github.com/apache/incubator-kie-tools/packages/kn-plugin-workflow@v0.28.1-0.20240311201729-34c6856b157f/pkg/command/quarkus/quarkus_project.go (about) 1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one 3 * or more contributor license agreements. See the NOTICE file 4 * distributed with this work for additional information 5 * regarding copyright ownership. The ASF licenses this file 6 * to you under the Apache License, Version 2.0 (the 7 * "License"); you may not use this file except in compliance 8 * with the License. You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, 13 * software distributed under the License is distributed on an 14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 * KIND, either express or implied. See the License for the 16 * specific language governing permissions and limitations 17 * under the License. 18 */ 19 20 package quarkus 21 22 import ( 23 "fmt" 24 25 "github.com/apache/incubator-kie-tools/packages/kn-plugin-workflow/pkg/common" 26 "github.com/apache/incubator-kie-tools/packages/kn-plugin-workflow/pkg/metadata" 27 "github.com/beevik/etree" 28 ) 29 30 type CreateQuarkusProjectConfig struct { 31 ProjectName string 32 Extensions string // List of extensions separated by "," to be added to the Quarkus project 33 DependenciesVersion metadata.DependenciesVersion 34 } 35 36 func CreateQuarkusProject(cfg CreateQuarkusProjectConfig) error { 37 if err := common.CheckProjectName(cfg.ProjectName); err != nil { 38 return err 39 } 40 exists, err := common.CheckIfDirExists(cfg.ProjectName) 41 if err != nil || exists { 42 return fmt.Errorf("directory with name \"%s\" already exists: %w", cfg.ProjectName, err) 43 } 44 create := common.ExecCommand( 45 "mvn", 46 fmt.Sprintf("%s:%s:%s:create", cfg.DependenciesVersion.QuarkusPlatformGroupId, metadata.QuarkusMavenPlugin, cfg.DependenciesVersion.QuarkusVersion), 47 "-DprojectGroupId=org.acme", 48 "-DnoCode", 49 fmt.Sprintf("-DprojectArtifactId=%s", cfg.ProjectName), 50 fmt.Sprintf("-Dextensions=%s", cfg.Extensions)) 51 52 if err := common.RunCommand( 53 create, 54 "create", 55 ); err != nil { 56 return err 57 } 58 59 //Until we are part of Quarkus 3.x bom we need to manipulate the pom.xml to use the right kogito dependencies 60 pomPath := cfg.ProjectName + "/pom.xml" 61 if err := manipulatePomToKogito(pomPath, cfg); err != nil { 62 return err 63 } 64 return nil 65 } 66 67 func manipulatePomToKogito(filename string, cfg CreateQuarkusProjectConfig) error { 68 69 if cfg.DependenciesVersion.QuarkusPlatformGroupId == "" || cfg.DependenciesVersion.QuarkusVersion == "" { 70 return fmt.Errorf("configuration for Quarkus versions is not complete") 71 } 72 73 doc := etree.NewDocument() 74 err := doc.ReadFromFile(filename) 75 if err != nil { 76 return fmt.Errorf("error reading %s: %w", filename, err) 77 } 78 79 // Update quarkus.platform.group-id 80 properties := doc.FindElement("//properties") 81 if properties == nil { 82 return fmt.Errorf("error parsing %s: %w", filename, err) 83 } 84 groupIDElement := properties.FindElement("quarkus.platform.group-id") 85 if groupIDElement == nil { 86 return fmt.Errorf("error parsing %s: %w", filename, err) 87 } 88 groupIDElement.SetText(cfg.DependenciesVersion.QuarkusPlatformGroupId) 89 90 // Update quarkus.platform.version 91 versionElement := properties.FindElement("quarkus.platform.version") 92 if versionElement == nil { 93 return fmt.Errorf("error parsing %s: %w", filename, err) 94 } 95 versionElement.SetText(cfg.DependenciesVersion.QuarkusVersion) 96 97 //Add kogito bom dependency 98 depManagement := doc.FindElement("//dependencyManagement") 99 if depManagement == nil { 100 return fmt.Errorf("error parsing %s: %w", filename, err) 101 } 102 103 dependenciesManagendChild := depManagement.FindElement("dependencies") 104 if dependenciesManagendChild == nil { 105 return fmt.Errorf("error parsing %s: %w", filename, err) 106 } 107 108 dependencyElement := dependenciesManagendChild.CreateElement("dependency") 109 dependencyElement.CreateElement("groupId").SetText(metadata.KogitoBomDependency.GroupId) 110 dependencyElement.CreateElement("artifactId").SetText(metadata.KogitoBomDependency.ArtifactId) 111 dependencyElement.CreateElement("version").SetText(metadata.KogitoBomDependency.Version) 112 dependencyElement.CreateElement("type").SetText(metadata.KogitoBomDependency.Type) 113 dependencyElement.CreateElement("scope").SetText(metadata.KogitoBomDependency.Scope) 114 115 // Update kogito pom dependencies 116 dependencies := doc.FindElement("//dependencies") 117 if dependencies == nil { 118 return fmt.Errorf("error parsing %s: %w", filename, err) 119 } 120 121 for _, dep := range metadata.KogitoDependencies { 122 dependencyElement := dependencies.CreateElement("dependency") 123 dependencyElement.CreateElement("groupId").SetText(dep.GroupId) 124 dependencyElement.CreateElement("artifactId").SetText(dep.ArtifactId) 125 } 126 127 doc.Indent(4) 128 129 if err := doc.WriteToFile(filename); err != nil { 130 return fmt.Errorf("error writing modified content to %s: %w", filename, err) 131 } 132 133 return nil 134 135 }