You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cz...@apache.org on 2012/09/03 08:59:19 UTC

svn commit: r1380141 - in /felix/trunk/scrplugin: generator/src/main/java/org/apache/felix/scrplugin/ generator/src/main/java/org/apache/felix/scrplugin/helper/ maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/ scrtask/src/main/java/org/a...

Author: cziegeler
Date: Mon Sep  3 06:59:18 2012
New Revision: 1380141

URL: http://svn.apache.org/viewvc?rev=1380141&view=rev
Log:
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

Modified:
    felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/Log.java
    felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/Result.java
    felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java
    felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/IssueLog.java
    felix/trunk/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/MavenLog.java
    felix/trunk/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/MavenProjectScanner.java
    felix/trunk/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/SCRDescriptorMojo.java
    felix/trunk/scrplugin/scrtask/src/main/java/org/apache/felix/scrplugin/ant/AntLog.java

Modified: felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/Log.java
URL: http://svn.apache.org/viewvc/felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/Log.java?rev=1380141&r1=1380140&r2=1380141&view=diff
==============================================================================
--- felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/Log.java (original)
+++ felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/Log.java Mon Sep  3 06:59:18 2012
@@ -109,7 +109,6 @@ public interface Log {
      */
     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 @@ public interface Log {
      */
     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 @@ public interface Log {
      */
     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.

Modified: felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/Result.java
URL: http://svn.apache.org/viewvc/felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/Result.java?rev=1380141&r1=1380140&r2=1380141&view=diff
==============================================================================
--- felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/Result.java (original)
+++ felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/Result.java Mon Sep  3 06:59:18 2012
@@ -18,6 +18,7 @@
  */
 package org.apache.felix.scrplugin;
 
+import java.util.ArrayList;
 import java.util.List;
 
 
@@ -32,6 +33,9 @@ public class Result {
     /** 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 @@ public class Result {
     }
 
     /**
+     * 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 class Result {
     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;
+	}
 }

Modified: felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java
URL: http://svn.apache.org/viewvc/felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java?rev=1380141&r1=1380140&r2=1380141&view=diff
==============================================================================
--- felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java (original)
+++ felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java Mon Sep  3 06:59:18 2012
@@ -148,9 +148,12 @@ public class SCRDescriptorGenerator {
         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 @@ public class SCRDescriptorGenerator {
             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));
 

Modified: felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/IssueLog.java
URL: http://svn.apache.org/viewvc/felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/IssueLog.java?rev=1380141&r1=1380140&r2=1380141&view=diff
==============================================================================
--- felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/IssueLog.java (original)
+++ felix/trunk/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/IssueLog.java Mon Sep  3 06:59:18 2012
@@ -68,9 +68,9 @@ public class IssueLog {
         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 @@ public class IssueLog {
         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;
         }
     }
 }

Modified: felix/trunk/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/MavenLog.java
URL: http://svn.apache.org/viewvc/felix/trunk/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/MavenLog.java?rev=1380141&r1=1380140&r2=1380141&view=diff
==============================================================================
--- felix/trunk/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/MavenLog.java (original)
+++ felix/trunk/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/MavenLog.java Mon Sep  3 06:59:18 2012
@@ -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 @@ import org.apache.felix.scrplugin.Log;
  */
 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 class MavenLog implements Log {
     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 class MavenLog implements Log {
      */
     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 class MavenLog implements Log {
     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;
-    }
 }

Modified: felix/trunk/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/MavenProjectScanner.java
URL: http://svn.apache.org/viewvc/felix/trunk/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/MavenProjectScanner.java?rev=1380141&r1=1380140&r2=1380141&view=diff
==============================================================================
--- felix/trunk/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/MavenProjectScanner.java (original)
+++ felix/trunk/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/MavenProjectScanner.java Mon Sep  3 06:59:18 2012
@@ -35,6 +35,10 @@ import org.sonatype.plexus.build.increme
 
 public class MavenProjectScanner {
 
+	private enum ScanKind {
+		ADDED_OR_UPDATED, DELETED;
+	}
+	
     private final MavenProject project;
 
     private final String includeString;
@@ -61,7 +65,13 @@ public class MavenProjectScanner {
      * 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 @@ public class MavenProjectScanner {
                 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 @@ public class MavenProjectScanner {
         }
 
         return files;
+	}
+    
+	/**
+	 * Returns all sources which were deleted since the previous build
+	 * 
+	 * @return the deleted sources
+	 */
+    public Collection<Source> getDeletedSources() {
+    	
+    	return getSourcesForScanKind(ScanKind.DELETED);
     }
 
     /**

Modified: felix/trunk/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/SCRDescriptorMojo.java
URL: http://svn.apache.org/viewvc/felix/trunk/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/SCRDescriptorMojo.java?rev=1380141&r1=1380140&r2=1380141&view=diff
==============================================================================
--- felix/trunk/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/SCRDescriptorMojo.java (original)
+++ felix/trunk/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/SCRDescriptorMojo.java Mon Sep  3 06:59:18 2012
@@ -24,6 +24,7 @@ import java.net.URL;
 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.Result
 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 @@ public class SCRDescriptorMojo extends A
         }
 
         // 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 @@ public class SCRDescriptorMojo extends A
             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 @@ public class SCRDescriptorMojo extends A
         }
     }
 
-    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)));

Modified: felix/trunk/scrplugin/scrtask/src/main/java/org/apache/felix/scrplugin/ant/AntLog.java
URL: http://svn.apache.org/viewvc/felix/trunk/scrplugin/scrtask/src/main/java/org/apache/felix/scrplugin/ant/AntLog.java?rev=1380141&r1=1380140&r2=1380141&view=diff
==============================================================================
--- felix/trunk/scrplugin/scrtask/src/main/java/org/apache/felix/scrplugin/ant/AntLog.java (original)
+++ felix/trunk/scrplugin/scrtask/src/main/java/org/apache/felix/scrplugin/ant/AntLog.java Mon Sep  3 06:59:18 2012
@@ -104,6 +104,11 @@ public class AntLog implements Log
         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 @@ public class AntLog implements Log
         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 )
     {