You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by js...@apache.org on 2007/04/11 04:55:07 UTC

svn commit: r527378 [6/9] - in /incubator/tuscany/java/sca/modules: assembly-xml/src/main/java/org/apache/tuscany/assembly/xml/ assembly-xml/src/main/java/org/apache/tuscany/assembly/xml/impl/ assembly-xml/src/test/java/org/apache/tuscany/assembly/xml/...

Added: incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/JavaIntrospectionHelper.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/JavaIntrospectionHelper.java?view=auto&rev=527378
==============================================================================
--- incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/JavaIntrospectionHelper.java (added)
+++ incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/JavaIntrospectionHelper.java Tue Apr 10 19:55:00 2007
@@ -0,0 +1,460 @@
+/*
+ * 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.tuscany.implementation.java.introspect.impl;
+
+import java.beans.Introspector;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.GenericArrayType;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
+import java.lang.reflect.WildcardType;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Implements various reflection-related operations
+ * 
+ * @version $Rev$ $Date$
+ */
+public final class JavaIntrospectionHelper {
+
+    private static final Class[] EMPTY_CLASS_ARRY = new Class[0];
+
+    /**
+     * Hide the constructor
+     */
+    private JavaIntrospectionHelper() {
+    }
+
+    /**
+     * Returns a collection of public, and protected fields declared by a class
+     * or one of its supertypes
+     */
+    public static Set<Field> getAllPublicAndProtectedFields(Class clazz) {
+        return getAllPublicAndProtectedFields(clazz, new HashSet<Field>());
+    }
+
+    /**
+     * Recursively evaluates the type hierachy to return all fields that are
+     * public or protected
+     */
+    private static Set<Field> getAllPublicAndProtectedFields(Class clazz, Set<Field> fields) {
+        if (clazz == null || clazz.isArray() || Object.class.equals(clazz)) {
+            return fields;
+        }
+        fields = getAllPublicAndProtectedFields(clazz.getSuperclass(), fields);
+        Field[] declaredFields = clazz.getDeclaredFields();
+        for (Field field : declaredFields) {
+            int modifiers = field.getModifiers();
+            if ((Modifier.isPublic(modifiers) || Modifier.isProtected(modifiers)) && !Modifier.isStatic(modifiers)) {
+                field.setAccessible(true); // ignore Java accessibility
+                fields.add(field);
+            }
+        }
+        return fields;
+    }
+
+    /**
+     * Returns a collection of public and protected methods declared by a class
+     * or one of its supertypes. Note that overriden methods will not be
+     * returned in the collection (i.e. only the method override will be). <p/>
+     * This method can potentially be expensive as reflection information is not
+     * cached. It is assumed that this method will be used during a
+     * configuration phase.
+     */
+    public static Set<Method> getAllUniquePublicProtectedMethods(Class clazz) {
+        return getAllUniqueMethods(clazz, new HashSet<Method>());
+    }
+
+    /**
+     * Recursively evaluates the type hierarchy to return all unique methods
+     */
+    private static Set<Method> getAllUniqueMethods(Class pClass, Set<Method> methods) {
+        if (pClass == null || pClass.isArray() || Object.class.equals(pClass)) {
+            return methods;
+        }
+        // we first evaluate methods of the subclass and then move to the parent
+        Method[] declaredMethods = pClass.getDeclaredMethods();
+        for (Method declaredMethod : declaredMethods) {
+            int modifiers = declaredMethod.getModifiers();
+            if ((!Modifier.isPublic(modifiers) && !Modifier.isProtected(modifiers)) || Modifier.isStatic(modifiers)) {
+                continue;
+            }
+            if (methods.size() == 0) {
+                methods.add(declaredMethod);
+            } else {
+                List<Method> temp = new ArrayList<Method>();
+                boolean matched = false;
+                for (Method method : methods) {
+                    // only add if not already in the set from a supclass (i.e.
+                    // the
+                    // method is not overrided)
+                    if (exactMethodMatch(declaredMethod, method)) {
+                        matched = true;
+                        break;
+                    }
+                }
+                if (!matched) {
+                    // TODO ignore Java accessibility
+                    declaredMethod.setAccessible(true);
+                    temp.add(declaredMethod);
+                }
+                methods.addAll(temp);
+                temp.clear();
+            }
+        }
+        // evaluate class hierarchy - this is done last to track inherited
+        // methods
+        methods = getAllUniqueMethods(pClass.getSuperclass(), methods);
+        return methods;
+    }
+
+    /**
+     * Finds the closest matching field with the given name, that is, a field of
+     * the exact specified type or, alternately, of a supertype.
+     * 
+     * @param name the name of the field
+     * @param type the field type
+     * @param fields the collection of fields to search
+     * @return the matching field or null if not found
+     */
+    public static Field findClosestMatchingField(String name, Class type, Set<Field> fields) {
+        Field candidate = null;
+        for (Field field : fields) {
+            if (field.getName().equals(name)) {
+                if (field.getType().equals(type)) {
+                    return field; // exact match
+                } else if (field.getType().isAssignableFrom(type) 
+                    || (field.getType().isPrimitive() && primitiveAssignable(field.getType(), type))) {
+                    // We could have the situation where a field parameter is a
+                    // primitive and the demarshalled value is
+                    // an object counterpart (e.g. Integer and int)
+                    // @spec issue
+                    // either an interface or super class, so keep a reference
+                    // until
+                    // we know there are no closer types
+                    candidate = field;
+                }
+            }
+        }
+        if (candidate != null) {
+            return candidate;
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Finds the closest matching method with the given name, that is, a method
+     * taking the exact parameter types or, alternately, parameter supertypes.
+     * 
+     * @param name the name of the method
+     * @param types the method parameter types
+     * @param methods the collection of methods to search
+     * @return the matching method or null if not found
+     */
+    public static Method findClosestMatchingMethod(String name, Class[] types, Set<Method> methods) {
+        if (types == null) {
+            types = EMPTY_CLASS_ARRY;
+        }
+        Method candidate = null;
+        for (Method method : methods) {
+            if (method.getName().equals(name) && method.getParameterTypes().length == types.length) {
+                Class<?>[] params = method.getParameterTypes();
+                boolean disqualify = false;
+                boolean exactMatch = true;
+                for (int i = 0; i < params.length; i++) {
+                    if (!params[i].equals(types[i]) && !params[i].isAssignableFrom(types[i])) {
+                        // no match
+                        disqualify = true;
+                        exactMatch = false;
+                        break;
+                    } else if (!params[i].equals(types[i]) && params[i].isAssignableFrom(types[i])) {
+                        // not exact match
+                        exactMatch = false;
+                    }
+                }
+                if (disqualify) {
+                    continue;
+                } else if (exactMatch) {
+                    return method;
+                } else {
+                    candidate = method;
+                }
+            }
+        }
+        if (candidate != null) {
+            return candidate;
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Determines if two methods "match" - that is, they have the same method
+     * names and exact parameter types (one is not a supertype of the other)
+     */
+    public static boolean exactMethodMatch(Method method1, Method method2) {
+        if (!method1.getName().equals(method2.getName())) {
+            return false;
+        }
+        Class<?>[] types1 = method1.getParameterTypes();
+        Class<?>[] types2 = method2.getParameterTypes();
+        if (types1.length != types2.length) {
+            return false;
+        }
+        boolean matched = true;
+        for (int i = 0; i < types1.length; i++) {
+            if (types1[i] != types2[i]) {
+                matched = false;
+                break;
+            }
+        }
+        return matched;
+    }
+
+    public static <T> Constructor<T> getDefaultConstructor(Class<T> clazz) throws NoSuchMethodException {
+        return clazz.getConstructor((Class[])null);
+    }
+
+    /**
+     * Loads a class corresponding to the class name using the current context
+     * class loader.
+     * 
+     * @throws ClassNotFoundException if the class was not found on the
+     *             classpath
+     */
+    public static Class loadClass(String pName) throws ClassNotFoundException {
+        ClassLoader loader = Thread.currentThread().getContextClassLoader();
+        return Class.forName(pName, true, loader);
+    }
+
+    /**
+     * Returns the simple name of a class - i.e. the class name devoid of its
+     * package qualifier
+     * 
+     * @param implClass the implmentation class
+     */
+    public static String getBaseName(Class<?> implClass) {
+        return implClass.getSimpleName();
+    }
+
+    public static boolean isImmutable(Class clazz) {
+        return String.class == clazz || clazz.isPrimitive()
+               || Number.class.isAssignableFrom(clazz)
+               || Boolean.class.isAssignableFrom(clazz)
+               || Character.class.isAssignableFrom(clazz)
+               || Byte.class.isAssignableFrom(clazz);
+    }
+
+    /**
+     * Takes a property name and converts it to a getter method name according
+     * to JavaBean conventions. For example, property
+     * <code>foo<code> is returned as <code>getFoo</code>
+     */
+    public static String toGetter(String name) {
+        return "get" + name.toUpperCase().substring(0, 1) + name.substring(1);
+    }
+
+    /**
+     * Takes a setter or getter method name and converts it to a property name
+     * according to JavaBean conventions. For example, <code>setFoo(var)</code>
+     * is returned as property <code>foo<code>
+     */
+    public static String toPropertyName(String name) {
+        if (!name.startsWith("set")) {
+            return name;
+        }
+        return Introspector.decapitalize(name.substring(3));
+    }
+
+    public static Class<?> getErasure(Type type) {
+        if (type instanceof Class) {
+            return (Class)type;
+        } else if (type instanceof GenericArrayType) {
+            // FIXME: How to deal with the []?
+            GenericArrayType arrayType = (GenericArrayType)type;
+            return getErasure(arrayType.getGenericComponentType());
+        } else if (type instanceof ParameterizedType) {
+            ParameterizedType pType = (ParameterizedType)type;
+            return getErasure(pType.getRawType());
+        } else if (type instanceof WildcardType) {
+            WildcardType wType = (WildcardType)type;
+            Type[] types = wType.getUpperBounds();
+            return getErasure(types[0]);
+        } else if (type instanceof TypeVariable) {
+            TypeVariable var = (TypeVariable)type;
+            Type[] types = var.getBounds();
+            return getErasure(types[0]);
+        }
+        return null;
+    }
+
+    public static Class<?> getBaseType(Class<?> cls, Type genericType) {
+        if (cls.isArray()) {
+            return cls.getComponentType();
+        } else if (Collection.class.isAssignableFrom(cls)) {
+            if (genericType instanceof ParameterizedType) {
+                // Collection<BaseType>
+                ParameterizedType parameterizedType = (ParameterizedType)genericType;
+                Type baseType = parameterizedType.getActualTypeArguments()[0];
+                if (baseType instanceof GenericArrayType) {
+                    // Base is array
+                    return cls;
+                } else {
+                    return getErasure(baseType);
+                }
+            } else {
+                return cls;
+            }
+        } else {
+            return cls;
+        }
+    }
+
+    /**
+     * Takes a property name and converts it to a setter method name according
+     * to JavaBean conventions. For example, the property
+     * <code>foo<code> is returned as <code>setFoo(var)</code>
+     */
+    public static String toSetter(String name) {
+        return "set" + name.toUpperCase().substring(0, 1) + name.substring(1);
+    }
+
+    /**
+     * Compares a two types, assuming one is a primitive, to determine if the
+     * other is its object counterpart
+     */
+    private static boolean primitiveAssignable(Class memberType, Class param) {
+        if (memberType == Integer.class) {
+            return param == Integer.TYPE;
+        } else if (memberType == Double.class) {
+            return param == Double.TYPE;
+        } else if (memberType == Float.class) {
+            return param == Float.TYPE;
+        } else if (memberType == Short.class) {
+            return param == Short.TYPE;
+        } else if (memberType == Character.class) {
+            return param == Character.TYPE;
+        } else if (memberType == Boolean.class) {
+            return param == Boolean.TYPE;
+        } else if (memberType == Byte.class) {
+            return param == Byte.TYPE;
+        } else if (param == Integer.class) {
+            return memberType == Integer.TYPE;
+        } else if (param == Double.class) {
+            return memberType == Double.TYPE;
+        } else if (param == Float.class) {
+            return memberType == Float.TYPE;
+        } else if (param == Short.class) {
+            return memberType == Short.TYPE;
+        } else if (param == Character.class) {
+            return memberType == Character.TYPE;
+        } else if (param == Boolean.class) {
+            return memberType == Boolean.TYPE;
+        } else if (param == Byte.class) {
+            return memberType == Byte.TYPE;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * Returns the generic types represented in the given type. Usage as
+     * follows: <code>
+     * JavaIntrospectionHelper.getGenerics(field.getGenericType());
+     * <p/>
+     * JavaIntrospectionHelper.getGenerics(m.getGenericParameterTypes()[0];); </code>
+     * 
+     * @return the generic types in order of declaration or an empty array if
+     *         the type is not genericized
+     */
+    public static List<? extends Type> getGenerics(Type genericType) {
+        List<Type> classes = new ArrayList<Type>();
+        if (genericType instanceof ParameterizedType) {
+            ParameterizedType ptype = (ParameterizedType)genericType;
+            // get the type arguments
+            Type[] targs = ptype.getActualTypeArguments();
+            for (Type targ : targs) {
+                classes.add(targ);
+            }
+        }
+        return classes;
+    }
+
+    /**
+     * Returns the generic type specified by the class at the given position as
+     * in: <p/> <code> public class Foo<Bar,Baz>{ //.. }
+     * <p/>
+     * JavaIntrospectionHelper.introspectGeneric(Foo.class,1); <code>
+     * <p/>
+     * will return Baz.
+     */
+    public static Class introspectGeneric(Class<?> clazz, int pos) {
+        assert clazz != null : "No class specified";
+        Type type = clazz.getGenericSuperclass();
+        if (type instanceof ParameterizedType) {
+            Type[] args = ((ParameterizedType)type).getActualTypeArguments();
+            if (args.length <= pos) {
+                throw new IllegalArgumentException("Invalid index value for generic class " + clazz.getName());
+            }
+            return (Class)((ParameterizedType)type).getActualTypeArguments()[pos];
+        } else {
+            Type[] interfaces = clazz.getGenericInterfaces();
+            for (Type itype : interfaces) {
+                if (!(itype instanceof ParameterizedType)) {
+                    continue;
+                }
+                ParameterizedType interfaceType = (ParameterizedType)itype;
+                return (Class)interfaceType.getActualTypeArguments()[0];
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Returns the set of interfaces implemented by the given class and its
+     * ancestors or a blank set if none
+     */
+    public static Set<Class> getAllInterfaces(Class clazz) {
+        Set<Class> implemented = new HashSet<Class>();
+        getAllInterfaces(clazz, implemented);
+        return implemented;
+    }
+
+    private static void getAllInterfaces(Class clazz, Set<Class> implemented) {
+        Class[] interfaces = clazz.getInterfaces();
+        for (Class interfaze : interfaces) {
+            implemented.add(interfaze);
+        }
+        Class<?> superClass = clazz.getSuperclass();
+        // Object has no superclass so check for null
+        if (superClass != null && !superClass.equals(Object.class)) {
+            getAllInterfaces(superClass, implemented);
+        }
+    }
+
+}

Propchange: incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/JavaIntrospectionHelper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/JavaIntrospectionHelper.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/NoConstructorException.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/NoConstructorException.java?view=auto&rev=527378
==============================================================================
--- incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/NoConstructorException.java (added)
+++ incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/NoConstructorException.java Tue Apr 10 19:55:00 2007
@@ -0,0 +1,37 @@
+/*
+ * 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.tuscany.implementation.java.introspect.impl;
+
+import org.apache.tuscany.implementation.java.introspect.ProcessingException;
+
+/**
+ * Thrown when a suitable constructor for a component implementation cannot be found
+ *
+ * @version $Rev$ $Date$
+ */
+public class NoConstructorException extends ProcessingException {
+    private static final long serialVersionUID = 3086706387280694424L;
+    
+    public NoConstructorException() {
+    }
+    
+    public NoConstructorException(String message) {
+       super(message);
+    }
+}

Propchange: incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/NoConstructorException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/NoConstructorException.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/PropertyProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/PropertyProcessor.java?view=auto&rev=527378
==============================================================================
--- incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/PropertyProcessor.java (added)
+++ incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/PropertyProcessor.java Tue Apr 10 19:55:00 2007
@@ -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.tuscany.implementation.java.introspect.impl;
+
+import org.osoa.sca.annotations.Property;
+
+/**
+ * Processes an {@link @Property} annotation, updating the component type with
+ * corresponding {@link JavaMappedProperty}
+ * 
+ * @version $Rev$ $Date$
+ */
+public class PropertyProcessor extends AbstractPropertyProcessor<Property> {
+    public PropertyProcessor() {
+        super(Property.class);
+    }
+
+    protected String getName(Property annotation) {
+        return annotation.name();
+    }
+
+    protected void initProperty(org.apache.tuscany.assembly.Property property, Property annotation) {
+        property.setMustSupply(annotation.required());
+    }
+
+}

Propchange: incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/PropertyProcessor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/PropertyProcessor.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/ReferenceProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/ReferenceProcessor.java?view=auto&rev=527378
==============================================================================
--- incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/ReferenceProcessor.java (added)
+++ incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/ReferenceProcessor.java Tue Apr 10 19:55:00 2007
@@ -0,0 +1,163 @@
+/*
+ * 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.tuscany.implementation.java.introspect.impl;
+
+import static org.apache.tuscany.implementation.java.introspect.impl.JavaIntrospectionHelper.getBaseType;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Type;
+import java.util.Collection;
+
+import org.apache.tuscany.assembly.Multiplicity;
+import org.apache.tuscany.assembly.impl.ReferenceImpl;
+import org.apache.tuscany.implementation.java.impl.JavaElement;
+import org.apache.tuscany.implementation.java.impl.JavaImplementationDefinition;
+import org.apache.tuscany.implementation.java.impl.Parameter;
+import org.apache.tuscany.implementation.java.introspect.BaseJavaClassIntrospectorExtension;
+import org.apache.tuscany.implementation.java.introspect.ProcessingException;
+import org.apache.tuscany.interfacedef.InvalidInterfaceException;
+import org.apache.tuscany.interfacedef.java.JavaInterface;
+import org.apache.tuscany.interfacedef.java.JavaInterfaceContract;
+import org.apache.tuscany.interfacedef.java.impl.JavaInterfaceContractImpl;
+import org.osoa.sca.annotations.Reference;
+
+/**
+ * Processes an {@link @Reference} annotation, updating the component type with
+ * corresponding {@link
+ * org.apache.tuscany.spi.implementation.java.JavaMappedReference}
+ * 
+ * @version $Rev$ $Date$
+ */
+public class ReferenceProcessor extends BaseJavaClassIntrospectorExtension {
+
+    public void visitMethod(Method method, JavaImplementationDefinition type) throws ProcessingException {
+        Reference annotation = method.getAnnotation(Reference.class);
+        if (annotation == null) {
+            return; // Not a reference annotation.
+        }
+        if (method.getParameterTypes().length != 1) {
+            throw new IllegalReferenceException("Setter must have one parameter", method);
+        }
+        String name = annotation.name();
+        if ("".equals(name)) {
+            name = JavaIntrospectionHelper.toPropertyName(method.getName());
+        }
+        if (type.getReferenceMembers().get(name) != null) {
+            throw new DuplicateReferenceException(name);
+        }
+
+        JavaElement element = new JavaElement(method, 0);
+        org.apache.tuscany.assembly.Reference reference = createReference(element, name);
+        type.getReferences().add(reference);
+        type.getReferenceMembers().put(name, element);
+    }
+
+    public void visitField(Field field, JavaImplementationDefinition type) throws ProcessingException {
+        Reference annotation = field.getAnnotation(Reference.class);
+        if (annotation == null) {
+            return;
+        }
+        String name = annotation.name();
+        if ("".equals(name)) {
+            name = field.getName();
+        }
+        if (type.getReferenceMembers().get(name) != null) {
+            throw new DuplicateReferenceException(name);
+        }
+        JavaElement element = new JavaElement(field);
+        org.apache.tuscany.assembly.Reference reference = createReference(element, name);
+        type.getReferences().add(reference);
+        type.getReferenceMembers().put(name, element);
+    }
+
+    public void visitConstructorParameter(Parameter parameter, JavaImplementationDefinition type)
+        throws ProcessingException {
+        Reference refAnnotation = parameter.getAnnotation(Reference.class);
+        if (refAnnotation == null) {
+            return;
+        }
+        String paramName = parameter.getName();
+        String name = getReferenceName(paramName, parameter.getIndex(), refAnnotation.name());
+        if (type.getReferenceMembers().get(name) != null) {
+            throw new DuplicateReferenceException(name);
+        }
+        org.apache.tuscany.assembly.Reference reference = createReference(parameter, name);
+        type.getReferences().add(reference);
+        type.getReferenceMembers().put(name, parameter);
+        parameter.setClassifer(Reference.class);
+        parameter.setName(name);
+    }
+
+    private String getReferenceName(String paramName, int pos, String name) throws InvalidConstructorException {
+        if ("".equals(name)) {
+            name = paramName;
+        }
+        if ("".equals(name)) {
+            return "_ref" + pos;
+        }
+        if (!"".equals(paramName) && !name.equals(paramName)) {
+            throw new InvalidConstructorException("Mismatching names specified for reference parameter " + pos);
+        } else {
+            return name;
+        }
+    }
+
+    private org.apache.tuscany.assembly.Reference createReference(JavaElement element, String name) throws ProcessingException {
+        org.apache.tuscany.assembly.Reference reference = new ReferenceImpl();
+        JavaInterfaceContract interfaceContract = new JavaInterfaceContractImpl();
+        reference.setInterfaceContract(interfaceContract);
+        
+        // reference.setMember((Member)element.getAnchor());
+        boolean required = false;
+        Reference ref = element.getAnnotation(Reference.class);
+        if (ref != null) {
+            required = ref.required();
+        }
+        // reference.setRequired(required);
+        reference.setName(name);
+        Class<?> rawType = element.getType();
+        if (rawType.isArray() || Collection.class.isAssignableFrom(rawType)) {
+            if (required) {
+                reference.setMultiplicity(Multiplicity.ONE_N);
+            } else {
+                reference.setMultiplicity(Multiplicity.ZERO_N);
+            }
+        } else {
+            if (required) {
+                reference.setMultiplicity(Multiplicity.ONE_ONE);
+            } else {
+                reference.setMultiplicity(Multiplicity.ZERO_ONE);
+            }
+        }
+        Type genericType = element.getGenericType();
+        Class<?> baseType = getBaseType(rawType, genericType);
+        try {
+            JavaInterface callInterface = interfaceIntrospector.introspect(baseType);
+            reference.getInterfaceContract().setInterface(callInterface);
+            if (callInterface.getCallbackClass() != null) {
+                JavaInterface callbackInterface = interfaceIntrospector.introspect(callInterface.getCallbackClass());
+                reference.getInterfaceContract().setCallbackInterface(callbackInterface);
+            }
+        } catch (InvalidInterfaceException e) {
+            throw new ProcessingException(e);
+        }
+        return reference;
+    }
+}

Propchange: incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/ReferenceProcessor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/ReferenceProcessor.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/ResourceProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/ResourceProcessor.java?view=auto&rev=527378
==============================================================================
--- incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/ResourceProcessor.java (added)
+++ incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/ResourceProcessor.java Tue Apr 10 19:55:00 2007
@@ -0,0 +1,133 @@
+/*
+ * 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.tuscany.implementation.java.introspect.impl;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Member;
+import java.lang.reflect.Method;
+
+import org.apache.tuscany.implementation.java.impl.JavaElement;
+import org.apache.tuscany.implementation.java.impl.JavaImplementationDefinition;
+import org.apache.tuscany.implementation.java.impl.Parameter;
+import org.apache.tuscany.implementation.java.impl.Resource;
+import org.apache.tuscany.implementation.java.introspect.BaseJavaClassIntrospectorExtension;
+import org.apache.tuscany.implementation.java.introspect.ProcessingException;
+
+/**
+ * Processes an {@link @Resource} annotation, updating the component type with
+ * corresponding {@link org.apache.tuscany.spi.implementation.java.Resource}
+ * 
+ * @version $Rev$ $Date$
+ */
+public class ResourceProcessor extends BaseJavaClassIntrospectorExtension {
+
+    public ResourceProcessor() {
+    }
+
+    public void visitMethod(Method method, JavaImplementationDefinition type) throws ProcessingException {
+        org.apache.tuscany.api.annotation.Resource annotation = method
+            .getAnnotation(org.apache.tuscany.api.annotation.Resource.class);
+        if (annotation == null) {
+            return;
+        }
+        if (method.getParameterTypes().length != 1) {
+            throw new IllegalResourceException("Resource setter must have one parameter", method);
+        }
+        String name = annotation.name();
+        if (name.length() < 1) {
+            name = JavaIntrospectionHelper.toPropertyName(method.getName());
+        }
+        if (type.getResources().get(name) != null) {
+            throw new DuplicateResourceException(name);
+        }
+
+        String mappedName = annotation.mappedName();
+        Resource<?> resource = createResource(name, new JavaElement(method, 0));
+        resource.setOptional(annotation.optional());
+        if (mappedName.length() > 0) {
+            resource.setMappedName(mappedName);
+        }
+        type.add(resource);
+    }
+
+    public void visitField(Field field, JavaImplementationDefinition type) throws ProcessingException {
+
+        org.apache.tuscany.api.annotation.Resource annotation = field
+            .getAnnotation(org.apache.tuscany.api.annotation.Resource.class);
+        if (annotation == null) {
+            return;
+        }
+        String name = annotation.name();
+        if (name.length() < 1) {
+            name = field.getName();
+        }
+        if (type.getResources().get(name) != null) {
+            throw new DuplicateResourceException(name);
+        }
+
+        String mappedName = annotation.mappedName();
+
+        Resource<?> resource = createResource(name, new JavaElement(field));
+        resource.setOptional(annotation.optional());
+        if (mappedName.length() > 0) {
+            resource.setMappedName(mappedName);
+        }
+        type.add(resource);
+    }
+
+    @SuppressWarnings("unchecked")
+    public <T> Resource<T> createResource(String name, JavaElement element) {
+        element.setClassifer(org.apache.tuscany.api.annotation.Resource.class);
+        element.setName(name);
+        return new Resource<T>(element);
+    }
+
+    public void visitConstructorParameter(Parameter parameter, JavaImplementationDefinition type)
+        throws ProcessingException {
+        org.apache.tuscany.api.annotation.Resource resourceAnnotation = parameter
+            .getAnnotation(org.apache.tuscany.api.annotation.Resource.class);
+        if (resourceAnnotation != null) {
+            String name = resourceAnnotation.name();
+            if ("".equals(name)) {
+                name = parameter.getName();
+            }
+            if ("".equals(name)) {
+                throw new InvalidResourceException("Missing resource name", (Member)parameter.getAnchor());
+            }
+
+            if (!"".equals(parameter.getName()) && !name.equals(parameter.getName())) {
+                throw new InvalidConstructorException("Mismatched resource name: " + parameter);
+            }
+
+            if (type.getResources().get(name) != null) {
+                throw new DuplicateResourceException(name);
+            }
+
+            String mappedName = resourceAnnotation.mappedName();
+
+            Resource<?> resource = createResource(name, parameter);
+            resource.setOptional(resourceAnnotation.optional());
+            if (mappedName.length() > 0) {
+                resource.setMappedName(mappedName);
+            }
+            type.add(resource);
+        }
+    }
+
+}

Propchange: incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/ResourceProcessor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/ResourceProcessor.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/ScopeProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/ScopeProcessor.java?view=auto&rev=527378
==============================================================================
--- incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/ScopeProcessor.java (added)
+++ incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/ScopeProcessor.java Tue Apr 10 19:55:00 2007
@@ -0,0 +1,58 @@
+/*
+ * 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.tuscany.implementation.java.introspect.impl;
+
+import org.apache.tuscany.implementation.java.impl.JavaImplementationDefinition;
+import org.apache.tuscany.implementation.java.impl.Scope;
+import org.apache.tuscany.implementation.java.introspect.BaseJavaClassIntrospectorExtension;
+import org.apache.tuscany.implementation.java.introspect.ProcessingException;
+
+/**
+ * Processes the {@link Scope} annotation and updates the component type with the corresponding implmentation scope
+ *
+ * @version $Rev$ $Date$
+ */
+public class ScopeProcessor extends BaseJavaClassIntrospectorExtension {
+
+    public <T> void visitClass(Class<T> clazz,
+                               JavaImplementationDefinition type)
+        throws ProcessingException {
+        org.osoa.sca.annotations.Scope annotation = clazz.getAnnotation(org.osoa.sca.annotations.Scope.class);
+        if (annotation == null) {
+            type.setScope(Scope.STATELESS);
+            return;
+        }
+        String name = annotation.value();
+        Scope scope;
+        if ("COMPOSITE".equals(name)) {
+            scope = Scope.COMPOSITE;
+        } else if ("SESSION".equals(name)) {
+            scope = Scope.SESSION;
+        } else if ("CONVERSATION".equals(name)) {
+            scope = Scope.CONVERSATION;
+        } else if ("REQUEST".equals(name)) {
+            scope = Scope.REQUEST;
+        } else if ("SYSTEM".equals(name)) {
+            scope = Scope.SYSTEM;
+        } else {
+            scope = new Scope(name);
+        }
+        type.setScope(scope);
+    }
+}

Propchange: incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/ScopeProcessor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/ScopeProcessor.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/ServiceProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/ServiceProcessor.java?view=auto&rev=527378
==============================================================================
--- incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/ServiceProcessor.java (added)
+++ incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/ServiceProcessor.java Tue Apr 10 19:55:00 2007
@@ -0,0 +1,153 @@
+/*
+ * 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.tuscany.implementation.java.introspect.impl;
+
+import static org.apache.tuscany.implementation.java.introspect.impl.JavaIntrospectionHelper.getAllInterfaces;
+import static org.apache.tuscany.implementation.java.introspect.impl.JavaIntrospectionHelper.toPropertyName;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.Set;
+
+import org.apache.tuscany.assembly.Service;
+import org.apache.tuscany.implementation.java.impl.JavaElement;
+import org.apache.tuscany.implementation.java.impl.JavaImplementationDefinition;
+import org.apache.tuscany.implementation.java.introspect.BaseJavaClassIntrospectorExtension;
+import org.apache.tuscany.implementation.java.introspect.ProcessingException;
+import org.apache.tuscany.interfacedef.InvalidInterfaceException;
+import org.apache.tuscany.interfacedef.java.JavaInterface;
+import org.apache.tuscany.interfacedef.java.JavaInterfaceContract;
+import org.apache.tuscany.interfacedef.java.impl.JavaInterfaceContractImpl;
+import org.osoa.sca.annotations.Callback;
+import org.osoa.sca.annotations.Remotable;
+
+/**
+ * Processes an {@link org.osoa.sca.annotations.Service} annotation and updates
+ * the component type with corresponding {@link Service}s. Also processes
+ * related {@link org.osoa.sca.annotations.Callback} annotations.
+ * 
+ * @version $Rev$ $Date$
+ */
+public class ServiceProcessor extends BaseJavaClassIntrospectorExtension {
+
+    public <T> void visitClass(Class<T> clazz, JavaImplementationDefinition type) throws ProcessingException {
+        org.osoa.sca.annotations.Service annotation = clazz.getAnnotation(org.osoa.sca.annotations.Service.class);
+        if (annotation == null) {
+            // scan intefaces for remotable
+            Set<Class> interfaces = getAllInterfaces(clazz);
+            for (Class<?> interfaze : interfaces) {
+                if (interfaze.isAnnotationPresent(Remotable.class) || interfaze.isAnnotationPresent(Callback.class)) {
+                    Service service;
+                    try {
+                        service = createService(interfaze);
+                    } catch (InvalidInterfaceException e) {
+                        throw new ProcessingException(e);
+                    }
+                    type.getServices().add(service);
+                }
+            }
+            return;
+        }
+        Class<?>[] interfaces = annotation.interfaces();
+        if (interfaces.length == 0) {
+            Class<?> interfaze = annotation.value();
+            if (Void.class.equals(interfaze)) {
+                throw new IllegalServiceDefinitionException("No interfaces specified");
+            } else {
+                interfaces = new Class<?>[1];
+                interfaces[0] = interfaze;
+            }
+        }
+        for (Class<?> interfaze : interfaces) {
+            if (!interfaze.isInterface()) {
+                throw new InvalidServiceType("Service must be an interface", interfaze);
+            }
+            Service service;
+            try {
+                service = createService(interfaze);
+            } catch (InvalidInterfaceException e) {
+                throw new ProcessingException(e);
+            }
+            type.getServices().add(service);
+        }
+    }
+
+    public void visitMethod(Method method, JavaImplementationDefinition type) throws ProcessingException {
+
+        Callback annotation = method.getAnnotation(Callback.class);
+        if (annotation == null) {
+            return;
+        }
+        if (method.getParameterTypes().length != 1) {
+            throw new IllegalCallbackReferenceException("Setter must have one parameter", method);
+        }
+        String name = toPropertyName(method.getName());
+        Service callbackService = null;
+        Class<?> callbackClass = method.getParameterTypes()[0];
+        for (Service service : type.getServices()) {
+            JavaInterface javaInterface = (JavaInterface)service.getInterfaceContract().getCallbackInterface();
+            if (callbackClass == javaInterface.getJavaClass()) {
+                callbackService = service;
+            }
+        }
+        if (callbackService == null) {
+            throw new IllegalCallbackReferenceException("Callback type does not match a service callback interface");
+        }
+        type.getCallbackMembers().put(name, new JavaElement(method, 0));
+    }
+
+    public void visitField(Field field, JavaImplementationDefinition type) throws ProcessingException {
+
+        Callback annotation = field.getAnnotation(Callback.class);
+        if (annotation == null) {
+            return;
+        }
+        String name = field.getName();
+        Service callbackService = null;
+        Class<?> callbackClass = field.getType();
+        for (Service service : type.getServices()) {
+            JavaInterface javaInterface = (JavaInterface)service.getInterfaceContract().getCallbackInterface();
+            if (callbackClass == javaInterface.getJavaClass()) {
+                callbackService = service;
+            }
+        }
+        if (callbackService == null) {
+            throw new IllegalCallbackReferenceException("Callback type does not match a service callback interface");
+        }
+        type.getCallbackMembers().put(name, new JavaElement(field));
+    }
+
+    public Service createService(Class<?> interfaze) throws InvalidInterfaceException {
+        Service service = factory.createService();
+        JavaInterfaceContract interfaceContract = new JavaInterfaceContractImpl();
+        service.setInterfaceContract(interfaceContract);
+
+        // create a relative URI
+        service.setName(interfaze.getSimpleName());
+
+        JavaInterface callInterface = interfaceIntrospector.introspect(interfaze);
+        service.getInterfaceContract().setInterface(callInterface);
+        if (callInterface.getCallbackClass() != null) {
+            JavaInterface callbackInterface = interfaceIntrospector.introspect(callInterface.getCallbackClass());
+            service.getInterfaceContract().setCallbackInterface(callbackInterface);
+        }
+        return service;
+    }
+
+}

Propchange: incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/ServiceProcessor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/ServiceProcessor.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/ServiceTypeNotFoundException.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/ServiceTypeNotFoundException.java?view=auto&rev=527378
==============================================================================
--- incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/ServiceTypeNotFoundException.java (added)
+++ incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/ServiceTypeNotFoundException.java Tue Apr 10 19:55:00 2007
@@ -0,0 +1,35 @@
+/*
+ * 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.tuscany.implementation.java.introspect.impl;
+
+import org.apache.tuscany.implementation.java.introspect.ProcessingException;
+
+/**
+ * Thrown when a service interface cannot be determined based on a heuristic evaluation of an implementation
+ *
+ * @version $Rev$ $Date$
+ */
+public class ServiceTypeNotFoundException extends ProcessingException {
+    private static final long serialVersionUID = -5124437274726947007L;
+
+    public ServiceTypeNotFoundException(String message) {
+        super(message);
+    }
+
+}

Propchange: incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/ServiceTypeNotFoundException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/ServiceTypeNotFoundException.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/UnknownContextTypeException.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/UnknownContextTypeException.java?view=auto&rev=527378
==============================================================================
--- incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/UnknownContextTypeException.java (added)
+++ incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/UnknownContextTypeException.java Tue Apr 10 19:55:00 2007
@@ -0,0 +1,33 @@
+/*
+ * 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.tuscany.implementation.java.introspect.impl;
+
+/**
+ * Thrown when a method or field marked with {@link org.osoa.sca.annotations.Context} takes an unknown type
+ *
+ * @version $Rev$ $Date$
+ */
+public class UnknownContextTypeException extends IllegalContextException {
+    private static final long serialVersionUID = 8125863714365422419L;
+
+    public UnknownContextTypeException(String message) {
+        super(message);
+    }
+
+}

Propchange: incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/UnknownContextTypeException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/introspect/impl/UnknownContextTypeException.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/xml/JavaImplementationProcessor.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/xml/JavaImplementationProcessor.java?view=diff&rev=527378&r1=527377&r2=527378
==============================================================================
--- incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/xml/JavaImplementationProcessor.java (original)
+++ incubator/tuscany/java/sca/modules/implementation-java-xml/src/main/java/org/apache/tuscany/implementation/java/xml/JavaImplementationProcessor.java Tue Apr 10 19:55:00 2007
@@ -33,8 +33,8 @@
 import org.apache.tuscany.implementation.java.JavaImplementationFactory;
 import org.apache.tuscany.implementation.java.impl.DefaultJavaImplementationFactory;
 import org.apache.tuscany.implementation.java.impl.JavaImplementationDefinition;
-import org.apache.tuscany.implementation.java.introspection.IntrospectionRegistry;
-import org.apache.tuscany.implementation.java.introspection.impl.IntrospectionRegistryImpl;
+import org.apache.tuscany.implementation.java.introspect.DefaultJavaClassIntrospector;
+import org.apache.tuscany.implementation.java.introspect.JavaClassIntrospectorExtensionPoint;
 import org.apache.tuscany.services.spi.contribution.ArtifactResolver;
 import org.apache.tuscany.services.spi.contribution.ContributionReadException;
 import org.apache.tuscany.services.spi.contribution.ContributionResolveException;
@@ -46,11 +46,11 @@
     JavaImplementationConstants {
 
     private JavaImplementationFactory javaFactory;
-    private IntrospectionRegistry introspectionRegistry;
+    private JavaClassIntrospectorExtensionPoint introspectionRegistry;
 
     public JavaImplementationProcessor(JavaImplementationFactory javaFactory) {
         this.javaFactory = javaFactory;
-        this.introspectionRegistry = new IntrospectionRegistryImpl();
+        this.introspectionRegistry = new DefaultJavaClassIntrospector();
     }
 
     public JavaImplementationProcessor() {
@@ -127,7 +127,7 @@
     /**
      * @param introspectionRegistry the introspectionRegistry to set
      */
-    public void setIntrospectionRegistry(IntrospectionRegistry introspectionRegistry) {
+    public void setIntrospectionRegistry(JavaClassIntrospectorExtensionPoint introspectionRegistry) {
         this.introspectionRegistry = introspectionRegistry;
     }
 

Added: incubator/tuscany/java/sca/modules/implementation-java-xml/src/test/java/org/apache/tuscany/implementation/java/introspect/DefaultJavaClassIntrospectorTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-java-xml/src/test/java/org/apache/tuscany/implementation/java/introspect/DefaultJavaClassIntrospectorTestCase.java?view=auto&rev=527378
==============================================================================
--- incubator/tuscany/java/sca/modules/implementation-java-xml/src/test/java/org/apache/tuscany/implementation/java/introspect/DefaultJavaClassIntrospectorTestCase.java (added)
+++ incubator/tuscany/java/sca/modules/implementation-java-xml/src/test/java/org/apache/tuscany/implementation/java/introspect/DefaultJavaClassIntrospectorTestCase.java Tue Apr 10 19:55:00 2007
@@ -0,0 +1,93 @@
+/*
+ * 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.tuscany.implementation.java.introspect;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.implementation.java.impl.JavaImplementationDefinition;
+import org.apache.tuscany.implementation.java.introspect.DefaultJavaClassIntrospector;
+import org.apache.tuscany.implementation.java.introspect.JavaClassIntrospectorExtension;
+import org.easymock.EasyMock;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class DefaultJavaClassIntrospectorTestCase extends TestCase {
+
+    public void testRegister() throws Exception {
+        DefaultJavaClassIntrospector registry = new DefaultJavaClassIntrospector();
+        JavaClassIntrospectorExtension processor = EasyMock.createNiceMock(JavaClassIntrospectorExtension.class);
+        registry.addExtension(processor);
+    }
+
+    public void testUnegister() throws Exception {
+        DefaultJavaClassIntrospector registry = new DefaultJavaClassIntrospector();
+        JavaClassIntrospectorExtension processor = EasyMock.createNiceMock(JavaClassIntrospectorExtension.class);
+        registry.addExtension(processor);
+        registry.removeExtension(processor);
+    }
+
+    @SuppressWarnings("unchecked")
+    public void testWalk() throws Exception {
+        DefaultJavaClassIntrospector registry = new DefaultJavaClassIntrospector();
+        JavaClassIntrospectorExtension processor = EasyMock.createMock(JavaClassIntrospectorExtension.class);
+        processor.visitClass(EasyMock.eq(Bar.class), EasyMock.isA(JavaImplementationDefinition.class));
+        processor.visitConstructor(EasyMock.isA(Constructor.class), EasyMock.isA(JavaImplementationDefinition.class));
+        processor.visitMethod(EasyMock.isA(Method.class), EasyMock.isA(JavaImplementationDefinition.class));
+        processor.visitField(EasyMock.isA(Field.class), EasyMock.isA(JavaImplementationDefinition.class));
+        processor.visitSuperClass(EasyMock.isA(Class.class), EasyMock.isA(JavaImplementationDefinition.class));
+        processor.visitEnd(EasyMock.isA(Class.class), EasyMock.isA(JavaImplementationDefinition.class));
+
+        // mock.expects(once()).method("visitClass");
+        // mock.expects(once()).method("visitMethod");
+        // mock.expects(once()).method("visitField");
+        // mock.expects(once()).method("visitConstructor");
+        // mock.expects(once()).method("visitSuperClass");
+        // mock.expects(once()).method("visitEnd");
+        EasyMock.replay(processor);
+        registry.addExtension(processor);
+        registry.introspect(Bar.class, new JavaImplementationDefinition());
+        EasyMock.verify(processor);
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    private class Baz {
+
+    }
+
+    private class Bar extends Baz {
+
+        protected String bar;
+
+        public Bar() {
+        }
+
+        public void bar() {
+        }
+
+    }
+
+}

Propchange: incubator/tuscany/java/sca/modules/implementation-java-xml/src/test/java/org/apache/tuscany/implementation/java/introspect/DefaultJavaClassIntrospectorTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/implementation-java-xml/src/test/java/org/apache/tuscany/implementation/java/introspect/DefaultJavaClassIntrospectorTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/implementation-java-xml/src/test/java/org/apache/tuscany/implementation/java/introspect/impl/AbstractProcessorTest.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-java-xml/src/test/java/org/apache/tuscany/implementation/java/introspect/impl/AbstractProcessorTest.java?view=auto&rev=527378
==============================================================================
--- incubator/tuscany/java/sca/modules/implementation-java-xml/src/test/java/org/apache/tuscany/implementation/java/introspect/impl/AbstractProcessorTest.java (added)
+++ incubator/tuscany/java/sca/modules/implementation-java-xml/src/test/java/org/apache/tuscany/implementation/java/introspect/impl/AbstractProcessorTest.java Tue Apr 10 19:55:00 2007
@@ -0,0 +1,75 @@
+/*
+ * 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.tuscany.implementation.java.introspect.impl;
+
+import java.lang.reflect.Constructor;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.assembly.AssemblyFactory;
+import org.apache.tuscany.assembly.impl.DefaultAssemblyFactory;
+import org.apache.tuscany.implementation.java.impl.ConstructorDefinition;
+import org.apache.tuscany.implementation.java.impl.JavaImplementationDefinition;
+import org.apache.tuscany.implementation.java.impl.Parameter;
+import org.apache.tuscany.implementation.java.introspect.ProcessingException;
+import org.apache.tuscany.implementation.java.introspect.impl.ConstructorProcessor;
+import org.apache.tuscany.implementation.java.introspect.impl.PropertyProcessor;
+import org.apache.tuscany.implementation.java.introspect.impl.ReferenceProcessor;
+import org.apache.tuscany.implementation.java.introspect.impl.ResourceProcessor;
+import org.apache.tuscany.interfacedef.java.introspect.DefaultJavaInterfaceIntrospector;
+
+
+/**
+ * Base class to simulate the processor sequences
+ * 
+ * @version $Rev$ $Date$
+ */
+public class AbstractProcessorTest extends TestCase {
+    protected AssemblyFactory factory = new DefaultAssemblyFactory();
+    protected ConstructorProcessor constructorProcessor;
+    private ReferenceProcessor referenceProcessor = new ReferenceProcessor();
+    private PropertyProcessor propertyProcessor = new PropertyProcessor();
+    private ResourceProcessor resourceProcessor = new ResourceProcessor();
+    // private MonitorProcessor monitorProcessor = new MonitorProcessor(new NullMonitorFactory());
+
+
+    protected AbstractProcessorTest() {
+        constructorProcessor = new ConstructorProcessor();
+        referenceProcessor = new ReferenceProcessor();
+        referenceProcessor.setInterfaceVisitorExtensionPoint(new DefaultJavaInterfaceIntrospector());
+        propertyProcessor = new PropertyProcessor();
+    }
+
+    protected <T> void visitConstructor(Constructor<T> constructor,
+                                        JavaImplementationDefinition type) throws ProcessingException {
+        constructorProcessor.visitConstructor(constructor, type);
+        ConstructorDefinition<?> definition = type.getConstructorDefinition();
+        if (definition == null) {
+            definition = new ConstructorDefinition<T>(constructor);
+            type.getConstructors().put(constructor, definition);
+        }
+        Parameter[] parameters = definition.getParameters();
+        for (int i = 0; i < parameters.length; i++) {
+            referenceProcessor.visitConstructorParameter(parameters[i], type);
+            propertyProcessor.visitConstructorParameter(parameters[i], type);
+            resourceProcessor.visitConstructorParameter(parameters[i], type);
+            // monitorProcessor.visitConstructorParameter(parameters[i], type);
+        }
+    }
+}

Propchange: incubator/tuscany/java/sca/modules/implementation-java-xml/src/test/java/org/apache/tuscany/implementation/java/introspect/impl/AbstractProcessorTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/implementation-java-xml/src/test/java/org/apache/tuscany/implementation/java/introspect/impl/AbstractProcessorTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/implementation-java-xml/src/test/java/org/apache/tuscany/implementation/java/introspect/impl/AbstractPropertyProcessorTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-java-xml/src/test/java/org/apache/tuscany/implementation/java/introspect/impl/AbstractPropertyProcessorTestCase.java?view=auto&rev=527378
==============================================================================
--- incubator/tuscany/java/sca/modules/implementation-java-xml/src/test/java/org/apache/tuscany/implementation/java/introspect/impl/AbstractPropertyProcessorTestCase.java (added)
+++ incubator/tuscany/java/sca/modules/implementation-java-xml/src/test/java/org/apache/tuscany/implementation/java/introspect/impl/AbstractPropertyProcessorTestCase.java Tue Apr 10 19:55:00 2007
@@ -0,0 +1,164 @@
+/*
+ * 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.tuscany.implementation.java.introspect.impl;
+
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static org.apache.tuscany.implementation.java.introspect.impl.ModelHelper.getProperty;
+
+import java.lang.annotation.Retention;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.assembly.Property;
+import org.apache.tuscany.implementation.java.impl.ConstructorDefinition;
+import org.apache.tuscany.implementation.java.impl.JavaImplementationDefinition;
+import org.apache.tuscany.implementation.java.impl.Parameter;
+import org.apache.tuscany.implementation.java.introspect.DuplicatePropertyException;
+import org.apache.tuscany.implementation.java.introspect.IllegalPropertyException;
+import org.apache.tuscany.implementation.java.introspect.JavaClassIntrospectorExtension;
+import org.apache.tuscany.implementation.java.introspect.impl.AbstractPropertyProcessor;
+
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class AbstractPropertyProcessorTestCase extends TestCase {
+
+    private JavaClassIntrospectorExtension processor;
+
+    public void testVisitMethod() throws Exception {
+        Method method = Foo.class.getMethod("setBar", String.class);
+        JavaImplementationDefinition type = new JavaImplementationDefinition();
+        processor.visitMethod(method, type);
+        Property prop = getProperty(type, "test");
+        assertNotNull(prop);
+    }
+
+    public void testVisitNoParamsMethod() throws Exception {
+        Method method = Foo.class.getMethod("setNoParamsBar");
+        JavaImplementationDefinition type = new JavaImplementationDefinition();
+        try {
+            processor.visitMethod(method, type);
+            fail();
+        } catch (IllegalPropertyException e) {
+            // expected
+        }
+    }
+
+    public void testVisitNonVoidMethod() throws Exception {
+        Method method = Foo.class.getMethod("setBadBar", String.class);
+        JavaImplementationDefinition type = new JavaImplementationDefinition();
+        try {
+            processor.visitMethod(method, type);
+            fail();
+        } catch (IllegalPropertyException e) {
+            // expected
+        }
+    }
+
+    public void testDuplicateMethod() throws Exception {
+        Method method = Foo.class.getMethod("setBar", String.class);
+        JavaImplementationDefinition type = new JavaImplementationDefinition();
+        processor.visitMethod(method, type);
+        try {
+            processor.visitMethod(method, type);
+            fail();
+        } catch (DuplicatePropertyException e) {
+            // expected
+        }
+    }
+
+    public void testVisitField() throws Exception {
+        Field field = Foo.class.getDeclaredField("d");
+        JavaImplementationDefinition type = new JavaImplementationDefinition();
+        processor.visitField(field, type);
+        Property prop = getProperty(type, "test");
+        assertNotNull(prop);
+    }
+
+    public void testVisitConstructor() throws Exception {
+        Constructor<Foo> ctor = Foo.class.getConstructor(String.class);
+        JavaImplementationDefinition type = new JavaImplementationDefinition();
+        ConstructorDefinition<Foo> def = new ConstructorDefinition<Foo>(ctor);
+        Parameter parameter = def.getParameters()[0];
+        processor.visitConstructorParameter(parameter, type);
+        assertEquals("test", def.getParameters()[0].getName());
+        assertNotNull(getProperty(type, "test"));
+    }
+
+    @SuppressWarnings("unchecked")
+    protected void setUp() throws Exception {
+        super.setUp();
+        processor = new TestProcessor();
+    }
+
+    @Retention(RUNTIME)
+    private @interface Bar {
+
+    }
+
+    private class TestProcessor extends AbstractPropertyProcessor<Bar> {
+
+        public TestProcessor() {
+            super(Bar.class);
+        }
+
+        @SuppressWarnings("unchecked")
+        protected void initProperty(Property property, Bar annotation) {
+            // property.setDefaultValueFactory(EasyMock.createMock(ObjectFactory.class));
+            property.setName("test");
+        }
+
+        protected String getName(Bar annotation) {
+            return "test";
+        }
+    }
+
+    private static class Foo {
+
+        @Bar
+        protected String d;
+
+        public Foo(String a, @Bar
+        String b) {
+        }
+
+        public Foo(@Bar
+        String d) {
+            this.d = d;
+        }
+
+        @Bar
+        public void setBar(String d) {
+            this.d = d;
+        }
+
+        @Bar
+        public void setNoParamsBar() {
+        }
+
+        @Bar
+        public String setBadBar(String d) {
+            return null;
+        }
+    }
+}

Propchange: incubator/tuscany/java/sca/modules/implementation-java-xml/src/test/java/org/apache/tuscany/implementation/java/introspect/impl/AbstractPropertyProcessorTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/implementation-java-xml/src/test/java/org/apache/tuscany/implementation/java/introspect/impl/AbstractPropertyProcessorTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/tuscany/java/sca/modules/implementation-java-xml/src/test/java/org/apache/tuscany/implementation/java/introspect/impl/AllowsPassByReferenceProcessorTestCase.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-java-xml/src/test/java/org/apache/tuscany/implementation/java/introspect/impl/AllowsPassByReferenceProcessorTestCase.java?view=auto&rev=527378
==============================================================================
--- incubator/tuscany/java/sca/modules/implementation-java-xml/src/test/java/org/apache/tuscany/implementation/java/introspect/impl/AllowsPassByReferenceProcessorTestCase.java (added)
+++ incubator/tuscany/java/sca/modules/implementation-java-xml/src/test/java/org/apache/tuscany/implementation/java/introspect/impl/AllowsPassByReferenceProcessorTestCase.java Tue Apr 10 19:55:00 2007
@@ -0,0 +1,66 @@
+/*
+ * 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.tuscany.implementation.java.introspect.impl;
+
+import java.lang.reflect.Method;
+
+import junit.framework.TestCase;
+
+import org.apache.tuscany.implementation.java.impl.JavaImplementationDefinition;
+import org.apache.tuscany.implementation.java.introspect.impl.AllowsPassByReferenceProcessor;
+import org.osoa.sca.annotations.AllowsPassByReference;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class AllowsPassByReferenceProcessorTestCase extends TestCase {
+
+    JavaImplementationDefinition type;
+    AllowsPassByReferenceProcessor processor;
+
+    public void testClassAnnotation() throws Exception {
+        processor.visitClass(Foo.class, type);
+        assertEquals(true, type.isAllowsPassByReference());
+
+        processor.visitClass(Bar.class, type);
+        assertEquals(false, type.isAllowsPassByReference());
+
+        Method m1 = Bar.class.getMethod("m1", new Class[] {});
+        processor.visitMethod(m1, type);
+        assertTrue(type.isAllowsPassByReference(m1));
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        type = new JavaImplementationDefinition();
+        processor = new AllowsPassByReferenceProcessor();
+    }
+
+    @AllowsPassByReference
+    private class Foo {
+    }
+
+    // no annotation
+    private class Bar {
+        @AllowsPassByReference
+        public void m1() {
+
+        }
+    }
+}

Propchange: incubator/tuscany/java/sca/modules/implementation-java-xml/src/test/java/org/apache/tuscany/implementation/java/introspect/impl/AllowsPassByReferenceProcessorTestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/tuscany/java/sca/modules/implementation-java-xml/src/test/java/org/apache/tuscany/implementation/java/introspect/impl/AllowsPassByReferenceProcessorTestCase.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org