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/05/22 08:04:18 UTC
svn commit: r1341309 [1/2] - in
/felix/sandbox/cziegeler/scrplugin/generator: ./
src/main/java/org/apache/felix/scrplugin/
src/main/java/org/apache/felix/scrplugin/helper/
src/main/java/org/apache/felix/scrplugin/om/
src/main/java/org/apache/felix/scrp...
Author: cziegeler
Date: Tue May 22 06:04:18 2012
New Revision: 1341309
URL: http://svn.apache.org/viewvc?rev=1341309&view=rev
Log:
New scr plugin
Modified:
felix/sandbox/cziegeler/scrplugin/generator/pom.xml
felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java
felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/ClassScanner.java
felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/IssueLog.java
felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/om/AbstractObject.java
felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/om/Component.java
felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/om/Implementation.java
felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/om/Interface.java
felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/om/Property.java
felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/om/Reference.java
felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/om/Service.java
felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/xml/ComponentDescriptorIO.java
Modified: felix/sandbox/cziegeler/scrplugin/generator/pom.xml
URL: http://svn.apache.org/viewvc/felix/sandbox/cziegeler/scrplugin/generator/pom.xml?rev=1341309&r1=1341308&r2=1341309&view=diff
==============================================================================
--- felix/sandbox/cziegeler/scrplugin/generator/pom.xml (original)
+++ felix/sandbox/cziegeler/scrplugin/generator/pom.xml Tue May 22 06:04:18 2012
@@ -52,6 +52,11 @@
<version>3.1</version>
<scope>compile</scope>
</dependency>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ <version>4.2.0</version>
+ </dependency>
</dependencies>
<build>
Modified: felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java
URL: http://svn.apache.org/viewvc/felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java?rev=1341309&r1=1341308&r2=1341309&view=diff
==============================================================================
--- felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java (original)
+++ felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java Tue May 22 06:04:18 2012
@@ -18,13 +18,25 @@
*/
package org.apache.felix.scrplugin;
-
import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.felix.scrplugin.description.ClassDescription;
+import org.apache.felix.scrplugin.description.ComponentDescription;
+import org.apache.felix.scrplugin.description.SpecVersion;
import org.apache.felix.scrplugin.helper.AnnotationProcessorManager;
import org.apache.felix.scrplugin.helper.ClassScanner;
import org.apache.felix.scrplugin.helper.IssueLog;
-
+import org.apache.felix.scrplugin.helper.StringUtils;
+import org.apache.felix.scrplugin.om.Component;
+import org.apache.felix.scrplugin.om.Components;
+import org.apache.felix.scrplugin.om.Context;
+import org.apache.felix.scrplugin.om.Implementation;
+import org.apache.felix.scrplugin.om.Reference;
+import org.apache.felix.scrplugin.om.metatype.MetaData;
+import org.apache.felix.scrplugin.xml.ComponentDescriptorIO;
+import org.apache.felix.scrplugin.xml.MetaTypeIO;
/**
* The <code>SCRDescriptorGenerator</code> class does the hard work of
@@ -32,10 +44,8 @@ import org.apache.felix.scrplugin.helper
* configured by clients and the {@link #execute()} method called to generate
* the descriptor files.
* <p>
- * When using this class carefully consider calling <i>all</i> setter methods
- * to properly configure the generator. All setter method document, which
- * default value is assumed for the respective property if the setter is
- * not called.
+ * When using this class carefully consider calling <i>all</i> setter methods to properly configure the generator. All setter
+ * method document, which default value is assumed for the respective property if the setter is not called.
* <p>
* Instances of this class are not thread save and should not be reused.
*/
@@ -56,16 +66,15 @@ public class SCRDescriptorGenerator {
private Options options = new Options();
/**
- * Create an instance of this generator using the given {@link Log}
- * instance of logging.
+ * Create an instance of this generator using the given {@link Log} instance
+ * of logging.
*/
- public SCRDescriptorGenerator(final Log logger ) {
+ public SCRDescriptorGenerator(final Log logger) {
this.logger = logger;
}
/**
- * Set the project.
- * This is required.
+ * Set the project. This is required.
*/
public void setProject(final Project p) {
this.project = p;
@@ -81,295 +90,263 @@ public class SCRDescriptorGenerator {
/**
* Sets the directory where the descriptor files will be created.
* <p>
- * This field has no default value and this setter <b>must</b> called prior
- * to calling {@link #execute()}.
+ * This field has no default value and this setter <b>must</b> called prior to calling {@link #execute()}.
*/
- public void setOutputDirectory( final File outputDirectory ) {
+ public void setOutputDirectory(final File outputDirectory) {
this.outputDirectory = outputDirectory;
}
/**
* Sets the name of the SCR declaration descriptor file. This file will be
- * created in the <i>OSGI-INF</i> directory below the
- * {@link #setOutputDirectory(File) output directory}.
+ * created in the <i>OSGI-INF</i> directory below the {@link #setOutputDirectory(File) output directory}.
* <p>
- * This file will be overwritten if already existing. If no descriptors
- * are created the file is actually removed.
+ * This file will be overwritten if already existing. If no descriptors are created the file is actually removed.
* <p>
* The default value of this property is <code>serviceComponents.xml</code>.
*/
- public void setFinalName( final String finalName ) {
+ public void setFinalName(final String finalName) {
this.finalName = finalName;
}
/**
* Sets the name of the file taking the Metatype Service descriptors. This
- * file will be created in the <i>OSGI-INF/metatype</i> directory below the
- * {@link #setOutputDirectory(File) output directory}.
+ * file will be created in the <i>OSGI-INF/metatype</i> directory below the {@link #setOutputDirectory(File) output directory}
+ * .
* <p>
- * This file will be overwritten if already existing. If no descriptors
- * are created the file is actually removed.
+ * This file will be overwritten if already existing. If no descriptors are created the file is actually removed.
* <p>
* The default value of this property is <code>metatype.xml</code>.
*/
- public void setMetaTypeName( final String metaTypeName ) {
+ public void setMetaTypeName(final String metaTypeName) {
this.metaTypeName = metaTypeName;
}
/**
* Actually generates the Declarative Services and Metatype descriptors
- * scanning the java sources provided by the
- * {@link #setDescriptorManager(JavaClassDescriptorManager) descriptor manager}.
- *
+ * scanning the java sources provided by the {@link #setDescriptorManager(JavaClassDescriptorManager) descriptor
+ * manager}.
+ *
* @return <code>true</code> if descriptors have been generated.
- *
+ *
* @throws SCRDescriptorException
* @throws SCRDescriptorFailureException
*/
- public boolean execute()
- throws SCRDescriptorException, SCRDescriptorFailureException {
- if ( this.project == null ) {
+ public boolean execute() throws SCRDescriptorException, SCRDescriptorFailureException {
+ if (this.project == null) {
throw new SCRDescriptorFailureException("Project has not been set!");
}
- this.logger.debug( "Starting SCRDescriptorMojo...." );
- this.logger.debug( "..generating accessors: " + this.options.isGenerateAccessors() );
+ this.logger.debug("Starting SCRDescriptorMojo....");
+ this.logger.debug("..generating accessors: " + this.options.isGenerateAccessors());
// check speck version configuration
- if ( this.options.getSpecVersion() == null ) {
- this.logger.debug( "..auto detecting spec version" );
+ if (this.options.getSpecVersion() == null) {
+ this.logger.debug("..auto detecting spec version");
} else {
- this.logger.debug( "..using spec version " + this.options.getSpecVersion().getName());
+ this.logger.debug("..using spec version " + this.options.getSpecVersion().getName());
}
// create a log
- final IssueLog iLog = new IssueLog( this.options.isStrictMode() );
+ final IssueLog iLog = new IssueLog(this.options.isStrictMode());
// create the annotation processor manager
final AnnotationProcessor aProcessor = new AnnotationProcessorManager(options.getAnnotationProcessors(),
- this.project.getClassLoader());
+ this.project.getClassLoader());
// create the class scanner - and start scanning
final ClassScanner scanner = new ClassScanner();
- scanner.execute(logger, project, aProcessor);
- return true;
- /*
+ final List<ClassDescription> scannedDescriptions = scanner.execute(logger, project, aProcessor);
+
final MetaData metaData = new MetaData();
- metaData.setLocalization( MetaTypeService.METATYPE_DOCUMENTS_LOCATION + "/metatype" );
+ // metaData.setLocalization(MetaTypeService.METATYPE_DOCUMENTS_LOCATION
+ // + "/metatype");
- // iterate through all source classes and check for component tag
- final JavaClassDescription[] javaSources = descriptorManager.getSourceDescriptions();
- Arrays.sort( javaSources, new JavaClassDescriptionInheritanceComparator() );
-
- final List<Component> scannedComponents = new ArrayList<Component>();
- for ( int i = 0; i < javaSources.length; i++ )
- {
- this.logger.debug( "Testing source " + javaSources[i].getName() );
- final JavaTag tag = javaSources[i].getTagByName( Constants.COMPONENT );
- if ( tag != null )
- {
- // FELIX-2853 : Deprecate javadoc tags.
- // This is not the most clever way of doing this, but it is the least intrusive...
- if ( javaSources[i] instanceof QDoxJavaClassDescription
- && !(javaSources[i] instanceof AnnotationJavaClassDescription)) {
- iLog.addDeprecationWarning("Class " + javaSources[i].getName() + " is using deprecated javadoc tags ",
- tag.getSourceLocation(), tag.getLineNumber());
- }
- this.logger.debug( "Processing service class " + javaSources[i].getName() );
- // check if there is more than one component tag!
- if ( javaSources[i].getTagsByName( Constants.COMPONENT, false ).length > 1 )
- {
- iLog.addError( "Class " + javaSources[i].getName() + " has more than one " + Constants.COMPONENT
- + " tag." + " Merge the tags to a single tag.", tag.getSourceLocation(), tag.getLineNumber() );
- }
- else
- {
- try {
- final Component comp = this.createComponent( javaSources[i], tag, metaData, iLog );
- if ( this.specVersion == null || comp.getSpecVersion().ordinal() > specVersion.ordinal() ) {
+ SpecVersion specVersion = options.getSpecVersion();
+
+ final List<Component> processedComponents = new ArrayList<Component>();
+ for (final ClassDescription desc : scannedDescriptions) {
+ this.logger.debug("Processing component class " + desc.getSource());
+
+ // check if there is more than one component definition
+ if (desc.getDescriptions(ComponentDescription.class).size() > 1) {
+ iLog.addError("Class has more than one component definition." + " Merge the definitions to a single definition.",
+ desc.getSource());
+ } else {
+ try {
+ final Component comp = this.createComponent(desc, metaData, iLog);
+ if (comp.getSpecVersion() != null) {
+ if (specVersion == null || comp.getSpecVersion().ordinal() > specVersion.ordinal()) {
// if a spec version has been configured and a component requires a higher
// version, this is considered an error!
- if ( this.specVersion != null ) {
- iLog.addError( "Component " + comp + " requires spec version " + comp.getSpecVersion().name()
- + " but plugin is configured to use version " + this.specVersion, tag
- .getSourceLocation(), tag.getLineNumber() );
+ if (this.options.getSpecVersion() != null) {
+ iLog.addError("Component " + comp + " requires spec version " + comp.getSpecVersion().name()
+ + " but plugin is configured to use version " + this.options.getSpecVersion(),
+ desc.getSource());
} else {
specVersion = comp.getSpecVersion();
}
}
- scannedComponents.add( comp );
- } catch ( final SCRDescriptorException sde ) {
- iLog.addError( sde.getMessage(), sde.getSourceLocation(), sde.getLineNumber() );
}
+ processedComponents.add(comp);
+ } catch (final SCRDescriptorException sde) {
+ iLog.addError(sde.getMessage(), sde.getSourceLocation());
}
}
}
- this.logger.debug( "..generating descriptor for spec version: " + this.specVersion );
+ // if spec version is still not set, we're using lowest available
+ specVersion = SpecVersion.VERSION_1_0;
+ this.logger.debug("..generating descriptor for spec version: " + specVersion);
// now check for abstract components and fill components objects
final Components components = new Components();
- final Components abstractComponents = new Components();
- components.setSpecVersion( specVersion );
- abstractComponents.setSpecVersion( specVersion );
+ components.setSpecVersion(specVersion);
- for ( final Component comp : scannedComponents )
- {
+ for (final Component comp : processedComponents) {
final int errorCount = iLog.getNumberOfErrors();
// before we can validate we should check the references for bind/unbind method
// in order to create them if possible
- for ( final Reference ref : comp.getReferences() )
- {
+ for (final Reference ref : comp.getReferences()) {
// if this is a field with a single cardinality,
// we look for the bind/unbind methods
// and create them if they are not availabe
- if ( this.generateAccessors && !ref.isLookupStrategy() )
- {
- if ( ref.getJavaTag().getField() != null
- && comp.getJavaClassDescription() instanceof ModifiableJavaClassDescription )
- {
- if ( ref.getCardinality().equals( "0..1" ) || ref.getCardinality().equals( "1..1" ) )
- {
- final String bindValue = ref.getBind();
- final String unbindValue = ref.getUnbind();
- final String name = ref.getName();
- final String type = ref.getInterfacename();
-
- boolean createBind = false;
- boolean createUnbind = false;
- // Only create method if no bind name has been specified
- if ( bindValue == null && ref.findMethod( specVersion, "bind" ) == null )
- {
- // create bind method
- createBind = true;
- }
- if ( unbindValue == null && ref.findMethod( specVersion, "unbind" ) == null )
- {
- // create unbind method
- createUnbind = true;
- }
- if ( createBind || createUnbind )
- {
- ( ( ModifiableJavaClassDescription ) comp.getJavaClassDescription() ).addMethods( name,
- type, createBind, createUnbind );
- }
- }
- }
+ if (this.options.isGenerateAccessors() && !ref.isLookupStrategy()) {
+ /*
+ * if (ref.getJavaTag().getField() != null
+ * && comp.getJavaClassDescription() instanceof ModifiableJavaClassDescription) {
+ * if (ref.getCardinality().equals("0..1") || ref.getCardinality().equals("1..1")) {
+ * final String bindValue = ref.getBind();
+ * final String unbindValue = ref.getUnbind();
+ * final String name = ref.getName();
+ * final String type = ref.getInterfacename();
+ *
+ * boolean createBind = false;
+ * boolean createUnbind = false;
+ * // Only create method if no bind name has been specified
+ * if (bindValue == null && ref.findMethod(specVersion, "bind") == null) {
+ * // create bind method
+ * createBind = true;
+ * }
+ * if (unbindValue == null && ref.findMethod(specVersion, "unbind") == null) {
+ * // create unbind method
+ * createUnbind = true;
+ * }
+ * if (createBind || createUnbind) {
+ * ((ModifiableJavaClassDescription) comp.getJavaClassDescription()).addMethods(name, type,
+ * createBind, createUnbind);
+ * }
+ * }
+ * }
+ */
}
}
- comp.validate( specVersion, iLog );
+ final Context ctx = new Context();
+ ctx.setClassDescription(comp.getClassDescription());
+ ctx.setIssueLog(iLog);
+ ctx.setProject(project);
+ ctx.setSpecVersion(specVersion);
+
+ comp.validate(ctx);
+
// ignore component if it has errors
- if ( iLog.getNumberOfErrors() == errorCount )
- {
- if ( !comp.isDs() )
- {
- logger.debug( "Ignoring descriptor " + comp );
- }
- else if ( comp.isAbstract() )
- {
- this.logger.debug( "Adding abstract descriptor " + comp );
- abstractComponents.addComponent( comp );
- }
- else
- {
- this.logger.debug( "Adding descriptor " + comp );
- components.addComponent( comp );
- abstractComponents.addComponent( comp );
+ if (iLog.getNumberOfErrors() == errorCount) {
+ if (!comp.isDs()) {
+ logger.debug("Ignoring descriptor " + comp);
+ } else if (!comp.isAbstract()) {
+ this.logger.debug("Adding descriptor " + comp);
+ components.addComponent(comp);
}
}
}
// log issues
- iLog.logMessages( logger );
+ iLog.logMessages(logger);
// after checking all classes, throw if there were any failures
- if ( iLog.hasErrors() )
- {
- throw new SCRDescriptorFailureException( "SCR Descriptor parsing had failures (see log)" );
+ if (iLog.hasErrors()) {
+ throw new SCRDescriptorFailureException("SCR Descriptor parsing had failures (see log)");
}
boolean addResources = false;
// write meta type info if there is a file name
- if ( !StringUtils.isEmpty( this.metaTypeName ) )
- {
- File mtFile = new File( this.outputDirectory, "OSGI-INF" + File.separator + "metatype" + File.separator
- + this.metaTypeName );
+ if (!StringUtils.isEmpty(this.metaTypeName)) {
+ File mtFile = new File(this.outputDirectory, "OSGI-INF" + File.separator + "metatype" + File.separator
+ + this.metaTypeName);
final int size = metaData.getOCDs().size() + metaData.getDesignates().size();
- if ( size > 0 )
- {
- this.logger.info( "Generating " + size + " MetaType Descriptors to " + mtFile );
+ if (size > 0) {
+ this.logger.info("Generating " + size + " MetaType Descriptors to " + mtFile);
mtFile.getParentFile().mkdirs();
- MetaTypeIO.write( metaData, mtFile );
+ MetaTypeIO.write(metaData, mtFile);
addResources = true;
- }
- else
- {
- if ( mtFile.exists() )
- {
+ } else {
+ if (mtFile.exists()) {
mtFile.delete();
}
}
- }
- else
- {
- this.logger.info( "Meta type file name is not set: meta type info is not written." );
- }
-
- // if we have descriptors, write them in our scr private file (for component inheritance)
- final File adFile = new File( this.outputDirectory, Constants.ABSTRACT_DESCRIPTOR_RELATIVE_PATH );
- if ( !abstractComponents.getComponents().isEmpty() )
- {
- this.logger.info( "Writing abstract service descriptor " + adFile + " with "
- + abstractComponents.getComponents().size() + " entries." );
- adFile.getParentFile().mkdirs();
- ComponentDescriptorIO.write( abstractComponents, adFile, true );
- addResources = true;
- }
- else
- {
- this.logger.debug( "No abstract SCR Descriptors found in project." );
- // remove file
- if ( adFile.exists() )
- {
- this.logger.debug( "Removing obsolete abstract service descriptor " + adFile );
- adFile.delete();
- }
+ } else {
+ this.logger.info("Meta type file name is not set: meta type info is not written.");
}
// check descriptor file
- final File descriptorFile = StringUtils.isEmpty( this.finalName ) ? null : new File( new File(
- this.outputDirectory, "OSGI-INF" ), this.finalName );
+ final File descriptorFile = StringUtils.isEmpty(this.finalName) ? null : new File(new File(this.outputDirectory,
+ "OSGI-INF"), this.finalName);
// terminate if there is nothing else to write
- if ( components.getComponents().isEmpty() )
- {
- this.logger.debug( "No SCR Descriptors found in project." );
+ if (components.getComponents().isEmpty()) {
+ this.logger.debug("No SCR Descriptors found in project.");
// remove file if it exists
- if ( descriptorFile != null && descriptorFile.exists() )
- {
- this.logger.debug( "Removing obsolete service descriptor " + descriptorFile );
+ if (descriptorFile != null && descriptorFile.exists()) {
+ this.logger.debug("Removing obsolete service descriptor " + descriptorFile);
descriptorFile.delete();
}
- }
- else
- {
- if ( descriptorFile == null )
- {
- throw new SCRDescriptorFailureException( "Descriptor file name must not be empty." );
+ } else {
+ if (descriptorFile == null) {
+ throw new SCRDescriptorFailureException("Descriptor file name must not be empty.");
}
// finally the descriptors have to be written ....
descriptorFile.getParentFile().mkdirs(); // ensure parent dir
- this.logger.info( "Generating " + components.getComponents().size() + " Service Component Descriptors to "
- + descriptorFile );
+ this.logger.info("Generating " + components.getComponents().size() + " Service Component Descriptors to "
+ + descriptorFile);
- ComponentDescriptorIO.write( components, descriptorFile, false );
+ ComponentDescriptorIO.write(components, descriptorFile);
addResources = true;
}
- return addResources;*/
+ return addResources;
+ }
+
+ private Component createComponent(final ClassDescription desc, final MetaData metaData, final IssueLog iLog)
+ throws SCRDescriptorException {
+ final ComponentDescription componentDesc = desc.getDescriptions(ComponentDescription.class).get(0);
+ final Component comp = new Component(desc, desc.getSource(), componentDesc.getAnnotation().getName());
+
+ comp.setAbstract(componentDesc.isAbstract());
+ comp.setDs(componentDesc.isCreateDs());
+ comp.setEnabled(componentDesc.getEnabled());
+ comp.setImmediate(componentDesc.getImmediate());
+ if (componentDesc.getActivate() != null) {
+ comp.setActivate(componentDesc.getActivate().getName());
+ }
+ if (componentDesc.getConfigurationPolicy() != null) {
+ comp.setConfigurationPolicy(componentDesc.getConfigurationPolicy().name());
+ }
+ if (componentDesc.getDeactivate() != null) {
+ comp.setDeactivate(componentDesc.getDeactivate().getName());
+ }
+ comp.setFactory(componentDesc.getFactory());
+ if (componentDesc.getModified() != null) {
+ comp.setModified(componentDesc.getModified().getName());
+ }
+ comp.setName(componentDesc.getName());
+ comp.setSpecVersion(componentDesc.getSpecVersion());
+
+ final Implementation impl = new Implementation(desc.getDescribedClass().getName());
+ comp.setImplementation(impl);
+
+ return comp;
}
}
Modified: felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/ClassScanner.java
URL: http://svn.apache.org/viewvc/felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/ClassScanner.java?rev=1341309&r1=1341308&r2=1341309&view=diff
==============================================================================
--- felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/ClassScanner.java (original)
+++ felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/ClassScanner.java Tue May 22 06:04:18 2012
@@ -53,17 +53,27 @@ import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.FieldNode;
import org.objectweb.asm.tree.MethodNode;
+/**
+ * The class scanner scans class files for annotations and invokes
+ * the {@link AnnotationProcessor} on each scanned class file.
+ */
public class ClassScanner {
/**
* Scan all class files for annotations and process them.
+ *
+ * @param log
+ * The log to use
+ * @param project
+ * The project environment
+ * @param aProcessor
+ * The annotation processor
*/
- public void execute(final Log log,
- final Project project,
- final AnnotationProcessor aProcessor)
- throws SCRDescriptorException, SCRDescriptorFailureException {
+ public List<ClassDescription> execute(final Log log, final Project project, final AnnotationProcessor aProcessor)
+ throws SCRDescriptorException, SCRDescriptorFailureException {
+ final List<ClassDescription> result = new ArrayList<ClassDescription>();
- for(final Source src : project.getSources()) {
+ for (final Source src : project.getSources()) {
log.debug("Scanning class " + src.getClassName());
try {
@@ -83,12 +93,14 @@ public class ClassScanner {
// create descriptions
final List<ScannedAnnotation> descriptions = extractAnnotation(classNode, annotatedClass);
- if ( descriptions.size() > 0 ) {
+ if (descriptions.size() > 0) {
// process descriptions
final ClassDescription desc = new ClassDescription(annotatedClass, src.getFile().toString());
aProcessor.process(new ScannedClass(descriptions, annotatedClass), desc);
- if ( desc.getDescriptions(ComponentDescription.class).size() > 0 ) {
- log.info("Found " + desc);
+
+ if (desc.getDescriptions(ComponentDescription.class).size() > 0) {
+ log.debug("Found component description " + desc + " in " + src.getClassName());
+ result.add(desc);
}
}
} catch (final ClassNotFoundException cnfe) {
@@ -97,17 +109,19 @@ public class ClassScanner {
throw new SCRDescriptorFailureException("Unable to scan class files: " + src.getClassName(), ioe);
}
}
+ return result;
}
/**
* Extract annotations
*/
- private final List<ScannedAnnotation> extractAnnotation(final ClassNode classNode, final Class<?> annotatedClass) {
+ private final List<ScannedAnnotation> extractAnnotation(final ClassNode classNode, final Class<?> annotatedClass)
+ throws SCRDescriptorException {
final List<ScannedAnnotation> descriptions = new ArrayList<ScannedAnnotation>();
// first parse class annotations
@SuppressWarnings("unchecked")
final List<AnnotationNode> annotations = classNode.invisibleAnnotations;
- if ( annotations != null ) {
+ if (annotations != null) {
for (final AnnotationNode annotation : annotations) {
this.parseAnnotation(descriptions, annotation, annotatedClass);
}
@@ -115,20 +129,50 @@ public class ClassScanner {
// second parse method annotations
@SuppressWarnings("unchecked")
final List<MethodNode> methods = classNode.methods;
- if ( methods != null ) {
- for(final MethodNode method : methods) {
+ if (methods != null) {
+ for (final MethodNode method : methods) {
@SuppressWarnings("unchecked")
final List<AnnotationNode> annos = method.invisibleAnnotations;
- if ( annos != null ) {
- // TODO - check signature and throw if not found!
+ if (annos != null) {
final String name = method.name;
+ String signature = method.signature;
+ if (signature != null) {
+ // remove generics
+ int pos;
+ while ((pos = signature.indexOf('<')) > 0) {
+ final int lastPos = signature.indexOf('>');
+ signature = signature.substring(0, pos) + signature.substring(lastPos + 1);
+ }
+ // remove everthing after the brackets and replace slash with dot
+ pos = signature.lastIndexOf(')');
+ signature = signature.substring(0, pos + 1);
+ signature = signature.replace('/', '.');
+ }
final Method[] allMethods = annotatedClass.getDeclaredMethods();
Method found = null;
- for(final Method m : allMethods) {
- if ( m.getName().equals(name) ) {
- found = m;
+ for (final Method m : allMethods) {
+ if (m.getName().equals(name)) {
+ if (m.getParameterTypes().length == 0 && signature == null) {
+ found = m;
+ }
+ if (m.getParameterTypes().length > 0 && signature != null) {
+ final StringBuilder sb = new StringBuilder("(");
+ for (final Class<?> c : m.getParameterTypes()) {
+ sb.append("L");
+ sb.append(c.getName());
+ sb.append(";");
+ }
+ sb.append(")");
+ if (sb.toString().equals(signature)) {
+ found = m;
+ }
+ }
}
}
+ if (found == null) {
+ throw new SCRDescriptorException("Annotated method " + name + " not found.",
+ annotatedClass.getName(), -1);
+ }
for (final AnnotationNode annotation : annos) {
parseAnnotation(descriptions, annotation, found);
}
@@ -139,17 +183,17 @@ public class ClassScanner {
// third parse field annotations
@SuppressWarnings("unchecked")
final List<FieldNode> fields = classNode.fields;
- if ( fields != null ) {
- for(final FieldNode field : fields) {
+ if (fields != null) {
+ for (final FieldNode field : fields) {
@SuppressWarnings("unchecked")
final List<AnnotationNode> annos = field.invisibleAnnotations;
- if ( annos != null ) {
+ if (annos != null) {
// TODO - throw if not found
final String name = field.name;
final Field[] allFields = annotatedClass.getDeclaredFields();
Field found = null;
- for(final Field f : allFields) {
- if ( f.getName().equals(name) ) {
+ for (final Field f : allFields) {
+ if (f.getName().equals(name)) {
found = f;
}
}
@@ -172,41 +216,40 @@ public class ClassScanner {
/**
* Parse annotation and create a description.
*/
- private void parseAnnotation(final List<ScannedAnnotation> descriptions,
- final AnnotationNode annotation,
- final Object annotatedObject) {
+ private void parseAnnotation(final List<ScannedAnnotation> descriptions, final AnnotationNode annotation,
+ final Object annotatedObject) {
// desc has the format 'L' + className.replace('.', '/') + ';'
final String name = annotation.desc.substring(1, annotation.desc.length() - 1).replace('/', '.');
Map<String, Object> values = null;
- if ( annotation.values != null ) {
+ if (annotation.values != null) {
values = new HashMap<String, Object>();
final Iterator<?> i = annotation.values.iterator();
- while ( i.hasNext() ) {
+ while (i.hasNext()) {
final Object vName = i.next();
Object value = i.next();
// convert type to class name string
- if ( value instanceof Type ) {
- value = ((Type)value).getClassName();
- } else if ( value instanceof List<?> ) {
- final List<?> objects = (List<?>)value;
- if ( objects.size() > 0 ) {
- if ( objects.get(0) instanceof Type ) {
+ if (value instanceof Type) {
+ value = ((Type) value).getClassName();
+ } else if (value instanceof List<?>) {
+ final List<?> objects = (List<?>) value;
+ if (objects.size() > 0) {
+ if (objects.get(0) instanceof Type) {
final String[] classNames = new String[objects.size()];
int index = 0;
- for(final Object v : objects) {
- classNames[index] = ((Type)v).getClassName();
+ for (final Object v : objects) {
+ classNames[index] = ((Type) v).getClassName();
index++;
}
value = classNames;
- } else if ( objects.get(0) instanceof AnnotationNode ) {
+ } else if (objects.get(0) instanceof AnnotationNode) {
final List<ScannedAnnotation> innerDesc = new ArrayList<ScannedAnnotation>();
- for(final Object v : objects) {
- parseAnnotation(innerDesc, (AnnotationNode)v, annotatedObject);
+ for (final Object v : objects) {
+ parseAnnotation(innerDesc, (AnnotationNode) v, annotatedObject);
}
- if ( annotatedObject instanceof Method ) {
+ if (annotatedObject instanceof Method) {
value = innerDesc.toArray(new MethodAnnotation[innerDesc.size()]);
- } else if ( annotatedObject instanceof Field ) {
+ } else if (annotatedObject instanceof Field) {
value = innerDesc.toArray(new FieldAnnotation[innerDesc.size()]);
} else {
value = innerDesc.toArray(new ClassAnnotation[innerDesc.size()]);
@@ -224,10 +267,10 @@ public class ClassScanner {
}
final ScannedAnnotation a;
- if ( annotatedObject instanceof Method ) {
+ if (annotatedObject instanceof Method) {
a = new MethodAnnotation(name, values, (Method) annotatedObject);
((Method) annotatedObject).setAccessible(true);
- } else if ( annotatedObject instanceof Field ) {
+ } else if (annotatedObject instanceof Field) {
a = new FieldAnnotation(name, values, (Field) annotatedObject);
((Field) annotatedObject).setAccessible(true);
} else {
Modified: felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/IssueLog.java
URL: http://svn.apache.org/viewvc/felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/IssueLog.java?rev=1341309&r1=1341308&r2=1341309&view=diff
==============================================================================
--- felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/IssueLog.java (original)
+++ felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/IssueLog.java Tue May 22 06:04:18 2012
@@ -18,7 +18,9 @@
*/
package org.apache.felix.scrplugin.helper;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
import org.apache.felix.scrplugin.Log;
@@ -44,86 +46,72 @@ public class IssueLog {
}
public boolean hasErrors() {
- return errors.size() > 0 ||
- (this.strictMode && (warnings.size() > 0 || this.deprecationWarnings.size() > 0));
+ return errors.size() > 0 || (this.strictMode && (warnings.size() > 0 || this.deprecationWarnings.size() > 0));
}
- public void addError(final String message, final String location, final int lineNumber) {
- errors.add( new Entry( message, location, lineNumber ) );
+ public void addError(final String message, final String location) {
+ errors.add(new Entry(message, location));
}
- public void addWarning(final String message, final String location, final int lineNumber) {
- warnings.add( new Entry( message, location, lineNumber ) );
+ public void addWarning(final String message, final String location) {
+ warnings.add(new Entry(message, location));
}
- public void addDeprecationWarning(final String message, final String location, final int lineNumber) {
- deprecationWarnings.add( new Entry( message, location, lineNumber ) );
+ public void addDeprecationWarning(final String message, final String location) {
+ deprecationWarnings.add(new Entry(message, location));
}
- public void logMessages( final Log log )
- {
+ public void logMessages(final Log log) {
// now log warnings and errors (warnings first)
// in strict mode everything is an error!
final Iterator<Entry> depWarnings = this.deprecationWarnings.iterator();
- while ( depWarnings.hasNext() )
- {
+ while (depWarnings.hasNext()) {
final Entry entry = depWarnings.next();
- if ( strictMode )
- {
- log.error( entry.message, entry.location, entry.lineNumber);
- }
- else
- {
- log.warn( entry.message, entry.location, entry.lineNumber);
+ if (strictMode) {
+ log.error(entry.toString());
+ } else {
+ log.warn(entry.toString());
}
}
- if ( this.deprecationWarnings.size() > 0 ) {
- final String msg = "It is highly recommended to fix these problems, as future versions might not " +
- "support these features anymore.";
- if ( strictMode )
- {
- log.error( msg );
- }
- else
- {
- log.warn( msg );
+ if (this.deprecationWarnings.size() > 0) {
+ final String msg = "It is highly recommended to fix these problems, as future versions might not "
+ + "support these features anymore.";
+ if (strictMode) {
+ log.error(msg);
+ } else {
+ log.warn(msg);
}
}
final Iterator<Entry> warnings = this.warnings.iterator();
- while ( warnings.hasNext() )
- {
+ while (warnings.hasNext()) {
final Entry entry = warnings.next();
- if ( strictMode )
- {
- log.error( entry.message, entry.location, entry.lineNumber);
- }
- else
- {
- log.warn( entry.message, entry.location, entry.lineNumber);
+ if (strictMode) {
+ log.error(entry.toString());
+ } else {
+ log.warn(entry.toString());
}
}
final Iterator<Entry> errors = this.errors.iterator();
- while ( errors.hasNext() )
- {
+ while (errors.hasNext()) {
final Entry entry = errors.next();
- log.error( entry.message, entry.location, entry.lineNumber);
+ log.error(entry.toString());
}
}
- private static class Entry
- {
+ private static class Entry {
final String message;
final String location;
- final int lineNumber;
-
- Entry( final String message, final String location, final int lineNumber )
- {
+ Entry(final String message, final String location) {
this.message = message;
this.location = location;
- this.lineNumber = lineNumber;
+ }
+
+ @Override
+ public String toString() {
+ return this.location + " : " + this.message;
}
}
}
Modified: felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/om/AbstractObject.java
URL: http://svn.apache.org/viewvc/felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/om/AbstractObject.java?rev=1341309&r1=1341308&r2=1341309&view=diff
==============================================================================
--- felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/om/AbstractObject.java (original)
+++ felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/om/AbstractObject.java Tue May 22 06:04:18 2012
@@ -21,8 +21,7 @@ package org.apache.felix.scrplugin.om;
import org.apache.felix.scrplugin.helper.IssueLog;
/**
- * The <code>AbstractObject</code>
- * is the base class for the all classes of the scr om.
+ * The <code>AbstractObject</code> is the base class for the all classes of the scr om.
*/
public abstract class AbstractObject {
@@ -30,19 +29,16 @@ public abstract class AbstractObject {
private final String sourceLocation;
- private final int lineNumber;
-
- protected AbstractObject(final String annotationName, final String sourceLocation, final int lineNumber) {
+ protected AbstractObject(final String annotationName, final String sourceLocation) {
this.annotationName = annotationName;
this.sourceLocation = sourceLocation;
- this.lineNumber = lineNumber;
}
protected void logWarn(IssueLog iLog, String message) {
- iLog.addWarning( "@" + this.annotationName + ": " + message, sourceLocation, lineNumber );
+ iLog.addWarning("@" + this.annotationName + ": " + message, sourceLocation);
}
protected void logError(IssueLog iLog, String message) {
- iLog.addError( "@" + this.annotationName + ": " + message, sourceLocation, lineNumber );
+ iLog.addError("@" + this.annotationName + ": " + message, sourceLocation);
}
}
Modified: felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/om/Component.java
URL: http://svn.apache.org/viewvc/felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/om/Component.java?rev=1341309&r1=1341308&r2=1341309&view=diff
==============================================================================
--- felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/om/Component.java (original)
+++ felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/om/Component.java Tue May 22 06:04:18 2012
@@ -24,12 +24,12 @@ import java.util.List;
import org.apache.felix.scrplugin.Constants;
import org.apache.felix.scrplugin.SCRDescriptorException;
-import org.apache.felix.scrplugin.helper.IssueLog;
+import org.apache.felix.scrplugin.description.ClassDescription;
+import org.apache.felix.scrplugin.description.SpecVersion;
/**
- * <code>Component</code>
- * is a described component.
- *
+ * <code>Component</code> is a described component.
+ *
*/
public class Component extends AbstractObject {
@@ -76,35 +76,42 @@ public class Component extends AbstractO
protected String modified;
/** The spec version. */
- protected int specVersion;
+ protected SpecVersion specVersion;
+
+ private final ClassDescription classDescription;
/**
* Default constructor.
*/
public Component() {
- this(null, null, -1);
+ this(null, null, null);
}
/**
* Constructor from java source.
*/
- public Component(final String annotationName, final String sourceLocation, final int lineNumber) {
- super(annotationName, sourceLocation, lineNumber);
+ public Component(final ClassDescription cDesc, final String annotationName, final String sourceLocation) {
+ super(annotationName, sourceLocation);
+ this.classDescription = cDesc;
+ }
+
+ public ClassDescription getClassDescription() {
+ return this.classDescription;
}
/**
* Get the spec version.
*/
- public int getSpecVersion() {
+ public SpecVersion getSpecVersion() {
return this.specVersion;
}
/**
* Set the spec version.
*/
- public void setSpecVersion(int value) {
+ public void setSpecVersion(final SpecVersion value) {
// only set a higher version, never "downgrade"
- if (this.specVersion < value) {
+ if (this.specVersion == null || this.specVersion.ordinal() < value.ordinal()) {
this.specVersion = value;
}
}
@@ -243,12 +250,10 @@ public class Component extends AbstractO
}
/**
- * Validate the component description.
- * If errors occur a message is added to the issues list,
- * warnings can be added to the warnings list.
+ * Validate the component description. If errors occur a message is added to
+ * the issues list, warnings can be added to the warnings list.
*/
- public void validate(final Context context)
- throws SCRDescriptorException {
+ public void validate(final Context context) throws SCRDescriptorException {
// nothing to check if this is ignored
if (!isDs()) {
return;
@@ -257,88 +262,98 @@ public class Component extends AbstractO
final int currentIssueCount = context.getIssueLog().getNumberOfErrors();
// if the service is abstract, we do not validate everything
- if ( !this.isAbstract ) {
+ if (!this.isAbstract) {
// ensure non-abstract, public class
- if (!Modifier.isPublic(context.getClassDescription().getDescribedClass().getModifiers()) ) {
- this.logError( context.getIssueLog(), "Class must be public: " + context.getClassDescription().getDescribedClass().getName() );
+ if (!Modifier.isPublic(context.getClassDescription().getDescribedClass().getModifiers())) {
+ this.logError(context.getIssueLog(), "Class must be public: "
+ + context.getClassDescription().getDescribedClass().getName());
}
- if (Modifier.isAbstract(context.getClassDescription().getDescribedClass().getModifiers()) || context.getClassDescription().getDescribedClass().isInterface()) {
- this.logError( context.getIssueLog(), "Class must be concrete class (not abstract or interface) : " + context.getClassDescription().getDescribedClass().getName() );
+ if (Modifier.isAbstract(context.getClassDescription().getDescribedClass().getModifiers())
+ || context.getClassDescription().getDescribedClass().isInterface()) {
+ this.logError(context.getIssueLog(), "Class must be concrete class (not abstract or interface) : "
+ + context.getClassDescription().getDescribedClass().getName());
}
// no errors so far, let's continue
- if ( context.getIssueLog().getNumberOfErrors() == currentIssueCount ) {
- final String activateName = this.activate == null ? "activate" : this.activate;
- final String deactivateName = this.deactivate == null ? "deactivate" : this.deactivate;
-
- // check activate and deactivate methods
- this.checkLifecycleMethod(specVersion, javaClass, activateName, true, iLog);
- this.checkLifecycleMethod(specVersion, javaClass, deactivateName, false, iLog);
-
- if ( this.modified != null && specVersion >= Constants.VERSION_1_1 ) {
- this.checkLifecycleMethod(specVersion, javaClass, this.modified, true, iLog);
- }
- // ensure public default constructor
- boolean constructorFound = true;
- JavaMethod[] methods = javaClass.getMethods();
- for (int i = 0; methods != null && i < methods.length; i++) {
- if (methods[i].isConstructor()) {
- // if public default, succeed
- if (methods[i].isPublic()
- && (methods[i].getParameters() == null || methods[i].getParameters().length == 0)) {
- constructorFound = true;
- break;
- }
-
- // non-public/non-default constructor found, must have explicit
- constructorFound = false;
- }
- }
- if (!constructorFound) {
- this.logError( context.getIssueLog(), "Class must have public default constructor: " + javaClass.getName() );
- }
-
- // verify properties
- for(final Property prop : this.getProperties()) {
- prop.validate(specVersion, context.getIssueLog());
- }
-
- // verify service
- boolean isServiceFactory = false;
- if (this.getService() != null) {
- if ( this.getService().getInterfaces().size() == 0 ) {
- this.logError( context.getIssueLog(), "Service interface information is missing!" );
- }
- this.getService().validate(context);
- isServiceFactory = this.getService().isServicefactory();
- }
-
- // serviceFactory must not be true for immediate of component factory
- if (isServiceFactory && this.isImmediate() != null && this.isImmediate().booleanValue() && this.getFactory() != null) {
- this.logError( context.getIssueLog(), "Component must not be a ServiceFactory, if immediate and/or component factory: " + javaClass.getName() );
- }
-
- // immediate must not be true for component factory
- if (this.isImmediate() != null && this.isImmediate().booleanValue() && this.getFactory() != null) {
- this.logError( context.getIssueLog(), "Component must not be immediate if component factory: " + javaClass.getName() );
- }
- }
+ /*
+ * if (context.getIssueLog().getNumberOfErrors() == currentIssueCount) {
+ * final String activateName = this.activate == null ? "activate" : this.activate;
+ * final String deactivateName = this.deactivate == null ? "deactivate" : this.deactivate;
+ *
+ * // check activate and deactivate methods
+ * this.checkLifecycleMethod(specVersion, javaClass, activateName, true, iLog);
+ * this.checkLifecycleMethod(specVersion, javaClass, deactivateName, false, iLog);
+ *
+ * if (this.modified != null && specVersion >= Constants.VERSION_1_1) {
+ * this.checkLifecycleMethod(specVersion, javaClass, this.modified, true, iLog);
+ * }
+ * // ensure public default constructor
+ * boolean constructorFound = true;
+ * JavaMethod[] methods = javaClass.getMethods();
+ * for (int i = 0; methods != null && i < methods.length; i++) {
+ * if (methods[i].isConstructor()) {
+ * // if public default, succeed
+ * if (methods[i].isPublic()
+ * && (methods[i].getParameters() == null || methods[i].getParameters().length == 0)) {
+ * constructorFound = true;
+ * break;
+ * }
+ *
+ * // non-public/non-default constructor found, must have
+ * // explicit
+ * constructorFound = false;
+ * }
+ * }
+ * if (!constructorFound) {
+ * this.logError(context.getIssueLog(), "Class must have public default constructor: " + javaClass.getName());
+ * }
+ *
+ * // verify properties
+ * for (final Property prop : this.getProperties()) {
+ * prop.validate(specVersion, context.getIssueLog());
+ * }
+ *
+ * // verify service
+ * boolean isServiceFactory = false;
+ * if (this.getService() != null) {
+ * if (this.getService().getInterfaces().size() == 0) {
+ * this.logError(context.getIssueLog(), "Service interface information is missing!");
+ * }
+ * this.getService().validate(context);
+ * isServiceFactory = this.getService().isServicefactory();
+ * }
+ *
+ * // serviceFactory must not be true for immediate of component
+ * // factory
+ * if (isServiceFactory && this.isImmediate() != null && this.isImmediate().booleanValue()
+ * && this.getFactory() != null) {
+ * this.logError(context.getIssueLog(),
+ * "Component must not be a ServiceFactory, if immediate and/or component factory: "
+ * + javaClass.getName());
+ * }
+ *
+ * // immediate must not be true for component factory
+ * if (this.isImmediate() != null && this.isImmediate().booleanValue() && this.getFactory() != null) {
+ * this.logError(context.getIssueLog(),
+ * "Component must not be immediate if component factory: " + javaClass.getName());
+ * }
+ * }
+ */
}
- if ( context.getIssueLog().getNumberOfErrors() == currentIssueCount ) {
+ if (context.getIssueLog().getNumberOfErrors() == currentIssueCount) {
// verify references
- for(final Reference ref : this.getReferences()) {
+ for (final Reference ref : this.getReferences()) {
ref.validate(context, this.isAbstract);
}
}
// check additional stuff if version is 1.1
- if ( specVersion >= Constants.VERSION_1_1 ) {
+ if (specVersion != null && specVersion.ordinal() >= SpecVersion.VERSION_1_1.ordinal()) {
final String cp = this.getConfigurationPolicy();
- if ( cp != null
- && !Constants.COMPONENT_CONFIG_POLICY_IGNORE.equals(cp)
- && !Constants.COMPONENT_CONFIG_POLICY_REQUIRE.equals(cp)
- && !Constants.COMPONENT_CONFIG_POLICY_OPTIONAL.equals(cp) ) {
- this.logError( iLog, "Component has an unknown value for configuration policy: " + cp );
+ if (cp != null && !Constants.COMPONENT_CONFIG_POLICY_IGNORE.equals(cp)
+ && !Constants.COMPONENT_CONFIG_POLICY_REQUIRE.equals(cp)
+ && !Constants.COMPONENT_CONFIG_POLICY_OPTIONAL.equals(cp)) {
+ this.logError(context.getIssueLog(), "Component has an unknown value for configuration policy: " + cp);
}
}
@@ -352,110 +367,118 @@ public class Component extends AbstractO
/**
* Check for existence of lifecycle methods.
- * @param specVersion The spec version
- * @param javaClass The java class to inspect.
- * @param methodName The method name.
- * @param warnings The list of warnings used to add new warnings.
- */
- protected void checkLifecycleMethod(final int specVersion,
- final JavaClassDescription javaClass,
- final String methodName,
- final boolean isActivate,
- final IssueLog iLog)
- throws SCRDescriptorException {
- // first candidate is (de)activate(ComponentContext)
- JavaMethod method = javaClass.getMethodBySignature(methodName, new String[] {TYPE_COMPONENT_CONTEXT});
- if ( method == null ) {
- if ( specVersion >= Constants.VERSION_1_1) {
- // second candidate is (de)activate(BundleContext)
- method = javaClass.getMethodBySignature(methodName, new String[] {TYPE_BUNDLE_CONTEXT});
- if ( method == null ) {
- // third candidate is (de)activate(Map)
- method = javaClass.getMethodBySignature(methodName, new String[] {TYPE_MAP});
-
- if ( method == null ) {
- // if this is a deactivate method, we have two additional possibilities
- // a method with parameter of type int and one of type Integer
- if ( !isActivate ) {
- method = javaClass.getMethodBySignature(methodName, new String[] {TYPE_INT});
- if ( method == null ) {
- method = javaClass.getMethodBySignature(methodName, new String[] {TYPE_INTEGER});
- }
- }
-
- // fourth candidate is (de)activate with two or three arguments (type must be BundleContext, ComponentCtx and Map)
- // as we have to iterate now and the fifth candidate is zero arguments
- // we already store this option
- JavaMethod zeroArgMethod = null;
- JavaMethod found = method;
- final JavaMethod[] methods = javaClass.getMethods();
- int i = 0;
- while ( i < methods.length ) {
- if ( methodName.equals(methods[i].getName()) ) {
-
- if ( methods[i].getParameters().length == 0 ) {
- zeroArgMethod = methods[i];
- } else if ( methods[i].getParameters().length >= 2 ) {
- boolean valid = true;
- for(int m=0; m<methods[i].getParameters().length; m++) {
- final String type = methods[i].getParameters()[m].getType();
- if ( !type.equals(TYPE_BUNDLE_CONTEXT)
- && !type.equals(TYPE_COMPONENT_CONTEXT)
- && !type.equals(TYPE_MAP) ) {
- // if this is deactivate, int and integer are possible as well
- if ( isActivate || (!type.equals(TYPE_INT) && !type.equals(TYPE_INTEGER)) ) {
- valid = false;
- }
- }
- }
- if ( valid ) {
- if ( found == null ) {
- found = methods[i];
- } else {
- // print warning
- this.logWarn( iLog, "Lifecycle method " + methods[i].getName()
- + " occurs several times with different matching signature." );
- }
- }
- }
- }
- i++;
- }
- if ( found != null ) {
- method = found;
- } else {
- method = zeroArgMethod;
- }
- }
- }
- }
- // if no method is found, we check for any method with that name to print some warnings!
- if ( method == null ) {
- final JavaMethod[] methods = javaClass.getMethods();
- for(int i=0; i<methods.length; i++) {
- if ( methodName.equals(methods[i].getName()) ) {
- if ( methods[i].getParameters().length != 1 ) {
- this.logWarn( iLog, "Lifecycle method " + methods[i].getName()
- + " has wrong number of arguments" );
- } else {
- this.logWarn( iLog, "Lifecycle method " + methods[i].getName() + " has wrong argument "
- + methods[i].getParameters()[0].getType() );
- }
- }
- }
- }
- }
- // method must be protected for version 1.0
- if ( method != null && specVersion == Constants.VERSION_1_0) {
- // check protected
- if (method.isPublic()) {
- this.logWarn( iLog, "Lifecycle method " + method.getName() + " should be declared protected" );
- } else if (!method.isProtected()) {
- this.logWarn( iLog, "Lifecycle method " + method.getName()
- + " has wrong qualifier, public or protected required" );
- }
- }
- }
+ *
+ * @param specVersion
+ * The spec version
+ * @param javaClass
+ * The java class to inspect.
+ * @param methodName
+ * The method name.
+ * @param warnings
+ * The list of warnings used to add new warnings.
+ * protected void checkLifecycleMethod(final int specVersion, final JavaClassDescription javaClass, final String
+ * methodName,
+ * final boolean isActivate, final IssueLog iLog) throws SCRDescriptorException {
+ * // first candidate is (de)activate(ComponentContext)
+ * JavaMethod method = javaClass.getMethodBySignature(methodName, new String[] { TYPE_COMPONENT_CONTEXT });
+ * if (method == null) {
+ * if (specVersion >= Constants.VERSION_1_1) {
+ * // second candidate is (de)activate(BundleContext)
+ * method = javaClass.getMethodBySignature(methodName, new String[] { TYPE_BUNDLE_CONTEXT });
+ * if (method == null) {
+ * // third candidate is (de)activate(Map)
+ * method = javaClass.getMethodBySignature(methodName, new String[] { TYPE_MAP });
+ *
+ * if (method == null) {
+ * // if this is a deactivate method, we have two
+ * // additional possibilities
+ * // a method with parameter of type int and one of type
+ * // Integer
+ * if (!isActivate) {
+ * method = javaClass.getMethodBySignature(methodName, new String[] { TYPE_INT });
+ * if (method == null) {
+ * method = javaClass.getMethodBySignature(methodName, new String[] { TYPE_INTEGER });
+ * }
+ * }
+ *
+ * // fourth candidate is (de)activate with two or three
+ * // arguments (type must be BundleContext, ComponentCtx
+ * // and Map)
+ * // as we have to iterate now and the fifth candidate is
+ * // zero arguments
+ * // we already store this option
+ * JavaMethod zeroArgMethod = null;
+ * JavaMethod found = method;
+ * final JavaMethod[] methods = javaClass.getMethods();
+ * int i = 0;
+ * while (i < methods.length) {
+ * if (methodName.equals(methods[i].getName())) {
+ *
+ * if (methods[i].getParameters().length == 0) {
+ * zeroArgMethod = methods[i];
+ * } else if (methods[i].getParameters().length >= 2) {
+ * boolean valid = true;
+ * for (int m = 0; m < methods[i].getParameters().length; m++) {
+ * final String type = methods[i].getParameters()[m].getType();
+ * if (!type.equals(TYPE_BUNDLE_CONTEXT) && !type.equals(TYPE_COMPONENT_CONTEXT)
+ * && !type.equals(TYPE_MAP)) {
+ * // if this is deactivate, int and
+ * // integer are possible as well
+ * if (isActivate || (!type.equals(TYPE_INT) && !type.equals(TYPE_INTEGER))) {
+ * valid = false;
+ * }
+ * }
+ * }
+ * if (valid) {
+ * if (found == null) {
+ * found = methods[i];
+ * } else {
+ * // print warning
+ * this.logWarn(iLog, "Lifecycle method " + methods[i].getName()
+ * + " occurs several times with different matching signature.");
+ * }
+ * }
+ * }
+ * }
+ * i++;
+ * }
+ * if (found != null) {
+ * method = found;
+ * } else {
+ * method = zeroArgMethod;
+ * }
+ * }
+ * }
+ * }
+ * // if no method is found, we check for any method with that name to
+ * // print some warnings!
+ * if (method == null) {
+ * final JavaMethod[] methods = javaClass.getMethods();
+ * for (int i = 0; i < methods.length; i++) {
+ * if (methodName.equals(methods[i].getName())) {
+ * if (methods[i].getParameters().length != 1) {
+ * this.logWarn(iLog, "Lifecycle method " + methods[i].getName() + " has wrong number of arguments");
+ * } else {
+ * this.logWarn(iLog,
+ * "Lifecycle method " + methods[i].getName() + " has wrong argument "
+ * + methods[i].getParameters()[0].getType());
+ * }
+ * }
+ * }
+ * }
+ * }
+ * // method must be protected for version 1.0
+ * if (method != null && specVersion == Constants.VERSION_1_0) {
+ * // check protected
+ * if (method.isPublic()) {
+ * this.logWarn(iLog, "Lifecycle method " + method.getName() + " should be declared protected");
+ * } else if (!method.isProtected()) {
+ * this.logWarn(iLog, "Lifecycle method " + method.getName() +
+ * " has wrong qualifier, public or protected required");
+ * }
+ * }
+ * }
+ */
/**
* Return the configuration policy.
@@ -473,21 +496,14 @@ public class Component extends AbstractO
@Override
public String toString() {
- return "Component " + this.name + " (" +
- "enabled=" + (enabled==null?"<notset>":enabled) +
- ", immediate=" + (immediate == null?"<notset>":immediate) +
- ", abstract=" + isAbstract +
- ", isDS=" + isDs +
- (factory != null ? ", factory="+factory:"")+
- (configurationPolicy != null ? ", configurationPolicy=" + configurationPolicy : "") +
- (activate != null ? ", activate=" + activate : "") +
- (deactivate != null ? ", deactivate=" + deactivate : "") +
- (modified != null ? ", modified=" + modified : "") +
- ", specVersion=" + specVersion +
- ", implementation=" + implementation +
- ", service=" + service +
- ", properties=" + properties +
- ", references=" + references +
- ")";
+ return "Component " + this.name + " (" + "enabled=" + (enabled == null ? "<notset>" : enabled) + ", immediate="
+ + (immediate == null ? "<notset>" : immediate) + ", abstract=" + isAbstract + ", isDS=" + isDs
+ + (factory != null ? ", factory=" + factory : "")
+ + (configurationPolicy != null ? ", configurationPolicy=" + configurationPolicy : "")
+ + (activate != null ? ", activate=" + activate : "")
+ + (deactivate != null ? ", deactivate=" + deactivate : "")
+ + (modified != null ? ", modified=" + modified : "") + ", specVersion=" + specVersion
+ + ", implementation=" + implementation + ", service=" + service + ", properties=" + properties
+ + ", references=" + references + ")";
}
}
\ No newline at end of file
Modified: felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/om/Implementation.java
URL: http://svn.apache.org/viewvc/felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/om/Implementation.java?rev=1341309&r1=1341308&r2=1341309&view=diff
==============================================================================
--- felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/om/Implementation.java (original)
+++ felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/om/Implementation.java Tue May 22 06:04:18 2012
@@ -20,13 +20,13 @@ package org.apache.felix.scrplugin.om;
/**
* <code>Implementation</code>
- *
+ *
* contains the class name implementing the component.
*/
public class Implementation {
/** The class name. */
- private String className;
+ private final String className;
public Implementation(final String name) {
this.className = name;
@@ -35,8 +35,4 @@ public class Implementation {
public String getClassName() {
return this.className;
}
-
- public void setClassName(final String name) {
- this.className = name;
- }
}
Modified: felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/om/Interface.java
URL: http://svn.apache.org/viewvc/felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/om/Interface.java?rev=1341309&r1=1341308&r2=1341309&view=diff
==============================================================================
--- felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/om/Interface.java (original)
+++ felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/om/Interface.java Tue May 22 06:04:18 2012
@@ -22,7 +22,7 @@ import org.apache.felix.scrplugin.SCRDes
/**
* <code>Interface</code>
- *
+ *
* contains an interface name the component is implementing
* (the interface name can also be a class name)
*/
@@ -35,14 +35,14 @@ public class Interface extends AbstractO
* Default constructor.
*/
public Interface() {
- this(null, null, -1);
+ this(null, null);
}
/**
* Constructor from java source.
*/
- public Interface(final String annotationName, final String sourceLocation, final int lineNumber) {
- super(annotationName, sourceLocation, lineNumber);
+ public Interface(final String annotationName, final String sourceLocation) {
+ super(annotationName, sourceLocation);
}
/**
@@ -64,16 +64,15 @@ public class Interface extends AbstractO
* If errors occur a message is added to the issues list,
* warnings can be added to the warnings list.
*/
- public void validate(final Context context)
- throws SCRDescriptorException {
+ public void validate(final Context context) throws SCRDescriptorException {
if (context.getClassDescription().getDescribedClass().isInterface()) {
- this.logError( context.getIssueLog(), "Must be declared in a Java class - not an interface" );
+ this.logError(context.getIssueLog(), "Must be declared in a Java class - not an interface");
} else {
try {
final Class<?> interfaceClass = context.getProject().getClassLoader().loadClass(this.interfaceName);
- if ( !interfaceClass.isAssignableFrom(context.getClassDescription().getDescribedClass()) ) {
+ if (!interfaceClass.isAssignableFrom(context.getClassDescription().getDescribedClass())) {
// interface not implemented
- this.logError( context.getIssueLog(), "Class must implement provided interface " + this.interfaceName);
+ this.logError(context.getIssueLog(), "Class must implement provided interface " + this.interfaceName);
}
} catch (final ClassNotFoundException cnfe) {
throw new SCRDescriptorException("Unable to load interface class.", cnfe);
Modified: felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/om/Property.java
URL: http://svn.apache.org/viewvc/felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/om/Property.java?rev=1341309&r1=1341308&r2=1341309&view=diff
==============================================================================
--- felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/om/Property.java (original)
+++ felix/sandbox/cziegeler/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/om/Property.java Tue May 22 06:04:18 2012
@@ -24,7 +24,7 @@ import org.apache.felix.scrplugin.descri
/**
* <code>Property.java</code>...
- *
+ *
*/
public class Property extends AbstractObject {
@@ -42,14 +42,14 @@ public class Property extends AbstractOb
* Default constructor.
*/
public Property() {
- this(null, null, -1);
+ this(null, null);
}
/**
* Constructor from java source.
*/
- public Property(final String annotationName, final String sourceLocation, final int lineNumber) {
- super(annotationName, sourceLocation, lineNumber);
+ public Property(final String annotationName, final String sourceLocation) {
+ super(annotationName, sourceLocation);
}
public String getName() {
@@ -92,20 +92,21 @@ public class Property extends AbstractOb
* warnings can be added to the warnings list.
*/
public void validate(final Context context) {
- if ( name == null || name.trim().length() == 0 ) {
- this.logError( context.getIssueLog(), "Property name can not be empty." );
+ if (name == null || name.trim().length() == 0) {
+ this.logError(context.getIssueLog(), "Property name can not be empty.");
}
- if ( type != null ) {
+ if (type != null) {
try {
PropertyType.valueOf(this.type);
} catch (final IllegalArgumentException iae) {
- this.logError( context.getIssueLog(), "Property " + name + " has unknown type: " + type );
+ this.logError(context.getIssueLog(), "Property " + name + " has unknown type: " + type);
}
// now check for old and new char
- if ( context.getSpecVersion() == SpecVersion.VERSION_1_0 && type.equals(Constants.PROPERTY_TYPE_CHAR_1_1) ) {
+ if (context.getSpecVersion() == SpecVersion.VERSION_1_0 && type.equals(Constants.PROPERTY_TYPE_CHAR_1_1)) {
type = Constants.PROPERTY_TYPE_CHAR;
}
- if ( context.getSpecVersion().ordinal() >= SpecVersion.VERSION_1_1.ordinal() && type.equals(Constants.PROPERTY_TYPE_CHAR) ) {
+ if (context.getSpecVersion().ordinal() >= SpecVersion.VERSION_1_1.ordinal()
+ && type.equals(Constants.PROPERTY_TYPE_CHAR)) {
type = Constants.PROPERTY_TYPE_CHAR_1_1;
}
}