diff --git a/.github/workflows/maven-build.yml b/.github/workflows/maven-build.yml
new file mode 100644
index 00000000..9311b004
--- /dev/null
+++ b/.github/workflows/maven-build.yml
@@ -0,0 +1,55 @@
+# Build validation
+
+name: Build
+
+on:
+ push:
+ branches-ignore:
+ - master
+ - experimental/**
+ pull_request:
+ branches-ignore:
+ - master
+ - experimental/**
+ workflow_dispatch:
+
+jobs:
+ build:
+
+ runs-on: ${{ matrix.os }}
+ strategy:
+ matrix:
+ os: [ ubuntu-latest ]
+ java: [8, 11, 17]
+
+ steps:
+ # Check out Git repository
+ - name: Checkout code
+ uses: actions/checkout@v2
+
+ # Set up environment with Java and Maven
+ - name: Setup JDK
+ uses: actions/setup-java@v1
+ with:
+ java-version: ${{ matrix.java }}
+
+ # Set up dependency cache
+ - name: Cache local Maven repository
+ uses: actions/cache@v2
+ with:
+ path: ~/.m2/repository
+ key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+ restore-keys: |
+ ${{ runner.os }}-maven-
+
+ # Build & install (required for 2nd build: example)
+ - name: Build and verify
+ run: ./mvnw -s ./.maven-settings.xml -Pcontinuous-integration -B -U clean install
+
+ # Build & verify example
+ - name: Build and verify example
+ run: ./mvnw -s ./.maven-settings.xml -Pcontinuous-integration -B -U clean verify -f example
+
+ # Run code coverage check
+ - name: Run code coverage check
+ run: bash <(curl -s https://codecov.io/bash)
diff --git a/.github/workflows/maven-deploy.yml b/.github/workflows/maven-deploy.yml
new file mode 100644
index 00000000..33d3373e
--- /dev/null
+++ b/.github/workflows/maven-deploy.yml
@@ -0,0 +1,55 @@
+# Deploy snapshots to Sonatpe OSS repository and deploy site to GitHub Pages
+
+name: Deploy
+
+on:
+ push:
+ branches:
+ - develop
+ workflow_dispatch:
+
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+
+ steps:
+ # Check out Git repository
+ - name: Checkout code
+ uses: actions/checkout@v2
+
+ # Configure GIT
+ - name: Configure GIT
+ run: |
+ git config --global user.email "${{ secrets.GH_SITE_DEPLOY_EMAIL }}"
+ git config --global user.name "${{ secrets.GH_SITE_DEPLOY_NAME }}"
+
+ # Set up environment with Java and Maven
+ - name: Setup JDK
+ uses: actions/setup-java@v1
+ with:
+ java-version: 1.8
+
+ # Set up dependency cache
+ - name: Cache local Maven repository
+ uses: actions/cache@v2
+ with:
+ path: ~/.m2/repository
+ key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+ restore-keys: |
+ ${{ runner.os }}-maven-
+
+ # Build, deploy to ossrh, generate and stage site
+ - name: Build, verify, deploy, generate site
+ env:
+ SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }}
+ SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }}
+ run: ./mvnw -s ./.maven-settings.xml -Pcontinuous-integration -B -U clean deploy site
+
+ # Deploy site to Github Pages
+ - name: Stage and deploy site
+ run: >
+ ./mvnw -s ./.maven-settings.xml -Pcontinuous-integration -B site:stage scm-publish:publish-scm
+ -Dscmpublish.checkinComment="Maven site: ${{ github.repository }}"
+ -Dusername=${{ secrets.GH_SITE_DEPLOY_USERNAME }}
+ -Dpassword=${{ secrets.GH_SITE_DEPLOY_PAT }}
diff --git a/.travis.maven-settings.xml b/.maven-settings.xml
similarity index 80%
rename from .travis.maven-settings.xml
rename to .maven-settings.xml
index 8b184f67..fb12e792 100644
--- a/.travis.maven-settings.xml
+++ b/.maven-settings.xml
@@ -42,19 +42,6 @@
-
- wcm-io-apache-intermediate-release
- https://wcm.io/maven/repositories/apache-intermediate-release
- default
-
- true
- never
-
-
- false
-
-
-
oss-snapshots
https://oss.sonatype.org/content/repositories/snapshots
@@ -98,19 +85,6 @@
-
- wcm-io-apache-intermediate-release
- https://wcm.io/maven/repositories/apache-intermediate-release
- default
-
- true
- never
-
-
- false
-
-
-
oss-snapshots
https://oss.sonatype.org/content/repositories/snapshots
@@ -147,4 +121,12 @@
default
+
+
+ ossrh
+ ${env.SONATYPE_USERNAME}
+ ${env.SONATYPE_PASSWORD}
+
+
+
diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java
new file mode 100644
index 00000000..b901097f
--- /dev/null
+++ b/.mvn/wrapper/MavenWrapperDownloader.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2007-present the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import java.net.*;
+import java.io.*;
+import java.nio.channels.*;
+import java.util.Properties;
+
+public class MavenWrapperDownloader {
+
+ private static final String WRAPPER_VERSION = "0.5.6";
+ /**
+ * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
+ */
+ private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
+ + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
+
+ /**
+ * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
+ * use instead of the default one.
+ */
+ private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
+ ".mvn/wrapper/maven-wrapper.properties";
+
+ /**
+ * Path where the maven-wrapper.jar will be saved to.
+ */
+ private static final String MAVEN_WRAPPER_JAR_PATH =
+ ".mvn/wrapper/maven-wrapper.jar";
+
+ /**
+ * Name of the property which should be used to override the default download url for the wrapper.
+ */
+ private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
+
+ public static void main(String args[]) {
+ System.out.println("- Downloader started");
+ File baseDirectory = new File(args[0]);
+ System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
+
+ // If the maven-wrapper.properties exists, read it and check if it contains a custom
+ // wrapperUrl parameter.
+ File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
+ String url = DEFAULT_DOWNLOAD_URL;
+ if(mavenWrapperPropertyFile.exists()) {
+ FileInputStream mavenWrapperPropertyFileInputStream = null;
+ try {
+ mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
+ Properties mavenWrapperProperties = new Properties();
+ mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
+ url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
+ } catch (IOException e) {
+ System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
+ } finally {
+ try {
+ if(mavenWrapperPropertyFileInputStream != null) {
+ mavenWrapperPropertyFileInputStream.close();
+ }
+ } catch (IOException e) {
+ // Ignore ...
+ }
+ }
+ }
+ System.out.println("- Downloading from: " + url);
+
+ File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
+ if(!outputFile.getParentFile().exists()) {
+ if(!outputFile.getParentFile().mkdirs()) {
+ System.out.println(
+ "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
+ }
+ }
+ System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
+ try {
+ downloadFileFromURL(url, outputFile);
+ System.out.println("Done");
+ System.exit(0);
+ } catch (Throwable e) {
+ System.out.println("- Error downloading");
+ e.printStackTrace();
+ System.exit(1);
+ }
+ }
+
+ private static void downloadFileFromURL(String urlString, File destination) throws Exception {
+ if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
+ String username = System.getenv("MVNW_USERNAME");
+ char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
+ Authenticator.setDefault(new Authenticator() {
+ @Override
+ protected PasswordAuthentication getPasswordAuthentication() {
+ return new PasswordAuthentication(username, password);
+ }
+ });
+ }
+ URL website = new URL(urlString);
+ ReadableByteChannel rbc;
+ rbc = Channels.newChannel(website.openStream());
+ FileOutputStream fos = new FileOutputStream(destination);
+ fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
+ fos.close();
+ rbc.close();
+ }
+
+}
diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar
new file mode 100644
index 00000000..2cc7d4a5
Binary files /dev/null and b/.mvn/wrapper/maven-wrapper.jar differ
diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 00000000..598fb341
--- /dev/null
+++ b/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1,2 @@
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.4/apache-maven-3.8.4-bin.zip
+wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 0d033d61..00000000
--- a/.travis.yml
+++ /dev/null
@@ -1,58 +0,0 @@
-# #%L
-# wcm.io
-# %%
-# Copyright (C) 2015 wcm.io
-# %%
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# #L%
-#
-
-language: java
-
-jdk:
-- openjdk8
-- openjdk11
-
-# Make sure travis can use container-based infrastructure
-sudo: false
-
-install: "mvn -s ./.travis.maven-settings.xml clean"
-
-script:
-- "mvn -s ./.travis.maven-settings.xml -Pcontinuous-integration -U install"
-# Separate build for example due to dependeny on conga-maven-plugin
-- "mvn -s ./.travis.maven-settings.xml -Pcontinuous-integration -U install -f example"
-# Remove wcm.io artefacts from repository before cache
-- rm -rf $HOME/.m2/repository/io/wcm
-
-# exlude release tags like 1.0.0
-branches:
- except:
- - /^\d+(\.\d+\.\d+)?(\..*|\-.*)?$/
-
-# Cache Maven Repository
-cache:
- directories:
- - '$HOME/.m2/repository'
-
-# this will not work yet with a google groups mailing list - see https://github.com/travis-ci/travis-ci/issues/2513
-#notifications:
-# email:
-# recipients:
-# - wcm-io-dev@googlegroups.com
-# on_success: change
-# on_failure: always
-
-# codecov.io integration
-after_success:
-- bash <(curl -s https://codecov.io/bash)
diff --git a/Jenkinsfile b/Jenkinsfile
deleted file mode 100644
index 9acec44a..00000000
--- a/Jenkinsfile
+++ /dev/null
@@ -1,37 +0,0 @@
-@Library('pipeline-library') pipelineLibrary
-@Library('pv-pipeline-library') pvPipelineLibrary
-
-
-import io.wcm.devops.jenkins.pipeline.ssh.SSHTarget
-
-import static de.provision.devops.jenkins.pipeline.utils.ConfigConstants.*
-import static io.wcm.devops.jenkins.pipeline.utils.ConfigConstants.*
-
-// See:
-// https://github.com/pro-vision/jenkins-pv-pipeline-library
-// https://github.com/pro-vision/jenkins-pv-pipeline-library/blob/master/docs/config-structure.md
-// Also have a look at https://github.com/wcm-io-devops/jenkins-pipeline-library for further configuration options
-
-List triggers = defaults.getTriggers()
-triggers.push(githubPush())
-
-Map config = [
- (BUILD_WRAPPER): [
- (BUILD_WRAPPER_SSH_TARGETS): [new SSHTarget("ssh-wcm.io")]
- ],
- (PROPERTIES) : [
- (PROPERTIES_PIPELINE_TRIGGERS): triggers
- ],
- (STAGE_COMPILE): [
- (MAVEN): [
- (MAVEN_GOALS): ["clean", "deploy", "site-deploy"],
- ]
- ],
- (STAGE_FEATURE_PREPARATION): [
- (STAGE_FEATURE_PREPARATION_MERGE): [
- (STAGE_FEATURE_PREPARATION_MERGE_ENABLED): false
- ]
- ]
-]
-
-routeDefaultJenkinsFile(config)
diff --git a/README.md b/README.md
index 618a6b20..9137ba4e 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
CONGA - CONfiguration GenerAtor
======
-[![Build Status](https://travis-ci.org/wcm-io-devops/conga.png?branch=develop)](https://travis-ci.org/wcm-io-devops/conga)
+[![Build](https://github.com/wcm-io-devops/conga/workflows/Build/badge.svg?branch=develop)](https://github.com/wcm-io-devops/conga/actions?query=workflow%3ABuild+branch%3Adevelop)
[![Code Coverage](https://codecov.io/gh/wcm-io-devops/conga/branch/develop/graph/badge.svg)](https://codecov.io/gh/wcm-io-devops/conga)
wcm.io DevOps CONGA Configuration Generator.
@@ -8,7 +8,7 @@ wcm.io DevOps CONGA Configuration Generator.
Documentation: https://devops.wcm.io/conga/
Issues: https://wcm-io.atlassian.net/projects/WDCONGA
Wiki: https://wcm-io.atlassian.net/wiki/
-Continuous Integration: https://travis-ci.org/wcm-io-devops/conga
+Continuous Integration: https://github.com/wcm-io-devops/conga/actions
Commercial support: https://wcm.io/commercial-support.html
@@ -16,7 +16,7 @@ Commercial support: https://wcm.io/commercial-support.html
If you want to build from sources make sure you have configured all [Maven Repositories](https://devops.wcm.io/maven.html) in your settings.xml.
-See [Travis Maven settings.xml](https://github.com/wcm-io-devops/conga/blob/master/.travis.maven-settings.xml) for an example with a full configuration.
+See [Maven Settings](https://github.com/wcm-io-devops/conga/blob/develop/.maven-settings.xml) for an example with a full configuration.
Then you can build using
diff --git a/changes.xml b/changes.xml
index 921f85c8..a7dea595 100644
--- a/changes.xml
+++ b/changes.xml
@@ -23,7 +23,13 @@
xsi:schemaLocation="http://maven.apache.org/changes/1.0.0 https://maven.apache.org/plugins/maven-changes-plugin/xsd/changes-1.0.0.xsd">
-
+
+
+ Eliminate usage of uk.com.robust-it:cloning to be compatible with Java 16+.
+
+
+
+
conga-maven-plugin: Allow to override maven properties used in CONGA definitions/environments via system parameters.
diff --git a/example/environments/pom.xml b/example/environments/pom.xml
index f31d8b89..645d7f67 100644
--- a/example/environments/pom.xml
+++ b/example/environments/pom.xml
@@ -50,7 +50,7 @@
io.wcm.devops
io.wcm.devops.parent_toplevel
- 1.2.4
+ 1.2.10
xml
site
diff --git a/example/pom.xml b/example/pom.xml
index 360eea53..75e8a263 100644
--- a/example/pom.xml
+++ b/example/pom.xml
@@ -26,7 +26,7 @@
io.wcm.maven
io.wcm.maven.global-parent
- 33
+ 36
@@ -50,7 +50,7 @@
io.wcm.devops.conga
conga-maven-plugin
- 1.14.1-SNAPSHOT
+ 1.14.3-SNAPSHOT
true
diff --git a/generator/pom.xml b/generator/pom.xml
index 2dbe62d8..2c5f0884 100644
--- a/generator/pom.xml
+++ b/generator/pom.xml
@@ -25,7 +25,7 @@
io.wcm.devops.conga
io.wcm.devops.conga.parent
- 1.14.2
+ 1.14.4
../parent/pom.xml
@@ -36,7 +36,7 @@
wcm.io DevOps CONGA Configuration Generator.
- conga/generator
+ generator
@@ -44,7 +44,7 @@
io.wcm.devops.conga
io.wcm.devops.conga.model
- 1.14.2
+ 1.14.4
compile
@@ -71,12 +71,6 @@
compile
-
- uk.com.robust-it
- cloning
- compile
-
-
org.apache.commons
commons-jexl3
@@ -98,7 +92,6 @@
-
@@ -109,16 +102,20 @@
-
-
- org.apache.maven.plugins
- maven-site-plugin
-
- false
-
-
-
+
+
+
+
+ org.apache.maven.plugins
+ maven-site-plugin
+
+ ${site.deploy.url}
+
+
+
+
+
@@ -158,7 +155,7 @@
${site.deploy.id}
- ${site.deploy.url}${site.url.module.prefix}
+ ${site.deploy.url}/${site.url.module.prefix}
diff --git a/generator/src/main/java/io/wcm/devops/conga/generator/ContextPropertiesBuilder.java b/generator/src/main/java/io/wcm/devops/conga/generator/ContextPropertiesBuilder.java
index fc24f84f..c01a2f3b 100644
--- a/generator/src/main/java/io/wcm/devops/conga/generator/ContextPropertiesBuilder.java
+++ b/generator/src/main/java/io/wcm/devops/conga/generator/ContextPropertiesBuilder.java
@@ -40,8 +40,8 @@
import java.util.Map;
import com.google.common.collect.ImmutableMap;
-import com.rits.cloning.Cloner;
+import io.wcm.devops.conga.generator.util.ObjectCloner;
import io.wcm.devops.conga.generator.util.VariableObjectTreeResolver;
import io.wcm.devops.conga.generator.util.VariableStringResolver;
import io.wcm.devops.conga.model.environment.Environment;
@@ -94,7 +94,7 @@ public static Map buildEnvironmentContextVariables(String enviro
map.put(ENVIRONMENT, environmentName);
// clone environment before resolving variables to make sure they are resolved only for this context, not for file generation
- Environment clonedEnvironemnt = Cloner.standard().deepClone(environment);
+ Environment clonedEnvironemnt = ObjectCloner.deepClone(environment);
// resolve all variables at any level in environment
variableObjectTreeResolver.resolve(clonedEnvironemnt);
diff --git a/generator/src/main/java/io/wcm/devops/conga/generator/export/ModelExport.java b/generator/src/main/java/io/wcm/devops/conga/generator/export/ModelExport.java
index e5c0e941..a6f5b17c 100644
--- a/generator/src/main/java/io/wcm/devops/conga/generator/export/ModelExport.java
+++ b/generator/src/main/java/io/wcm/devops/conga/generator/export/ModelExport.java
@@ -27,6 +27,7 @@
* Defines an export configuration for model information.
*/
public final class ModelExport extends AbstractConfigurable {
+ private static final long serialVersionUID = 4642081520558431376L;
private List node;
diff --git a/generator/src/main/java/io/wcm/devops/conga/generator/export/NodeModelExport.java b/generator/src/main/java/io/wcm/devops/conga/generator/export/NodeModelExport.java
index 6fb1dd0a..ae82efc4 100644
--- a/generator/src/main/java/io/wcm/devops/conga/generator/export/NodeModelExport.java
+++ b/generator/src/main/java/io/wcm/devops/conga/generator/export/NodeModelExport.java
@@ -25,8 +25,6 @@
import java.util.Map;
import java.util.Set;
-import com.rits.cloning.Cloner;
-
import io.wcm.devops.conga.generator.ContextProperties;
import io.wcm.devops.conga.generator.spi.context.PluginContextOptions;
import io.wcm.devops.conga.generator.spi.export.NodeModelExportPlugin;
@@ -34,6 +32,7 @@
import io.wcm.devops.conga.generator.spi.export.context.ExportNodeRoleTenantData;
import io.wcm.devops.conga.generator.spi.export.context.NodeModelExportContext;
import io.wcm.devops.conga.generator.spi.yaml.context.YamlRepresenter;
+import io.wcm.devops.conga.generator.util.ObjectCloner;
import io.wcm.devops.conga.generator.util.VariableMapResolver;
import io.wcm.devops.conga.generator.util.VariableStringResolver;
import io.wcm.devops.conga.model.environment.Environment;
@@ -116,7 +115,7 @@ public ExportNodeRoleData addRole(String role, List roleVariants, Map clonedConfig = Cloner.standard().deepClone(config);
+ Map clonedConfig = ObjectCloner.deepClone(config);
// resolve variables in configuration, and remove context properties
Map resolvedNodeConfig = variableMapResolver.resolve(clonedConfig, false);
diff --git a/generator/src/main/java/io/wcm/devops/conga/generator/util/EnvironmentExpander.java b/generator/src/main/java/io/wcm/devops/conga/generator/util/EnvironmentExpander.java
index 024ce098..ad70dbec 100644
--- a/generator/src/main/java/io/wcm/devops/conga/generator/util/EnvironmentExpander.java
+++ b/generator/src/main/java/io/wcm/devops/conga/generator/util/EnvironmentExpander.java
@@ -27,7 +27,6 @@
import org.apache.commons.lang3.StringUtils;
import com.google.common.collect.ImmutableList;
-import com.rits.cloning.Cloner;
import io.wcm.devops.conga.generator.GeneratorException;
import io.wcm.devops.conga.model.environment.Environment;
@@ -50,7 +49,7 @@ private EnvironmentExpander() {
* @return Environment that contains only nodes with single node names
*/
public static Environment expandNodes(Environment environment, String environmentName) {
- Environment clonedEnvironemnt = Cloner.standard().deepClone(environment);
+ Environment clonedEnvironemnt = ObjectCloner.deepClone(environment);
clonedEnvironemnt.setNodes(environment.getNodes().stream()
.flatMap(node -> getSingleNodes(node, environmentName))
@@ -76,7 +75,7 @@ else if (hasNode) {
}
else if (hasNodes) {
for (String nodeName : node.getNodes()) {
- Node clonedNode = Cloner.standard().deepClone(node);
+ Node clonedNode = ObjectCloner.deepClone(node);
clonedNode.setNode(nodeName);
clonedNode.setNodes(ImmutableList.of());
nodes.add(clonedNode);
diff --git a/generator/src/main/java/io/wcm/devops/conga/generator/util/ObjectCloner.java b/generator/src/main/java/io/wcm/devops/conga/generator/util/ObjectCloner.java
new file mode 100644
index 00000000..8804e53a
--- /dev/null
+++ b/generator/src/main/java/io/wcm/devops/conga/generator/util/ObjectCloner.java
@@ -0,0 +1,49 @@
+/*
+ * #%L
+ * wcm.io
+ * %%
+ * Copyright (C) 2021 wcm.io
+ * %%
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * #L%
+ */
+package io.wcm.devops.conga.generator.util;
+
+import java.io.Serializable;
+
+import org.apache.commons.lang3.SerializationUtils;
+
+/**
+ * Clone maps.
+ */
+public final class ObjectCloner {
+
+ private ObjectCloner() {
+ // static methods only
+ }
+
+ /**
+ * Deep clones an object.
+ * @param Type is expected to be serializable (but not enforced here to also support e.g. Map interface variables)
+ * @param input Input object
+ * @return Cloned object
+ */
+ @SuppressWarnings("unchecked")
+ public static T deepClone(T input) {
+ if (!(input instanceof Serializable)) {
+ throw new IllegalArgumentException("Input not serializable: " + input);
+ }
+ return (T)SerializationUtils.clone((Serializable)input);
+ }
+
+}
diff --git a/generator/src/main/java/io/wcm/devops/conga/generator/util/RoleUtil.java b/generator/src/main/java/io/wcm/devops/conga/generator/util/RoleUtil.java
index 2553e64e..ea3418c2 100644
--- a/generator/src/main/java/io/wcm/devops/conga/generator/util/RoleUtil.java
+++ b/generator/src/main/java/io/wcm/devops/conga/generator/util/RoleUtil.java
@@ -29,7 +29,6 @@
import org.apache.commons.lang3.StringUtils;
import com.google.common.collect.ImmutableList;
-import com.rits.cloning.Cloner;
import io.wcm.devops.conga.generator.GeneratorException;
import io.wcm.devops.conga.model.role.Role;
@@ -106,7 +105,7 @@ private static Role getRole(String roleName, String context, Map r
+ "referenced in " + context + " does not exist.");
}
// clone role object because it may be changed when resolving inheritance
- return Cloner.standard().deepClone(role);
+ return ObjectCloner.deepClone(role);
}
private static void validateRole(String roleName, Role role, String superRoleName, Role superRole) {
@@ -151,7 +150,7 @@ private static void mergeRoleConfig(Role role, Role superRole) {
if (!found) {
// if super role does not have the variant from the sub role, add it to super role as well
List mergedVariants = new ArrayList<>(superRole.getVariants());
- mergedVariants.add(Cloner.standard().deepClone(variant));
+ mergedVariants.add(ObjectCloner.deepClone(variant));
superRole.setVariants(mergedVariants);
}
}
diff --git a/generator/src/main/java/io/wcm/devops/conga/generator/util/VariableMapResolver.java b/generator/src/main/java/io/wcm/devops/conga/generator/util/VariableMapResolver.java
index eb84eb7b..67c362af 100644
--- a/generator/src/main/java/io/wcm/devops/conga/generator/util/VariableMapResolver.java
+++ b/generator/src/main/java/io/wcm/devops/conga/generator/util/VariableMapResolver.java
@@ -29,7 +29,6 @@
import java.util.regex.Matcher;
import com.google.common.collect.ImmutableList;
-import com.rits.cloning.Cloner;
import io.wcm.devops.conga.generator.spi.context.ValueProviderGlobalContext;
@@ -209,7 +208,7 @@ private List