You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cl...@apache.org on 2008/10/06 19:08:45 UTC
svn commit: r702202 [3/4] - in /felix/trunk/ipojo:
ant/src/main/java/org/apache/felix/ipojo/task/
core/src/main/java/org/apache/felix/ipojo/
handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/
handler/eventadmin/src/main/java/org/ap...
Modified: felix/trunk/ipojo/handler/whiteboard/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/handler/whiteboard/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardManager.java?rev=702202&r1=702201&r2=702202&view=diff
==============================================================================
--- felix/trunk/ipojo/handler/whiteboard/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardManager.java (original)
+++ felix/trunk/ipojo/handler/whiteboard/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardManager.java Mon Oct 6 10:08:45 2008
@@ -1,173 +1,173 @@
-/*
- * 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.handler.wbp;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.apache.felix.ipojo.PrimitiveHandler;
-import org.apache.felix.ipojo.util.Callback;
-import org.apache.felix.ipojo.util.Tracker;
-import org.apache.felix.ipojo.util.TrackerCustomizer;
-import org.osgi.framework.Filter;
-import org.osgi.framework.ServiceReference;
-
-/**
- * Manage a white board pattern.
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class WhiteBoardManager implements TrackerCustomizer {
-
- /**
- * monitored filter.
- */
- private Filter m_filter;
-
- /**
- * onArrival method.
- */
- private Callback m_onArrival;
-
- /**
- * onDeparture method.
- */
- private Callback m_onDeparture;
-
- /**
- * onModify method.
- */
- private Callback m_onModification;
-
- /**
- * Service Tracker.
- */
- private Tracker m_tracker;
-
- /**
- * Attached handler.
- */
- private PrimitiveHandler m_handler;
-
- /**
- * Constructor.
- * @param handler : attached handler
- * @param filter : monitored filter
- * @param bind : onArrival method
- * @param unbind : onDeparture method
- * @param modification : onModify method
- */
- public WhiteBoardManager(WhiteBoardPatternHandler handler, Filter filter, String bind, String unbind, String modification) {
- m_handler = handler;
- m_onArrival = new Callback(bind, new Class[] {ServiceReference.class}, false, m_handler.getInstanceManager());
- m_onDeparture = new Callback(unbind, new Class[] {ServiceReference.class}, false, m_handler.getInstanceManager());
- if (modification != null) {
- m_onModification = new Callback(modification, new Class[] {ServiceReference.class}, false, m_handler.getInstanceManager());
- }
- m_filter = filter;
- m_tracker = new Tracker(handler.getInstanceManager().getContext(), m_filter, this);
- }
-
- /**
- * Open the tracker.
- */
- public void start() {
- m_tracker.open();
- }
-
- /**
- * Close the tracker.
- */
- public void stop() {
- m_tracker.close();
- }
-
- /**
- * A new service was added to the tracker.
- * @param arg0 : service reference.
- * @see org.apache.felix.ipojo.util.TrackerCustomizer#addedService(org.osgi.framework.ServiceReference)
- */
- public void addedService(ServiceReference arg0) {
- try {
- m_onArrival.call(new Object[] {arg0});
- } catch (NoSuchMethodException e) {
- m_handler.error("The onArrival method " + m_onArrival.getMethod() + " does not exist in the class", e);
- m_handler.getInstanceManager().stop();
- } catch (IllegalAccessException e) {
- m_handler.error("The onArrival method " + m_onArrival.getMethod() + " cannot be invoked", e);
- m_handler.getInstanceManager().stop();
- } catch (InvocationTargetException e) {
- m_handler.error("The onArrival method " + m_onArrival.getMethod() + " has thrown an exception", e.getTargetException());
- m_handler.getInstanceManager().stop();
- }
- }
-
- /**
- * A new service is detected.
- * @param arg0 : service reference
- * @return true to add the service
- * @see org.apache.felix.ipojo.util.TrackerCustomizer#addingService(org.osgi.framework.ServiceReference)
- */
- public boolean addingService(ServiceReference arg0) {
- return true;
- }
-
- /**
- * An existing service was modified.
- * @param arg0 : service reference
- * @param arg1 : service object (if already get)
- * @see org.apache.felix.ipojo.util.TrackerCustomizer#modifiedService(org.osgi.framework.ServiceReference, java.lang.Object)
- */
- public void modifiedService(ServiceReference arg0, Object arg1) {
- if (m_onModification != null) {
- try {
- m_onModification.call(new Object[] {arg0});
- } catch (NoSuchMethodException e) {
- m_handler.error("The onModification method " + m_onModification.getMethod() + " does not exist in the class", e);
- m_handler.getInstanceManager().stop();
- } catch (IllegalAccessException e) {
- m_handler.error("The onModification method " + m_onModification.getMethod() + " cannot be invoked", e);
- m_handler.getInstanceManager().stop();
- } catch (InvocationTargetException e) {
- m_handler.error("The onModification method " + m_onModification.getMethod() + " has thrown an exception", e.getTargetException());
- m_handler.getInstanceManager().stop();
- }
- }
- }
-
- /**
- * A service disappears.
- * @param arg0 : service reference
- * @param arg1 : service object (if already get)
- * @see org.apache.felix.ipojo.util.TrackerCustomizer#removedService(org.osgi.framework.ServiceReference, java.lang.Object)
- */
- public void removedService(ServiceReference arg0, Object arg1) {
- try {
- m_onDeparture.call(new Object[] {arg0});
- } catch (NoSuchMethodException e) {
- m_handler.error("The onDeparture method " + m_onDeparture.getMethod() + " does not exist in the class", e);
- m_handler.getInstanceManager().stop();
- } catch (IllegalAccessException e) {
- m_handler.error("The onDeparture method " + m_onDeparture.getMethod() + " cannot be invoked", e);
- m_handler.getInstanceManager().stop();
- } catch (InvocationTargetException e) {
- m_handler.error("The onDeparture method " + m_onDeparture.getMethod() + " has thrown an exception", e.getTargetException());
- m_handler.getInstanceManager().stop();
- }
- }
-
-}
+/*
+ * 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.handler.wbp;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.apache.felix.ipojo.PrimitiveHandler;
+import org.apache.felix.ipojo.util.Callback;
+import org.apache.felix.ipojo.util.Tracker;
+import org.apache.felix.ipojo.util.TrackerCustomizer;
+import org.osgi.framework.Filter;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Manage a white board pattern.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class WhiteBoardManager implements TrackerCustomizer {
+
+ /**
+ * The monitored filter.
+ */
+ private Filter m_filter;
+
+ /**
+ * The onArrival method.
+ */
+ private Callback m_onArrival;
+
+ /**
+ * The onDeparture method.
+ */
+ private Callback m_onDeparture;
+
+ /**
+ * The onModify method.
+ */
+ private Callback m_onModification;
+
+ /**
+ * The service tracker.
+ */
+ private Tracker m_tracker;
+
+ /**
+ * The attached handler.
+ */
+ private PrimitiveHandler m_handler;
+
+ /**
+ * Constructor.
+ * @param handler the attached handler
+ * @param filter the monitored filter
+ * @param bind the onArrival method
+ * @param unbind the onDeparture method
+ * @param modification the onModify method
+ */
+ public WhiteBoardManager(WhiteBoardPatternHandler handler, Filter filter, String bind, String unbind, String modification) {
+ m_handler = handler;
+ m_onArrival = new Callback(bind, new Class[] {ServiceReference.class}, false, m_handler.getInstanceManager());
+ m_onDeparture = new Callback(unbind, new Class[] {ServiceReference.class}, false, m_handler.getInstanceManager());
+ if (modification != null) {
+ m_onModification = new Callback(modification, new Class[] {ServiceReference.class}, false, m_handler.getInstanceManager());
+ }
+ m_filter = filter;
+ m_tracker = new Tracker(handler.getInstanceManager().getContext(), m_filter, this);
+ }
+
+ /**
+ * Opens the tracker.
+ */
+ public void start() {
+ m_tracker.open();
+ }
+
+ /**
+ * Closes the tracker.
+ */
+ public void stop() {
+ m_tracker.close();
+ }
+
+ /**
+ * A new service was added to the tracker.
+ * @param arg0 the service reference.
+ * @see org.apache.felix.ipojo.util.TrackerCustomizer#addedService(org.osgi.framework.ServiceReference)
+ */
+ public void addedService(ServiceReference arg0) {
+ try {
+ m_onArrival.call(new Object[] {arg0});
+ } catch (NoSuchMethodException e) {
+ m_handler.error("The onArrival method " + m_onArrival.getMethod() + " does not exist in the class", e);
+ m_handler.getInstanceManager().stop();
+ } catch (IllegalAccessException e) {
+ m_handler.error("The onArrival method " + m_onArrival.getMethod() + " cannot be invoked", e);
+ m_handler.getInstanceManager().stop();
+ } catch (InvocationTargetException e) {
+ m_handler.error("The onArrival method " + m_onArrival.getMethod() + " has thrown an exception", e.getTargetException());
+ m_handler.getInstanceManager().stop();
+ }
+ }
+
+ /**
+ * A new service is detected.
+ * @param arg0 the service reference
+ * @return {@code true} to add the service.
+ * @see org.apache.felix.ipojo.util.TrackerCustomizer#addingService(org.osgi.framework.ServiceReference)
+ */
+ public boolean addingService(ServiceReference arg0) {
+ return true;
+ }
+
+ /**
+ * An existing service was modified.
+ * @param arg0 the service reference
+ * @param arg1 the service object (if already get)
+ * @see org.apache.felix.ipojo.util.TrackerCustomizer#modifiedService(org.osgi.framework.ServiceReference, java.lang.Object)
+ */
+ public void modifiedService(ServiceReference arg0, Object arg1) {
+ if (m_onModification != null) {
+ try {
+ m_onModification.call(new Object[] {arg0});
+ } catch (NoSuchMethodException e) {
+ m_handler.error("The onModification method " + m_onModification.getMethod() + " does not exist in the class", e);
+ m_handler.getInstanceManager().stop();
+ } catch (IllegalAccessException e) {
+ m_handler.error("The onModification method " + m_onModification.getMethod() + " cannot be invoked", e);
+ m_handler.getInstanceManager().stop();
+ } catch (InvocationTargetException e) {
+ m_handler.error("The onModification method " + m_onModification.getMethod() + " has thrown an exception", e.getTargetException());
+ m_handler.getInstanceManager().stop();
+ }
+ }
+ }
+
+ /**
+ * A service disappears.
+ * @param arg0 the service reference
+ * @param arg1 the service object (if already get)
+ * @see org.apache.felix.ipojo.util.TrackerCustomizer#removedService(org.osgi.framework.ServiceReference, java.lang.Object)
+ */
+ public void removedService(ServiceReference arg0, Object arg1) {
+ try {
+ m_onDeparture.call(new Object[] {arg0});
+ } catch (NoSuchMethodException e) {
+ m_handler.error("The onDeparture method " + m_onDeparture.getMethod() + " does not exist in the class", e);
+ m_handler.getInstanceManager().stop();
+ } catch (IllegalAccessException e) {
+ m_handler.error("The onDeparture method " + m_onDeparture.getMethod() + " cannot be invoked", e);
+ m_handler.getInstanceManager().stop();
+ } catch (InvocationTargetException e) {
+ m_handler.error("The onDeparture method " + m_onDeparture.getMethod() + " has thrown an exception", e.getTargetException());
+ m_handler.getInstanceManager().stop();
+ }
+ }
+
+}
Modified: felix/trunk/ipojo/handler/whiteboard/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardPatternHandler.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/handler/whiteboard/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardPatternHandler.java?rev=702202&r1=702201&r2=702202&view=diff
==============================================================================
--- felix/trunk/ipojo/handler/whiteboard/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardPatternHandler.java (original)
+++ felix/trunk/ipojo/handler/whiteboard/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardPatternHandler.java Mon Oct 6 10:08:45 2008
@@ -1,99 +1,99 @@
-/*
- * 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.handler.wbp;
-
-import java.util.ArrayList;
-import java.util.Dictionary;
-import java.util.List;
-
-import org.apache.felix.ipojo.ConfigurationException;
-import org.apache.felix.ipojo.PrimitiveHandler;
-import org.apache.felix.ipojo.metadata.Element;
-import org.osgi.framework.InvalidSyntaxException;
-
-/**
- * White board pattern handler.
- * This handler aims to automate white board patterns by invoking callback when needed.
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class WhiteBoardPatternHandler extends PrimitiveHandler {
-
- /**
- * Handler namespace.
- */
- public static final String NAMESPACE = "org.apache.felix.ipojo.white-board-pattern";
-
- /**
- * White board pattern to manage. By default just one.
- */
- private List m_managers = new ArrayList(1);
-
- /**
- * Configure method. It will parse metadata to analyze org.apache.felix.ipojo.white-board-pattern:wbp element.
- * @param elem : component type description
- * @param dict : instance description
- * @throws ConfigurationException : occurs when the description is not valid.
- * @see org.apache.felix.ipojo.Handler#configure(org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
- */
- public void configure(Element elem, Dictionary dict) throws ConfigurationException {
- Element[] elems = elem.getElements("wbp", NAMESPACE);
- for (int i = 0; i < elems.length; i++) {
- String filter = elems[i].getAttribute("filter");
- String onArrival = elems[i].getAttribute("onArrival");
- String onDeparture = elems[i].getAttribute("onDeparture");
- String onModification = elems[i].getAttribute("onModification");
-
- if (filter == null) {
- throw new ConfigurationException("The white board pattern element requires a filter attribute");
- }
- if (onArrival == null || onDeparture == null) {
- throw new ConfigurationException("The white board pattern element requires the onArrival and onDeparture attributes");
- }
-
- try {
- WhiteBoardManager wbm = new WhiteBoardManager(this, getInstanceManager().getContext().createFilter(filter), onArrival, onDeparture, onModification);
- m_managers.add(wbm);
- } catch (InvalidSyntaxException e) {
- throw new ConfigurationException("The filter " + filter + " is invalid : " + e);
- }
- }
-
- }
-
- /**
- * Start method : start managers.
- * @see org.apache.felix.ipojo.Handler#start()
- */
- public void start() {
- for (int i = 0; i < m_managers.size(); i++) {
- ((WhiteBoardManager) m_managers.get(i)).start();
- }
- }
-
- /**
- * Stop method : stop managers.
- * @see org.apache.felix.ipojo.Handler#stop()
- */
- public void stop() {
- for (int i = 0; i < m_managers.size(); i++) {
- ((WhiteBoardManager) m_managers.get(i)).stop();
- }
- }
-
-}
+/*
+ * 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.handler.wbp;
+
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.List;
+
+import org.apache.felix.ipojo.ConfigurationException;
+import org.apache.felix.ipojo.PrimitiveHandler;
+import org.apache.felix.ipojo.metadata.Element;
+import org.osgi.framework.InvalidSyntaxException;
+
+/**
+ * White board pattern handler.
+ * This handler aims to automate white board patterns by invoking callback when needed.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class WhiteBoardPatternHandler extends PrimitiveHandler {
+
+ /**
+ * The handler namespace.
+ */
+ public static final String NAMESPACE = "org.apache.felix.ipojo.white-board-pattern";
+
+ /**
+ * The white board pattern to manage. By default just one.
+ */
+ private List m_managers = new ArrayList(1);
+
+ /**
+ * Configure method. Parses the metadata to analyze white-board-pattern elements.
+ * @param elem the component type description
+ * @param dict the instance description
+ * @throws ConfigurationException if the description is not valid.
+ * @see org.apache.felix.ipojo.Handler#configure(org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
+ */
+ public void configure(Element elem, Dictionary dict) throws ConfigurationException {
+ Element[] elems = elem.getElements("wbp", NAMESPACE);
+ for (int i = 0; i < elems.length; i++) {
+ String filter = elems[i].getAttribute("filter");
+ String onArrival = elems[i].getAttribute("onArrival");
+ String onDeparture = elems[i].getAttribute("onDeparture");
+ String onModification = elems[i].getAttribute("onModification");
+
+ if (filter == null) {
+ throw new ConfigurationException("The white board pattern element requires a filter attribute");
+ }
+ if (onArrival == null || onDeparture == null) {
+ throw new ConfigurationException("The white board pattern element requires the onArrival and onDeparture attributes");
+ }
+
+ try {
+ WhiteBoardManager wbm = new WhiteBoardManager(this, getInstanceManager().getContext().createFilter(filter), onArrival, onDeparture, onModification);
+ m_managers.add(wbm);
+ } catch (InvalidSyntaxException e) {
+ throw new ConfigurationException("The filter " + filter + " is invalid : " + e);
+ }
+ }
+
+ }
+
+ /**
+ * Start method. Starts managers.
+ * @see org.apache.felix.ipojo.Handler#start()
+ */
+ public void start() {
+ for (int i = 0; i < m_managers.size(); i++) {
+ ((WhiteBoardManager) m_managers.get(i)).start();
+ }
+ }
+
+ /**
+ * Stop method. Stops managers.
+ * @see org.apache.felix.ipojo.Handler#stop()
+ */
+ public void stop() {
+ for (int i = 0; i < m_managers.size(); i++) {
+ ((WhiteBoardManager) m_managers.get(i)).stop();
+ }
+ }
+
+}
Modified: felix/trunk/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MetadataCollector.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MetadataCollector.java?rev=702202&r1=702201&r2=702202&view=diff
==============================================================================
--- felix/trunk/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MetadataCollector.java (original)
+++ felix/trunk/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MetadataCollector.java Mon Oct 6 10:08:45 2008
@@ -1,381 +1,381 @@
-/*
- * 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.manipulation.annotations;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.felix.ipojo.metadata.Attribute;
-import org.apache.felix.ipojo.metadata.Element;
-import org.objectweb.asm.AnnotationVisitor;
-import org.objectweb.asm.FieldVisitor;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-import org.objectweb.asm.commons.EmptyVisitor;
-
-/**
- * Collect metadata from classes by parsing annotation.
- * This class collects type (i.e.) annotations and create method & field collectors.
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class MetadataCollector extends EmptyVisitor implements Opcodes {
-
- /**
- * Class name.
- */
- private String m_className;
-
- /**
- * Root element of computed metadata.
- */
- private Element m_elem = new Element("component", "");
-
- /**
- * True if the visited class is a component type declaration (i.e. contains the @component annotation).
- */
- private boolean m_containsAnnotation = false;
-
- /**
- * Map of [element ids, element].
- * This map is used to easily get an already created element.
- */
- private Map m_ids = new HashMap();
-
- /**
- * Map of [element, referto].
- * This map is used to recreate the element hierarchie.
- * Stored element are added under referred element.
- */
- private Map m_elements = new HashMap();
-
- public Element getElem() {
- return m_elem;
- }
-
- public boolean isAnnotated() {
- return m_containsAnnotation;
- }
-
-
- /**
- * Start visiting a class.
- * Initialize the getter/setter generator, add the _cm field, add the pojo interface.
- * @param version : class version
- * @param access : class access
- * @param name : class name
- * @param signature : class signature
- * @param superName : class super class
- * @param interfaces : implemented interfaces
- * @see org.objectweb.asm.ClassAdapter#visit(int, int, java.lang.String, java.lang.String, java.lang.String, java.lang.String[])
- */
- public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
- m_ids = new HashMap();
- m_elements = new HashMap();
- m_className = name;
- }
-
-
- /**
- * Visit class annotations.
- * This method detects @component, @provides and @Element annotations.
- * @param desc : annotation descriptor.
- * @param visible : is the annotation visible at runtime.
- * @return the annotation visitor.
- * @see org.objectweb.asm.ClassAdapter#visitAnnotation(java.lang.String, boolean)
- */
- public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
- // @Component
- if (desc.equals("Lorg/apache/felix/ipojo/annotations/Component;")) {
- // It is a component
- m_containsAnnotation = true;
- m_elem.addAttribute(new Attribute("className", m_className.replace('/', '.')));
- return new ComponentVisitor();
- }
-
- // @Provides
- if (desc.equals("Lorg/apache/felix/ipojo/annotations/Provides;")) {
- return new ProvidesVisitor();
- }
-
- if (CustomAnnotationVisitor.isCustomAnnotation(desc)) {
- Element elem = CustomAnnotationVisitor.buildElement(desc);
- return new CustomAnnotationVisitor(elem, this, true);
- }
-
- return null;
- }
-
-
-
- /**
- * Visit a field.
- * Call the field collector visitor.
- * @param access : field access.
- * @param name : field name
- * @param desc : field descriptor
- * @param signature : field signature
- * @param value : field value (static field only)
- * @return the field visitor.
- * @see org.objectweb.asm.ClassAdapter#visitField(int, java.lang.String, java.lang.String, java.lang.String, java.lang.Object)
- */
- public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) {
- return new FieldCollector(name, this);
- }
-
- /**
- * Visit a method.
- * Call the method collector visitor.
- * @param access : method access
- * @param name : method name
- * @param desc : method descriptor
- * @param signature : method signature
- * @param exceptions : method exceptions
- * @return the Method Visitor.
- * @see org.objectweb.asm.ClassAdapter#visitMethod(int, java.lang.String, java.lang.String, java.lang.String, java.lang.String[])
- */
- public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
- return new MethodCollector(name, this);
- }
-
- /**
- * End of the visit : compute final elements.
- * @see org.objectweb.asm.commons.EmptyVisitor#visitEnd()
- */
- public void visitEnd() {
- // Recompute the tree
- Set elems = getElements().keySet();
- Iterator it = elems.iterator();
- while (it.hasNext()) {
- Element current = (Element) it.next();
- String reference = (String) getElements().get(current);
- if (reference == null) {
- m_elem.addElement(current);
- } else {
- Element ref = (Element) getIds().get(reference);
- if (ref == null) {
- System.err.println("The element " + reference + " is not declared - skip the element " + current.toXMLString());
- } else {
- ref.addElement(current);
- }
- }
- }
- }
-
- protected Map getIds() {
- return m_ids;
- }
-
- protected Map getElements() {
- return m_elements;
- }
-
- /**
- * Parse the @provides annotation.
- */
- private class ProvidesVisitor extends EmptyVisitor implements AnnotationVisitor {
- /**
- * Provides element.
- */
- Element m_prov = new Element("provides", "");
-
- /**
- * Visit @provides annotation attributes.
- * @param arg0 : annotation attribute name
- * @param arg1 : annotation attribute value
- * @see org.objectweb.asm.commons.EmptyVisitor#visit(java.lang.String, java.lang.Object)
- */
- public void visit(String arg0, Object arg1) {
- if (arg0.equals("factory")) {
- m_prov.addAttribute(new Attribute("factory", arg1.toString()));
- }
- }
-
- /**
- * Visit specifications array.
- * @param arg0 : attribute name
- * @return a visitor visiting each element of the array.
- * @see org.objectweb.asm.commons.EmptyVisitor#visitArray(java.lang.String)
- */
- public AnnotationVisitor visitArray(String arg0) {
- if (arg0.equals("specifications")) {
- return new InterfaceArrayVisitor();
- } else {
- return null;
- }
- }
-
- /**
- * End of the visit.
- * Append to the parent element the computed "provides" element.
- * @see org.objectweb.asm.commons.EmptyVisitor#visitEnd()
- */
- public void visitEnd() {
- getIds().put("provides", m_prov);
- getElements().put(m_prov, null);
- }
-
- private class InterfaceArrayVisitor extends EmptyVisitor {
- /**
- * List of parsed interface.
- */
- private String m_itfs;
-
- /**
- * Visit one element of the array.
- * @param arg0 : null
- * @param arg1 : element value.
- * @see org.objectweb.asm.commons.EmptyVisitor#visit(java.lang.String, java.lang.Object)
- */
- public void visit(String arg0, Object arg1) {
- if (m_itfs == null) {
- m_itfs = "{" + ((Type) arg1).getClassName();
- } else {
- m_itfs += "," + ((Type) arg1).getClassName();
- }
- }
-
- /**
- * End of the array visit.
- * Add the attribute to 'provides' element.
- * @see org.objectweb.asm.commons.EmptyVisitor#visitEnd()
- */
- public void visitEnd() {
- m_prov.addAttribute(new Attribute("interface", m_itfs + "}"));
- }
-
- }
-
- }
-
- /**
- * Parse the @component annotation.
- */
- private class ComponentVisitor extends EmptyVisitor implements AnnotationVisitor {
-
- /**
- * Factory attribute.
- */
- private String m_factory;
-
- /**
- * Is the component an immediate component?
- */
- private String m_immediate;
-
- /**
- * Component name (cannot be null).
- */
- private String m_name;
-
- /**
- * Does the component exposes its architecture?
- */
- private String m_architecture;
-
- /**
- * Does the component propagate configuration to provided services?
- */
- private String m_propagation;
-
- /**
- * Managed Service PID.
- */
- private String m_managedservice;
-
- /**
- * Element properties.
- */
- private Element m_props;
-
- /**
- * Visit @component annotation attribute.
- * @param arg0 : attribute name
- * @param arg1 : attribute value
- * @see org.objectweb.asm.commons.EmptyVisitor#visit(java.lang.String, java.lang.Object)
- */
- public void visit(String arg0, Object arg1) {
- if (arg0.equals("public_factory")) {
- m_factory = arg1.toString();
- return;
- }
- if (arg0.equals("name")) {
- m_name = arg1.toString();
- return;
- }
- if (arg0.equals("immediate")) {
- m_immediate = arg1.toString();
- return;
- }
- if (arg0.equals("architecture")) {
- m_architecture = arg1.toString();
- return;
- }
- if (arg0.equals("propagation")) {
- m_propagation = arg1.toString();
- return;
- }
- if (arg0.equals("managedservice")) {
- m_managedservice = arg1.toString();
- return;
- }
- }
-
- /**
- * End of the visit.
- * Append to the "component" element computed attribute.
- * @see org.objectweb.asm.commons.EmptyVisitor#visitEnd()
- */
- public void visitEnd() {
- if (m_name == null) {
- m_name = m_className.replace('/', '.');
- }
- m_elem.addAttribute(new Attribute("name", m_name));
- if (m_factory != null && m_factory.equalsIgnoreCase("false")) {
- m_elem.addAttribute(new Attribute("public", "false"));
- } else {
- m_elem.addAttribute(new Attribute("public", "true"));
- }
- if (m_architecture != null) {
- m_elem.addAttribute(new Attribute("architecture", m_architecture));
- }
- if (m_immediate != null) {
- m_elem.addAttribute(new Attribute("immediate", m_immediate));
- }
- if (m_propagation != null) {
- if (m_props == null) {
- m_props = new Element("properties", "");
- getElements().put(m_props, null);
- getIds().put("properties", m_props);
- }
- m_props.addAttribute(new Attribute("propagation", m_propagation));
- }
- if (m_managedservice != null) {
- if (m_props == null) {
- m_props = new Element("properties", "");
- getElements().put(m_props, null);
- getIds().put("properties", m_props);
- }
- m_props.addAttribute(new Attribute("pid", m_managedservice));
- }
- }
- }
-}
+/*
+ * 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.manipulation.annotations;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.felix.ipojo.metadata.Attribute;
+import org.apache.felix.ipojo.metadata.Element;
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.commons.EmptyVisitor;
+
+/**
+ * Collect metadata from classes by parsing annotation.
+ * This class collects type (i.e.) annotations and create method & field collectors.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class MetadataCollector extends EmptyVisitor implements Opcodes {
+
+ /**
+ * Class name.
+ */
+ private String m_className;
+
+ /**
+ * Root element of computed metadata.
+ */
+ private Element m_elem = new Element("component", "");
+
+ /**
+ * True if the visited class is a component type declaration (i.e. contains the @component annotation).
+ */
+ private boolean m_containsAnnotation = false;
+
+ /**
+ * Map of [element ids, element].
+ * This map is used to easily get an already created element.
+ */
+ private Map m_ids = new HashMap();
+
+ /**
+ * Map of [element, referto].
+ * This map is used to recreate the element hierarchie.
+ * Stored element are added under referred element.
+ */
+ private Map m_elements = new HashMap();
+
+ public Element getElem() {
+ return m_elem;
+ }
+
+ public boolean isAnnotated() {
+ return m_containsAnnotation;
+ }
+
+
+ /**
+ * Start visiting a class.
+ * Initialize the getter/setter generator, add the _cm field, add the pojo interface.
+ * @param version : class version
+ * @param access : class access
+ * @param name : class name
+ * @param signature : class signature
+ * @param superName : class super class
+ * @param interfaces : implemented interfaces
+ * @see org.objectweb.asm.ClassAdapter#visit(int, int, java.lang.String, java.lang.String, java.lang.String, java.lang.String[])
+ */
+ public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
+ m_ids = new HashMap();
+ m_elements = new HashMap();
+ m_className = name;
+ }
+
+
+ /**
+ * Visit class annotations.
+ * This method detects @component, @provides and @Element annotations.
+ * @param desc : annotation descriptor.
+ * @param visible : is the annotation visible at runtime.
+ * @return the annotation visitor.
+ * @see org.objectweb.asm.ClassAdapter#visitAnnotation(java.lang.String, boolean)
+ */
+ public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
+ // @Component
+ if (desc.equals("Lorg/apache/felix/ipojo/annotations/Component;")) {
+ // It is a component
+ m_containsAnnotation = true;
+ m_elem.addAttribute(new Attribute("className", m_className.replace('/', '.')));
+ return new ComponentVisitor();
+ }
+
+ // @Provides
+ if (desc.equals("Lorg/apache/felix/ipojo/annotations/Provides;")) {
+ return new ProvidesVisitor();
+ }
+
+ if (CustomAnnotationVisitor.isCustomAnnotation(desc)) {
+ Element elem = CustomAnnotationVisitor.buildElement(desc);
+ return new CustomAnnotationVisitor(elem, this, true);
+ }
+
+ return null;
+ }
+
+
+
+ /**
+ * Visit a field.
+ * Call the field collector visitor.
+ * @param access : field access.
+ * @param name : field name
+ * @param desc : field descriptor
+ * @param signature : field signature
+ * @param value : field value (static field only)
+ * @return the field visitor.
+ * @see org.objectweb.asm.ClassAdapter#visitField(int, java.lang.String, java.lang.String, java.lang.String, java.lang.Object)
+ */
+ public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) {
+ return new FieldCollector(name, this);
+ }
+
+ /**
+ * Visit a method.
+ * Call the method collector visitor.
+ * @param access : method access
+ * @param name : method name
+ * @param desc : method descriptor
+ * @param signature : method signature
+ * @param exceptions : method exceptions
+ * @return the Method Visitor.
+ * @see org.objectweb.asm.ClassAdapter#visitMethod(int, java.lang.String, java.lang.String, java.lang.String, java.lang.String[])
+ */
+ public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
+ return new MethodCollector(name, this);
+ }
+
+ /**
+ * End of the visit : compute final elements.
+ * @see org.objectweb.asm.commons.EmptyVisitor#visitEnd()
+ */
+ public void visitEnd() {
+ // Recompute the tree
+ Set elems = getElements().keySet();
+ Iterator it = elems.iterator();
+ while (it.hasNext()) {
+ Element current = (Element) it.next();
+ String reference = (String) getElements().get(current);
+ if (reference == null) {
+ m_elem.addElement(current);
+ } else {
+ Element ref = (Element) getIds().get(reference);
+ if (ref == null) {
+ System.err.println("The element " + reference + " is not declared - skipping the element " + current.toXMLString());
+ } else {
+ ref.addElement(current);
+ }
+ }
+ }
+ }
+
+ protected Map getIds() {
+ return m_ids;
+ }
+
+ protected Map getElements() {
+ return m_elements;
+ }
+
+ /**
+ * Parse the @provides annotation.
+ */
+ private class ProvidesVisitor extends EmptyVisitor implements AnnotationVisitor {
+ /**
+ * Provides element.
+ */
+ Element m_prov = new Element("provides", "");
+
+ /**
+ * Visit @provides annotation attributes.
+ * @param arg0 : annotation attribute name
+ * @param arg1 : annotation attribute value
+ * @see org.objectweb.asm.commons.EmptyVisitor#visit(java.lang.String, java.lang.Object)
+ */
+ public void visit(String arg0, Object arg1) {
+ if (arg0.equals("factory")) {
+ m_prov.addAttribute(new Attribute("factory", arg1.toString()));
+ }
+ }
+
+ /**
+ * Visit specifications array.
+ * @param arg0 : attribute name
+ * @return a visitor visiting each element of the array.
+ * @see org.objectweb.asm.commons.EmptyVisitor#visitArray(java.lang.String)
+ */
+ public AnnotationVisitor visitArray(String arg0) {
+ if (arg0.equals("specifications")) {
+ return new InterfaceArrayVisitor();
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * End of the visit.
+ * Append to the parent element the computed "provides" element.
+ * @see org.objectweb.asm.commons.EmptyVisitor#visitEnd()
+ */
+ public void visitEnd() {
+ getIds().put("provides", m_prov);
+ getElements().put(m_prov, null);
+ }
+
+ private class InterfaceArrayVisitor extends EmptyVisitor {
+ /**
+ * List of parsed interface.
+ */
+ private String m_itfs;
+
+ /**
+ * Visit one element of the array.
+ * @param arg0 : null
+ * @param arg1 : element value.
+ * @see org.objectweb.asm.commons.EmptyVisitor#visit(java.lang.String, java.lang.Object)
+ */
+ public void visit(String arg0, Object arg1) {
+ if (m_itfs == null) {
+ m_itfs = "{" + ((Type) arg1).getClassName();
+ } else {
+ m_itfs += "," + ((Type) arg1).getClassName();
+ }
+ }
+
+ /**
+ * End of the array visit.
+ * Add the attribute to 'provides' element.
+ * @see org.objectweb.asm.commons.EmptyVisitor#visitEnd()
+ */
+ public void visitEnd() {
+ m_prov.addAttribute(new Attribute("interface", m_itfs + "}"));
+ }
+
+ }
+
+ }
+
+ /**
+ * Parse the @component annotation.
+ */
+ private class ComponentVisitor extends EmptyVisitor implements AnnotationVisitor {
+
+ /**
+ * Factory attribute.
+ */
+ private String m_factory;
+
+ /**
+ * Is the component an immediate component?
+ */
+ private String m_immediate;
+
+ /**
+ * Component name (cannot be null).
+ */
+ private String m_name;
+
+ /**
+ * Does the component exposes its architecture?
+ */
+ private String m_architecture;
+
+ /**
+ * Does the component propagate configuration to provided services?
+ */
+ private String m_propagation;
+
+ /**
+ * Managed Service PID.
+ */
+ private String m_managedservice;
+
+ /**
+ * Element properties.
+ */
+ private Element m_props;
+
+ /**
+ * Visit @component annotation attribute.
+ * @param arg0 : attribute name
+ * @param arg1 : attribute value
+ * @see org.objectweb.asm.commons.EmptyVisitor#visit(java.lang.String, java.lang.Object)
+ */
+ public void visit(String arg0, Object arg1) {
+ if (arg0.equals("public_factory")) {
+ m_factory = arg1.toString();
+ return;
+ }
+ if (arg0.equals("name")) {
+ m_name = arg1.toString();
+ return;
+ }
+ if (arg0.equals("immediate")) {
+ m_immediate = arg1.toString();
+ return;
+ }
+ if (arg0.equals("architecture")) {
+ m_architecture = arg1.toString();
+ return;
+ }
+ if (arg0.equals("propagation")) {
+ m_propagation = arg1.toString();
+ return;
+ }
+ if (arg0.equals("managedservice")) {
+ m_managedservice = arg1.toString();
+ return;
+ }
+ }
+
+ /**
+ * End of the visit.
+ * Append to the "component" element computed attribute.
+ * @see org.objectweb.asm.commons.EmptyVisitor#visitEnd()
+ */
+ public void visitEnd() {
+ if (m_name == null) {
+ m_name = m_className.replace('/', '.');
+ }
+ m_elem.addAttribute(new Attribute("name", m_name));
+ if (m_factory != null && m_factory.equalsIgnoreCase("false")) {
+ m_elem.addAttribute(new Attribute("public", "false"));
+ } else {
+ m_elem.addAttribute(new Attribute("public", "true"));
+ }
+ if (m_architecture != null) {
+ m_elem.addAttribute(new Attribute("architecture", m_architecture));
+ }
+ if (m_immediate != null) {
+ m_elem.addAttribute(new Attribute("immediate", m_immediate));
+ }
+ if (m_propagation != null) {
+ if (m_props == null) {
+ m_props = new Element("properties", "");
+ getElements().put(m_props, null);
+ getIds().put("properties", m_props);
+ }
+ m_props.addAttribute(new Attribute("propagation", m_propagation));
+ }
+ if (m_managedservice != null) {
+ if (m_props == null) {
+ m_props = new Element("properties", "");
+ getElements().put(m_props, null);
+ getIds().put("properties", m_props);
+ }
+ m_props.addAttribute(new Attribute("pid", m_managedservice));
+ }
+ }
+ }
+}
Modified: felix/trunk/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MethodCollector.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MethodCollector.java?rev=702202&r1=702201&r2=702202&view=diff
==============================================================================
--- felix/trunk/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MethodCollector.java (original)
+++ felix/trunk/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MethodCollector.java Mon Oct 6 10:08:45 2008
@@ -1,470 +1,470 @@
-/*
- * 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.manipulation.annotations;
-
-import org.apache.felix.ipojo.metadata.Attribute;
-import org.apache.felix.ipojo.metadata.Element;
-import org.objectweb.asm.AnnotationVisitor;
-import org.objectweb.asm.Type;
-import org.objectweb.asm.commons.EmptyVisitor;
-
-/**
- * This class collects method annotations, and give them to the metadata collector.
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class MethodCollector extends EmptyVisitor {
-
- /**
- * Parent collector.
- */
- private MetadataCollector m_collector;
-
- /**
- * Method name.
- */
- private String m_name;
-
- /**
- * Constructor.
- * @param name : name of the method.
- * @param collector : parent collector.
- */
- public MethodCollector(String name, MetadataCollector collector) {
- m_collector = collector;
- m_name = name;
- }
-
- /**
- * Visit method annotations.
- * @param arg0 : annotation name.
- * @param arg1 : is the annotation visible at runtime.
- * @return the visitor paring the visited annotation.
- * @see org.objectweb.asm.commons.EmptyVisitor#visitAnnotation(java.lang.String, boolean)
- */
- public AnnotationVisitor visitAnnotation(String arg0, boolean arg1) {
- if (arg0.equals("Lorg/apache/felix/ipojo/annotations/Property;")) {
- return processProperty();
- }
- if (arg0.equals("Lorg/apache/felix/ipojo/annotations/ServiceProperty;")) {
- return processServiceProperty();
- }
- if (arg0.equals("Lorg/apache/felix/ipojo/annotations/Validate;")) {
- return processValidate();
- }
- if (arg0.equals("Lorg/apache/felix/ipojo/annotations/Invalidate;")) {
- return processInvalidate();
- }
- if (arg0.equals("Lorg/apache/felix/ipojo/annotations/Bind;")) {
- return processBind("bind");
- }
- if (arg0.equals("Lorg/apache/felix/ipojo/annotations/Unbind;")) {
- return processBind("unbind");
- }
-
- if (CustomAnnotationVisitor.isCustomAnnotation(arg0)) {
- Element elem = CustomAnnotationVisitor.buildElement(arg0);
- elem.addAttribute(new Attribute("method", m_name));
- return new CustomAnnotationVisitor(elem, m_collector, true);
- }
-
- return null;
- }
-
- /**
- * Process @bind & @unbind.
- * @param type : bind or unbind
- * @return the visitor parsing @bind & @unbind annotations.
- */
- private AnnotationVisitor processBind(String type) {
- return new BindAnnotationParser(m_name, type);
- }
-
- /**
- * Process @validate annotation.
- * @return null.
- */
- private AnnotationVisitor processValidate() {
- Element cb = new Element("callback", "");
- cb.addAttribute(new org.apache.felix.ipojo.metadata.Attribute("transition", "validate"));
- cb.addAttribute(new org.apache.felix.ipojo.metadata.Attribute("method", m_name));
- m_collector.getElements().put(cb, null);
- return null;
- }
-
- /**
- * Process @invalidate annotation.
- * @return null.
- */
- private AnnotationVisitor processInvalidate() {
- Element cb = new Element("callback", "");
- cb.addAttribute(new org.apache.felix.ipojo.metadata.Attribute("transition", "invalidate"));
- cb.addAttribute(new org.apache.felix.ipojo.metadata.Attribute("method", m_name));
- m_collector.getElements().put(cb, null);
- return null;
- }
-
- /**
- * Process @serviceProperty annotation.
- * @return the visitor parsing the visited annotation.
- */
- private AnnotationVisitor processServiceProperty() {
- if (! m_collector.getIds().containsKey("provides")) {
- System.err.println("the component does not provide services, skip ServiceProperty for " + m_name);
- return null;
- } else {
- Element provides = (Element) m_collector.getIds().get("provides");
- return new PropertyAnnotationParser(provides, m_name);
- }
- }
-
- /**
- * Process @property annotation.
- * @return the visitor parsing the visited annotation.
- */
- private AnnotationVisitor processProperty() {
- Element prop = null;
- if (! m_collector.getIds().containsKey("properties")) {
- prop = new Element("Properties", "");
- m_collector.getIds().put("properties", prop);
- m_collector.getElements().put(prop, null);
- } else {
- prop = (Element) m_collector.getIds().get("properties");
- }
- return new PropertyAnnotationParser(prop, m_name);
- }
-
- /**
- * Parse @bind & @unbind annotations.
- */
- private final class BindAnnotationParser extends EmptyVisitor implements AnnotationVisitor {
-
- /**
- * Method name.
- */
- private String m_name;
-
- /**
- * Requirement filter.
- */
- private String m_filter;
-
- /**
- * Is the requirement optional?
- */
- private String m_optional;
-
- /**
- * Is the requirement aggregate?
- */
- private String m_aggregate;
-
- /**
- * Required specification.
- */
- private String m_specification;
-
- /**
- * Requirement id.
- */
- private String m_id;
-
- /**
- * Bind or Unbind method?
- */
- private String m_type;
-
- /**
- * Binding policy.
- */
- private String m_policy;
-
- /**
- * Comparator.
- */
- private String m_comparator;
-
- /**
- * From attribute.
- */
- private String m_from;
-
- /**
- * Constructor.
- * @param bind : method name.
- * @param type : is the callback a bind or an unbind method.
- */
- private BindAnnotationParser(String bind, String type) {
- m_name = bind;
- m_type = type;
- }
-
- /**
- * Visit annotation attribute.
- * @param arg0 : annotation name
- * @param arg1 : annotation value
- * @see org.objectweb.asm.commons.EmptyVisitor#visit(java.lang.String, java.lang.Object)
- */
- public void visit(String arg0, Object arg1) {
- if (arg0.equals("filter")) {
- m_filter = arg1.toString();
- return;
- }
- if (arg0.equals("optional")) {
- m_optional = arg1.toString();
- return;
- }
- if (arg0.equals("aggregate")) {
- m_aggregate = arg1.toString();
- return;
- }
- if (arg0.equals("specification")) {
- m_specification = arg1.toString();
- return;
- }
- if (arg0.equals("policy")) {
- m_policy = arg1.toString();
- return;
- }
- if (arg0.equals("id")) {
- m_id = arg1.toString();
- return;
- }
- if (arg0.equals("comparator")) {
- Type type = Type.getType(arg1.toString());
- m_comparator = type.getClassName();
- return;
- }
- if (arg0.equals("from")) {
- m_from = arg1.toString();
- return;
- }
-
- }
-
- /**
- * End of the visit.
- * Create or append the requirement info to a created or already existing "requires" element.
- * @see org.objectweb.asm.commons.EmptyVisitor#visitEnd()
- */
- public void visitEnd() {
- if (m_id == null) {
- if (m_name.startsWith("bind")) {
- m_id = m_name.substring("bind".length());
- } else if (m_name.startsWith("unbind")) {
- m_id = m_name.substring("unbind".length());
- } else {
- System.err.println("Cannot determine the id of the bind method : " + m_name);
- return;
- }
- }
- // Check if it is a full-determined requirement
- Element req = (Element) m_collector.getIds().get(m_id);
- if (req == null) {
- // Add the complete requires
- req = new Element("requires", "");
- if (m_specification != null) {
- req.addAttribute(new Attribute("specification", m_specification));
- }
- if (m_aggregate != null) {
- req.addAttribute(new Attribute("aggregate", m_aggregate));
- }
- if (m_filter != null) {
- req.addAttribute(new Attribute("filter", m_filter));
- }
- if (m_optional != null) {
- req.addAttribute(new Attribute("optional", m_optional));
- }
- if (m_policy != null) {
- req.addAttribute(new Attribute("policy", m_policy));
- }
- if (m_id != null) {
- req.addAttribute(new Attribute("id", m_id));
- }
- if (m_comparator != null) {
- req.addAttribute(new Attribute("comparator", m_comparator));
- }
- if (m_from != null) {
- req.addAttribute(new Attribute("from", m_from));
- }
- } else {
- String itf = req.getAttribute("specification");
- String aggregate = req.getAttribute("aggregate");
- String optional = req.getAttribute("optional");
- String filter = req.getAttribute("filter");
- String policy = req.getAttribute("policy");
- String comparator = req.getAttribute("comparator");
- String from = req.getAttribute("from");
- if (m_specification != null) {
- if (itf == null) {
- req.addAttribute(new Attribute("specification", m_specification));
- } else if (! m_specification.equals(itf)) {
- System.err.println("The required specification is not the same than previouly : " + m_specification + " & " + itf);
- return;
- }
- }
-
- if (m_optional != null) {
- if (optional == null) {
- req.addAttribute(new Attribute("optional", m_optional));
- } else if (! m_optional.equals(optional)) {
- System.err.println("The optional attribute is not always the same");
- return;
- }
- }
-
- if (m_aggregate != null) {
- if (aggregate == null) {
- req.addAttribute(new Attribute("aggregate", m_aggregate));
- } else if (! m_aggregate.equals(aggregate)) {
- System.err.println("The aggregate attribute is not always the same");
- return;
- }
- }
-
- if (m_filter != null) {
- if (filter == null) {
- req.addAttribute(new Attribute("filter", m_filter));
- } else if (! m_filter.equals(filter)) {
- System.err.println("The filter attribute is not always the same");
- return;
- }
- }
-
- if (m_policy != null) {
- if (policy == null) {
- req.addAttribute(new Attribute("policy", m_policy));
- } else if (! m_policy.equals(policy)) {
- System.err.println("The policy attribute is not always the same");
- return;
- }
- }
-
- if (m_comparator != null) {
- if (comparator == null) {
- req.addAttribute(new Attribute("comparator", m_comparator));
- } else if (! m_comparator.equals(comparator)) {
- System.err.println("The comparator attribute is not always the same");
- return;
- }
- }
-
- if (m_from != null) {
- if (from == null) {
- req.addAttribute(new Attribute("from", m_from));
- } else if (! m_from.equals(from)) {
- System.err.println("The from attribute is not always the same");
- return;
- }
-
- }
-
- }
- Element method = new Element("callback", "");
- method.addAttribute(new Attribute("method", m_name));
- method.addAttribute(new Attribute("type", m_type));
- req.addElement(method);
- m_collector.getIds().put(m_id, req);
- m_collector.getElements().put(req, null);
- return;
- }
- }
-
- private final class PropertyAnnotationParser extends EmptyVisitor implements AnnotationVisitor {
-
- /**
- * Parent element.
- */
- private Element m_parent;
-
- /**
- * Attached method.
- */
- private String m_method;
-
- /**
- * Property name.
- */
- private String m_name;
-
- /**
- * Property value.
- */
- private String m_value;
-
- /**
- * Constructor.
- * @param parent : parent element.
- * @param method : attached method.
- */
- private PropertyAnnotationParser(Element parent, String method) {
- m_parent = parent;
- m_method = method;
- }
-
- /**
- * Visit annotation attributes.
- * @param arg0 : annotation name
- * @param arg1 : annotation value
- * @see org.objectweb.asm.commons.EmptyVisitor#visit(java.lang.String, java.lang.Object)
- */
- public void visit(String arg0, Object arg1) {
- if (arg0.equals("name")) {
- m_name = arg1.toString();
- return;
- }
- if (arg0.equals("value")) {
- m_value = arg1.toString();
- return;
- }
- }
-
- /**
- * End of the visit.
- * Append the computed element to the parent element.
- * @see org.objectweb.asm.commons.EmptyVisitor#visitEnd()
- */
- public void visitEnd() {
- if (m_name == null && m_method.startsWith("set")) {
- m_name = m_method.substring("set".length());
- }
- Element[] props = m_parent.getElements("Property");
- Element prop = null;
- for (int i = 0; props != null && prop == null && i < props.length; i++) {
- String name = props[i].getAttribute("name");
- if (name != null && name.equals(m_name)) {
- prop = props[i];
- }
- }
-
- if (prop == null) {
- prop = new Element("property", "");
- m_parent.addElement(prop);
- if (m_name != null) {
- prop.addAttribute(new Attribute("name", m_name));
- }
- }
-
- prop.addAttribute(new Attribute("method", m_method));
- if (m_value != null) {
- prop.addAttribute(new Attribute("value", m_value));
- }
-
- }
- }
-}
+/*
+ * 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.manipulation.annotations;
+
+import org.apache.felix.ipojo.metadata.Attribute;
+import org.apache.felix.ipojo.metadata.Element;
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.commons.EmptyVisitor;
+
+/**
+ * This class collects method annotations, and give them to the metadata collector.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class MethodCollector extends EmptyVisitor {
+
+ /**
+ * Parent collector.
+ */
+ private MetadataCollector m_collector;
+
+ /**
+ * Method name.
+ */
+ private String m_name;
+
+ /**
+ * Constructor.
+ * @param name : name of the method.
+ * @param collector : parent collector.
+ */
+ public MethodCollector(String name, MetadataCollector collector) {
+ m_collector = collector;
+ m_name = name;
+ }
+
+ /**
+ * Visit method annotations.
+ * @param arg0 : annotation name.
+ * @param arg1 : is the annotation visible at runtime.
+ * @return the visitor paring the visited annotation.
+ * @see org.objectweb.asm.commons.EmptyVisitor#visitAnnotation(java.lang.String, boolean)
+ */
+ public AnnotationVisitor visitAnnotation(String arg0, boolean arg1) {
+ if (arg0.equals("Lorg/apache/felix/ipojo/annotations/Property;")) {
+ return processProperty();
+ }
+ if (arg0.equals("Lorg/apache/felix/ipojo/annotations/ServiceProperty;")) {
+ return processServiceProperty();
+ }
+ if (arg0.equals("Lorg/apache/felix/ipojo/annotations/Validate;")) {
+ return processValidate();
+ }
+ if (arg0.equals("Lorg/apache/felix/ipojo/annotations/Invalidate;")) {
+ return processInvalidate();
+ }
+ if (arg0.equals("Lorg/apache/felix/ipojo/annotations/Bind;")) {
+ return processBind("bind");
+ }
+ if (arg0.equals("Lorg/apache/felix/ipojo/annotations/Unbind;")) {
+ return processBind("unbind");
+ }
+
+ if (CustomAnnotationVisitor.isCustomAnnotation(arg0)) {
+ Element elem = CustomAnnotationVisitor.buildElement(arg0);
+ elem.addAttribute(new Attribute("method", m_name));
+ return new CustomAnnotationVisitor(elem, m_collector, true);
+ }
+
+ return null;
+ }
+
+ /**
+ * Process @bind & @unbind.
+ * @param type : bind or unbind
+ * @return the visitor parsing @bind & @unbind annotations.
+ */
+ private AnnotationVisitor processBind(String type) {
+ return new BindAnnotationParser(m_name, type);
+ }
+
+ /**
+ * Process @validate annotation.
+ * @return null.
+ */
+ private AnnotationVisitor processValidate() {
+ Element cb = new Element("callback", "");
+ cb.addAttribute(new org.apache.felix.ipojo.metadata.Attribute("transition", "validate"));
+ cb.addAttribute(new org.apache.felix.ipojo.metadata.Attribute("method", m_name));
+ m_collector.getElements().put(cb, null);
+ return null;
+ }
+
+ /**
+ * Process @invalidate annotation.
+ * @return null.
+ */
+ private AnnotationVisitor processInvalidate() {
+ Element cb = new Element("callback", "");
+ cb.addAttribute(new org.apache.felix.ipojo.metadata.Attribute("transition", "invalidate"));
+ cb.addAttribute(new org.apache.felix.ipojo.metadata.Attribute("method", m_name));
+ m_collector.getElements().put(cb, null);
+ return null;
+ }
+
+ /**
+ * Process @serviceProperty annotation.
+ * @return the visitor parsing the visited annotation.
+ */
+ private AnnotationVisitor processServiceProperty() {
+ if (! m_collector.getIds().containsKey("provides")) {
+ System.err.println("The component does not provide services, skipping ServiceProperty for " + m_name);
+ return null;
+ } else {
+ Element provides = (Element) m_collector.getIds().get("provides");
+ return new PropertyAnnotationParser(provides, m_name);
+ }
+ }
+
+ /**
+ * Process @property annotation.
+ * @return the visitor parsing the visited annotation.
+ */
+ private AnnotationVisitor processProperty() {
+ Element prop = null;
+ if (! m_collector.getIds().containsKey("properties")) {
+ prop = new Element("Properties", "");
+ m_collector.getIds().put("properties", prop);
+ m_collector.getElements().put(prop, null);
+ } else {
+ prop = (Element) m_collector.getIds().get("properties");
+ }
+ return new PropertyAnnotationParser(prop, m_name);
+ }
+
+ /**
+ * Parse @bind & @unbind annotations.
+ */
+ private final class BindAnnotationParser extends EmptyVisitor implements AnnotationVisitor {
+
+ /**
+ * Method name.
+ */
+ private String m_name;
+
+ /**
+ * Requirement filter.
+ */
+ private String m_filter;
+
+ /**
+ * Is the requirement optional?
+ */
+ private String m_optional;
+
+ /**
+ * Is the requirement aggregate?
+ */
+ private String m_aggregate;
+
+ /**
+ * Required specification.
+ */
+ private String m_specification;
+
+ /**
+ * Requirement id.
+ */
+ private String m_id;
+
+ /**
+ * Bind or Unbind method?
+ */
+ private String m_type;
+
+ /**
+ * Binding policy.
+ */
+ private String m_policy;
+
+ /**
+ * Comparator.
+ */
+ private String m_comparator;
+
+ /**
+ * From attribute.
+ */
+ private String m_from;
+
+ /**
+ * Constructor.
+ * @param bind : method name.
+ * @param type : is the callback a bind or an unbind method.
+ */
+ private BindAnnotationParser(String bind, String type) {
+ m_name = bind;
+ m_type = type;
+ }
+
+ /**
+ * Visit annotation attribute.
+ * @param arg0 : annotation name
+ * @param arg1 : annotation value
+ * @see org.objectweb.asm.commons.EmptyVisitor#visit(java.lang.String, java.lang.Object)
+ */
+ public void visit(String arg0, Object arg1) {
+ if (arg0.equals("filter")) {
+ m_filter = arg1.toString();
+ return;
+ }
+ if (arg0.equals("optional")) {
+ m_optional = arg1.toString();
+ return;
+ }
+ if (arg0.equals("aggregate")) {
+ m_aggregate = arg1.toString();
+ return;
+ }
+ if (arg0.equals("specification")) {
+ m_specification = arg1.toString();
+ return;
+ }
+ if (arg0.equals("policy")) {
+ m_policy = arg1.toString();
+ return;
+ }
+ if (arg0.equals("id")) {
+ m_id = arg1.toString();
+ return;
+ }
+ if (arg0.equals("comparator")) {
+ Type type = Type.getType(arg1.toString());
+ m_comparator = type.getClassName();
+ return;
+ }
+ if (arg0.equals("from")) {
+ m_from = arg1.toString();
+ return;
+ }
+
+ }
+
+ /**
+ * End of the visit.
+ * Create or append the requirement info to a created or already existing "requires" element.
+ * @see org.objectweb.asm.commons.EmptyVisitor#visitEnd()
+ */
+ public void visitEnd() {
+ if (m_id == null) {
+ if (m_name.startsWith("bind")) {
+ m_id = m_name.substring("bind".length());
+ } else if (m_name.startsWith("unbind")) {
+ m_id = m_name.substring("unbind".length());
+ } else {
+ System.err.println("Cannot determine the id of the bind method : " + m_name);
+ return;
+ }
+ }
+ // Check if it is a full-determined requirement
+ Element req = (Element) m_collector.getIds().get(m_id);
+ if (req == null) {
+ // Add the complete requires
+ req = new Element("requires", "");
+ if (m_specification != null) {
+ req.addAttribute(new Attribute("specification", m_specification));
+ }
+ if (m_aggregate != null) {
+ req.addAttribute(new Attribute("aggregate", m_aggregate));
+ }
+ if (m_filter != null) {
+ req.addAttribute(new Attribute("filter", m_filter));
+ }
+ if (m_optional != null) {
+ req.addAttribute(new Attribute("optional", m_optional));
+ }
+ if (m_policy != null) {
+ req.addAttribute(new Attribute("policy", m_policy));
+ }
+ if (m_id != null) {
+ req.addAttribute(new Attribute("id", m_id));
+ }
+ if (m_comparator != null) {
+ req.addAttribute(new Attribute("comparator", m_comparator));
+ }
+ if (m_from != null) {
+ req.addAttribute(new Attribute("from", m_from));
+ }
+ } else {
+ String itf = req.getAttribute("specification");
+ String aggregate = req.getAttribute("aggregate");
+ String optional = req.getAttribute("optional");
+ String filter = req.getAttribute("filter");
+ String policy = req.getAttribute("policy");
+ String comparator = req.getAttribute("comparator");
+ String from = req.getAttribute("from");
+ if (m_specification != null) {
+ if (itf == null) {
+ req.addAttribute(new Attribute("specification", m_specification));
+ } else if (! m_specification.equals(itf)) {
+ System.err.println("The required specification is not the same as previouly : " + m_specification + " & " + itf);
+ return;
+ }
+ }
+
+ if (m_optional != null) {
+ if (optional == null) {
+ req.addAttribute(new Attribute("optional", m_optional));
+ } else if (! m_optional.equals(optional)) {
+ System.err.println("The optional attribute is not always the same");
+ return;
+ }
+ }
+
+ if (m_aggregate != null) {
+ if (aggregate == null) {
+ req.addAttribute(new Attribute("aggregate", m_aggregate));
+ } else if (! m_aggregate.equals(aggregate)) {
+ System.err.println("The aggregate attribute is not always the same");
+ return;
+ }
+ }
+
+ if (m_filter != null) {
+ if (filter == null) {
+ req.addAttribute(new Attribute("filter", m_filter));
+ } else if (! m_filter.equals(filter)) {
+ System.err.println("The filter attribute is not always the same");
+ return;
+ }
+ }
+
+ if (m_policy != null) {
+ if (policy == null) {
+ req.addAttribute(new Attribute("policy", m_policy));
+ } else if (! m_policy.equals(policy)) {
+ System.err.println("The policy attribute is not always the same");
+ return;
+ }
+ }
+
+ if (m_comparator != null) {
+ if (comparator == null) {
+ req.addAttribute(new Attribute("comparator", m_comparator));
+ } else if (! m_comparator.equals(comparator)) {
+ System.err.println("The comparator attribute is not always the same");
+ return;
+ }
+ }
+
+ if (m_from != null) {
+ if (from == null) {
+ req.addAttribute(new Attribute("from", m_from));
+ } else if (! m_from.equals(from)) {
+ System.err.println("The from attribute is not always the same");
+ return;
+ }
+
+ }
+
+ }
+ Element method = new Element("callback", "");
+ method.addAttribute(new Attribute("method", m_name));
+ method.addAttribute(new Attribute("type", m_type));
+ req.addElement(method);
+ m_collector.getIds().put(m_id, req);
+ m_collector.getElements().put(req, null);
+ return;
+ }
+ }
+
+ private final class PropertyAnnotationParser extends EmptyVisitor implements AnnotationVisitor {
+
+ /**
+ * Parent element.
+ */
+ private Element m_parent;
+
+ /**
+ * Attached method.
+ */
+ private String m_method;
+
+ /**
+ * Property name.
+ */
+ private String m_name;
+
+ /**
+ * Property value.
+ */
+ private String m_value;
+
+ /**
+ * Constructor.
+ * @param parent : parent element.
+ * @param method : attached method.
+ */
+ private PropertyAnnotationParser(Element parent, String method) {
+ m_parent = parent;
+ m_method = method;
+ }
+
+ /**
+ * Visit annotation attributes.
+ * @param arg0 : annotation name
+ * @param arg1 : annotation value
+ * @see org.objectweb.asm.commons.EmptyVisitor#visit(java.lang.String, java.lang.Object)
+ */
+ public void visit(String arg0, Object arg1) {
+ if (arg0.equals("name")) {
+ m_name = arg1.toString();
+ return;
+ }
+ if (arg0.equals("value")) {
+ m_value = arg1.toString();
+ return;
+ }
+ }
+
+ /**
+ * End of the visit.
+ * Append the computed element to the parent element.
+ * @see org.objectweb.asm.commons.EmptyVisitor#visitEnd()
+ */
+ public void visitEnd() {
+ if (m_name == null && m_method.startsWith("set")) {
+ m_name = m_method.substring("set".length());
+ }
+ Element[] props = m_parent.getElements("Property");
+ Element prop = null;
+ for (int i = 0; props != null && prop == null && i < props.length; i++) {
+ String name = props[i].getAttribute("name");
+ if (name != null && name.equals(m_name)) {
+ prop = props[i];
+ }
+ }
+
+ if (prop == null) {
+ prop = new Element("property", "");
+ m_parent.addElement(prop);
+ if (m_name != null) {
+ prop.addAttribute(new Attribute("name", m_name));
+ }
+ }
+
+ prop.addAttribute(new Attribute("method", m_method));
+ if (m_value != null) {
+ prop.addAttribute(new Attribute("value", m_value));
+ }
+
+ }
+ }
+}