You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by gu...@apache.org on 2013/07/26 14:33:30 UTC
svn commit: r1507289 [2/3] - in /felix/trunk/ipojo/manipulator:
annotations/src/main/java/org/apache/felix/ipojo/annotations/
manipulator-it/ipojo-manipulator-manipulation-test/src/main/java/org/apache/felix/ipojo/runtime/core/components/
manipulator-i...
Added: felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/model/parser/replay/VisitAnnotation.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/model/parser/replay/VisitAnnotation.java?rev=1507289&view=auto
==============================================================================
--- felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/model/parser/replay/VisitAnnotation.java (added)
+++ felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/model/parser/replay/VisitAnnotation.java Fri Jul 26 12:33:28 2013
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.felix.ipojo.manipulator.metadata.annotation.model.parser.replay;
+
+import org.objectweb.asm.AnnotationVisitor;
+
+/**
+* User: guillaume
+* Date: 30/05/13
+* Time: 17:24
+*/
+public class VisitAnnotation implements Replay {
+ private final String m_name;
+ private final String m_desc;
+ private final AnnotationRecorder m_sub;
+
+ public VisitAnnotation(final String name, final String desc, final AnnotationRecorder sub) {
+ m_name = name;
+ m_desc = desc;
+ m_sub = sub;
+ }
+
+ public void accept(final AnnotationVisitor visitor) {
+ AnnotationVisitor child = visitor.visitAnnotation(m_name, m_desc);
+ if (child != null) {
+ m_sub.accept(child);
+ }
+ }
+}
Added: felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/model/parser/replay/VisitArray.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/model/parser/replay/VisitArray.java?rev=1507289&view=auto
==============================================================================
--- felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/model/parser/replay/VisitArray.java (added)
+++ felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/model/parser/replay/VisitArray.java Fri Jul 26 12:33:28 2013
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.felix.ipojo.manipulator.metadata.annotation.model.parser.replay;
+
+import org.objectweb.asm.AnnotationVisitor;
+
+/**
+* User: guillaume
+* Date: 30/05/13
+* Time: 17:24
+*/
+public class VisitArray implements Replay {
+ private final String m_name;
+ private final AnnotationRecorder m_sub;
+
+ public VisitArray(final String name, final AnnotationRecorder sub) {
+ m_name = name;
+ m_sub = sub;
+ }
+
+ public void accept(final AnnotationVisitor visitor) {
+ AnnotationVisitor child = visitor.visitArray(m_name);
+ if (child != null) {
+ m_sub.accept(child);
+ }
+ }
+}
Added: felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/model/parser/replay/VisitEnd.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/model/parser/replay/VisitEnd.java?rev=1507289&view=auto
==============================================================================
--- felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/model/parser/replay/VisitEnd.java (added)
+++ felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/model/parser/replay/VisitEnd.java Fri Jul 26 12:33:28 2013
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.felix.ipojo.manipulator.metadata.annotation.model.parser.replay;
+
+import org.objectweb.asm.AnnotationVisitor;
+
+/**
+* User: guillaume
+* Date: 30/05/13
+* Time: 17:24
+*/
+public class VisitEnd implements Replay {
+
+ public void accept(final AnnotationVisitor visitor) {
+ visitor.visitEnd();
+ }
+}
Added: felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/model/parser/replay/VisitEnum.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/model/parser/replay/VisitEnum.java?rev=1507289&view=auto
==============================================================================
--- felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/model/parser/replay/VisitEnum.java (added)
+++ felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/model/parser/replay/VisitEnum.java Fri Jul 26 12:33:28 2013
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.felix.ipojo.manipulator.metadata.annotation.model.parser.replay;
+
+import org.objectweb.asm.AnnotationVisitor;
+
+/**
+* User: guillaume
+* Date: 30/05/13
+* Time: 17:23
+*/
+public class VisitEnum implements Replay {
+ private final String m_name;
+ private final String m_desc;
+ private final String m_value;
+
+ public VisitEnum(final String name, final String desc, final String value) {m_name = name;
+ m_desc = desc;
+ m_value = value;
+ }
+
+ public void accept(final AnnotationVisitor visitor) {
+ visitor.visitEnum(m_name, m_desc, m_value);
+ }
+}
Modified: felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/Binding.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/Binding.java?rev=1507289&r1=1507288&r2=1507289&view=diff
==============================================================================
--- felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/Binding.java (original)
+++ felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/Binding.java Fri Jul 26 12:33:28 2013
@@ -19,8 +19,11 @@
package org.apache.felix.ipojo.manipulator.metadata.annotation.registry;
+import static java.lang.String.format;
+
import org.apache.felix.ipojo.manipulator.spi.AnnotationVisitorFactory;
import org.apache.felix.ipojo.manipulator.spi.Predicate;
+import org.objectweb.asm.Type;
import java.lang.annotation.Annotation;
@@ -29,15 +32,15 @@ import java.lang.annotation.Annotation;
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
public class Binding {
- private Class<? extends Annotation> annotationType;
+ private Type annotationType;
private AnnotationVisitorFactory factory;
private Predicate predicate;
- public Class<? extends Annotation> getAnnotationType() {
+ public Type getAnnotationType() {
return annotationType;
}
- public void setAnnotationType(Class<? extends Annotation> annotationType) {
+ public void setAnnotationType(Type annotationType) {
this.annotationType = annotationType;
}
@@ -56,4 +59,9 @@ public class Binding {
public void setPredicate(Predicate predicate) {
this.predicate = predicate;
}
+
+ @Override
+ public String toString() {
+ return format("Binding[@%s->%s]", annotationType.getClassName(), factory);
+ }
}
Modified: felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/BindingRegistry.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/BindingRegistry.java?rev=1507289&r1=1507288&r2=1507289&view=diff
==============================================================================
--- felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/BindingRegistry.java (original)
+++ felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/BindingRegistry.java Fri Jul 26 12:33:28 2013
@@ -19,65 +19,25 @@
package org.apache.felix.ipojo.manipulator.metadata.annotation.registry;
-import org.apache.felix.ipojo.manipulator.Reporter;
-import org.apache.felix.ipojo.manipulator.metadata.annotation.ComponentWorkbench;
-import org.apache.felix.ipojo.manipulator.spi.Predicate;
-import org.objectweb.asm.Type;
-
-import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
+
+import org.apache.felix.ipojo.manipulator.metadata.annotation.ComponentWorkbench;
/**
- * Stores all the {@link Binding}s coming from the {@link org.apache.felix.ipojo.manipulator.spi.Module}.
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ * User: guillaume
+ * Date: 11/07/13
+ * Time: 16:12
*/
-public class BindingRegistry {
- private Map<String, List<Binding>> tree;
- private Reporter reporter;
-
- /**
- * When no other Binding is selected, the default Bindings list is used.
- */
- private List<Binding> defaultBindings;
-
- public BindingRegistry(Reporter reporter) {
- this.reporter = reporter;
- tree = new HashMap<String, List<Binding>>();
- defaultBindings = new ArrayList<Binding>();
- }
+public interface BindingRegistry {
+ void addBindings(Iterable<Binding> bindings);
- /**
- * Stores the given Bindings
- */
- public void addBindings(Iterable<Binding> bindings) {
- for (Binding binding : bindings) {
- Type type = Type.getType(binding.getAnnotationType());
-
- List<Binding> potential = tree.get(type.getDescriptor());
- if (potential == null) {
- // Annotation is not already found in supported list
- potential = new ArrayList<Binding>();
- tree.put(type.getDescriptor(), potential);
- }
-
- potential.add(binding);
- }
- }
+ Selection selection(ComponentWorkbench workbench);
/**
- * Initiate a {@link Selection} for the given workbench.
+ * Find the list of {@link Binding} registered with the given annotation type.
+ * This method returns an empty List if no bindings are registered.
+ * @param descriptor denotes the annotation's type
+ * @return the list of {@link Binding} registered with the given descriptor, the list may be empty if no bindings are found.
*/
- public Selection selection(ComponentWorkbench workbench) {
- return new Selection(this, workbench, reporter);
- }
-
- public List<Binding> getBindings(String descriptor) {
- return tree.get(descriptor);
- }
-
- public List<Binding> getDefaultBindings() {
- return defaultBindings;
- }
+ List<Binding> getBindings(String descriptor);
}
Added: felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/CompletableBindingRegistry.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/CompletableBindingRegistry.java?rev=1507289&view=auto
==============================================================================
--- felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/CompletableBindingRegistry.java (added)
+++ felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/CompletableBindingRegistry.java Fri Jul 26 12:33:28 2013
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.felix.ipojo.manipulator.metadata.annotation.registry;
+
+import java.util.List;
+
+import org.apache.felix.ipojo.manipulator.Reporter;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.ComponentWorkbench;
+import org.objectweb.asm.Type;
+
+/**
+ * User: guillaume
+ * Date: 11/07/13
+ * Time: 16:09
+ */
+public abstract class CompletableBindingRegistry implements BindingRegistry {
+ private final BindingRegistry m_delegate;
+ private final Reporter m_reporter;
+
+ public CompletableBindingRegistry(final BindingRegistry delegate, final Reporter reporter) {
+ m_delegate = delegate;
+ m_reporter = reporter;
+ }
+
+ public List<Binding> getBindings(final String descriptor) {
+ List<Binding> bindings = m_delegate.getBindings(descriptor);
+ if (bindings.isEmpty()) {
+ List<Binding> ignored = createBindings(Type.getType(descriptor));
+ m_delegate.addBindings(ignored);
+ return ignored;
+ }
+ return bindings;
+ }
+
+ protected abstract List<Binding> createBindings(final Type type);
+
+ public void addBindings(final Iterable<Binding> bindings) {
+ m_delegate.addBindings(bindings);
+ }
+
+ public Selection selection(final ComponentWorkbench workbench) {
+ return new Selection(this, workbench, m_reporter);
+ }
+
+}
Added: felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/DefaultBindingRegistry.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/DefaultBindingRegistry.java?rev=1507289&view=auto
==============================================================================
--- felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/DefaultBindingRegistry.java (added)
+++ felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/DefaultBindingRegistry.java Fri Jul 26 12:33:28 2013
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.felix.ipojo.manipulator.metadata.annotation.registry;
+
+import static java.util.Collections.emptyList;
+
+import org.apache.felix.ipojo.manipulator.Reporter;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.ComponentWorkbench;
+import org.objectweb.asm.Type;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Stores all the {@link Binding}s coming from the {@link org.apache.felix.ipojo.manipulator.spi.Module}.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class DefaultBindingRegistry implements BindingRegistry {
+ private final Map<String, List<Binding>> tree = new HashMap<String, List<Binding>>();
+ protected final Reporter reporter;
+
+ public DefaultBindingRegistry(Reporter reporter) {
+ this.reporter = reporter;
+ }
+
+ /**
+ * Stores the given Bindings
+ */
+ public void addBindings(Iterable<Binding> bindings) {
+ for (Binding binding : bindings) {
+ Type type = binding.getAnnotationType();
+
+ List<Binding> potential = tree.get(type.getDescriptor());
+ if (potential == null) {
+ // Annotation is not already found in supported list
+ potential = new ArrayList<Binding>();
+ tree.put(type.getDescriptor(), potential);
+ }
+
+ reporter.trace("Registered @%s", type.getClassName());
+ potential.add(binding);
+ }
+ }
+
+ /**
+ * Initiate a {@link Selection} for the given workbench.
+ */
+ public Selection selection(ComponentWorkbench workbench) {
+ return new Selection(this, workbench, reporter);
+ }
+
+ public List<Binding> getBindings(String descriptor) {
+ List<Binding> bindings = tree.get(descriptor);
+ if (bindings == null) {
+ bindings = emptyList();
+ }
+ return bindings;
+ }
+
+}
Added: felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/IgnoreAllBindingRegistry.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/IgnoreAllBindingRegistry.java?rev=1507289&view=auto
==============================================================================
--- felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/IgnoreAllBindingRegistry.java (added)
+++ felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/IgnoreAllBindingRegistry.java Fri Jul 26 12:33:28 2013
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.felix.ipojo.manipulator.metadata.annotation.registry;
+
+import static java.util.Collections.singletonList;
+
+import java.util.List;
+
+import org.apache.felix.ipojo.manipulator.Reporter;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.ignore.NullBinding;
+import org.objectweb.asm.Type;
+
+/**
+ * User: guillaume
+ * Date: 11/07/13
+ * Time: 16:09
+ */
+public class IgnoreAllBindingRegistry extends CompletableBindingRegistry {
+
+ public IgnoreAllBindingRegistry(final BindingRegistry delegate, final Reporter reporter) {
+ super(delegate, reporter);
+ }
+
+ @Override
+ protected List<Binding> createBindings(final Type type) {
+ return singletonList((Binding) new NullBinding(type));
+ }
+
+}
Added: felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/LegacyGenericBindingRegistry.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/LegacyGenericBindingRegistry.java?rev=1507289&view=auto
==============================================================================
--- felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/LegacyGenericBindingRegistry.java (added)
+++ felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/LegacyGenericBindingRegistry.java Fri Jul 26 12:33:28 2013
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.felix.ipojo.manipulator.metadata.annotation.registry;
+
+import static java.util.Collections.emptyList;
+import static java.util.Collections.singletonList;
+import static org.apache.felix.ipojo.manipulator.spi.helper.Predicates.alwaysTrue;
+
+import java.util.List;
+import java.util.regex.Pattern;
+
+import org.apache.felix.ipojo.manipulator.Reporter;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.generic.FieldGenericVisitor;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.generic.MethodGenericVisitor;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.generic.ParameterGenericVisitor;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.generic.TypeGenericVisitor;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.util.Elements;
+import org.apache.felix.ipojo.manipulator.spi.AnnotationVisitorFactory;
+import org.apache.felix.ipojo.manipulator.spi.BindingContext;
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.tree.ClassNode;
+import org.objectweb.asm.tree.FieldNode;
+import org.objectweb.asm.tree.MethodNode;
+
+/**
+ * User: guillaume
+ * Date: 11/07/13
+ * Time: 16:09
+ */
+public class LegacyGenericBindingRegistry extends CompletableBindingRegistry {
+ public static final Pattern CUSTOM_HANDLER_PATTERN = Pattern.compile("(.*\\.ipojo\\..*)|(.*\\.handler\\..*)");
+
+ public LegacyGenericBindingRegistry(final BindingRegistry delegate, final Reporter reporter) {
+ super(delegate, reporter);
+ }
+
+ @Override
+ protected List<Binding> createBindings(final Type type) {
+ if (CUSTOM_HANDLER_PATTERN.matcher(type.getClassName()).matches()) {
+ Binding binding = new Binding();
+ binding.setAnnotationType(type);
+ binding.setPredicate(alwaysTrue());
+ binding.setFactory(new AnnotationVisitorFactory() {
+ // Need to build a new Element instance for each created visitor
+ public AnnotationVisitor newAnnotationVisitor(BindingContext context) {
+ if (context.getNode() instanceof ClassNode) {
+ return new TypeGenericVisitor(context.getWorkbench(),
+ Elements.buildElement(type));
+ } else if (context.getNode() instanceof FieldNode) {
+ return new FieldGenericVisitor(context.getWorkbench(),
+ Elements.buildElement(type),
+ (FieldNode) context.getNode());
+
+ } else if ((context.getNode() instanceof MethodNode) &&
+ (context.getParameterIndex() == BindingContext.NO_INDEX)) {
+ return new MethodGenericVisitor(context.getWorkbench(),
+ Elements.buildElement(type),
+ (MethodNode) context.getNode());
+ } else {
+ // last case: method parameter annotation
+ return new ParameterGenericVisitor(context.getWorkbench(),
+ Elements.buildElement(type),
+ (MethodNode) context.getNode(),
+ context.getParameterIndex());
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "LegacyGenericVisitorFactory";
+ }
+ });
+
+ // Return the produced generic binding
+ return singletonList(binding);
+ }
+
+ return emptyList();
+ }
+}
Added: felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/MetaAnnotationBindingRegistry.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/MetaAnnotationBindingRegistry.java?rev=1507289&view=auto
==============================================================================
--- felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/MetaAnnotationBindingRegistry.java (added)
+++ felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/MetaAnnotationBindingRegistry.java Fri Jul 26 12:33:28 2013
@@ -0,0 +1,160 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.felix.ipojo.manipulator.metadata.annotation.registry;
+
+import static java.util.Collections.emptyList;
+import static java.util.Collections.unmodifiableList;
+import static org.apache.felix.ipojo.manipulator.spi.helper.Predicates.alwaysTrue;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.felix.ipojo.annotations.HandlerBinding;
+import org.apache.felix.ipojo.annotations.Ignore;
+import org.apache.felix.ipojo.annotations.Stereotype;
+import org.apache.felix.ipojo.manipulator.Reporter;
+import org.apache.felix.ipojo.manipulator.ResourceStore;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.model.AnnotationType;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.model.discovery.ChainedAnnotationDiscovery;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.model.discovery.HandlerBindingDiscovery;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.model.discovery.IgnoredDiscovery;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.model.discovery.StereotypeDiscovery;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.model.parser.AnnotationParser;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.generic.GenericVisitorFactory;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.ignore.NullBinding;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.stereotype.StereotypeVisitorFactory;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.util.Elements;
+import org.apache.felix.ipojo.metadata.Element;
+import org.objectweb.asm.Type;
+
+/**
+ * The {@link MetaAnnotationBindingRegistry} is a registry that tries to complete its list
+ * of bindings when an unknown one is detected.
+ * It uses the given {@link ResourceStore} to parse the annotation's type and find if
+ * it's annotated with @{@link org.apache.felix.ipojo.annotations.Stereotype},
+ * @{@link org.apache.felix.ipojo.annotations.HandlerBinding} or @{@link org.apache.felix.ipojo.annotations.Ignore}
+ */
+public class MetaAnnotationBindingRegistry extends CompletableBindingRegistry {
+
+ private ResourceStore m_store;
+ private Reporter m_reporter;
+
+ public MetaAnnotationBindingRegistry(final BindingRegistry delegate, final Reporter reporter, final ResourceStore store) {
+ super(delegate, reporter);
+ this.m_reporter = reporter;
+ this.m_store = store;
+ addBindings(nullBindingsForMetaAnnotations());
+ }
+
+ protected Iterable<Binding> nullBindingsForMetaAnnotations() {
+ // Do not re-apply meta-annotations
+ ArrayList<Binding> bindings = new ArrayList<Binding>();
+ bindings.add(new NullBinding(Type.getType(Stereotype.class)));
+ bindings.add(new NullBinding(Type.getType(HandlerBinding.class)));
+ bindings.add(new NullBinding(Type.getType(Ignore.class)));
+ return bindings;
+ }
+
+ @Override
+ protected List<Binding> createBindings(final Type type) {
+
+ // Parse the annotation
+ byte[] bytes;
+ try {
+ bytes = m_store.read(type.getInternalName().concat(".class"));
+ } catch (IOException e) {
+ // Annotation type cannot be read
+ m_reporter.trace("Could not read bytecode for @%s", type.getClassName());
+ return emptyList();
+ }
+ AnnotationParser parser = new AnnotationParser();
+ AnnotationType annotationType = parser.read(bytes);
+
+ // Search meta-annotations
+ ChainedAnnotationDiscovery chain = new ChainedAnnotationDiscovery();
+ StereotypeDiscovery stereotypeDiscovery = new StereotypeDiscovery();
+ HandlerBindingDiscovery handlerBindingDiscovery = new HandlerBindingDiscovery();
+ IgnoredDiscovery ignoredDiscovery = new IgnoredDiscovery();
+ chain.getDiscoveries().add(stereotypeDiscovery);
+ chain.getDiscoveries().add(handlerBindingDiscovery);
+ chain.getDiscoveries().add(ignoredDiscovery);
+
+ annotationType.traverse(chain);
+
+ // Produced Bindings
+ List<Binding> bindings = new ArrayList<Binding>();
+
+ // @Stereotype support
+ if (stereotypeDiscovery.isStereotype()) {
+ m_reporter.trace("@Stereotype detected: @%s", type.getClassName());
+ Binding binding = new Binding();
+ binding.setAnnotationType(type);
+ binding.setPredicate(alwaysTrue());
+ binding.setFactory(new StereotypeVisitorFactory(annotationType));
+
+ bindings.add(binding);
+ }
+
+ // @HandlerBinding support
+ if (handlerBindingDiscovery.isHandlerBinding()) {
+
+ m_reporter.trace("@HandlerBinding detected: @%s", type.getClassName());
+ Binding binding = new Binding();
+ binding.setAnnotationType(type);
+ binding.setPredicate(alwaysTrue());
+ final Element element = buildElement(handlerBindingDiscovery, type);
+ binding.setFactory(new GenericVisitorFactory(element.getName(), element.getNameSpace()));
+
+ bindings.add(binding);
+ }
+
+ // Its IMPORTANT that the @Ignore is processed last since it removes existing bindings
+ if (ignoredDiscovery.isIgnore()) {
+ m_reporter.trace("@Ignore detected: @%s", type.getClassName());
+ Binding binding = new NullBinding(type);
+
+ bindings.clear();
+ bindings.add(binding);
+ bindings = unmodifiableList(bindings); // just in case of ...
+ }
+
+ return bindings;
+
+ }
+
+ private Element buildElement(final HandlerBindingDiscovery handler, final Type type) {
+ Element element;
+ if ((handler.getNamespace() == null) &&
+ (handler.getValue() == null)) {
+ // No attributes specified, use annotation type as element's source
+ element = Elements.buildElement(type);
+ } else if ((handler.getNamespace() == null) &&
+ (handler.getValue() != null)) {
+ // Namespace attribute is omitted
+ element = Elements.buildElement(handler.getValue());
+ } else {
+ element = Elements.buildElement(handler.getNamespace(),
+ handler.getValue());
+ }
+ return element;
+ }
+
+}
Modified: felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/Selection.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/Selection.java?rev=1507289&r1=1507288&r2=1507289&view=diff
==============================================================================
--- felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/Selection.java (original)
+++ felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/registry/Selection.java Fri Jul 26 12:33:28 2013
@@ -22,6 +22,7 @@ package org.apache.felix.ipojo.manipulat
import org.apache.felix.ipojo.manipulator.Reporter;
import org.apache.felix.ipojo.manipulator.metadata.annotation.ComponentWorkbench;
import org.apache.felix.ipojo.manipulator.spi.BindingContext;
+import org.apache.felix.ipojo.manipulator.util.ChainedAnnotationVisitor;
import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.FieldVisitor;
@@ -34,7 +35,6 @@ import org.objectweb.asm.tree.MethodNode
import java.lang.annotation.ElementType;
import java.util.ArrayList;
-import java.util.Iterator;
import java.util.List;
/**
@@ -42,13 +42,13 @@ import java.util.List;
* It's a query DSL.
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
-public class Selection implements Iterable<AnnotationVisitor> {
+public class Selection {
private BindingRegistry registry;
private ComponentWorkbench workbench;
private Reporter reporter;
private MemberNode node;
- private int index = -1;
+ private int index = BindingContext.NO_INDEX;
private String annotation;
private ElementType elementType = null;
private Object visitor;
@@ -94,32 +94,34 @@ public class Selection implements Iterab
}
public AnnotationVisitor get() {
- Iterator<AnnotationVisitor> i = iterator();
- if (iterator().hasNext()) {
- return i.next();
+ List<AnnotationVisitor> visitors = list();
+
+ if (visitors.isEmpty()) {
+ return null;
+ }
+
+ if (visitors.size() == 1) {
+ return visitors.get(0);
}
- return null;
- }
- public Iterator<AnnotationVisitor> iterator() {
+ ChainedAnnotationVisitor chained = new ChainedAnnotationVisitor();
+ chained.getVisitors().addAll(visitors);
+ return chained;
+ }
- List<AnnotationVisitor> visitors = new ArrayList<AnnotationVisitor>();
+ private List<AnnotationVisitor> list() {
BindingContext context = new BindingContext(workbench, reporter, Type.getType(annotation), node, elementType, index, visitor);
List<Binding> predicates = registry.getBindings(annotation);
+ List<AnnotationVisitor> visitors = new ArrayList<AnnotationVisitor>();
if (predicates != null && !predicates.isEmpty()) {
collectMatchingVisitors(predicates, context, visitors);
}
-
- if (visitors.isEmpty() && !registry.getDefaultBindings().isEmpty()) {
- collectMatchingVisitors(registry.getDefaultBindings(), context, visitors);
- }
-
-
- return visitors.iterator();
+ return visitors;
}
+
private void collectMatchingVisitors(List<Binding> bindings, BindingContext context, List<AnnotationVisitor> visitors) {
for (Binding binding : bindings) {
if (binding.getPredicate().matches(context)) {
Added: felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/generic/GenericVisitorFactory.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/generic/GenericVisitorFactory.java?rev=1507289&view=auto
==============================================================================
--- felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/generic/GenericVisitorFactory.java (added)
+++ felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/generic/GenericVisitorFactory.java Fri Jul 26 12:33:28 2013
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.generic;
+
+import org.apache.felix.ipojo.manipulator.spi.AnnotationVisitorFactory;
+import org.apache.felix.ipojo.manipulator.spi.BindingContext;
+import org.apache.felix.ipojo.metadata.Element;
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.tree.ClassNode;
+import org.objectweb.asm.tree.FieldNode;
+import org.objectweb.asm.tree.MethodNode;
+
+/**
+* User: guillaume
+* Date: 11/07/13
+* Time: 14:41
+*/
+public class GenericVisitorFactory implements AnnotationVisitorFactory {
+ private final String m_name;
+ private final String m_namespace;
+
+ public GenericVisitorFactory(final String name, final String namespace) {
+ m_name = name;
+ m_namespace = namespace;
+ }
+
+ // Need to build a new Element instance for each created visitor
+ public AnnotationVisitor newAnnotationVisitor(BindingContext context) {
+ if (context.getNode() instanceof ClassNode) {
+ return new TypeGenericVisitor(context.getWorkbench(),
+ new Element(m_name, m_namespace));
+ } else if (context.getNode() instanceof FieldNode) {
+ return new FieldGenericVisitor(context.getWorkbench(),
+ new Element(m_name, m_namespace),
+ (FieldNode) context.getNode());
+
+ } else if ((context.getNode() instanceof MethodNode) &&
+ (context.getParameterIndex() == BindingContext.NO_INDEX)) {
+ return new MethodGenericVisitor(context.getWorkbench(),
+ new Element(m_name, m_namespace),
+ (MethodNode) context.getNode());
+ } else {
+ // last case: method parameter annotation
+ return new ParameterGenericVisitor(context.getWorkbench(),
+ new Element(m_name, m_namespace),
+ (MethodNode) context.getNode(),
+ context.getParameterIndex());
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "GenericVisitorFactory";
+ }
+
+}
Added: felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/ignore/NullBinding.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/ignore/NullBinding.java?rev=1507289&view=auto
==============================================================================
--- felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/ignore/NullBinding.java (added)
+++ felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/ignore/NullBinding.java Fri Jul 26 12:33:28 2013
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.ignore;
+
+import static org.apache.felix.ipojo.manipulator.spi.helper.Predicates.alwaysTrue;
+
+import org.apache.felix.ipojo.manipulator.metadata.annotation.registry.Binding;
+import org.objectweb.asm.Type;
+
+/**
+ * User: guillaume
+ * Date: 10/07/13
+ * Time: 15:04
+ */
+public class NullBinding extends Binding {
+ public NullBinding(final Type type) {
+ super();
+ setAnnotationType(type);
+ setPredicate(alwaysTrue());
+ setFactory(NullVisitorFactory.INSTANCE);
+
+ }
+}
Added: felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/ignore/NullVisitorFactory.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/ignore/NullVisitorFactory.java?rev=1507289&view=auto
==============================================================================
--- felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/ignore/NullVisitorFactory.java (added)
+++ felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/ignore/NullVisitorFactory.java Fri Jul 26 12:33:28 2013
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.ignore;
+
+import org.apache.felix.ipojo.manipulator.spi.AnnotationVisitorFactory;
+import org.apache.felix.ipojo.manipulator.spi.BindingContext;
+import org.objectweb.asm.AnnotationVisitor;
+
+/**
+* User: guillaume
+* Date: 10/07/13
+* Time: 15:05
+*/
+public class NullVisitorFactory implements AnnotationVisitorFactory {
+ public static final AnnotationVisitorFactory INSTANCE = new NullVisitorFactory();
+
+ public AnnotationVisitor newAnnotationVisitor(final BindingContext context) {
+ return null;
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName();
+ }
+}
Modified: felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/stereotype/FieldStereotypeVisitor.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/stereotype/FieldStereotypeVisitor.java?rev=1507289&r1=1507288&r2=1507289&view=diff
==============================================================================
--- felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/stereotype/FieldStereotypeVisitor.java (original)
+++ felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/stereotype/FieldStereotypeVisitor.java Fri Jul 26 12:33:28 2013
@@ -19,10 +19,8 @@
package org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.stereotype;
-import java.util.List;
-
-import org.apache.felix.ipojo.manipulator.metadata.annotation.stereotype.replay.RootAnnotationRecorder;
-import org.objectweb.asm.ClassVisitor;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.model.AnnotationType;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.model.Playback;
import org.objectweb.asm.FieldVisitor;
import org.objectweb.asm.commons.EmptyVisitor;
@@ -33,19 +31,19 @@ import org.objectweb.asm.commons.EmptyVi
*/
public class FieldStereotypeVisitor extends EmptyVisitor {
- private final FieldVisitor delegate;
- private final List<RootAnnotationRecorder> m_recorder;
+ private final FieldVisitor m_delegate;
+ private final AnnotationType m_annotationType;
- public FieldStereotypeVisitor(final FieldVisitor delegate, List<RootAnnotationRecorder> recorder) {
- this.delegate = delegate;
- m_recorder = recorder;
+ public FieldStereotypeVisitor(final FieldVisitor delegate, AnnotationType annotationType) {
+ this.m_delegate = delegate;
+ m_annotationType = annotationType;
}
@Override
public void visitEnd() {
// Replay stereotype annotations
- for (RootAnnotationRecorder recorder : m_recorder) {
- recorder.accept(delegate);
+ for (Playback playback : m_annotationType.getPlaybacks()) {
+ playback.accept(m_delegate);
}
}
}
Modified: felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/stereotype/MethodStereotypeVisitor.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/stereotype/MethodStereotypeVisitor.java?rev=1507289&r1=1507288&r2=1507289&view=diff
==============================================================================
--- felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/stereotype/MethodStereotypeVisitor.java (original)
+++ felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/stereotype/MethodStereotypeVisitor.java Fri Jul 26 12:33:28 2013
@@ -19,10 +19,8 @@
package org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.stereotype;
-import java.util.List;
-
-import org.apache.felix.ipojo.manipulator.metadata.annotation.stereotype.replay.RootAnnotationRecorder;
-import org.objectweb.asm.FieldVisitor;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.model.AnnotationType;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.model.Playback;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.commons.EmptyVisitor;
@@ -33,19 +31,19 @@ import org.objectweb.asm.commons.EmptyVi
*/
public class MethodStereotypeVisitor extends EmptyVisitor {
- private final MethodVisitor delegate;
- private final List<RootAnnotationRecorder> m_recorder;
+ private final MethodVisitor m_delegate;
+ private final AnnotationType m_annotationType;
- public MethodStereotypeVisitor(final MethodVisitor delegate, List<RootAnnotationRecorder> recorder) {
- this.delegate = delegate;
- m_recorder = recorder;
+ public MethodStereotypeVisitor(final MethodVisitor delegate, AnnotationType annotationType) {
+ this.m_delegate = delegate;
+ m_annotationType = annotationType;
}
@Override
public void visitEnd() {
// Replay stereotype annotations
- for (RootAnnotationRecorder recorder : m_recorder) {
- recorder.accept(delegate);
+ for (Playback playback : m_annotationType.getPlaybacks()) {
+ playback.accept(m_delegate);
}
}
}
Modified: felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/stereotype/ParameterStereotypeVisitor.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/stereotype/ParameterStereotypeVisitor.java?rev=1507289&r1=1507288&r2=1507289&view=diff
==============================================================================
--- felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/stereotype/ParameterStereotypeVisitor.java (original)
+++ felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/stereotype/ParameterStereotypeVisitor.java Fri Jul 26 12:33:28 2013
@@ -19,10 +19,8 @@
package org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.stereotype;
-import java.util.List;
-
-import org.apache.felix.ipojo.manipulator.metadata.annotation.stereotype.replay.RootAnnotationRecorder;
-import org.objectweb.asm.FieldVisitor;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.model.AnnotationType;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.model.Playback;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.commons.EmptyVisitor;
@@ -33,21 +31,21 @@ import org.objectweb.asm.commons.EmptyVi
*/
public class ParameterStereotypeVisitor extends EmptyVisitor {
- private final MethodVisitor delegate;
+ private final MethodVisitor m_delegate;
private final int index;
- private final List<RootAnnotationRecorder> m_recorder;
+ private final AnnotationType m_annotationType;
- public ParameterStereotypeVisitor(final MethodVisitor delegate, final int index, List<RootAnnotationRecorder> recorder) {
- this.delegate = delegate;
+ public ParameterStereotypeVisitor(final MethodVisitor delegate, final int index, AnnotationType annotationType) {
+ this.m_delegate = delegate;
this.index = index;
- m_recorder = recorder;
+ m_annotationType = annotationType;
}
@Override
public void visitEnd() {
// Replay stereotype annotations
- for (RootAnnotationRecorder recorder : m_recorder) {
- recorder.accept(delegate, index);
+ for (Playback playback : m_annotationType.getPlaybacks()) {
+ playback.accept(m_delegate, index);
}
}
}
Added: felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/stereotype/StereotypeVisitorFactory.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/stereotype/StereotypeVisitorFactory.java?rev=1507289&view=auto
==============================================================================
--- felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/stereotype/StereotypeVisitorFactory.java (added)
+++ felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/stereotype/StereotypeVisitorFactory.java Fri Jul 26 12:33:28 2013
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.stereotype;
+
+import org.apache.felix.ipojo.manipulator.metadata.annotation.model.AnnotationType;
+import org.apache.felix.ipojo.manipulator.spi.AnnotationVisitorFactory;
+import org.apache.felix.ipojo.manipulator.spi.BindingContext;
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.tree.ClassNode;
+import org.objectweb.asm.tree.FieldNode;
+import org.objectweb.asm.tree.MethodNode;
+
+/**
+* User: guillaume
+* Date: 11/07/13
+* Time: 14:26
+*/
+public class StereotypeVisitorFactory implements AnnotationVisitorFactory {
+ private final AnnotationType m_annotationType;
+
+ public StereotypeVisitorFactory(final AnnotationType annotationType) {
+ m_annotationType = annotationType;
+ }
+
+ public AnnotationVisitor newAnnotationVisitor(BindingContext context) {
+ if (context.getNode() instanceof ClassNode) {
+ return new TypeStereotypeVisitor((ClassVisitor) context.getVisitor(),
+ m_annotationType);
+ } else if (context.getNode() instanceof FieldNode) {
+ return new FieldStereotypeVisitor((FieldVisitor) context.getVisitor(),
+ m_annotationType);
+
+ } else if ((context.getNode() instanceof MethodNode) &&
+ (context.getParameterIndex() == BindingContext.NO_INDEX)) {
+ return new MethodStereotypeVisitor((MethodVisitor) context.getVisitor(),
+ m_annotationType);
+
+ } else {
+ // last case: method parameter annotation
+ return new ParameterStereotypeVisitor((MethodVisitor) context.getVisitor(),
+ context.getParameterIndex(),
+ m_annotationType);
+ }
+
+ }
+
+ @Override
+ public String toString() {
+ return "StereotypeVisitorFactory";
+ }
+}
Modified: felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/stereotype/TypeStereotypeVisitor.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/stereotype/TypeStereotypeVisitor.java?rev=1507289&r1=1507288&r2=1507289&view=diff
==============================================================================
--- felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/stereotype/TypeStereotypeVisitor.java (original)
+++ felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/stereotype/TypeStereotypeVisitor.java Fri Jul 26 12:33:28 2013
@@ -19,9 +19,8 @@
package org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.stereotype;
-import java.util.List;
-
-import org.apache.felix.ipojo.manipulator.metadata.annotation.stereotype.replay.RootAnnotationRecorder;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.model.AnnotationType;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.model.Playback;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.commons.EmptyVisitor;
@@ -32,19 +31,19 @@ import org.objectweb.asm.commons.EmptyVi
*/
public class TypeStereotypeVisitor extends EmptyVisitor {
- private final ClassVisitor delegate;
- private final List<RootAnnotationRecorder> m_recorder;
+ private final ClassVisitor m_delegate;
+ private final AnnotationType m_annotationType;
- public TypeStereotypeVisitor(final ClassVisitor delegate, List<RootAnnotationRecorder> recorder) {
- this.delegate = delegate;
- m_recorder = recorder;
+ public TypeStereotypeVisitor(final ClassVisitor delegate, AnnotationType annotationType) {
+ this.m_delegate = delegate;
+ m_annotationType = annotationType;
}
@Override
public void visitEnd() {
// Replay stereotype annotations
- for (RootAnnotationRecorder recorder : m_recorder) {
- recorder.accept(delegate);
+ for (Playback playback : m_annotationType.getPlaybacks()) {
+ playback.accept(m_delegate);
}
}
}
Modified: felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/util/Bindings.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/util/Bindings.java?rev=1507289&r1=1507288&r2=1507289&view=diff
==============================================================================
--- felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/util/Bindings.java (original)
+++ felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/util/Bindings.java Fri Jul 26 12:33:28 2013
@@ -21,129 +21,31 @@ package org.apache.felix.ipojo.manipulat
import org.apache.felix.ipojo.manipulator.Reporter;
import org.apache.felix.ipojo.manipulator.ResourceStore;
-import org.apache.felix.ipojo.manipulator.metadata.annotation.registry.AnnotationRegistry;
-import org.apache.felix.ipojo.manipulator.metadata.annotation.stereotype.StereotypeParser;
-import org.apache.felix.ipojo.manipulator.metadata.annotation.registry.Binding;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.registry.DefaultBindingRegistry;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.registry.IgnoreAllBindingRegistry;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.registry.LegacyGenericBindingRegistry;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.registry.MetaAnnotationBindingRegistry;
import org.apache.felix.ipojo.manipulator.metadata.annotation.registry.BindingRegistry;
-import org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.stereotype.FieldStereotypeVisitor;
-import org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.stereotype.MethodStereotypeVisitor;
-import org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.stereotype.ParameterStereotypeVisitor;
-import org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.stereotype.TypeStereotypeVisitor;
-import org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.generic.FieldGenericVisitor;
-import org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.generic.MethodGenericVisitor;
-import org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.generic.ParameterGenericVisitor;
-import org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.generic.TypeGenericVisitor;
-import org.apache.felix.ipojo.manipulator.spi.AnnotationVisitorFactory;
-import org.apache.felix.ipojo.manipulator.spi.BindingContext;
import org.apache.felix.ipojo.manipulator.spi.Module;
-import org.apache.felix.ipojo.manipulator.spi.Predicate;
-import org.apache.felix.ipojo.manipulator.util.Strings;
-import org.apache.felix.ipojo.metadata.Element;
-import org.objectweb.asm.AnnotationVisitor;
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.FieldVisitor;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Type;
-import org.objectweb.asm.tree.FieldNode;
-import org.objectweb.asm.tree.MethodNode;
-import java.io.IOException;
-import java.lang.annotation.ElementType;
-import java.util.ArrayList;
-import java.util.List;
import java.util.ServiceLoader;
-import static org.apache.felix.ipojo.manipulator.spi.helper.Predicates.and;
-import static org.apache.felix.ipojo.manipulator.spi.helper.Predicates.on;
import static org.apache.felix.ipojo.manipulator.spi.helper.Predicates.or;
-import static org.apache.felix.ipojo.manipulator.spi.helper.Predicates.pattern;
/**
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
public class Bindings {
- private static Binding newGenericTypeBinding() {
- Binding binding = new Binding();
- // ElementType is TYPE
- // Annotation descriptor is matching generic pattern
- binding.setPredicate(
- and(
- on(ElementType.TYPE),
- customAnnotationPattern()
- ));
- binding.setFactory(new AnnotationVisitorFactory() {
- public AnnotationVisitor newAnnotationVisitor(BindingContext context) {
- Element element = Elements.buildElement(context.getAnnotationType());
- return new TypeGenericVisitor(context.getWorkbench(), element);
- }
- });
- return binding;
- }
-
- private static Predicate customAnnotationPattern() {
- return pattern("(.*\\.ipojo\\..*)|(.*\\.handler\\..*)").matches();
- }
-
- private static Binding newGenericFieldBinding() {
- Binding binding = new Binding();
- // ElementType is FIELD
- // Annotation descriptor is matching generic pattern
- binding.setPredicate(
- and(
- on(ElementType.FIELD),
- customAnnotationPattern()
- ));
- binding.setFactory(new AnnotationVisitorFactory() {
- public AnnotationVisitor newAnnotationVisitor(BindingContext context) {
- Element element = Elements.buildElement(context.getAnnotationType());
- return new FieldGenericVisitor(context.getWorkbench(), element, (FieldNode) context.getNode());
- }
- });
- return binding;
- }
-
- private static Binding newGenericMethodBinding() {
- Binding binding = new Binding();
- // ElementType is METHOD
- // Annotation descriptor is matching generic pattern
- binding.setPredicate(
- and(
- on(ElementType.METHOD),
- customAnnotationPattern()
- ));
- binding.setFactory(new AnnotationVisitorFactory() {
- public AnnotationVisitor newAnnotationVisitor(BindingContext context) {
- Element element = Elements.buildElement(context.getAnnotationType());
- return new MethodGenericVisitor(context.getWorkbench(), element, (MethodNode) context.getNode());
- }
- });
- return binding;
- }
-
- private static Binding newGenericParameterBinding() {
- Binding binding = new Binding();
- // ElementType is METHOD
- // Annotation descriptor is matching generic pattern
- binding.setPredicate(
- and(
- on(ElementType.PARAMETER),
- customAnnotationPattern()
- ));
- binding.setFactory(new AnnotationVisitorFactory() {
- public AnnotationVisitor newAnnotationVisitor(BindingContext context) {
- Element element = Elements.buildElement(context.getAnnotationType());
- return new ParameterGenericVisitor(context.getWorkbench(), element, (MethodNode) context.getNode(), context.getParameterIndex());
- }
- });
- return binding;
- }
-
-
public static BindingRegistry newBindingRegistry(Reporter reporter, ResourceStore store) {
- AnnotationRegistry ar = new AnnotationRegistry();
- BindingRegistry registry = new BindingRegistry(reporter);
+ // Build the registry by aggregation of the features we want
+ // TODO We can enable/disable the legacy support easily here
+ BindingRegistry registry = new DefaultBindingRegistry(reporter);
+ registry = new MetaAnnotationBindingRegistry(registry, reporter, store);
+ registry = new LegacyGenericBindingRegistry(registry, reporter);
+ registry = new IgnoreAllBindingRegistry(registry, reporter);
+
ServiceLoader<Module> loader = ServiceLoader.load(Module.class, classloader());
// Build each Module and add its contributed Bindings in the registry
@@ -152,127 +54,9 @@ public class Bindings {
registry.addBindings(module);
}
- // Do not forget the default Bindings
- registry.getDefaultBindings().addAll(newDefaultBindings(store, ar));
-
return registry;
}
- public static List<Binding> newDefaultBindings(final ResourceStore store, final AnnotationRegistry ar) {
- List<Binding> bindings = new ArrayList<Binding>();
-
- // Register Stereotype binding support first
- // That allows iPOJO to provide its own stereotyped annotations
- bindings.add(newStereotypeTypeBinding(store, ar));
- bindings.add(newStereotypeFieldBinding(store, ar));
- bindings.add(newStereotypeMethodBinding(store, ar));
- bindings.add(newStereotypeParameterBinding(store, ar));
-
- // Then register the generic bindings
- bindings.add(newGenericTypeBinding());
- bindings.add(newGenericFieldBinding());
- bindings.add(newGenericMethodBinding());
- bindings.add(newGenericParameterBinding());
- return bindings;
-
- }
-
- private static Binding newStereotypeParameterBinding(final ResourceStore store, final AnnotationRegistry registry) {
- Binding binding = new Binding();
- binding.setPredicate(
- and(
- on(ElementType.PARAMETER),
- stereotype(store, registry)
- ));
- binding.setFactory(new AnnotationVisitorFactory() {
- public AnnotationVisitor newAnnotationVisitor(BindingContext context) {
- return new ParameterStereotypeVisitor((MethodVisitor) context.getVisitor(),
- context.getParameterIndex(),
- registry.getRecorders(context.getAnnotationType()));
- }
- });
- return binding;
- }
-
- private static Binding newStereotypeMethodBinding(final ResourceStore store, final AnnotationRegistry registry) {
- Binding binding = new Binding();
- binding.setPredicate(
- and(
- on(ElementType.METHOD),
- stereotype(store, registry)
- ));
- binding.setFactory(new AnnotationVisitorFactory() {
- public AnnotationVisitor newAnnotationVisitor(BindingContext context) {
- return new MethodStereotypeVisitor((MethodVisitor) context.getVisitor(),
- registry.getRecorders(context.getAnnotationType()));
- }
- });
- return binding;
- }
-
- private static Binding newStereotypeFieldBinding(final ResourceStore store, final AnnotationRegistry registry) {
- Binding binding = new Binding();
- binding.setPredicate(
- and(
- on(ElementType.FIELD),
- stereotype(store, registry)
- ));
- binding.setFactory(new AnnotationVisitorFactory() {
- public AnnotationVisitor newAnnotationVisitor(BindingContext context) {
- return new FieldStereotypeVisitor((FieldVisitor) context.getVisitor(),
- registry.getRecorders(context.getAnnotationType()));
- }
- });
- return binding;
- }
-
- private static Binding newStereotypeTypeBinding(final ResourceStore store, final AnnotationRegistry registry) {
- Binding binding = new Binding();
- binding.setPredicate(
- and(
- on(ElementType.TYPE),
- stereotype(store, registry)
- ));
- binding.setFactory(new AnnotationVisitorFactory() {
- public AnnotationVisitor newAnnotationVisitor(BindingContext context) {
- return new TypeStereotypeVisitor((ClassVisitor) context.getVisitor(),
- registry.getRecorders(context.getAnnotationType()));
- }
- });
- return binding;
- }
-
- private static Predicate stereotype(final ResourceStore store, final AnnotationRegistry registry) {
- return new Predicate() {
- public boolean matches(final BindingContext context) {
-
- Type type = context.getAnnotationType();
- if (registry.isUnknown(type)) {
- // The given annotation type was never parsed before
- try {
-
- // Try to read the annotation's byte code
- byte[] bytes = store.read(Strings.asResourcePath(context.getAnnotationType().getClassName()));
- StereotypeParser parser = new StereotypeParser();
- parser.read(bytes);
- if (parser.isStereotype()) {
- registry.addStereotype(type, parser.getRecorders());
- return true;
- }
- registry.addUnbound(type);
- return false;
- } catch (IOException e) {
- // Cannot load the byte code, assume it's not a stereotype
- // TODO print a warning ?
- registry.addUnbound(type);
- return false;
- }
- }
- return registry.isStereotype(type);
- }
- };
- }
-
private static ClassLoader classloader() {
return Bindings.class.getClassLoader();
}
Modified: felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/util/Elements.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/util/Elements.java?rev=1507289&r1=1507288&r2=1507289&view=diff
==============================================================================
--- felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/util/Elements.java (original)
+++ felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/metadata/annotation/visitor/util/Elements.java Fri Jul 26 12:33:28 2013
@@ -19,6 +19,8 @@
package org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.util;
+import static java.lang.String.format;
+
import org.apache.felix.ipojo.manipulator.metadata.annotation.ComponentWorkbench;
import org.apache.felix.ipojo.metadata.Element;
import org.objectweb.asm.Type;
@@ -41,7 +43,38 @@ public class Elements {
int index = name.lastIndexOf('.');
String local = name.substring(index + 1);
String namespace = name.substring(0, index);
- return new Element(local, namespace);
+ return buildElement(namespace, local);
+ }
+
+ /**
+ * Build an {@link Element} using the provided namespace and local name.
+ */
+ public static Element buildElement(final String namespace, final String name) {
+ return new Element(name, namespace);
+ }
+
+ /**
+ * Build an {@link Element} using the provided binding information.
+ * Expected format is {@literal [namespace:]name} (eg: {@literal com.acme:foo} or {@literal foo} if namespace
+ * by default -org.apache.felix.ipojo- has to be used).
+ * Notice that the ':' character usage in namespace or name part may lead to unexpected results.
+ * In that case, the @HandlerBinding(namespace = "urn:my:namespace", value = "foo:handler") usage is preferred.
+ * @param binding the condensed element name
+ * @return the new element
+ */
+ public static Element buildElement(String binding) {
+ String[] split = binding.split(":");
+ if (split.length == 1) {
+ return buildElement("", binding);
+ }
+ if (split.length > 2) {
+ throw new IllegalArgumentException(
+ format("@HandlerBinding(\"%s\") is invalid: only 1 ':' char is authorized, please" +
+ " use the @HandlerBinding(namespace=\"...\", value=\"...\") form instead.",
+ binding)
+ );
+ }
+ return buildElement(split[0], split[1]);
}
/**
@@ -52,7 +85,7 @@ public class Elements {
public static Element getPropertiesElement(ComponentWorkbench workbench) {
Element properties = workbench.getIds().get("properties");
if (properties == null) {
- properties = new Element("properties", "");
+ properties = buildElement("", "properties");
workbench.getIds().put("properties", properties);
workbench.getElements().put(properties, null);
}
Modified: felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/spi/AbsBindingModule.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/spi/AbsBindingModule.java?rev=1507289&r1=1507288&r2=1507289&view=diff
==============================================================================
--- felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/spi/AbsBindingModule.java (original)
+++ felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/spi/AbsBindingModule.java Fri Jul 26 12:33:28 2013
@@ -19,21 +19,23 @@
package org.apache.felix.ipojo.manipulator.spi;
-import org.apache.felix.ipojo.manipulator.metadata.annotation.registry.Binding;
+import static org.apache.felix.ipojo.manipulator.spi.helper.Predicates.onlySupportedElements;
import java.lang.annotation.Annotation;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Target;
import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
-import static org.apache.felix.ipojo.manipulator.spi.helper.Predicates.alwaysTrue;
-import static org.apache.felix.ipojo.manipulator.spi.helper.Predicates.on;
-import static org.apache.felix.ipojo.manipulator.spi.helper.Predicates.onlySupportedElements;
-import static org.apache.felix.ipojo.manipulator.spi.helper.Predicates.or;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.model.AnnotationType;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.model.literal.AnnotationLiteral;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.model.literal.AnnotationPlayback;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.registry.Binding;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.generic.GenericVisitorFactory;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.ignore.NullBinding;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.stereotype.StereotypeVisitorFactory;
+import org.apache.felix.ipojo.manipulator.metadata.annotation.visitor.util.Elements;
+import org.apache.felix.ipojo.metadata.Element;
+import org.objectweb.asm.Type;
/**
* All provided {@link Module}s have to inherit from this class.
@@ -66,6 +68,18 @@ public abstract class AbsBindingModule i
return new AnnotationBindingBuilder(bindings, annotationType);
}
+ protected StereotypeBindingBuilder bindStereotype(Class<? extends Annotation> annotationType) {
+ return new StereotypeBindingBuilder(bindings, annotationType);
+ }
+
+ protected HandlerBindingBuilder bindHandlerBinding(Class<? extends Annotation> annotationType) {
+ return new HandlerBindingBuilder(bindings, annotationType);
+ }
+
+ protected void bindIgnore(Class<? extends Annotation> annotationType) {
+ bindings.add(new NullBinding(Type.getType(annotationType)));
+ }
+
/**
* DSL helper class.
*/
@@ -104,7 +118,7 @@ public abstract class AbsBindingModule i
*/
private Binding build() {
Binding binding = new Binding();
- binding.setAnnotationType(annotationType);
+ binding.setAnnotationType(Type.getType(annotationType));
binding.setPredicate(onlySupportedElements(annotationType));
binding.setFactory(factory);
return binding;
@@ -145,4 +159,40 @@ public abstract class AbsBindingModule i
}
}
+ public class StereotypeBindingBuilder {
+ private final AnnotationType m_annotationType;
+
+ public StereotypeBindingBuilder(final List<Binding> bindings, final Class<? extends Annotation> type) {
+ m_annotationType = new AnnotationType(Type.getType(type));
+ Binding binding = new Binding();
+ binding.setAnnotationType(m_annotationType.getType());
+ binding.setPredicate(onlySupportedElements(type));
+ binding.setFactory(new StereotypeVisitorFactory(m_annotationType));
+ bindings.add(binding);
+ }
+
+ public StereotypeBindingBuilder with(AnnotationLiteral<?> literal) {
+ m_annotationType.getPlaybacks().add(new AnnotationPlayback(literal));
+ return this;
+ }
+ }
+
+ public class HandlerBindingBuilder {
+
+ private final Binding m_binding;
+
+ public HandlerBindingBuilder(final List<Binding> bindings, final Class<? extends Annotation> annotationType) {
+ m_binding = new Binding();
+ Type type = Type.getType(annotationType);
+ m_binding.setAnnotationType(type);
+ m_binding.setPredicate(onlySupportedElements(annotationType));
+ Element e = Elements.buildElement(type);
+ m_binding.setFactory(new GenericVisitorFactory(e.getName(), e.getNameSpace()));
+ bindings.add(m_binding);
+ }
+
+ public void to(String namespace, String name) {
+ m_binding.setFactory(new GenericVisitorFactory(name, namespace));
+ }
+ }
}
Modified: felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/spi/BindingContext.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/spi/BindingContext.java?rev=1507289&r1=1507288&r2=1507289&view=diff
==============================================================================
--- felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/spi/BindingContext.java (original)
+++ felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/spi/BindingContext.java Fri Jul 26 12:33:28 2013
@@ -31,6 +31,8 @@ import java.lang.annotation.ElementType;
*/
public class BindingContext {
+ public static final int NO_INDEX = -1;
+
/**
*
*/
Added: felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/util/ChainedAnnotationVisitor.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/util/ChainedAnnotationVisitor.java?rev=1507289&view=auto
==============================================================================
--- felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/util/ChainedAnnotationVisitor.java (added)
+++ felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/util/ChainedAnnotationVisitor.java Fri Jul 26 12:33:28 2013
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.felix.ipojo.manipulator.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.felix.ipojo.manipulator.metadata.annotation.model.discovery.ChainedAnnotationDiscovery;
+import org.objectweb.asm.AnnotationVisitor;
+
+/**
+* User: guillaume
+* Date: 10/07/13
+* Time: 16:43
+*/
+public class ChainedAnnotationVisitor implements AnnotationVisitor {
+
+ private List<AnnotationVisitor> m_visitors = new ArrayList<AnnotationVisitor>();
+
+ public List<AnnotationVisitor> getVisitors() {
+ return m_visitors;
+ }
+
+ public void visit(final String name, final Object value) {
+ for (AnnotationVisitor visitor : m_visitors) {
+ visitor.visit(name, value);
+ }
+ }
+
+ public void visitEnum(final String name, final String desc, final String value) {
+ for (AnnotationVisitor visitor : m_visitors) {
+ visitor.visitEnum(name, desc, value);
+ }
+ }
+
+ public AnnotationVisitor visitAnnotation(final String name, final String desc) {
+ ChainedAnnotationVisitor chain = null;
+ for (AnnotationVisitor visitor : m_visitors) {
+ AnnotationVisitor child = visitor.visitAnnotation(name, desc);
+ if (child != null) {
+ if (chain == null) {
+ chain = new ChainedAnnotationVisitor();
+ }
+ chain.getVisitors().add(child);
+ }
+
+ }
+ return chain;
+ }
+
+ public AnnotationVisitor visitArray(final String name) {
+ ChainedAnnotationVisitor chain = null;
+ for (AnnotationVisitor visitor : m_visitors) {
+ AnnotationVisitor child = visitor.visitArray(name);
+ if (child != null) {
+ if (chain == null) {
+ chain = new ChainedAnnotationVisitor();
+ }
+ chain.getVisitors().add(child);
+ }
+
+ }
+ return chain;
+ }
+
+ public void visitEnd() {
+ for (AnnotationVisitor visitor : m_visitors) {
+ visitor.visitEnd();
+ }
+ }
+}