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  }