28 Commits
Author SHA1 Message Date
brian.long 72e7e48e1b v1.1.0 pom 2022-04-25 21:46:38 -04:00
brian.long de21f4fc0d Merge branch 'develop' into stable 2022-04-25 21:46:12 -04:00
brian.long aa120eae1b allow AMP with warning 2022-04-25 21:44:19 -04:00
brian.long c9f56d7187 renamed artifact to amp-maven-plugin 2022-04-25 21:44:06 -04:00
brian.long f1f3362f00 v1.0.7 pom 2022-04-04 17:52:48 -04:00
brian.long 846e02a439 Merge branch 'develop' into stable 2022-04-04 17:52:32 -04:00
brian.long de45b98652 added classifier support 2022-04-04 17:52:24 -04:00
brian.long 52aac1f24b v1.0.6 pom 2021-10-29 11:18:56 -04:00
brian.long 6f1e386a63 Merge branch 'develop' into stable 2021-10-29 11:18:51 -04:00
brian.long b25646c45e fixed NPE 2021-10-29 11:18:25 -04:00
brian.long 141a22941b excluding deps that are children of provided deps 2021-10-29 11:11:04 -04:00
brian.long 4ba804039d fixed true/false flip 2021-10-29 10:09:59 -04:00
brian.long 41d8067d09 fixed exclusion of all due to self ref 2021-10-29 10:06:16 -04:00
brian.long f2c4b0b3a7 https repo 2021-10-29 10:00:00 -04:00
brian.long 80521c89a1 fixed due to unpredictable dependency ordering 2021-10-29 09:56:52 -04:00
brian.long f116e493a2 ignoring AMPs from AMP packing 2021-10-29 09:10:03 -04:00
brian.long eff0b43059 Merge branch 'develop' into stable 2021-06-02 14:15:32 -04:00
brian.long 05adb5f119 excluding this project itself 2021-06-02 14:15:10 -04:00
brian.long 85c2fa9d96 v1.0.5 pom 2021-06-02 08:34:28 -04:00
brian.long ad2f0af0a3 Merge branch 'develop' into stable 2021-06-02 08:31:04 -04:00
brian.long b0baa443ca added parent search 2021-06-02 08:30:23 -04:00
brian.long ceef88aa8d added module cache to exclude dependencies of modules 2021-06-02 08:19:46 -04:00
brian.long 7038122a2c v1.0.4 pom 2021-05-19 16:15:01 -04:00
brian.long d0cb229d81 Merge branch 'develop' into stable 2021-05-19 16:14:26 -04:00
brian.long dec44cf623 fixed zip streaming 2021-05-19 16:14:12 -04:00
brian.long e3626bdbf8 v1.0.3 pom 2021-05-19 11:16:01 -04:00
brian.long 85dba196a0 Merge branch 'develop' into stable 2021-05-19 11:15:19 -04:00
brian.long 8ede035b2a using stream instead of reader 2021-05-19 11:15:08 -04:00
6 changed files with 180 additions and 26 deletions
+3
View File
@@ -7,3 +7,6 @@ pom.xml.versionsBackup
.project
.classpath
# Visual Studio Code
.factorypath
+4 -5
View File
@@ -7,8 +7,8 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.inteligr8.alfresco</groupId>
<artifactId>amp-plugin</artifactId>
<version>1.0.2</version>
<artifactId>amp-maven-plugin</artifactId>
<version>1.1.0</version>
<packaging>maven-plugin</packaging>
<name>A Maven plugin to generate AMP files</name>
@@ -91,7 +91,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>3.6.0</version>
<version>3.6.1</version>
<configuration>
<goalPrefix>amp</goalPrefix>
</configuration>
@@ -117,9 +117,8 @@
<repository>
<id>inteligr8-releases</id>
<name>Inteligr8 Releases</name>
<url>http://repos.inteligr8.com/nexus/repository/inteligr8-public</url>
<url>https://repos.inteligr8.com/nexus/repository/inteligr8-public</url>
</repository>
</distributionManagement>
</project>
@@ -6,7 +6,10 @@ import java.io.FileInputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
@@ -23,15 +26,32 @@ import org.eclipse.aether.resolution.ArtifactResult;
public class AmpDependencyFilter implements DependencyFilter {
private final Pattern modulePropertiesPattern = Pattern.compile("^alfresco/module/[^/]+/module\\.properties$");
private final String moduleExtension = "amp";
private final Set<String> ignoreDependenciesOfParentScopes = new HashSet<>(Arrays.asList("provided", "system"));
private final int streamBufferSize = 16 * 1024;
private final Log log;
private final Charset charset;
private final ArtifactResolutionCallback callback;
private final String projectModuleId;
private Set<String> moduleIds = new HashSet<String>();
private Set<String> notModuleIds = new HashSet<String>();
public AmpDependencyFilter(Log log, String charsetName, ArtifactResolutionCallback callback) {
this.log = log;
this.charset = Charset.forName(charsetName);
this.callback = callback;
this.projectModuleId = this.getModuleId(this.callback.getProject().getArtifact());
}
private String getModuleId(org.apache.maven.artifact.Artifact artifact) {
return artifact.getGroupId() + "." + artifact.getArtifactId();
}
private String getModuleId(Artifact artifact) {
return artifact.getGroupId() + "." + artifact.getArtifactId();
}
@Override
@@ -39,12 +59,74 @@ public class AmpDependencyFilter implements DependencyFilter {
Artifact artifact = node.getArtifact();
if (this.log.isDebugEnabled())
this.log.debug("Checking dependency: " + artifact.getArtifactId());
String possibleModuleId = this.getModuleId(artifact);
if (this.projectModuleId.equals(possibleModuleId)) {
// always include project itself, even if it is a module
return true;
}
try {
if (this.isOrIsInAlfrescoModule(possibleModuleId, node, parents.iterator())) {
if (this.log.isDebugEnabled())
this.log.debug("Not packaging library; detected as Alfresco Module or as dependency to other Alfresco Module: " + artifact.getArtifactId());
return false;
}
} catch (NotInScopeException nise) {
if (this.log.isDebugEnabled())
this.log.debug("Not packaging library; detected as provided by another dependency [" + nise.getNotInScopeParentArtifact() + "]: " + artifact.getArtifactId());
return false;
}
return true;
}
private boolean isOrIsInAlfrescoModule(String possibleModuleId, DependencyNode depNode, Iterator<DependencyNode> parents) throws NotInScopeException {
Artifact artifact = depNode.getArtifact();
if (this.projectModuleId.equals(possibleModuleId)) {
return false;
} else if (depNode.getDependency() != null && this.ignoreDependenciesOfParentScopes.contains(depNode.getDependency().getScope())) {
throw new NotInScopeException(artifact);
} else if (this.moduleIds.contains(possibleModuleId)) {
if (this.log.isDebugEnabled())
this.log.debug("Detected as Alfresco Module: " + artifact.getArtifactId());
return true;
} else if (this.notModuleIds.contains(possibleModuleId)) {
return false;
} else if (parents != null && parents.hasNext()) {
DependencyNode parentNode = parents.next();
String parentModuleId = this.getModuleId(parentNode.getArtifact());
if (this.log.isDebugEnabled())
this.log.debug("Checking parent dependency: " + artifact.getArtifactId());
if (this.isOrIsInAlfrescoModule(parentModuleId, parentNode, parents)) {
if (this.log.isDebugEnabled())
this.log.debug("Detected as dependency to other Alfresco Module: " + artifact.getArtifactId());
return true;
}
}
// never seen this artifact or its parents
return this.isAlfrescoModule(possibleModuleId, depNode);
}
private boolean isAlfrescoModule(String possibleModuleId, DependencyNode depNode) {
Artifact artifact = depNode.getArtifact();
if (this.moduleExtension.equalsIgnoreCase(artifact.getExtension())) {
if (this.log.isDebugEnabled())
this.log.debug("Detected as Alfresco Module: " + artifact.getArtifactId());
this.moduleIds.add(possibleModuleId);
return true;
}
File file = artifact.getFile();
try {
if (file == null) {
if (this.log.isDebugEnabled())
this.log.debug("Resolving dependency: " + artifact.getArtifactId());
ArtifactResult result = this.callback.resolveArtifact(new ArtifactRequest(node));
this.log.debug("Resolving dependency to get file: " + artifact.getArtifactId());
ArtifactResult result = this.callback.resolveArtifact(new ArtifactRequest(depNode));
if (result.isMissing() || !result.isResolved())
throw new ArtifactResolutionException(Arrays.asList(result));
artifact = result.getArtifact();
@@ -53,23 +135,25 @@ public class AmpDependencyFilter implements DependencyFilter {
if (this.log.isDebugEnabled())
this.log.debug("Checking dependency file: " + file);
if (this.isAlfrescoModule(file)) {
if (this.isAlfrescoModuleJar(file)) {
this.moduleIds.add(possibleModuleId);
if (this.log.isInfoEnabled())
this.log.info("Not packaging JAR; detected as Alfresco JAR Module: " + node.getArtifact().getArtifactId());
return false;
this.log.info("Detected as Alfresco Module: " + artifact.getArtifactId());
return true;
}
return true;
this.notModuleIds.add(possibleModuleId);
return false;
} catch (ArtifactResolutionException are) {
this.log.warn("An artifact could not be resolved; assuming it is not an Alfresco module and continuing");
return true;
return false;
} catch (IOException ie) {
this.log.warn("An I/O issue occurred while inspecting a JAR to see if it is an Alfresco module; assuming it isn't and continuing");
return true;
return false;
}
}
}
private boolean isAlfrescoModule(File file) throws IOException {
public boolean isAlfrescoModuleJar(File file) throws IOException {
FileInputStream fistream = new FileInputStream(file);
BufferedInputStream bistream = new BufferedInputStream(fistream, this.streamBufferSize);
ZipInputStream zstream = new ZipInputStream(bistream, this.charset);
@@ -1,9 +1,10 @@
package com.inteligr8.alfresco.amp;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
@@ -62,6 +63,9 @@ public class AmpMojo extends AbstractMojo implements ArtifactResolutionCallback
@Requirement
private ArtifactResolver artifactResolver;
@Parameter( property = "classifier", required = false )
protected String classifier;
@Parameter( property = "outputFile", required = true, defaultValue = "${project.build.directory}/${project.artifactId}-${project.version}.amp" )
protected String outputAmpFile;
@@ -89,14 +93,26 @@ public class AmpMojo extends AbstractMojo implements ArtifactResolutionCallback
@Parameter( property = "skip", required = true, defaultValue = "false" )
protected boolean skip;
@Override
public MavenProject getProject() {
return this.project;
}
public void execute() throws MojoExecutionException {
if (this.skip) {
this.getLog().debug("Skipped AMP packaging");
this.getLog().debug("Skipped AMP package");
return;
}
this.getLog().debug("Executing AMP packaging");
this.classifier = StringUtils.trimToNull(this.classifier);
if (this.classifier != null) {
this.getLog().info("A classifier was specified; injecting classifier into module and output artifact names");
this.outputAmpFile = this.injectClassifier(this.outputAmpFile);
this.moduleJarFile = this.injectClassifier(this.moduleJarFile);
}
this.normalize();
File ampFile = this.getOutputFile();
@@ -128,6 +144,22 @@ public class AmpMojo extends AbstractMojo implements ArtifactResolutionCallback
}
}
private String injectClassifier(String filename) {
int lastDot = filename.lastIndexOf('.');
if (lastDot < 0)
throw new IllegalArgumentException();
int lastDash = filename.lastIndexOf('-', lastDot-1);
if (lastDash > 0) {
// see if the classifier was already specified
String possibleClassifier = filename.substring(lastDash+1, lastDot);
if (this.classifier.equals(possibleClassifier))
return filename;
}
return filename.substring(0, lastDot) + '-' + this.classifier + filename.substring(lastDot);
}
private void normalize() {
this.outputAmpFile = StringUtils.trimToNull(this.outputAmpFile);
this.moduleJarFile = StringUtils.trimToNull(this.moduleJarFile);
@@ -213,9 +245,9 @@ public class AmpMojo extends AbstractMojo implements ArtifactResolutionCallback
for (FileSet fileset : this.libDirectories)
libcount += this.zipFileset(zstream, fileset, "lib");
if (libcount == 0)
throw new IllegalStateException("There are no external libraries to include, making an AMP pointless");
this.getLog().warn("There are no external libraries to include; an AMP is not recommended");
}
private List<String> getExclusions() {
@@ -272,11 +304,12 @@ public class AmpMojo extends AbstractMojo implements ArtifactResolutionCallback
zstream.putNextEntry(new ZipEntry(filename));
File file = new File(directory, filename);
FileReader freader = new FileReader(file);
FileInputStream fistream = new FileInputStream(file);
BufferedInputStream bistream = new BufferedInputStream(fistream, this.streamBufferSize);
try {
IOUtil.copy(freader, zstream);
IOUtil.copy(bistream, zstream);
} finally {
freader.close();
bistream.close();
}
zstream.closeEntry();
@@ -298,13 +331,14 @@ public class AmpMojo extends AbstractMojo implements ArtifactResolutionCallback
zstream.putNextEntry(new ZipEntry(targetPath + file.getName()));
FileReader freader = new FileReader(file);
FileInputStream fistream = new FileInputStream(file);
BufferedInputStream bistream = new BufferedInputStream(fistream, this.streamBufferSize);
try {
IOUtil.copy(freader, zstream);
IOUtil.copy(bistream, zstream);
} finally {
freader.close();
bistream.close();
}
zstream.closeEntry();
}
@@ -1,11 +1,14 @@
package com.inteligr8.alfresco.amp;
import org.apache.maven.project.MavenProject;
import org.eclipse.aether.resolution.ArtifactRequest;
import org.eclipse.aether.resolution.ArtifactResolutionException;
import org.eclipse.aether.resolution.ArtifactResult;
public interface ArtifactResolutionCallback {
MavenProject getProject();
ArtifactResult resolveArtifact(ArtifactRequest artifactRequest) throws ArtifactResolutionException;
}
@@ -0,0 +1,31 @@
package com.inteligr8.alfresco.amp;
import org.eclipse.aether.artifact.Artifact;
public class NotInScopeException extends Exception {
private static final long serialVersionUID = 8055701654626788700L;
private final Artifact notInScopeParentArtifact;
private Artifact impactedChildArtifact;
public NotInScopeException(Artifact notInScopeParentArtifact) {
super("The '" + notInScopeParentArtifact.getArtifactId() + "' artifact is not scope");
this.notInScopeParentArtifact = notInScopeParentArtifact;
}
public NotInScopeException(Artifact notInScopeParentArtifact, Artifact impactedChildArtifact) {
super("The '" + notInScopeParentArtifact.getArtifactId() + "' artifact is not scope, impacting the '" + impactedChildArtifact.getArtifactId() + "' artifact");
this.notInScopeParentArtifact = notInScopeParentArtifact;
this.impactedChildArtifact = impactedChildArtifact;
}
public Artifact getNotInScopeParentArtifact() {
return this.notInScopeParentArtifact;
}
public Artifact getImpactedChildArtifact() {
return this.impactedChildArtifact;
}
}