Merge pull request #531 from Alfresco/bug/sdk-3-bugfixing

BUGFIX - SDK 3.0.1 bug fixing
This commit is contained in:
Ole Hejlskov 2019-01-28 12:36:36 +01:00 committed by GitHub
commit 1d551d1895
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
31 changed files with 548 additions and 66 deletions

View File

@ -35,6 +35,11 @@
<source>src/main/assembly/file-mapping.properties</source>
<filtered>false</filtered>
</file>
<!-- Add module-specific log4j.properties configuration at top level in the AMP -->
<file>
<source>src/main/resources/alfresco/module/${project.artifactId}/log4j.properties</source>
<filtered>false</filtered>
</file>
</files>
<fileSets>

View File

@ -35,6 +35,11 @@
<source>src/main/assembly/file-mapping.properties</source>
<filtered>false</filtered>
</file>
<!-- Add module-specific log4j.properties configuration at top level in the AMP -->
<file>
<source>src/main/resources/alfresco/module/${project.artifactId}/log4j.properties</source>
<filtered>false</filtered>
</file>
</files>
<fileSets>

View File

@ -55,10 +55,9 @@ public class DemoComponentIT extends AbstractAlfrescoIT {
DemoComponent demoComponent = (DemoComponent) getApplicationContext().getBean("${package}.DemoComponent");
NodeRef companyHome = demoComponent.getCompanyHome();
assertNotNull(companyHome);
String companyHomeName = (String) getServiceRegistry().getNodeService().getProperty(
companyHome, ContentModel.PROP_NAME);
assertNotNull(companyHomeName);
assertEquals("Company Home", companyHomeName);
String companyHomePath = getServiceRegistry().getNodeService().getPath(companyHome).toPrefixString(getServiceRegistry().getNamespaceService());
assertNotNull(companyHomePath);
assertEquals("/app:company_home", companyHomePath);
}
@Test

View File

