* This is a JUnit test runner that is designed to work with an Alfresco repository.
* It detects if it's executing a test inside of a running Alfresco instance. If that
* is the case the tests are all run normally. If however the test is being run from
@@ -54,14 +55,15 @@ import java.io.*;
* test an HTTP request is made to a Web Script in a running Alfresco instance. This
* Web Script runs the test and returns enough information to this class so we can
* emulate having run the test locally.
- *
+ *
+ *
* By doing this, we are able to create Integration Tests (IT) using standard JUnit
* capabilities. These can then be run from our IDEs with the associated visualizations,
* support for re-running failed tests, etc.
- *
+ *
* Integration testing framework donated by Zia Consulting
*
- * @author Bindu Wavell
+ * @author Bindu Wavell (bindu@ziaconsulting.com)
* @author martin.bergljung@alfresco.com (some editing)
* @since 3.0
*/
@@ -104,13 +106,13 @@ public class AlfrescoTestRunner extends BlockJUnit4ClassRunner {
* Call a remote Alfresco server and have the test run there.
*
* @param method the test method to run
- * @param notifier
- * @param desc
+ * @param notifier given @{@link RunNotifier} to notify the result of the test
+ * @param desc given @{@link Description} of the test to run
*/
protected void callProxiedChild(FrameworkMethod method, RunNotifier notifier, Description desc) {
notifier.fireTestStarted(desc);
- String className = method.getMethod().getDeclaringClass().getCanonicalName();
+ String className = this.getTestClass().getJavaClass().getCanonicalName();
String methodName = method.getName();
if (null != methodName) {
className += "#" + methodName;
@@ -232,8 +234,8 @@ public class AlfrescoTestRunner extends BlockJUnit4ClassRunner {
* Check the @Remote config on the test class to see where the
* Alfresco Repo is running
*
- * @param method
- * @return
+ * @param method given @{@link FrameworkMethod} to be executed
+ * @return the ACS endpoint
*/
protected String getContextRoot(FrameworkMethod method) {
Class> declaringClass = method.getMethod().getDeclaringClass();
diff --git a/modules/alfresco-rad/src/main/java/org/alfresco/rad/test/Remote.java b/modules/alfresco-rad/src/main/java/org/alfresco/rad/test/Remote.java
index 0a1cfd3e..b99ce9b2 100644
--- a/modules/alfresco-rad/src/main/java/org/alfresco/rad/test/Remote.java
+++ b/modules/alfresco-rad/src/main/java/org/alfresco/rad/test/Remote.java
@@ -24,14 +24,15 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
+ *
* By default the ${@link AlfrescoTestRunner} will attempt to find a
* running Alfresco instance at http://localhost:8080/alfresco
* This annotation can be applied to a test class to have the
* proxy calls go to a different host/port.
- *
* This Web Script works in consort with the ${@link AlfrescoTestRunner}. When a test is run from an IDE or
* command line, the Alfresco test runner sends a proxied request to perform the test to this script. This runs
* the test and wraps the results up so that the test initiator can be fooled into thinking they are
* running the tests locally.
- *
+ *
* Integration testing framework donated by Zia Consulting.
*
- * @author Bindu Wavell
+ * @author Bindu Wavell (bindu@ziaconsulting.com)
* @author martin.bergljung@alfresco.com (some editing)
* @since 3.0
*/
diff --git a/plugins/alfresco-maven-plugin/pom.xml b/plugins/alfresco-maven-plugin/pom.xml
index 71028939..e86f26ab 100644
--- a/plugins/alfresco-maven-plugin/pom.xml
+++ b/plugins/alfresco-maven-plugin/pom.xml
@@ -140,6 +140,11 @@
zt-zip1.11
+
+ de.schlichtherle.truezip
+ truezip-kernel
+ 7.7.9
+
diff --git a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/AbstractRefreshWebappMojo.java b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/AbstractRefreshWebappMojo.java
index bb236ef1..013c5f73 100644
--- a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/AbstractRefreshWebappMojo.java
+++ b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/AbstractRefreshWebappMojo.java
@@ -164,6 +164,8 @@ public abstract class AbstractRefreshWebappMojo extends AbstractMojo {
/**
* Perform a Refresh of Web Scripts container in webapp.
* Called by specific refresh mojo implementation.
+ *
+ * @param url the relative path to refresh webscripts
*/
protected void refreshWebScripts(String url) {
// Create the Refresh URL for the Alfresco Tomcat server
@@ -184,6 +186,8 @@ public abstract class AbstractRefreshWebappMojo extends AbstractMojo {
/**
* Perform a Clear Dependency Caches call on Share webapp.
* Called by specific refresh mojo implementation, currently only applicable to Share webapp.
+ *
+ * @param url the relative path to clear cache
*/
protected void clearDependencyCaches(String url) {
// Create the Clear Cache URL for the Alfresco Tomcat server
diff --git a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/AbstractRunMojo.java b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/AbstractRunMojo.java
index 92171f62..d4a4a842 100644
--- a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/AbstractRunMojo.java
+++ b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/AbstractRunMojo.java
@@ -17,9 +17,13 @@
*/
package org.alfresco.maven.plugin;
+import com.google.common.collect.ImmutableSet;
+import de.schlichtherle.truezip.file.TVFS;
+import de.schlichtherle.truezip.fs.FsSyncException;
import org.alfresco.maven.plugin.config.ModuleDependency;
import org.alfresco.maven.plugin.config.TomcatDependency;
import org.alfresco.maven.plugin.config.TomcatWebapp;
+import org.alfresco.util.Pair;
import org.apache.commons.lang.StringUtils;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
@@ -40,6 +44,7 @@ import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import static org.twdata.maven.mojoexecutor.MojoExecutor.*;
@@ -57,7 +62,6 @@ public abstract class AbstractRunMojo extends AbstractMojo {
public static final String MAVEN_INSTALL_PLUGIN_VERSION = "2.5.2";
public static final String MAVEN_REPLACER_PLUGIN_VERSION = "1.5.3";
public static final String MAVEN_RESOURCE_PLUGIN_VERSION = "2.7";
- public static final String MAVEN_TOMCAT7_PLUGIN_VERSION = "2.2";
public static final String MAVEN_BUILD_HELPER_PLUGIN_VERSION = "1.12";
public static final String PLATFORM_WAR_PREFIX_NAME = "platform";
@@ -67,6 +71,31 @@ public abstract class AbstractRunMojo extends AbstractMojo {
public static final String ALFRESCO_ENTERPRISE_EDITION = "enterprise";
public static final String ALFRESCO_COMMUNITY_EDITION = "community";
+ private static final String TOMCAT_GROUP_ID = "org.apache.tomcat";
+ private static final String TOMCAT_EMBED_GROUP_ID = "org.apache.tomcat.embed";
+ private static final Set> TOMCAT_DEPENDENCIES = new ImmutableSet.Builder>()
+ .add(new Pair(TOMCAT_EMBED_GROUP_ID,"tomcat-embed-core"))
+ .add(new Pair(TOMCAT_GROUP_ID,"tomcat-util"))
+ .add(new Pair(TOMCAT_GROUP_ID,"tomcat-coyote"))
+ .add(new Pair(TOMCAT_GROUP_ID,"tomcat-api"))
+ .add(new Pair(TOMCAT_GROUP_ID,"tomcat-jdbc"))
+ .add(new Pair(TOMCAT_GROUP_ID,"tomcat-dbcp"))
+ .add(new Pair(TOMCAT_GROUP_ID,"tomcat-servlet-api"))
+ .add(new Pair(TOMCAT_GROUP_ID,"tomcat-jsp-api"))
+ .add(new Pair(TOMCAT_GROUP_ID,"tomcat-jasper"))
+ .add(new Pair(TOMCAT_GROUP_ID,"tomcat-jasper-el"))
+ .add(new Pair(TOMCAT_GROUP_ID,"tomcat-el-api"))
+ .add(new Pair(TOMCAT_GROUP_ID,"tomcat-catalina"))
+ .add(new Pair(TOMCAT_GROUP_ID,"tomcat-tribes"))
+ .add(new Pair(TOMCAT_GROUP_ID,"tomcat-catalina-ha"))
+ .add(new Pair(TOMCAT_GROUP_ID,"tomcat-annotations-api"))
+ .add(new Pair(TOMCAT_GROUP_ID,"tomcat-juli"))
+ .add(new Pair(TOMCAT_EMBED_GROUP_ID,"tomcat-embed-logging-juli"))
+ .add(new Pair(TOMCAT_EMBED_GROUP_ID,"tomcat-embed-logging-log4j"))
+ .build();
+
+ private static final String AMP_LOCATION_PATTERN = "%s/%s-%s.amp";
+
@Component
protected MavenProject project;
@@ -351,6 +380,32 @@ public abstract class AbstractRunMojo extends AbstractMojo {
@Parameter(property = "solr.home", defaultValue = "${project.basedir}/${alfresco.data.location}/solr")
protected String solrHome;
+ /**
+ * Solr indexation frequency. It is customizable to speed up integration tests execution.
+ */
+ @Parameter(property = "solr.alfresco.cron", defaultValue = "0/15 * * * * ? *")
+ protected String solrCron;
+
+ /**
+ * Tomcat version to be used in the Maven Tomcat Plugin. If this parameter is not set, then the
+ * default Tomcat version will be used (it depends on the version of the Tomcat Maven Plugin).
+ */
+ @Parameter(property = "maven.alfresco.tomcat.version")
+ protected String tomcatVersion;
+
+ /**
+ * Tomcat Maven Plugin version to be used when running the project. If this parameter is not set, then the
+ * default Tomcat Maven Plugin version will be used (2.2).
+ */
+ @Parameter(property = "maven.alfresco.tomcat.maven.plugin.version", defaultValue = "2.2")
+ protected String tomcatMavenPluginVersion;
+
+ /**
+ * Location of a custom context file to use in the deployment of the platform war in Tomcat.
+ */
+ @Parameter(property = "maven.alfresco.platform.custom.context.file")
+ protected String platformCustomContextFile;
+
/**
* Maven GAV properties for customized alfresco.war, share.war, activiti-app.war
* Used by the Maven Tomcat 7 Plugin
@@ -372,6 +427,8 @@ public abstract class AbstractRunMojo extends AbstractMojo {
/**
* Get the Tomcat port. By default the port is changed by using the maven.alfresco.tomcat.port property
* but for legacy and external configuration purposes maven.tomcat.port will override if defined
+ *
+ * @return the Tomcat port
*/
protected String getPort() {
String port = tomcatPort;
@@ -384,7 +441,9 @@ public abstract class AbstractRunMojo extends AbstractMojo {
}
/**
+ * Check if Tomcat is already running.
*
+ * @return true if Tomcat is already running, false otherwise
*/
protected boolean tomcatIsRunning() {
@@ -409,7 +468,7 @@ public abstract class AbstractRunMojo extends AbstractMojo {
* Download and unpack the Solr 4 configuration as we don't have it in the project.
* It will reside under /alf_data_dev/solr
*
- * @throws MojoExecutionException
+ * @throws MojoExecutionException when any problem appears unpacking the Solr configuration
*/
protected void unpackSolrConfig() throws MojoExecutionException {
getLog().info("Unpacking Solr config");
@@ -442,7 +501,7 @@ public abstract class AbstractRunMojo extends AbstractMojo {
* For windows paths, convert single \ to / for the ${alfresco.solr.data.dir} path,
* by default it will be c:\bla\, we need forward slash or double backslash.
*
- * @throws MojoExecutionException
+ * @throws MojoExecutionException when any problem appears fixing the Solr home path
*/
protected void fixSolrHomePath() throws MojoExecutionException {
getLog().info("Fix Solr Home Path to work in Windows");
@@ -469,7 +528,7 @@ public abstract class AbstractRunMojo extends AbstractMojo {
* Copy custom solr configuration files over, so a
* developer can overwrite any files needed
*
- * @throws MojoExecutionException
+ * @throws MojoExecutionException when any problem appears copying the Solr custom configuration
*/
protected void copySolrCustomConfig() throws MojoExecutionException {
getLog().info("Copying custom Solr config");
@@ -498,7 +557,7 @@ public abstract class AbstractRunMojo extends AbstractMojo {
* Replace property placeholders in configuration files for the cores, so the
* index files can be found for each core when Solr starts up.
*
- * @throws MojoExecutionException
+ * @throws MojoExecutionException when any problem appears replacing the Solr configuration properties
*/
protected void replaceSolrConfigProperties() throws MojoExecutionException {
getLog().info("Replacing Solr config properties");
@@ -531,8 +590,11 @@ public abstract class AbstractRunMojo extends AbstractMojo {
element(name("replacement"),
element(name("token"), "alfresco.secureComms=https"),
element(name("value"), "alfresco.secureComms=none")
+ ),
+ element(name("replacement"),
+ element(name("token"), "alfresco.cron=0/15 * * * * ? *"),
+ element(name("value"), "alfresco.cron=" + solrCron)
)
-
)
),
execEnv
@@ -543,7 +605,7 @@ public abstract class AbstractRunMojo extends AbstractMojo {
* If we are in Alfresco version 4.2 or younger the Solr 1.0 WAR is not available as Maven artifact, just
* as part of a ZIP file, so install it locally so we can deploy from embedded tomcat
*
- * @throws MojoExecutionException
+ * @throws MojoExecutionException when any problem appears installing Solr10 in the local repository
*/
protected void installSolr10InLocalRepo() throws MojoExecutionException {
if (isPlatformVersionLtOrEqTo42()) {
@@ -657,12 +719,13 @@ public abstract class AbstractRunMojo extends AbstractMojo {
}
/**
+ *
* Replaces web.xml where applicable in platform webapp (alfresco.war),
* commenting out the security-constraints.
- *
+ *
* This is only needed for 4.2, 5.0 (5.1 handles it automatically when turning off ssl via props)
*
- * @throws MojoExecutionException
+ * @throws MojoExecutionException when any problem appears commenting out the security configuration
*/
protected void commentOutSecureCommsInPlatformWebXml() throws MojoExecutionException {
if (isPlatformVersionGtOrEqTo51()) {
@@ -706,7 +769,7 @@ public abstract class AbstractRunMojo extends AbstractMojo {
* enterprise db config) that will be used when running Alfresco. It contains database connection parameters and
* other general configuration for Alfresco Repository (alfresco.war)
*
- * @throws MojoExecutionException
+ * @throws MojoExecutionException when any problem appears copying the Alfresco global properties file
*/
protected void copyAlfrescoGlobalProperties() throws MojoExecutionException {
getLog().info("Copying and filtering alfresco-global-*.properties files to target/test-classes");
@@ -798,7 +861,7 @@ public abstract class AbstractRunMojo extends AbstractMojo {
* Rename the configured database specific alfresco-global-*.properties file to
* alfresco-global.properties so it will be used during Tomcat run.
*
- * @throws MojoExecutionException
+ * @throws MojoExecutionException when any problem appears renaming the alfresco global properties
*/
protected void renameAlfrescoGlobalProperties() throws MojoExecutionException {
String alfrescoGlobalFilePath = project.getBuild().getTestOutputDirectory() + "/alfresco-global-";
@@ -846,7 +909,7 @@ public abstract class AbstractRunMojo extends AbstractMojo {
* Copy the Alfresco Enterprise license to its correct place in the Platform WAR, if it exists.
* It is not enough to have it on the test classpath, then it will start up as Trial license...
*
- * @throws MojoExecutionException
+ * @throws MojoExecutionException when any problem appears copying the Alfresco license
*/
protected void copyAlfrescoLicense() throws MojoExecutionException {
if (alfrescoEdition.equals(ALFRESCO_COMMUNITY_EDITION)) {
@@ -885,7 +948,7 @@ public abstract class AbstractRunMojo extends AbstractMojo {
/**
* Copy the Activiti Log4J Dev config into the activitiApp-war/WEB-INF/classes dir.
*
- * @throws MojoExecutionException
+ * @throws MojoExecutionException when any problem appears copying the activity Log4J dev configuration
*/
protected void copyActivitiLog4JDevConfig() throws MojoExecutionException {
final String warOutputDir = getWarOutputDir(ACTIVITI_APP_WAR_PREFIX_NAME);
@@ -920,7 +983,7 @@ public abstract class AbstractRunMojo extends AbstractMojo {
/**
* Copy Share Config Custom in order to have global overrides for development and dynamic port
*
- * @throws MojoExecutionException
+ * @throws MojoExecutionException when any problem appears copying share config custom file
*/
protected void copyShareConfigCustom() throws MojoExecutionException {
final String warOutputDir = getWarOutputDir(SHARE_WAR_PREFIX_NAME);
@@ -961,7 +1024,7 @@ public abstract class AbstractRunMojo extends AbstractMojo {
* There is no custom classpath resolve mechanism for Share log4j,
* to log custom stuff overriding standard log4j.properties is needed.
*
- * @throws MojoExecutionException
+ * @throws MojoExecutionException when any problem appears copying the share log4j configuration
*/
protected void copyShareLog4jConfig() throws MojoExecutionException {
if (!useCustomShareLog4jConfig) {
@@ -1001,7 +1064,9 @@ public abstract class AbstractRunMojo extends AbstractMojo {
/**
* Copy and Build hotswap-agent.properties
*
- * @throws MojoExecutionException
+ * @param warPrefix path to the war root directory
+ *
+ * @throws MojoExecutionException when any problem appears copying hotswap agent properties
*/
protected void copyHotswapAgentProperties(String warPrefix) throws MojoExecutionException {
if ( copyHotswapAgentConfig == false ) {
@@ -1035,6 +1100,8 @@ public abstract class AbstractRunMojo extends AbstractMojo {
* Build the customized Platform webapp (i.e. the Repository, alfresco.war)
* that should be deployed by Tomcat by applying all AMPs and JARs from
* the {@code } configuration.
+ *
+ * @throws MojoExecutionException when any problem appears building the platform war
*/
protected void buildPlatformWar() throws MojoExecutionException {
buildCustomWarInDir(PLATFORM_WAR_PREFIX_NAME, platformModules,
@@ -1056,6 +1123,8 @@ public abstract class AbstractRunMojo extends AbstractMojo {
* Build the customized Share webapp (i.e. the share.war)
* that should be deployed by Tomcat by applying all AMPs and JARs from
* the {@code } configuration.
+ *
+ * @throws MojoExecutionException when any problem appears building the share war
*/
protected void buildShareWar() throws MojoExecutionException {
buildCustomWarInDir(SHARE_WAR_PREFIX_NAME, shareModules,
@@ -1078,6 +1147,8 @@ public abstract class AbstractRunMojo extends AbstractMojo {
* Build the customized Activiti App webapp (i.e. the activiti-app.war)
* that should be deployed by Tomcat by applying all JARs from
* the {@code } configuration.
+ *
+ * @throws MojoExecutionException when any problem appears building the activity war
*/
protected void buildActivitiAppWar() throws MojoExecutionException {
buildCustomWarInDir(ACTIVITI_APP_WAR_PREFIX_NAME, activitiModules,
@@ -1102,7 +1173,7 @@ public abstract class AbstractRunMojo extends AbstractMojo {
* @param originalWarGroupId the Maven groupId for the original war file that should be customized
* @param originalWarArtifactId the Maven artifactId for the original war file that should be customized
* @param originalWarVersion the Maven version for the original war file that should be customized
- * @throws MojoExecutionException
+ * @throws MojoExecutionException when any problem appears building the custom war
*/
protected void buildCustomWarInDir(String warName,
List modules,
@@ -1192,18 +1263,7 @@ public abstract class AbstractRunMojo extends AbstractMojo {
);
// Then apply all these amps to the unpacked war
- // Call the Alfresco Maven Plugin Install Mojo directly, so we don't have to keep SDK version info here
- String ampsLocation = project.getBuild().getDirectory() + "/" + ampsModuleDir;
- String warLocation = project.getBuild().getDirectory() + "/" + getWarName(warName);
- InstallMojo installMojo = new InstallMojo();
- installMojo.setAmpLocation(new File(ampsLocation));
- installMojo.setWarLocation(new File(warLocation));
- installMojo.setForce(true);
- try {
- installMojo.execute();
- } catch (MojoFailureException e) {
- e.printStackTrace();
- }
+ applyAMPs(warName, modules);
}
// Then copy all JAR dependencies to the unpacked war /target/-war/WEB-INF/lib
@@ -1222,6 +1282,13 @@ public abstract class AbstractRunMojo extends AbstractMojo {
execEnv
);
}
+
+ // Force the unmount of all the files mounted with TrueZIP to avoid an exception in the FsSyncShutdownHook
+ try {
+ TVFS.umount();
+ } catch (final FsSyncException e) {
+ getLog().error(e);
+ }
}
/**
@@ -1229,7 +1296,7 @@ public abstract class AbstractRunMojo extends AbstractMojo {
*
* @param warName the name of the custom war
* @return the customized war file artifactId, to be used by the tomcat7 plugin
- * @throws MojoExecutionException
+ * @throws MojoExecutionException when any problem appears packaging or installing the custom war
*/
protected String packageAndInstallCustomWar(String warName) throws MojoExecutionException {
final String warArtifactId = "${project.artifactId}-" + warName;
@@ -1264,6 +1331,8 @@ public abstract class AbstractRunMojo extends AbstractMojo {
/**
* Check that a database configuration has been supplied correctly
+ *
+ * @throws MojoExecutionException when any problem appears checking the database configuration
*/
protected void checkDatabaseConfig() throws MojoExecutionException {
// Only do this check if we are running alfresco.war or activiti-app.war that needs a database.
@@ -1294,7 +1363,7 @@ public abstract class AbstractRunMojo extends AbstractMojo {
* configured in the SDK project.
*
* @param fork true if tomcat process should be forked
- * @throws MojoExecutionException
+ * @throws MojoExecutionException when any problem appears starting tomcat
*/
protected void startTomcat(boolean fork) throws MojoExecutionException {
getLog().info("Starting Tomcat, fork = " + fork);
@@ -1341,10 +1410,16 @@ public abstract class AbstractRunMojo extends AbstractMojo {
dependency("org.postgresql", "postgresql", "9.4-1201-jdbc41"));
}
+ // If a custom version of Tomcat is required add the corresponding dependencies
+ if(StringUtils.isNotBlank(tomcatVersion)) {
+ addTomcatDependencies(tomcatPluginDependencies);
+ }
+
if (enablePlatform) {
+ String platformContextFile = StringUtils.isNotBlank(platformCustomContextFile) ? platformCustomContextFile : null;
webapps2Deploy.add(createWebAppElement(
runnerAlfrescoGroupId, runnerAlfrescoPlatformWarArtifactId, runnerAlfrescoPlatformVersion,
- "/alfresco", null));
+ "/alfresco", platformContextFile));
}
if (enableShare) {
@@ -1364,7 +1439,6 @@ public abstract class AbstractRunMojo extends AbstractMojo {
}
if (enableActivitiApp) {
-
webapps2Deploy.add(createWebAppElement(
runnerActivitiAppGroupId, runnerActivitiAppWarArtifactId, runnerActivitiAppVersion,
"/activiti-app", null));
@@ -1413,7 +1487,7 @@ public abstract class AbstractRunMojo extends AbstractMojo {
plugin(
groupId("org.apache.tomcat.maven"),
artifactId("tomcat7-maven-plugin"),
- version(MAVEN_TOMCAT7_PLUGIN_VERSION),
+ version(tomcatMavenPluginVersion),
tomcatPluginDependencies
),
goal("run"),
@@ -1788,4 +1862,68 @@ public abstract class AbstractRunMojo extends AbstractMojo {
private String getWarName(String baseWarName) {
return baseWarName + "-war";
}
+
+ /**
+ * Add all the required maven dependencies to execute a specific version of Tomcat set by the property tomcatVersion to the list of
+ * dependencies of the Tomcat Maven Plugin.
+ *
+ * @param tomcatPluginDependencies current list of dependencies of the Tomcat Maven Plugin
+ */
+ private void addTomcatDependencies(List tomcatPluginDependencies) {
+ for(Pair tomcatDependency : TOMCAT_DEPENDENCIES) {
+ tomcatPluginDependencies.add(dependency(tomcatDependency.getFirst(),tomcatDependency.getSecond(),tomcatVersion));
+ }
+ }
+
+ /**
+ * Apply a list of AMPs to a specific war file.
+ *
+ * @param warName the name of the war file to apply the AMPs to
+ * @param modules the list of proposed modules to be applied to the war file. Only the AMP files will be applied
+ * @throws MojoExecutionException when any problem appears applying the AMPs to the war
+ */
+ private void applyAMPs(String warName, List modules) throws MojoExecutionException {
+ final String ampsModuleDir = "modules/" + warName + "/amps";
+ final String ampsLocation = project.getBuild().getDirectory() + "/" + ampsModuleDir;
+ final String warLocation = project.getBuild().getDirectory() + "/" + getWarName(warName);
+
+ // Apply one AMP module each time to preserve the order applying the AMPs to the war
+ for(ModuleDependency module : modules) {
+ if(module.isAmp()) {
+ applyAMP(ampsLocation, warLocation, module);
+ }
+ }
+ }
+
+ /**
+ * Apply an AMP to a specific war file.
+ *
+ * @param ampsLocation the location of the folder where the AMP is located
+ * @param warLocation the location of the war file to apply the AMP to
+ * @param ampModule the module that represents the AMP to apply
+ * @throws MojoExecutionException when any problem appears applying the AMP to the war
+ */
+ private void applyAMP(String ampsLocation, String warLocation, ModuleDependency ampModule) throws MojoExecutionException {
+ // Call the Alfresco Maven Plugin Install Mojo directly, so we don't have to keep SDK version info here
+ InstallMojo installMojo = new InstallMojo();
+ installMojo.setAmpLocation(new File(getAMPLocation(ampsLocation, ampModule)));
+ installMojo.setWarLocation(new File(warLocation));
+ installMojo.setForce(true);
+ try {
+ installMojo.execute();
+ } catch (MojoFailureException e) {
+ getLog().error(e);
+ }
+ }
+
+ /**
+ * Build the location of an AMP file.
+ *
+ * @param ampsLocation the location of the folder where the AMPs are located
+ * @param ampModule the {@link ModuleDependency} of the AMP to build its location
+ * @return the location of the AMP file
+ */
+ private String getAMPLocation(String ampsLocation, ModuleDependency ampModule) {
+ return String.format(AMP_LOCATION_PATTERN, ampsLocation, ampModule.getArtifactId(), ampModule.getVersion());
+ }
}
diff --git a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/BuildWarsMojo.java b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/BuildWarsMojo.java
new file mode 100644
index 00000000..153cac62
--- /dev/null
+++ b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/BuildWarsMojo.java
@@ -0,0 +1,96 @@
+/**
+ * Copyright (C) 2019 Alfresco Software Limited.
+ *
+ * This file is part of the Alfresco SDK.
+ *
+ * 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.
+ */
+package org.alfresco.maven.plugin;
+
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.ResolutionScope;
+
+import static org.twdata.maven.mojoexecutor.MojoExecutor.executionEnvironment;
+
+/**
+ * Alfresco Plugin mojo that is used when you want to build the Alfresco WARs without starting the server.
+ *
+ * @author Jose Luis Osorno - joseluis.osorno@ixxus.com
+ * @version 1.0
+ * @since 3.1.0
+ */
+@Mojo(name = "build-wars",
+ defaultPhase = LifecyclePhase.PACKAGE,
+ aggregator = true,
+ requiresDependencyResolution = ResolutionScope.TEST)
+public class BuildWarsMojo extends AbstractRunMojo {
+
+ @Override
+ public void execute() throws MojoExecutionException {
+ execEnv = executionEnvironment(
+ project,
+ session,
+ pluginManager
+ );
+
+ if (enableActivitiApp || enableActivitiAdmin) {
+ getLog().warn("*************************************************************************************************************");
+ getLog().warn("*");
+ getLog().warn("*");
+ getLog().warn("*");
+ getLog().warn("*");
+ getLog().warn("*");
+ getLog().warn("*");
+ getLog().warn("*");
+ getLog().warn("*");
+ getLog().warn("*\tWARNING" );
+ getLog().warn("*\tThe Activiti features in SDK 3.x are UNSUPPORTED.");
+ getLog().warn("*\tIt has been marked for deprecation (SDK 3.1) and will be removed in SDK 4.0.");
+ getLog().warn("*");
+ getLog().warn("*");
+ getLog().warn("*");
+ getLog().warn("*");
+ getLog().warn("*");
+ getLog().warn("*");
+ getLog().warn("*");
+ getLog().warn("*************************************************************************************************************");
+ }
+
+ if (enableSolr) {
+ unpackSolrConfig();
+ fixSolrHomePath();
+ copySolrCustomConfig();
+ replaceSolrConfigProperties();
+ installSolr10InLocalRepo();
+ }
+
+ if (enableTestProperties && enablePlatform) {
+ copyAlfrescoGlobalProperties();
+ renameAlfrescoGlobalProperties();
+ }
+
+ if (enablePlatform) {
+ buildPlatformWar();
+ }
+
+ if (enableShare) {
+ buildShareWar();
+ }
+
+ if (enableActivitiApp) {
+ buildActivitiAppWar();
+ }
+ }
+}
diff --git a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/InstallMojo.java b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/InstallMojo.java
index b53e25a4..4ca97688 100644
--- a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/InstallMojo.java
+++ b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/InstallMojo.java
@@ -26,9 +26,10 @@ import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
/**
+ *
* Performs a AMP to WAR overlay invoking the Alfresco Repository ModuleManagementTool.
* It therefore wraps and emulates the same WAR overlay performed by Alfresco MMT.
- *
+ *
* This goal will install the AMP file(s) found in ${ampLocation} onto the WAR (or exploded WAR) found in ${warLocation}
*
* @version $Id:$
diff --git a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/IntegrationTestMojo.java b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/IntegrationTestMojo.java
index 6c36f76e..b2dbc520 100644
--- a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/IntegrationTestMojo.java
+++ b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/IntegrationTestMojo.java
@@ -35,12 +35,13 @@ import java.util.Properties;
import static org.twdata.maven.mojoexecutor.MojoExecutor.*;
/**
+ *
* Alfresco Plugin mojo that are used when you want to run Integration Tests.
* It will package up all the Integration Test classes and execute contained
* tests with the Maven Failsafe plugin. The test classes will be added
* to the platform war so they can be executed remotely via
- * the ${@link org.alfresco.rad.test.AlfrescoTestRunner}
- *
+ * the AlfrescoTestRunner.
+ *
* The Alfresco RAD module is also added to the Platform WAR so
* the Alfresco Test runner classes are available.
*
diff --git a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/RefreshMojo.java b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/RefreshMojo.java
index 26427eb0..b0ff0ea8 100644
--- a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/RefreshMojo.java
+++ b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/RefreshMojo.java
@@ -21,11 +21,12 @@ import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
/**
+ *
* Refresh Alfresco Repo and Share Mojo.
* Will refresh the Web Script container so new and changed
* Spring Surf Web Scripts are detected.
* Will also clear the dependency caches for web resources (CSS, JS, etc).
- *
+ *
* It is important to execute the refresh calls in the compile phase,
* otherwise the files will be copied after this and the refresh calls
* will not be recognized.
diff --git a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/RefreshRepoWebappMojo.java b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/RefreshRepoWebappMojo.java
index c741c90a..9e38ab9b 100644
--- a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/RefreshRepoWebappMojo.java
+++ b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/RefreshRepoWebappMojo.java
@@ -21,10 +21,11 @@ import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
/**
+ *
* Refresh Alfresco Repository (alfresco.war) Mojo.
* Will refresh the Web Script container so new and changed
* Web Scripts are detected.
- *
+ *
* It is important to execute the refresh calls in the compile phase,
* otherwise the files will be copied after this and the refresh calls
* will not be recognized.
diff --git a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/RefreshShareWebappMojo.java b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/RefreshShareWebappMojo.java
index 157e1898..30b40567 100644
--- a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/RefreshShareWebappMojo.java
+++ b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/RefreshShareWebappMojo.java
@@ -21,11 +21,12 @@ import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
/**
+ *
* Refresh Alfresco Share (share.war) Mojo.
* Will refresh the Web Script container so new and changed
* Spring Surf Web Scripts are detected.
* Will also clear the dependency caches for web resources (CSS, JS, etc).
- *
+ *
* It is important to execute the refresh calls in the compile phase,
* otherwise the files will be copied after this and the refresh calls
* will not be recognized.
diff --git a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/VersionMojo.java b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/VersionMojo.java
index 234d57fa..41d363c9 100644
--- a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/VersionMojo.java
+++ b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/VersionMojo.java
@@ -28,8 +28,7 @@ import org.apache.maven.project.MavenProject;
/**
* Removes -SNAPSHOT suffix from the version number (if present), optionally replacing it with a timestamp.
- * The result is provided in the Maven property ${noSnapshotVersion} (name can be changed using
- * myCustomVersion>).
+ * The result is provided in the Maven property ${noSnapshotVersion}.
* This feature is mostly needed to avoid Alfresco failing when installing AMP modules with non-numeric
* versions.
*
@@ -67,7 +66,7 @@ public class VersionMojo extends AbstractMojo {
/**
* Allows to append a custom (numeric) value to the current artifact's version,
* i.e. appending the SCM build number can be accomplished defining
- * ${buildnumber} in the plugin
+ * <customVersionSuffix>${buildnumber}</customVersionSuffix> in the plugin
* configuration.
*
* @parameter property="maven.alfresco.customVersionSuffix"
diff --git a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/archiver/AmpUnArchiver.java b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/archiver/AmpUnArchiver.java
index 58cdd1ec..8be254a3 100644
--- a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/archiver/AmpUnArchiver.java
+++ b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/archiver/AmpUnArchiver.java
@@ -14,7 +14,7 @@ import org.codehaus.plexus.component.annotations.Requirement;
import org.codehaus.plexus.util.xml.Xpp3Dom;
/**
* This class provides AMP unpacking support for projects depending on AMPs
- * This allows for example AMPs to be specified as in the maven-war-plugin
+ * This allows for example AMPs to be specified as <overlay> in the maven-war-plugin
* @author mindthegab
*
*/
diff --git a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/config/ModuleDependency.java b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/config/ModuleDependency.java
index 7e2690e8..5d5d3f04 100644
--- a/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/config/ModuleDependency.java
+++ b/plugins/alfresco-maven-plugin/src/main/java/org/alfresco/maven/plugin/config/ModuleDependency.java
@@ -21,15 +21,18 @@ package org.alfresco.maven.plugin.config;
import org.apache.commons.lang.StringUtils;
/**
+ *
* Defines an Alfresco extension module dependency (JAR or AMP) to be
* overlayed on an Alfresco webapp file.
- *
+ *
+ *
* This is so we can skip the WAR projects in the AIO project,
* and so we can include the Share Services AMP when running
* with a simple platform JAR.
- *
* Tomcat Webapp used in Embedded Tomcat Maven plugin configuration.
* These are custom webapps that you would want to include for some reason
* (The {webapp artifact}.war need to be available in a Maven Repo).
* Note. the standard webapps are included with plugin properties such as enablePlatform and enableShare.
- *