FELIX-3358 : Enhance the maven-scr-plugin to be compatible with recent Maven/Eclipse integrations
FELIX-3643 : Use BuildContext for scanning changed files
Apply patches from Robert Munteanu
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1380141 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/Log.java b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/Log.java
index ec679cb..33701e9 100644
--- a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/Log.java
+++ b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/Log.java
@@ -109,7 +109,6 @@
*/
void warn( String content );
-
/**
* Send a message (and accompanying exception) to the user in the <b>warn</b> error level.
* <br/>
@@ -121,6 +120,18 @@
*/
void warn( String content, String location, int lineNumber );
+ /**
+ * Send a message (and accompanying exception) to the user in the <b>warn</b> error level.
+ * <br/>
+ * The error's stacktrace will be output when this error level is enabled.
+ *
+ * @param content
+ * @param location The location at which the error occurred
+ * @param lineNumber The line number at which the error occurred
+ * @param columnNumber The column number at which the error occurred
+ */
+ void warn( String content, String location, int lineNumber, int columnNumber );
+
/**
* Send a message (and accompanying exception) to the user in the <b>warn</b> error level.
@@ -168,6 +179,18 @@
*/
void error( String content, String location, int lineNumber );
+ /**
+ * Send a message (and accompanying exception) to the user in the <b>error</b> error level.
+ * <br/>
+ * The error's stacktrace will be output when this error level is enabled.
+ *
+ * @param content
+ * @param location The location at which the error occurred
+ * @param lineNumber The line number at which the error occurred
+ * @param columnNumber The column number at which the error occurred
+ */
+ void error( String content, String location, int lineNumber, int columnNumber );
+
/**
* Send a message (and accompanying exception) to the user in the <b>error</b> error level.
diff --git a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/Result.java b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/Result.java
index f38a4f9..98911b2 100644
--- a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/Result.java
+++ b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/Result.java
@@ -18,6 +18,7 @@
*/
package org.apache.felix.scrplugin;
+import java.util.ArrayList;
import java.util.List;
@@ -32,6 +33,9 @@
/** The list of scr files. */
private List<String> scrFiles;
+ /** The list of processed source files. */
+ private List<String> processedSourceFiles = new ArrayList<String>();
+
/**
* Set the list of metatype files
*/
@@ -47,6 +51,16 @@
}
/**
+ * Adds a source file to the list of processed source files
+ *
+ * @param source the processed source file
+ */
+ public void addProcessedSourceFile(String processedSourceFile) {
+
+ this.processedSourceFiles.add(processedSourceFile);
+ }
+
+ /**
* Return a list of generated metatype files
* @return A list of relative paths or <code>null</code>
*/
@@ -61,4 +75,14 @@
public List<String> getScrFiles() {
return scrFiles;
}
+
+
+ /**
+ * Returns a list of processed source files
+ *
+ * @return the list of processed source files
+ */
+ public List<String> getProcessedSourceFiles() {
+ return processedSourceFiles;
+ }
}
diff --git a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java
index 5f59908..e1bf594 100644
--- a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java
+++ b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java
@@ -148,9 +148,12 @@
this.scanner = new ClassScanner(logger, iLog, project, aProcessor);
final List<ClassDescription> scannedDescriptions = scanner.scanSources();
+ // create the result to hold the list of processed source files
+ final Result result = new Result();
final List<ComponentContainer> processedContainers = new ArrayList<ComponentContainer>();
for (final ClassDescription desc : scannedDescriptions) {
this.logger.debug("Processing component class " + desc.getSource());
+ result.addProcessedSourceFile(desc.getSource());
// check if there is more than one component definition
if (desc.getDescriptions(ComponentDescription.class).size() > 1) {
@@ -259,9 +262,7 @@
throw new SCRDescriptorFailureException("SCR Descriptor parsing had failures (see log)");
}
- // create result and generate files
- final Result result = new Result();
-
+ // and generate files
result.setMetatypeFiles(MetaTypeIO.generateDescriptors(module, this.options, this.logger));
result.setScrFiles(ComponentDescriptorIO.generateDescriptorFiles(module, this.options, logger));
diff --git a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/IssueLog.java b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/IssueLog.java
index 8e7819c..c132fb7 100644
--- a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/IssueLog.java
+++ b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/IssueLog.java
@@ -68,9 +68,9 @@
while (depWarnings.hasNext()) {
final Entry entry = depWarnings.next();
if (strictMode) {
- log.error(entry.toString());
+ log.error(entry.message, entry.location, entry.lineNumber, entry.columnNumber);
} else {
- log.warn(entry.toString());
+ log.warn(entry.message, entry.location, entry.lineNumber, entry.columnNumber);
}
}
if (this.deprecationWarnings.size() > 0) {
@@ -87,31 +87,44 @@
while (warnings.hasNext()) {
final Entry entry = warnings.next();
if (strictMode) {
- log.error(entry.toString());
+ log.error(entry.message, entry.location, entry.lineNumber, entry.columnNumber);
} else {
- log.warn(entry.toString());
+ log.warn(entry.message, entry.location, entry.lineNumber, entry.columnNumber);
}
}
final Iterator<Entry> errors = this.errors.iterator();
while (errors.hasNext()) {
final Entry entry = errors.next();
- log.error(entry.toString());
+ log.error(entry.message, entry.location, entry.lineNumber, entry.columnNumber);
}
}
private static class Entry {
+
+ static final int LINE_NUMBER_UNKNOWN = 0;
+ static final int COLUMN_NUMBER_UNKNOWN = 0;
+
final String message;
final String location;
+ final int lineNumber;
+ final int columnNumber;
Entry(final String message, final String location) {
- this.message = message;
- this.location = location;
+ this(message, location, LINE_NUMBER_UNKNOWN, COLUMN_NUMBER_UNKNOWN);
}
+ Entry(final String message, final String location, final int lineNumber, final int columnNumber) {
+ this.message = message;
+ this.location = location;
+ this.lineNumber = lineNumber;
+ this.columnNumber = columnNumber;
+ }
+
+
@Override
public String toString() {
- return this.location + " : " + this.message;
+ return this.location + " [" + this.lineNumber+ "," + this.columnNumber+"] : " + this.message;
}
}
}
diff --git a/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/MavenLog.java b/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/MavenLog.java
index 417509f..67dc831 100644
--- a/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/MavenLog.java
+++ b/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/MavenLog.java
@@ -18,7 +18,10 @@
*/
package org.apache.felix.scrplugin.mojo;
+import java.io.File;
+
import org.apache.felix.scrplugin.Log;
+import org.sonatype.plexus.build.incremental.BuildContext;
/**
* The <code>MavenLog</code> class implements the {@link Log} interface using
@@ -26,10 +29,14 @@
*/
public class MavenLog implements Log {
+ private static final int COLUMN_NUMBER_UNKNOWN = 0;
+
private final org.apache.maven.plugin.logging.Log mavenLog;
+ private final BuildContext buildContext;
- MavenLog(final org.apache.maven.plugin.logging.Log mavenLog) {
+ MavenLog(final org.apache.maven.plugin.logging.Log mavenLog, BuildContext buildContext) {
this.mavenLog = mavenLog;
+ this.buildContext = buildContext;
}
/**
@@ -67,9 +74,17 @@
public void error(final String content,
final String location,
final int lineNumber) {
- final String message = formatMessage(content, location, lineNumber);
- mavenLog.error(message);
+ error(content, location, lineNumber, COLUMN_NUMBER_UNKNOWN);
}
+
+ /**
+ * @see org.apache.felix.scrplugin.Log#error(java.lang.String, java.lang.String, int, int)
+ */
+ public void error(final String content, final String location,
+ final int lineNumber, final int columnNumber) {
+ buildContext.addMessage(new File(location), lineNumber, columnNumber,
+ content, BuildContext.SEVERITY_ERROR, null);
+ }
/**
* @see org.apache.felix.scrplugin.Log#error(java.lang.String)
@@ -146,11 +161,20 @@
*/
public void warn(final String content, final String location,
final int lineNumber) {
- final String message = formatMessage(content, location, lineNumber);
- mavenLog.warn(message);
+ this.warn(content, location, lineNumber, COLUMN_NUMBER_UNKNOWN);
}
/**
+ * @see org.apache.felix.scrplugin.Log#warn(java.lang.String, java.lang.String, int, int)
+ */
+ public void warn(final String content, final String location,
+ final int lineNumber, final int columnNumber) {
+ buildContext.addMessage(new File(location), lineNumber, columnNumber,
+ content, BuildContext.SEVERITY_WARNING, null);
+ }
+
+
+ /**
* @see org.apache.felix.scrplugin.Log#warn(java.lang.String)
*/
public void warn(final String content) {
@@ -163,9 +187,4 @@
public void warn(final Throwable error) {
mavenLog.warn(error);
}
-
- private String formatMessage(final String content, final String location,
- final int lineNumber) {
- return content + " at " + location + ":" + lineNumber;
- }
}
diff --git a/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/MavenProjectScanner.java b/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/MavenProjectScanner.java
index 6813382..3912f73 100644
--- a/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/MavenProjectScanner.java
+++ b/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/MavenProjectScanner.java
@@ -35,6 +35,10 @@
public class MavenProjectScanner {
+ private enum ScanKind {
+ ADDED_OR_UPDATED, DELETED;
+ }
+
private final MavenProject project;
private final String includeString;
@@ -61,7 +65,13 @@
* Return all sources.
*/
public Collection<Source> getSources() {
- final ArrayList<Source> files = new ArrayList<Source>();
+
+ return getSourcesForScanKind(ScanKind.ADDED_OR_UPDATED);
+ }
+
+ private Collection<Source> getSourcesForScanKind(ScanKind scanKind)
+ throws AssertionError {
+ final ArrayList<Source> files = new ArrayList<Source>();
@SuppressWarnings("unchecked")
final Iterator<String> i = project.getCompileSourceRoots().iterator();
@@ -87,7 +97,23 @@
continue;
}
log.debug( "Scanning source tree " + tree );
- final Scanner scanner = this.buildContext.newScanner(directory, false);
+
+ final Scanner scanner;
+ switch ( scanKind ) {
+
+ case ADDED_OR_UPDATED:
+ scanner = this.buildContext.newScanner(directory, false);
+ break;
+
+ case DELETED:
+ scanner = this.buildContext.newDeleteScanner(directory);
+ break;
+
+ default:
+ throw new AssertionError("Unhandled ScanKind " + scanKind);
+
+ }
+
if ( excludes != null && excludes.length > 0 ) {
scanner.setExcludes( excludes );
@@ -114,6 +140,16 @@
}
return files;
+ }
+
+ /**
+ * Returns all sources which were deleted since the previous build
+ *
+ * @return the deleted sources
+ */
+ public Collection<Source> getDeletedSources() {
+
+ return getSourcesForScanKind(ScanKind.DELETED);
}
/**
diff --git a/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/SCRDescriptorMojo.java b/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/SCRDescriptorMojo.java
index ff6af89..4113a99 100644
--- a/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/SCRDescriptorMojo.java
+++ b/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/SCRDescriptorMojo.java
@@ -24,6 +24,7 @@
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
@@ -38,6 +39,7 @@
import org.apache.felix.scrplugin.SCRDescriptorException;
import org.apache.felix.scrplugin.SCRDescriptorFailureException;
import org.apache.felix.scrplugin.SCRDescriptorGenerator;
+import org.apache.felix.scrplugin.Source;
import org.apache.felix.scrplugin.SpecVersion;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.versioning.ArtifactVersion;
@@ -191,13 +193,13 @@
}
// create the log for the generator
- final org.apache.felix.scrplugin.Log scrLog = new MavenLog(getLog());
+ final org.apache.felix.scrplugin.Log scrLog = new MavenLog(getLog(), buildContext);
// create project
final MavenProjectScanner scanner = new MavenProjectScanner(
this.buildContext,
this.project, this.sourceIncludes, this.sourceExcludes, scrLog);
-
+
final Project project = new Project();
// create the class loader
project.setClassLoader(new URLClassLoader(getClassPath(), this
@@ -233,9 +235,15 @@
final Result result = generator.execute();
this.setServiceComponentHeader(result.getScrFiles());
this.updateProjectResources();
-
- // refreshing the target files does not seem to be the right thing
+
+ // TODO - should we skip performing these operations just one descriptor file is generated?
+ this.cleanUpDeletedSources(scanner.getDeletedSources());
+ this.refreshMessages(result.getProcessedSourceFiles());
+
+ // TODO - refreshing the target files does not seem to be the right thing ; however, new files
+ // are not refresh in Eclipse right now
//this.updateBuildContext(result);
+
} catch (final SCRDescriptorException sde) {
throw new MojoExecutionException(sde.getSourceLocation() + " : " + sde.getMessage(), sde);
} catch (final SCRDescriptorFailureException sdfe) {
@@ -244,7 +252,40 @@
}
}
- private void updateBuildContext(final Result result) {
+ /**
+ * @param scrFiles
+ */
+ private void refreshMessages(List<String> scrFiles) {
+
+ for ( String scrFile : scrFiles )
+ buildContext.removeMessages(new File(scrFile));
+
+ }
+
+ private void cleanUpDeletedSources(Collection<Source> deletedSources) {
+
+ // TODO remove duplication of file name selection - MetaTypeIO, ComponentDescriptorIO
+
+ final File parentDir = new File(this.outputDirectory, "OSGI-INF");
+ final File mtDir = new File(parentDir, "metatype");
+
+ for ( Source deletedSource : deletedSources ) {
+
+ File metaTypeFile = new File(mtDir, deletedSource.getClassName() + ".xml");
+ boolean deleted = metaTypeFile.delete();
+ if ( deleted )
+ buildContext.refresh(metaTypeFile);
+
+ File componentDescriptorFile = new File(parentDir, deletedSource.getClassName()+".xml");
+ deleted = componentDescriptorFile.delete();
+ if ( deleted )
+ buildContext.refresh(componentDescriptorFile);
+ }
+ }
+
+
+
+ private void updateBuildContext(final Result result) {
if ( result.getMetatypeFiles() != null ) {
for(final String name : result.getMetatypeFiles() ) {
this.buildContext.refresh(new File(this.outputDirectory, name.replace('/', File.separatorChar)));
diff --git a/scrplugin/scrtask/src/main/java/org/apache/felix/scrplugin/ant/AntLog.java b/scrplugin/scrtask/src/main/java/org/apache/felix/scrplugin/ant/AntLog.java
index 605e75a..076620a 100644
--- a/scrplugin/scrtask/src/main/java/org/apache/felix/scrplugin/ant/AntLog.java
+++ b/scrplugin/scrtask/src/main/java/org/apache/felix/scrplugin/ant/AntLog.java
@@ -104,6 +104,11 @@
warn( String.format( "%s [%s,%d]", content, location, lineNumber ) );
}
+ public void warn( String content, String location, int lineNumber, int columNumber )
+ {
+ warn( String.format( "%s [%s,%d:%d]", content, location, lineNumber , columNumber) );
+ }
+
public void warn( String content, Throwable error )
{
@@ -135,6 +140,11 @@
error( String.format( "%s [%s,%d]", content, location, lineNumber ) );
}
+ public void error( String content, String location, int lineNumber, int columnNumber )
+ {
+ error( String.format( "%s [%s,%d:%d]", content, location, lineNumber, columnNumber ) );
+ }
+
public void error( String content, Throwable error )
{