@ -336,6 +336,56 @@
</configuration>
</plugin>
<!-- Compress JavaScript files and store as *-min.js -->
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>yuicompressor-maven-plugin</artifactId>
<version>1.5.1</version>
<executions>
<!-- Compress the JS files under the assembly folder -->
<execution>
<id>compress-assembly</id>
<goals>
<goal>compress</goal>
</goals>
<configuration>
<sourceDirectory>${project.basedir}/src/main/assembly/web</sourceDirectory>
<outputDirectory>${project.basedir}/src/main/assembly/web</outputDirectory>
<excludes>
<exclude>**/webscripts/**</exclude>
<exclude>**/site-webscripts/**</exclude>
<exclude>**/META-INF/**</exclude>
<exclude>**/*.lib.js</exclude>
<exclude>**/*.css</exclude>
<exclude>**/*-min.js</exclude>
<exclude>**/*-min.css</exclude>
</excludes>
<force>true</force>
<jswarn>false</jswarn>
</configuration>
</execution>
<!-- Compress the JS files under the resources folder -->
<execution>
<id>compress-resources</id>
<goals>
<goal>compress</goal>
</goals>
<configuration>
<excludes>
<exclude>**/webscripts/**</exclude>
<exclude>**/site-webscripts/**</exclude>
<exclude>**/*.lib.js</exclude>
<exclude>**/*.css</exclude>
<exclude>**/*-min.js</exclude>
<exclude>**/*-min.css</exclude>
</excludes>
<force>true</force>
<jswarn>false</jswarn>
</configuration>
</execution>
</executions>
</plugin>
<!-- Hot reloading with JRebel -->
<plugin>
<groupId>org.zeroturnaround</groupId>

View File

@ -162,6 +162,56 @@
</configuration>
</plugin>
<!-- Compress JavaScript files and store as *-min.js -->
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>yuicompressor-maven-plugin</artifactId>
<version>1.5.1</version>
<executions>
<!-- Compress the JS files under the assembly folder -->
<execution>
<id>compress-assembly</id>
<goals>
<goal>compress</goal>
</goals>
<configuration>
<sourceDirectory>${project.basedir}/src/main/assembly/web</sourceDirectory>
<outputDirectory>${project.basedir}/src/main/assembly/web</outputDirectory>
<excludes>
<exclude>**/webscripts/**</exclude>
<exclude>**/site-webscripts/**</exclude>
<exclude>**/META-INF/**</exclude>
<exclude>**/*.lib.js</exclude>
<exclude>**/*.css</exclude>
<exclude>**/*-min.js</exclude>
<exclude>**/*-min.css</exclude>
</excludes>
<force>true</force>
<jswarn>false</jswarn>
</configuration>
</execution>
<!-- Compress the JS files under the resources folder -->
<execution>
<id>compress-resources</id>
<goals>
<goal>compress</goal>
</goals>
<configuration>
<excludes>
<exclude>**/webscripts/**</exclude>
<exclude>**/site-webscripts/**</exclude>
<exclude>**/*.lib.js</exclude>
<exclude>**/*.css</exclude>
<exclude>**/*-min.js</exclude>
<exclude>**/*-min.css</exclude>
</excludes>
<force>true</force>
<jswarn>false</jswarn>
</configuration>
</execution>
</executions>
</plugin>
<!--
Build an AMP if 3rd party libs are needed by the extensions
JARs are the default artifact produced in your modules, if you want to build an amp for each module

View File

@ -35,6 +35,11 @@
<source>src/main/assembly/file-mapping.properties</source>
<filtered>false</filtered>
</file>
<!-- Add module-specific log4j.properties configuration at top level in the AMP -->
<file>
<source>src/main/resources/alfresco/module/${project.artifactId}/log4j.properties</source>
<filtered>false</filtered>
</file>
</files>
<fileSets>

View File

@ -0,0 +1 @@
# Add here module-specific custom log4j.properties configuration

View File

@ -95,6 +95,56 @@
</configuration>
</plugin>
<!-- Compress JavaScript files and store as *-min.js -->
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>yuicompressor-maven-plugin</artifactId>
<version>1.5.1</version>
<executions>
<!-- Compress the JS files under the assembly folder -->
<execution>
<id>compress-assembly</id>
<goals>
<goal>compress</goal>
</goals>
<configuration>
<sourceDirectory>${project.basedir}/src/main/assembly/web</sourceDirectory>
<outputDirectory>${project.basedir}/src/main/assembly/web</outputDirectory>
<excludes>
<exclude>**/webscripts/**</exclude>
<exclude>**/site-webscripts/**</exclude>
<exclude>**/META-INF/**</exclude>
<exclude>**/*.lib.js</exclude>
<exclude>**/*.css</exclude>
<exclude>**/*-min.js</exclude>
<exclude>**/*-min.css</exclude>
</excludes>
<force>true</force>
<jswarn>false</jswarn>
</configuration>
</execution>
<!-- Compress the JS files under the resources folder -->
<execution>
<id>compress-resources</id>
<goals>
<goal>compress</goal>
</goals>
<configuration>
<excludes>
<exclude>**/webscripts/**</exclude>
<exclude>**/site-webscripts/**</exclude>
<exclude>**/*.lib.js</exclude>
<exclude>**/*.css</exclude>
<exclude>**/*-min.js</exclude>
<exclude>**/*-min.css</exclude>
</excludes>
<force>true</force>
<jswarn>false</jswarn>
</configuration>
</execution>
</executions>
</plugin>
<!-- Build an AMP if 3rd party libs are needed by the extension -->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>

View File

@ -35,6 +35,11 @@
<source>src/main/assembly/file-mapping.properties</source>
<filtered>false</filtered>
</file>
<!-- Add module-specific log4j.properties configuration at top level in the AMP -->
<file>
<source>src/main/resources/alfresco/module/${project.artifactId}/log4j.properties</source>
<filtered>false</filtered>
</file>
</files>
<fileSets>

View File

@ -0,0 +1 @@
# Add here module-specific custom log4j.properties configuration

View File

@ -51,7 +51,7 @@ public class SpringContextHolder implements ApplicationContextAware {
/**
* Return the singleton instance
*
* @return
* @return the singleton instance
*/
public static SpringContextHolder Instance() {
return springContextHolderInstance;

View File

@ -46,6 +46,7 @@ import javax.xml.parsers.ParserConfigurationException;
import java.io.*;
/**
* <p>
* 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.
* <p/>
* </p>
* <p>
* 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.
* <p/>
* </p>
* Integration testing framework donated by Zia Consulting
*
* @author Bindu Wavell <bindu@ziaconsulting.com>
* @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();

View File

@ -24,14 +24,15 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* <p>
* 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.
* <p/>
* </p>
* Integration testing framework donated by Zia Consulting.
*
* @author Bindu Wavell <bindu@ziaconsulting.com>
* @author Bindu Wavell (bindu@ziaconsulting.com)
* @since 3.0
*/
@Target(ElementType.TYPE)

View File

@ -35,14 +35,15 @@ import java.util.List;
import java.util.Map;
/**
* <p>
* 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.
* <p/>
* </p>
* Integration testing framework donated by Zia Consulting.
*
* @author Bindu Wavell <bindu@ziaconsulting.com>
* @author Bindu Wavell (bindu@ziaconsulting.com)
* @author martin.bergljung@alfresco.com (some editing)
* @since 3.0
*/

View File

@ -140,6 +140,11 @@
<artifactId>zt-zip</artifactId>
<version>1.11</version>
</dependency>
<dependency>
<groupId>de.schlichtherle.truezip</groupId>
<artifactId>truezip-kernel</artifactId>
<version>7.7.9</version>
</dependency>
</dependencies>
<reporting>

View File

@ -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

View File

@ -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<Pair<String, String>> TOMCAT_DEPENDENCIES = new ImmutableSet.Builder<Pair<String, String>>()
.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 <code>true</code> if Tomcat is already running, <code>false</code> 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 {
}
/**
* <p>
* Replaces web.xml where applicable in platform webapp (alfresco.war),
* commenting out the security-constraints.
* <p/>
* </p>
* 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 <platformModules> } 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 <shareModules> } 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 <activitiModules> } 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<ModuleDependency> 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/<warName>-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 <code>tomcatVersion</code> 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<Dependency> tomcatPluginDependencies) {
for(Pair<String, String> 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<ModuleDependency> 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());
}
}

View File

@ -0,0 +1,96 @@
/**
* Copyright (C) 2019 Alfresco Software Limited.
* <p/>
* This file is part of the Alfresco SDK.
* <p/>
* 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
* <p/>
* http://www.apache.org/licenses/LICENSE-2.0
* <p/>
* 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();
}
}
}

View File

@ -26,9 +26,10 @@ import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
/**
* <p>
* Performs a AMP to WAR overlay invoking the Alfresco Repository ModuleManagementTool.
* It therefore wraps and emulates the same WAR overlay performed by Alfresco MMT.
* <p/>
* </p>
* This goal will install the AMP file(s) found in ${ampLocation} onto the WAR (or exploded WAR) found in ${warLocation}
*
* @version $Id:$

View File

@ -35,12 +35,13 @@ import java.util.Properties;
import static org.twdata.maven.mojoexecutor.MojoExecutor.*;
/**
* <p>
* 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}
* <p/>
* the AlfrescoTestRunner.
* </p>
* The Alfresco RAD module is also added to the Platform WAR so
* the Alfresco Test runner classes are available.
*

View File

@ -21,11 +21,12 @@ import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
/**
* <p>
* 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).
* <p/>
* </p>
* 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.

View File

@ -21,10 +21,11 @@ import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
/**
* <p>
* Refresh Alfresco Repository (alfresco.war) Mojo.
* Will refresh the Web Script container so new and changed
* Web Scripts are detected.
* <p/>
* </p>
* 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.

View File

@ -21,11 +21,12 @@ import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
/**
* <p>
* 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).
* <p/>
* </p>
* 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.

View File

@ -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
* <propertyName>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
* <customVersionSuffix>${buildnumber}</customVersionSuffix> in the plugin
* &lt;customVersionSuffix&gt;${buildnumber}&lt;/customVersionSuffix&gt; in the plugin
* configuration.
*
* @parameter property="maven.alfresco.customVersionSuffix"

View File

@ -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 <overlay> in the maven-war-plugin
* This allows for example AMPs to be specified as &lt;overlay&gt; in the maven-war-plugin
* @author mindthegab
*
*/

View File

@ -21,15 +21,18 @@ package org.alfresco.maven.plugin.config;
import org.apache.commons.lang.StringUtils;
/**
* <p>
* Defines an Alfresco extension module dependency (JAR or AMP) to be
* overlayed on an Alfresco webapp file.
* <p/>
* </p>
* <p>
* 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.
* <p/>
* </p>
* <p>
* This class is used by the RunMojo class.
* <p/>
* </p>
* Alfresco Maven Plugin config looks something like this:
* <pre>
* {@code

View File

@ -19,8 +19,9 @@
package org.alfresco.maven.plugin.config;
/**
* <p>
* Tomcat Dependency used in Embedded Tomcat Maven plugin configuration.
* <p/>
* </p>
* Alfresco Maven Plugin config looks something like this:
* <pre>
* {@code

View File

@ -18,11 +18,12 @@
package org.alfresco.maven.plugin.config;
/**
* <p>
* 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.
* <p/>
* </p>
* Alfresco Maven Plugin config looks something like this:
* <pre>
* {@code

53
pom.xml
View File

@ -152,6 +152,59 @@
<skip>${skipTests}</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<configuration>
<tags>
<tag>
<name>goal</name>
<placement>a</placement>
<head>Goal:</head>
</tag>
<tag>
<name>requiresDependencyResolution</name>
<placement>a</placement>
<head>Requires Dependency Resolution:</head>
</tag>
<tag>
<name>description</name>
<placement>a</placement>
<head>Description:</head>
</tag>
<tag>
<name>phase</name>
<placement>a</placement>
<head>Phase:</head>
</tag>
<tag>
<name>requiresProject</name>
<placement>a</placement>
<head>Requires Project:</head>
</tag>
<tag>
<name>threadSafe</name>
<placement>a</placement>
<head>Thread-Safe:</head>
</tag>
<tag>
<name>required</name>
<placement>a</placement>
<head>Required:</head>
</tag>
<tag>
<name>readonly</name>
<placement>a</placement>
<head>Read only:</head>
</tag>
<tag>
<name>parameter</name>
<placement>a</placement>
<head>Parameter:</head>
</tag>
</tags>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<extensions>