aries-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From z..@apache.org
Subject svn commit: r1075094 [13/17] - in /aries/tags/blueprint-0.1-incubating: ./ blueprint-api/ blueprint-api/src/ blueprint-api/src/main/ blueprint-api/src/main/appended-resources/ blueprint-api/src/main/appended-resources/META-INF/ blueprint-api/src/main/j...
Date Sun, 27 Feb 2011 17:47:18 GMT
Added: aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/MetadataUtil.java
URL: http://svn.apache.org/viewvc/aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/MetadataUtil.java?rev=1075094&view=auto
==============================================================================
--- aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/MetadataUtil.java (added)
+++ aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/MetadataUtil.java Sun Feb 27 17:47:08 2011
@@ -0,0 +1,210 @@
+/**
+ *  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.aries.blueprint.reflect;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.apache.aries.blueprint.PassThroughMetadata;
+import org.osgi.service.blueprint.reflect.BeanArgument;
+import org.osgi.service.blueprint.reflect.BeanMetadata;
+import org.osgi.service.blueprint.reflect.CollectionMetadata;
+import org.osgi.service.blueprint.reflect.ComponentMetadata;
+import org.osgi.service.blueprint.reflect.IdRefMetadata;
+import org.osgi.service.blueprint.reflect.MapMetadata;
+import org.osgi.service.blueprint.reflect.Metadata;
+import org.osgi.service.blueprint.reflect.NullMetadata;
+import org.osgi.service.blueprint.reflect.PropsMetadata;
+import org.osgi.service.blueprint.reflect.ReferenceListMetadata;
+import org.osgi.service.blueprint.reflect.RefMetadata;
+import org.osgi.service.blueprint.reflect.ReferenceMetadata;
+import org.osgi.service.blueprint.reflect.ServiceMetadata;
+import org.osgi.service.blueprint.reflect.Target;
+import org.osgi.service.blueprint.reflect.ValueMetadata;
+
+
+/**
+ * A utility class that handles cloning various polymorphic
+ * bits of metadata into concrete class implementations.
+ *
+ * @version $Rev: 822644 $, $Date: 2009-10-07 11:23:35 +0100 (Wed, 07 Oct 2009) $
+ */
+public class MetadataUtil {
+
+    public static final Comparator<BeanArgument> BEAN_COMPARATOR = new BeanArgumentComparator();
+    
+    static public Metadata cloneMetadata(Metadata source) {
+        if (source == null) {
+            return null;
+        } 
+        else if (source instanceof MapMetadata) {
+            return new MapMetadataImpl((MapMetadata)source);
+        }
+        else if (source instanceof NullMetadata) {
+            return NullMetadata.NULL;
+        }
+        else if (source instanceof PropsMetadata) {
+            return new PropsMetadataImpl((PropsMetadata)source);
+        }
+        else if (source instanceof RefMetadata) {
+            return new RefMetadataImpl((RefMetadata)source);
+        }
+        else if (source instanceof IdRefMetadata) {
+            return new IdRefMetadataImpl((IdRefMetadata)source);
+        }
+        else if (source instanceof ValueMetadata) {
+            return new ValueMetadataImpl((ValueMetadata)source);
+        }
+        else if (source instanceof BeanMetadata) {
+            return new BeanMetadataImpl((BeanMetadata)source);
+        }
+        else if (source instanceof ReferenceListMetadata) {
+            return new ReferenceListMetadataImpl((ReferenceListMetadata)source);
+        }
+        else if (source instanceof ServiceMetadata) {
+            return new ServiceMetadataImpl((ServiceMetadata)source);
+        }
+        else if (source instanceof ReferenceMetadata) {
+            return new ReferenceMetadataImpl((ReferenceMetadata)source);
+        }
+        else if (source instanceof CollectionMetadata) {
+            return new CollectionMetadataImpl((CollectionMetadata)source);
+        }
+        else if (source instanceof PassThroughMetadata) {
+            return new PassThroughMetadataImpl((PassThroughMetadata)source);
+        }
+
+        throw new RuntimeException("Unknown Metadata type received: " + source.getClass().getName());
+    }
+
+
+    /**
+     * Clone a component metadata item, returning a mutable
+     * instance.
+     *
+     * @param source The source metadata item.
+     *
+     * @return A mutable instance of this metadata item.
+     */
+    static public ComponentMetadata cloneComponentMetadata(ComponentMetadata source) {
+        return (ComponentMetadata) cloneMetadata(source);
+    }
+
+    /**
+     * Clone a target item, returning a mutable
+     * instance.
+     *
+     * @param source The source target item.
+     *
+     * @return A mutable instance of this target item.
+     */
+    static public Target cloneTarget(Target source) {
+        return (Target) cloneMetadata(source);
+    }
+
+    /**
+     * Create a new metadata instance of the given type
+     *
+     * @param type the class of the Metadata object to create
+     * @param <T>
+     * @return a new instance
+     */
+    public static <T extends Metadata> T createMetadata(Class<T> type) {
+        if (MapMetadata.class.isAssignableFrom(type)) {
+            return type.cast(new MapMetadataImpl());
+        } else if (NullMetadata.class.isAssignableFrom(type)) {
+            return type.cast(NullMetadata.NULL);
+        } else if (PropsMetadata.class.isAssignableFrom(type)) {
+            return type.cast(new PropsMetadataImpl());
+        } else if (RefMetadata.class.isAssignableFrom(type)) {
+            return type.cast(new RefMetadataImpl());
+        } else if (IdRefMetadata.class.isAssignableFrom(type)) {
+            return type.cast(new IdRefMetadataImpl());
+        } else if (ValueMetadata.class.isAssignableFrom(type)) {
+            return type.cast(new ValueMetadataImpl());
+        } else if (BeanMetadata.class.isAssignableFrom(type)) {
+            return type.cast(new BeanMetadataImpl());
+        } else if (ReferenceListMetadata.class.isAssignableFrom(type)) {
+            return type.cast(new ReferenceListMetadataImpl());
+        } else if (ServiceMetadata.class.isAssignableFrom(type)) {
+            return type.cast(new ServiceMetadataImpl());
+        } else if (ReferenceMetadata.class.isAssignableFrom(type)) {
+            return type.cast(new ReferenceMetadataImpl());
+        } else if (CollectionMetadata.class.isAssignableFrom(type)) {
+            return type.cast(new CollectionMetadataImpl());
+        } else if (PassThroughMetadata.class.isAssignableFrom(type)) {
+            return type.cast(new PassThroughMetadataImpl());
+        } else {
+            throw new IllegalArgumentException("Unsupport metadata type: " + (type != null ? type.getName() : null));
+        }
+    }
+    
+    public static List<BeanArgument> validateBeanArguments(List<BeanArgument> arguments) {
+        if (arguments == null || arguments.isEmpty()) {
+            return arguments;
+        }
+        // check if all or none arguments have index attribute
+        boolean hasIndexFirst = (arguments.get(0).getIndex() > -1);
+        for (int i = 1; i < arguments.size(); i++) {
+            boolean hasIndex = (arguments.get(i).getIndex() > -1);
+            if ( (hasIndexFirst && !hasIndex) ||
+                 (!hasIndexFirst && hasIndex) ) {
+                throw new IllegalArgumentException("Index attribute must be specified either on all or none constructor arguments");
+            }
+        }
+        if (hasIndexFirst) {
+            // sort the arguments
+            List<BeanArgument> argumentsCopy = new ArrayList<BeanArgument>(arguments);
+            Collections.sort(argumentsCopy, MetadataUtil.BEAN_COMPARATOR);
+            arguments = argumentsCopy;
+            
+            // check if the indexes are sequential
+            for (int i = 0; i < arguments.size(); i++) {
+                int index = arguments.get(i).getIndex();
+                if (index > i) {
+                    throw new IllegalArgumentException("Missing attribute index");                    
+                } else if (index < i) {
+                    throw new IllegalArgumentException("Duplicate attribute index");
+                } // must be the same
+            }            
+        }
+        
+        return arguments;
+    }
+    
+    public static boolean isPrototypeScope(BeanMetadata metadata) {
+        return (BeanMetadata.SCOPE_PROTOTYPE.equals(metadata.getScope()) || 
+                (metadata.getScope() == null && metadata.getId() == null));
+    }
+    
+    public static boolean isSingletonScope(BeanMetadata metadata) {
+        return (BeanMetadata.SCOPE_SINGLETON.equals(metadata.getScope())  ||
+                (metadata.getScope() == null && metadata.getId() != null));
+    }
+    
+    private static class BeanArgumentComparator implements Comparator<BeanArgument>, Serializable {
+        public int compare(BeanArgument object1, BeanArgument object2) {
+            return object1.getIndex() - object2.getIndex();
+        }        
+    }
+       
+}
+

Added: aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/PassThroughMetadataImpl.java
URL: http://svn.apache.org/viewvc/aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/PassThroughMetadataImpl.java?rev=1075094&view=auto
==============================================================================
--- aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/PassThroughMetadataImpl.java (added)
+++ aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/PassThroughMetadataImpl.java Sun Feb 27 17:47:08 2011
@@ -0,0 +1,53 @@
+/*
+ * 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.aries.blueprint.reflect;
+
+import org.apache.aries.blueprint.PassThroughMetadata;
+import org.apache.aries.blueprint.mutable.MutablePassThroughMetadata;
+
+/**
+ * A metadata for environment managers.
+ *
+ * @version $Rev: 896324 $, $Date: 2010-01-06 06:05:04 +0000 (Wed, 06 Jan 2010) $
+ */
+public class PassThroughMetadataImpl extends ComponentMetadataImpl implements MutablePassThroughMetadata {
+
+    private Object object;
+
+    public PassThroughMetadataImpl() {
+    }
+
+    public PassThroughMetadataImpl(PassThroughMetadata source) {
+        super(source);
+        this.object = source.getObject();
+    }
+
+    public PassThroughMetadataImpl(String id, Object object) {
+        this.id = id;
+        this.object = object;
+    }
+
+    public Object getObject() {
+        return object;
+    }
+
+    public void setObject(Object object) {
+        this.object = object;
+    }
+}

Added: aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/PropsMetadataImpl.java
URL: http://svn.apache.org/viewvc/aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/PropsMetadataImpl.java?rev=1075094&view=auto
==============================================================================
--- aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/PropsMetadataImpl.java (added)
+++ aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/PropsMetadataImpl.java Sun Feb 27 17:47:08 2011
@@ -0,0 +1,90 @@
+/*
+ * 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.aries.blueprint.reflect;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.aries.blueprint.mutable.MutablePropsMetadata;
+import org.osgi.service.blueprint.reflect.MapEntry;
+import org.osgi.service.blueprint.reflect.Metadata;
+import org.osgi.service.blueprint.reflect.NonNullMetadata;
+import org.osgi.service.blueprint.reflect.PropsMetadata;
+
+/**
+ * Implementation of PropsMetadata
+ *
+ * @version $Rev: 896324 $, $Date: 2010-01-06 06:05:04 +0000 (Wed, 06 Jan 2010) $
+ */
+public class PropsMetadataImpl implements MutablePropsMetadata {
+
+    private List<MapEntry> entries;
+
+    public PropsMetadataImpl() {
+    }
+
+    public PropsMetadataImpl(List<MapEntry> entries) {
+        this.entries = entries;
+    }
+
+    public PropsMetadataImpl(PropsMetadata source) {
+        for (MapEntry entry : source.getEntries()) {
+            addEntry(new MapEntryImpl(entry));
+        }
+    }
+
+    public List<MapEntry> getEntries() {
+        if (this.entries == null) {
+            return Collections.emptyList();
+        } else {
+            return Collections.unmodifiableList(this.entries);
+        }
+    }
+
+    public void setEntries(List<MapEntry> entries) {
+        this.entries = entries != null ? new ArrayList<MapEntry>(entries) : null;
+    }
+
+    public void addEntry(MapEntry entry) {
+        if (this.entries == null) {
+            this.entries = new ArrayList<MapEntry>();
+        }
+        this.entries.add(entry);
+    }
+
+    public MapEntry addEntry(NonNullMetadata key, Metadata value) {
+        MapEntry entry = new MapEntryImpl(key, value);
+        addEntry(entry);
+        return entry;
+    }
+
+    public void removeEntry(MapEntry entry) {
+        if (this.entries != null) {
+            this.entries.remove(entry);
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "PropsMetadata[" +
+                "entries=" + entries +
+                ']';
+    }
+}

Added: aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/RefMetadataImpl.java
URL: http://svn.apache.org/viewvc/aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/RefMetadataImpl.java?rev=1075094&view=auto
==============================================================================
--- aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/RefMetadataImpl.java (added)
+++ aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/RefMetadataImpl.java Sun Feb 27 17:47:08 2011
@@ -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.aries.blueprint.reflect;
+
+import org.apache.aries.blueprint.mutable.MutableRefMetadata;
+import org.osgi.service.blueprint.reflect.RefMetadata;
+
+/**
+ * Implementation of RefMetadata
+ *
+ * @version $Rev: 896324 $, $Date: 2010-01-06 06:05:04 +0000 (Wed, 06 Jan 2010) $
+ */
+public class RefMetadataImpl implements MutableRefMetadata {
+
+    protected String componentId;
+
+    public RefMetadataImpl() {
+    }
+
+    public RefMetadataImpl(String componentId) {
+        this.componentId = componentId;
+    }
+
+    public RefMetadataImpl(RefMetadata source) {
+        componentId = source.getComponentId();
+    }
+
+    public String getComponentId() {
+        return componentId;
+    }
+
+    public void setComponentId(String componentId) {
+        this.componentId = componentId;
+    }
+
+    @Override
+    public String toString() {
+        return "RefMetadata[" +
+                "componentId='" + componentId + '\'' +
+                ']';
+    }
+}

Added: aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/ReferenceListMetadataImpl.java
URL: http://svn.apache.org/viewvc/aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/ReferenceListMetadataImpl.java?rev=1075094&view=auto
==============================================================================
--- aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/ReferenceListMetadataImpl.java (added)
+++ aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/ReferenceListMetadataImpl.java Sun Feb 27 17:47:08 2011
@@ -0,0 +1,63 @@
+/*
+ * 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.aries.blueprint.reflect;
+
+import org.apache.aries.blueprint.mutable.MutableReferenceListMetadata;
+import org.osgi.service.blueprint.reflect.ReferenceListMetadata;
+
+/**
+ * Implementation of RefCollectionMetadata 
+ *
+ * @version $Rev: 896324 $, $Date: 2010-01-06 06:05:04 +0000 (Wed, 06 Jan 2010) $
+ */
+public class ReferenceListMetadataImpl extends ServiceReferenceMetadataImpl implements MutableReferenceListMetadata {
+
+    private int memberType = USE_SERVICE_OBJECT;
+
+    public ReferenceListMetadataImpl() {
+    }
+    
+    public ReferenceListMetadataImpl(ReferenceListMetadata source) {
+        super(source);
+        memberType = source.getMemberType();
+    }
+
+    public int getMemberType() {
+        return memberType;
+    }
+
+    public void setMemberType(int memberType) {
+        this.memberType = memberType;
+    }
+
+    @Override
+    public String toString() {
+        return "RefCollectionMetadata[" +
+                "id='" + id + '\'' +
+                ", activation=" + activation +
+                ", dependsOn=" + dependsOn +
+                ", availability=" + availability +
+                ", interface='" + interfaceName + '\'' +
+                ", componentName='" + componentName + '\'' +
+                ", filter='" + filter + '\'' +
+                ", referenceListeners=" + referenceListeners +
+                ", memberType=" + memberType +
+                ']';
+    }
+}

Added: aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/ReferenceListenerImpl.java
URL: http://svn.apache.org/viewvc/aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/ReferenceListenerImpl.java?rev=1075094&view=auto
==============================================================================
--- aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/ReferenceListenerImpl.java (added)
+++ aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/ReferenceListenerImpl.java Sun Feb 27 17:47:08 2011
@@ -0,0 +1,83 @@
+/*
+ * 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.aries.blueprint.reflect;
+
+import org.apache.aries.blueprint.mutable.MutableReferenceListener;
+import org.osgi.service.blueprint.reflect.ReferenceListener;
+import org.osgi.service.blueprint.reflect.Target;
+
+/**
+ * Implementation of Listener
+ *
+ * @version $Rev: 896324 $, $Date: 2010-01-06 06:05:04 +0000 (Wed, 06 Jan 2010) $
+ */
+public class ReferenceListenerImpl implements MutableReferenceListener {
+
+    private Target listenerComponent;
+    private String bindMethod;
+    private String unbindMethod;
+
+    public ReferenceListenerImpl() {
+    }
+
+    public ReferenceListenerImpl(Target listenerComponent, String bindMethod, String unbindMethod) {
+        this.listenerComponent = listenerComponent;
+        this.bindMethod = bindMethod;
+        this.unbindMethod = unbindMethod;
+    }
+
+    public ReferenceListenerImpl(ReferenceListener source) {
+        this.listenerComponent = MetadataUtil.cloneTarget(source.getListenerComponent());
+        this.bindMethod = source.getBindMethod();
+        this.unbindMethod = source.getUnbindMethod();
+    }
+
+    public Target getListenerComponent() {
+        return this.listenerComponent;
+    }
+
+    public void setListenerComponent(Target listenerComponent) {
+        this.listenerComponent = listenerComponent;
+    }
+
+    public String getBindMethod() {
+        return this.bindMethod;
+    }
+
+    public void setBindMethod(String bindMethodName) {
+        this.bindMethod = bindMethodName;
+    }
+
+    public String getUnbindMethod() {
+        return this.unbindMethod;
+    }
+
+    public void setUnbindMethod(String unbindMethodName) {
+        this.unbindMethod = unbindMethodName;
+    }
+
+    @Override
+    public String toString() {
+        return "Listener[" +
+                "listenerComponent=" + listenerComponent +
+                ", bindMethodName='" + bindMethod + '\'' +
+                ", unbindMethodName='" + unbindMethod + '\'' +
+                ']';
+    }
+}

Added: aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/ReferenceMetadataImpl.java
URL: http://svn.apache.org/viewvc/aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/ReferenceMetadataImpl.java?rev=1075094&view=auto
==============================================================================
--- aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/ReferenceMetadataImpl.java (added)
+++ aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/ReferenceMetadataImpl.java Sun Feb 27 17:47:08 2011
@@ -0,0 +1,63 @@
+/*
+ * 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.aries.blueprint.reflect;
+
+import org.apache.aries.blueprint.mutable.MutableReferenceMetadata;
+import org.osgi.service.blueprint.reflect.ReferenceMetadata;
+
+/**
+ * Implementation of ReferenceMetadata
+ *
+ * @version $Rev: 896324 $, $Date: 2010-01-06 06:05:04 +0000 (Wed, 06 Jan 2010) $
+ */
+public class ReferenceMetadataImpl extends ServiceReferenceMetadataImpl implements MutableReferenceMetadata {
+
+    private long timeout;
+
+    public ReferenceMetadataImpl() {
+    }
+    
+    public ReferenceMetadataImpl(ReferenceMetadata source) {
+        super(source);
+        timeout = source.getTimeout();
+    }
+
+    public long getTimeout() {
+        return timeout;
+    }
+
+    public void setTimeout(long timeout) {
+        this.timeout = timeout;
+    }
+
+    @Override
+    public String toString() {
+        return "ReferenceMetadata[" +
+                "id='" + id + '\'' +
+                ", activation=" + activation +
+                ", dependsOn=" + dependsOn +
+                ", availability=" + availability +
+                ", interface='" + interfaceName + '\'' +
+                ", componentName='" + componentName + '\'' +
+                ", filter='" + filter + '\'' +
+                ", referenceListeners=" + referenceListeners +
+                ", timeout=" + timeout +
+                ']';
+    }
+}

Added: aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/RegistrationListenerImpl.java
URL: http://svn.apache.org/viewvc/aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/RegistrationListenerImpl.java?rev=1075094&view=auto
==============================================================================
--- aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/RegistrationListenerImpl.java (added)
+++ aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/RegistrationListenerImpl.java Sun Feb 27 17:47:08 2011
@@ -0,0 +1,83 @@
+/*
+ * 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.aries.blueprint.reflect;
+
+import org.apache.aries.blueprint.mutable.MutableRegistrationListener;
+import org.osgi.service.blueprint.reflect.RegistrationListener;
+import org.osgi.service.blueprint.reflect.Target;
+
+/**
+ * Implementation of RegistrationListener.
+ *
+ * @version $Rev: 896324 $, $Date: 2010-01-06 06:05:04 +0000 (Wed, 06 Jan 2010) $
+ */
+public class RegistrationListenerImpl implements MutableRegistrationListener {
+
+    private Target listenerComponent;
+    private String registrationMethod;
+    private String unregistrationMethod;
+
+    public RegistrationListenerImpl() {
+    }
+
+    public RegistrationListenerImpl(Target listenerComponent, String registrationMethod, String unregistrationMethod) {
+        this.listenerComponent = listenerComponent;
+        this.registrationMethod = registrationMethod;
+        this.unregistrationMethod = unregistrationMethod;
+    }
+
+    public RegistrationListenerImpl(RegistrationListener source) {
+        listenerComponent = MetadataUtil.cloneTarget(source.getListenerComponent());
+        registrationMethod = source.getRegistrationMethod();
+        unregistrationMethod = source.getUnregistrationMethod();
+    }
+
+    public Target getListenerComponent() {
+        return listenerComponent;
+    }
+
+    public void setListenerComponent(Target listenerComponent) {
+        this.listenerComponent = listenerComponent;
+    }
+
+    public String getRegistrationMethod() {
+        return registrationMethod;
+    }
+
+    public void setRegistrationMethod(String registrationMethod) {
+        this.registrationMethod = registrationMethod;
+    }
+
+    public String getUnregistrationMethod() {
+        return unregistrationMethod;
+    }
+
+    public void setUnregistrationMethod(String unregistrationMethod) {
+        this.unregistrationMethod = unregistrationMethod;
+    }
+
+    @Override
+    public String toString() {
+        return "RegistrationListener[" +
+                "listenerComponent=" + listenerComponent +
+                ", registrationMethodName='" + registrationMethod + '\'' +
+                ", unregistrationMethodName='" + unregistrationMethod + '\'' +
+                ']';
+    }
+}

Added: aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/ServiceMetadataImpl.java
URL: http://svn.apache.org/viewvc/aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/ServiceMetadataImpl.java?rev=1075094&view=auto
==============================================================================
--- aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/ServiceMetadataImpl.java (added)
+++ aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/ServiceMetadataImpl.java Sun Feb 27 17:47:08 2011
@@ -0,0 +1,190 @@
+/*
+ * 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.aries.blueprint.reflect;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.aries.blueprint.mutable.MutableServiceMetadata;
+import org.osgi.service.blueprint.reflect.MapEntry;
+import org.osgi.service.blueprint.reflect.Metadata;
+import org.osgi.service.blueprint.reflect.NonNullMetadata;
+import org.osgi.service.blueprint.reflect.RegistrationListener;
+import org.osgi.service.blueprint.reflect.ServiceMetadata;
+import org.osgi.service.blueprint.reflect.Target;
+
+/**
+ * Implementation of ServiceMetadata
+ *
+ * @version $Rev: 896324 $, $Date: 2010-01-06 06:05:04 +0000 (Wed, 06 Jan 2010) $
+ */
+public class ServiceMetadataImpl extends ComponentMetadataImpl implements MutableServiceMetadata {
+
+    private Target serviceComponent;
+    private List<String> interfaceNames;
+    private int autoExport;
+    private List<MapEntry> serviceProperties;
+    private int ranking;
+    private Collection<RegistrationListener> registrationListeners;
+
+    public ServiceMetadataImpl() {
+    }
+    
+    public ServiceMetadataImpl(ServiceMetadata source) {
+        super(source);
+        this.serviceComponent = MetadataUtil.cloneTarget(source.getServiceComponent());
+        this.interfaceNames = new ArrayList<String>(source.getInterfaces());
+        this.autoExport = source.getAutoExport();
+        for (MapEntry serviceProperty : source.getServiceProperties()) {
+            addServiceProperty(new MapEntryImpl(serviceProperty));
+        }
+        this.ranking = source.getRanking();
+        for (RegistrationListener listener : source.getRegistrationListeners()) {
+            addRegistrationListener(new RegistrationListenerImpl(listener));
+        }
+    }
+
+    public Target getServiceComponent() {
+        return serviceComponent;
+    }
+
+    public void setServiceComponent(Target exportedComponent) {
+        this.serviceComponent = exportedComponent;
+    }
+
+    public List<String> getInterfaces() {
+        if (this.interfaceNames == null) {
+            return Collections.emptyList();
+        } else {
+            return Collections.unmodifiableList(this.interfaceNames);
+        }
+    }
+
+    public void setInterfaceNames(List<String> interfaceNames) {
+        this.interfaceNames = interfaceNames != null ? new ArrayList<String>(interfaceNames) : null;
+    }
+
+    public void addInterface(String interfaceName) {
+        if (this.interfaceNames == null) {
+            this.interfaceNames = new ArrayList<String>();
+        }
+        this.interfaceNames.add(interfaceName);
+    }
+
+    public void removeInterface(String interfaceName) {
+        if (this.interfaceNames != null) {
+            this.interfaceNames.remove(interfaceName);
+        }
+    }
+
+    public int getAutoExport() {
+        return this.autoExport;
+    }
+
+    public void setAutoExport(int autoExport) {
+        this.autoExport = autoExport;
+    }
+
+    public List<MapEntry> getServiceProperties() {
+        if (this.serviceProperties == null) {
+            return Collections.emptyList();
+        } else {
+            return Collections.unmodifiableList(this.serviceProperties);
+        }
+    }
+
+    public void setServiceProperties(List<MapEntry> serviceProperties) {
+        this.serviceProperties = serviceProperties != null ? new ArrayList<MapEntry>(serviceProperties) : null;
+    }
+
+    public void addServiceProperty(MapEntry serviceProperty) {
+        if (this.serviceProperties == null) {
+            this.serviceProperties = new ArrayList<MapEntry>();
+        }
+        this.serviceProperties.add(serviceProperty);
+    }
+
+    public MapEntry addServiceProperty(NonNullMetadata key, Metadata value) {
+        MapEntry serviceProperty = new MapEntryImpl(key, value);
+        addServiceProperty(serviceProperty);
+        return serviceProperty;
+    }
+
+    public void removeServiceProperty(MapEntry serviceProperty) {
+        if (this.serviceProperties != null) {
+            this.serviceProperties.remove(serviceProperty);
+        }
+    }
+
+    public int getRanking() {
+        return ranking;
+    }
+
+    public void setRanking(int ranking) {
+        this.ranking = ranking;
+    }
+
+    public Collection<RegistrationListener> getRegistrationListeners() {
+        if (this.registrationListeners == null) {
+            return Collections.emptySet();
+        } else {
+            return Collections.unmodifiableCollection(this.registrationListeners);
+        }
+    }
+
+    public void setRegistrationListeners(Collection<RegistrationListener> registrationListeners) {
+        this.registrationListeners = registrationListeners;
+    }
+
+    public void addRegistrationListener(RegistrationListener registrationListenerMetadata) {
+        if (this.registrationListeners == null) {
+            this.registrationListeners = new ArrayList<RegistrationListener>();
+        }
+        this.registrationListeners.add(registrationListenerMetadata);
+    }
+
+    public RegistrationListener addRegistrationListener(Target listenerComponent, String registrationMethodName, String unregistrationMethodName) {
+        RegistrationListener listener = new RegistrationListenerImpl(listenerComponent, registrationMethodName,  unregistrationMethodName);
+        addRegistrationListener(listener);
+        return listener;
+    }
+
+    public void removeRegistrationListener(RegistrationListener listener) {
+        if (this.registrationListeners != null) {
+            this.registrationListeners.remove(listener);
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "ServiceMetadata[" +
+                "id='" + id + '\'' +
+                ", activation=" + activation +
+                ", dependsOn=" + dependsOn +
+                ", exportedComponent=" + serviceComponent +
+                ", interfaces=" + interfaceNames +
+                ", autoExportMode=" + autoExport +
+                ", serviceProperties=" + serviceProperties +
+                ", ranking=" + ranking +
+                ", registrationListeners=" + registrationListeners +
+                ']';
+    }
+}

Added: aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/ServiceReferenceMetadataImpl.java
URL: http://svn.apache.org/viewvc/aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/ServiceReferenceMetadataImpl.java?rev=1075094&view=auto
==============================================================================
--- aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/ServiceReferenceMetadataImpl.java (added)
+++ aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/ServiceReferenceMetadataImpl.java Sun Feb 27 17:47:08 2011
@@ -0,0 +1,129 @@
+/*
+ * 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.aries.blueprint.reflect;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+
+import org.apache.aries.blueprint.mutable.MutableServiceReferenceMetadata;
+import org.osgi.service.blueprint.reflect.ReferenceListener;
+import org.osgi.service.blueprint.reflect.ServiceReferenceMetadata;
+import org.osgi.service.blueprint.reflect.Target;
+
+/**
+ * Implementation of ServiceReferenceMetadata 
+ *
+ * @version $Rev: 896324 $, $Date: 2010-01-06 06:05:04 +0000 (Wed, 06 Jan 2010) $
+ */
+public abstract class ServiceReferenceMetadataImpl extends ComponentMetadataImpl implements MutableServiceReferenceMetadata {
+
+    protected int availability;
+    protected String interfaceName;
+    protected String componentName;
+    protected String filter;
+    protected Collection<ReferenceListener> referenceListeners;
+    protected int proxyMethod;
+
+    public ServiceReferenceMetadataImpl() {
+    }
+
+    public ServiceReferenceMetadataImpl(ServiceReferenceMetadata source) {
+        super(source);
+        this.availability = source.getAvailability();
+        this.interfaceName = source.getInterface();
+        this.componentName = source.getComponentName();
+        this.filter = source.getFilter();
+        for (ReferenceListener listener : source.getReferenceListeners()) {
+            addServiceListener(new ReferenceListenerImpl(listener));
+        }
+    }
+
+    public int getAvailability() {
+        return availability;
+    }
+
+    public void setAvailability(int availability) {
+        this.availability = availability;
+    }
+
+    public String getInterface() {
+        return interfaceName;
+    }
+
+    public void setInterface(String interfaceName) {
+        this.interfaceName = interfaceName;
+    }
+
+    public String getComponentName() {
+        return componentName;
+    }
+
+    public void setComponentName(String componentName) {
+        this.componentName = componentName;
+    }
+
+    public String getFilter() {
+        return filter;
+    }
+
+    public void setFilter(String filter) {
+        this.filter = filter;
+    }
+
+    public Collection<ReferenceListener> getReferenceListeners() {
+        if (this.referenceListeners == null) {
+            return Collections.emptyList();
+        } else {
+            return Collections.unmodifiableCollection(this.referenceListeners);
+        }
+    }
+
+    public void setReferenceListeners(Collection<ReferenceListener> listeners) {
+        this.referenceListeners = listeners != null ? new ArrayList<ReferenceListener>(listeners) : null;
+    }
+
+    public void addServiceListener(ReferenceListener bindingListenerMetadata) {
+        if (this.referenceListeners == null) {
+            this.referenceListeners = new ArrayList<ReferenceListener>();
+        }
+        this.referenceListeners.add(bindingListenerMetadata);
+    }
+
+    public ReferenceListener addServiceListener(Target listenerComponent, String bindMethodName, String unbindMethodName) {
+        ReferenceListener listener = new ReferenceListenerImpl(listenerComponent, bindMethodName, unbindMethodName);
+        addServiceListener(listener);
+        return listener;
+    }
+
+    public void removeReferenceListener(ReferenceListener listener) {
+        if (this.referenceListeners != null) {
+            this.referenceListeners.remove(listener);
+        }
+    }
+
+    public int getProxyMethod() {
+        return proxyMethod;
+    }
+
+    public void setProxyMethod(int proxyMethod) {
+        this.proxyMethod = proxyMethod;
+    }
+
+}

Added: aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/ValueMetadataImpl.java
URL: http://svn.apache.org/viewvc/aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/ValueMetadataImpl.java?rev=1075094&view=auto
==============================================================================
--- aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/ValueMetadataImpl.java (added)
+++ aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/reflect/ValueMetadataImpl.java Sun Feb 27 17:47:08 2011
@@ -0,0 +1,74 @@
+/*
+ * 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.aries.blueprint.reflect;
+
+import org.apache.aries.blueprint.mutable.MutableValueMetadata;
+import org.osgi.service.blueprint.reflect.ValueMetadata;
+
+/**
+ * Implementation of ValueMetadata 
+ *
+ * @version $Rev: 896324 $, $Date: 2010-01-06 06:05:04 +0000 (Wed, 06 Jan 2010) $
+ */
+public class ValueMetadataImpl implements MutableValueMetadata {
+
+    private String stringValue;
+    private String type;
+
+    public ValueMetadataImpl() {
+    }
+
+    public ValueMetadataImpl(String stringValue) {
+        this.stringValue = stringValue;
+    }
+
+    public ValueMetadataImpl(String stringValue, String type) {
+        this.stringValue = stringValue;
+        this.type = type;
+    }
+
+    public ValueMetadataImpl(ValueMetadata source) {
+        this.stringValue = source.getStringValue();
+        this.type = source.getType();
+    }
+
+    public String getStringValue() {
+        return stringValue;
+    }
+
+    public void setStringValue(String stringValue) {
+        this.stringValue = stringValue;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String typeName) {
+        this.type = typeName;
+    }
+
+    @Override
+    public String toString() {
+        return "ValueMetadata[" +
+                "stringValue='" + stringValue + '\'' +
+                ", type='" + type + '\'' +
+                ']';
+    }
+}

Added: aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/utils/BundleDelegatingClassLoader.java
URL: http://svn.apache.org/viewvc/aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/utils/BundleDelegatingClassLoader.java?rev=1075094&view=auto
==============================================================================
--- aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/utils/BundleDelegatingClassLoader.java (added)
+++ aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/utils/BundleDelegatingClassLoader.java Sun Feb 27 17:47:08 2011
@@ -0,0 +1,87 @@
+/*
+ * 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.aries.blueprint.utils;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.Enumeration;
+
+import org.osgi.framework.Bundle;
+
+/**
+ * A ClassLoader delegating to a given OSGi bundle.
+ *
+ * @version $Rev: 896324 $, $Date: 2010-01-06 06:05:04 +0000 (Wed, 06 Jan 2010) $
+ */
+public class BundleDelegatingClassLoader extends ClassLoader {
+
+    private final Bundle bundle;
+    private final ClassLoader classLoader;
+
+    public BundleDelegatingClassLoader(Bundle bundle) {
+        this(bundle, null);
+    }
+
+    public BundleDelegatingClassLoader(Bundle bundle, ClassLoader classLoader) {
+        this.bundle = bundle;
+        this.classLoader = classLoader;
+    }
+
+    protected Class findClass(String name) throws ClassNotFoundException {
+        return bundle.loadClass(name);
+    }
+
+    protected URL findResource(String name) {
+        URL resource = bundle.getResource(name);
+        if (classLoader != null && resource == null) {
+            resource = classLoader.getResource(name);
+        }
+        return resource;
+    }
+
+    protected Enumeration findResources(String name) throws IOException {
+        return bundle.getResources(name);
+    }
+
+    protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
+        Class clazz;
+        try {
+            clazz = findClass(name);
+        }
+        catch (ClassNotFoundException cnfe) {
+            if (classLoader != null) {
+                try {
+                    clazz = classLoader.loadClass(name);
+                } catch (ClassNotFoundException e) {
+                    throw new ClassNotFoundException(name + " from bundle " + bundle.getBundleId() + " (" + bundle.getSymbolicName() + ")", cnfe);
+                }
+            } else {
+                throw new ClassNotFoundException(name + " from bundle " + bundle.getBundleId() + " (" + bundle.getSymbolicName() + ")", cnfe);
+            }
+        }
+        if (resolve) {
+            resolveClass(clazz);
+        }
+        return clazz;
+    }
+
+    public Bundle getBundle() {
+        return bundle;
+    }
+}

Added: aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/utils/DynamicCollection.java
URL: http://svn.apache.org/viewvc/aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/utils/DynamicCollection.java?rev=1075094&view=auto
==============================================================================
--- aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/utils/DynamicCollection.java (added)
+++ aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/utils/DynamicCollection.java Sun Feb 27 17:47:08 2011
@@ -0,0 +1,314 @@
+/*
+ * 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.aries.blueprint.utils;
+
+import java.lang.ref.WeakReference;
+import java.util.AbstractCollection;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.NoSuchElementException;
+
+/**
+ * Collection that allows iterators to see addition or removals of elements while iterating.
+ * This collection and its iterators are thread safe but all operations happen under a
+ * synchronization lock, so the performance in heavy concurrency load is far from optimal.
+ * If such a use is needed, a CopyOnWriteArrayList may be more suited.
+ *
+ * @version $Rev: 896324 $, $Date: 2010-01-06 06:05:04 +0000 (Wed, 06 Jan 2010) $
+ */
+public class DynamicCollection<E> extends AbstractCollection<E> {
+
+    protected final Object lock = new Object();
+    protected final List<E> storage;
+    protected final List<WeakReference<DynamicIterator>> iterators;
+
+    public DynamicCollection() {
+        this.storage = new ArrayList<E>();
+        this.iterators = new ArrayList<WeakReference<DynamicIterator>>();
+    }
+
+    public DynamicIterator iterator() {
+        return iterator(0);
+    }
+
+    public DynamicIterator iterator(int index) {
+        DynamicIterator iterator = createIterator(index);
+        synchronized (lock) {
+            for (Iterator<WeakReference<DynamicIterator>> it = iterators.iterator(); it.hasNext();) {
+                if (it.next().get() == null) {
+                    it.remove();
+                }
+            }
+            iterators.add(new WeakReference<DynamicIterator>(iterator));
+        }
+        return iterator;
+    }
+
+    protected DynamicIterator createIterator(int index) {
+        return new DynamicIterator(index);
+    }
+
+    public int size() {
+        synchronized (lock) {
+            return storage.size();
+        }
+    }
+
+    public boolean isEmpty() {
+        return size() == 0;
+    }
+
+    public boolean contains(Object o) {
+        if (o == null) {
+            throw new NullPointerException();
+        }
+        synchronized (lock) {
+            return storage.contains(o);
+        }
+    }
+
+    public Object[] toArray() {
+        synchronized (lock) {
+            return storage.toArray();
+        }
+    }
+
+    public <T> T[] toArray(T[] a) {
+        synchronized (lock) {
+            return storage.toArray(a);
+        }
+    }
+
+    public boolean containsAll(Collection<?> c) {
+        synchronized (lock) {
+            return storage.containsAll(c);
+        }
+    }
+
+    public boolean add(E o) {
+        if (o == null) {
+            throw new NullPointerException();
+        }
+        synchronized (lock) {
+            internalAdd(storage.size(), o);
+            return true;
+        }
+    }
+
+    public boolean remove(Object o) {
+        if (o == null) {
+            throw new NullPointerException();
+        }
+        synchronized (lock) {
+            int index = storage.indexOf(o);
+            return remove(index) != null;
+        }
+    }
+
+    public E get(int index) {
+        synchronized (lock) {
+            return storage.get(index);
+        }
+    }
+
+    private void internalAdd(int index, E o) {
+        if (o == null) {
+            throw new NullPointerException();
+        }
+        synchronized (lock) {
+            storage.add(index, o);
+            for (Iterator<WeakReference<DynamicIterator>> it = iterators.iterator(); it.hasNext();) {
+                DynamicIterator i = it.next().get();
+                if (i == null) {
+                    it.remove();
+                } else {
+                    i.addedIndex(index);
+                }
+            }
+        }
+    }
+
+    @Override
+    public void clear() {
+        synchronized (lock) {
+            storage.clear();
+        }
+    }
+
+    public E remove(int index) {
+        synchronized (lock) {
+            E o = storage.remove(index);
+            for (Iterator<WeakReference<DynamicIterator>> it = iterators.iterator(); it.hasNext();) {
+                WeakReference<DynamicIterator> r = it.next();
+                DynamicIterator i = r.get();
+                if (i == null) {
+                    it.remove();
+                } else {
+                    i.removedIndex(index);
+                }
+            }
+            return o;
+        }
+    }
+
+    public E first() {
+        synchronized (lock) {
+            if (storage.isEmpty()) {
+                throw new NoSuchElementException();
+            } else {
+                return storage.get(0);
+            }
+        }
+    }
+
+    public E last() {
+        synchronized (lock) {
+            if (storage.isEmpty()) {
+                throw new NoSuchElementException();
+            } else {
+                return storage.get(storage.size() - 1);
+            }
+        }
+    }
+
+    public class DynamicIterator implements ListIterator<E> {
+
+        protected int index;
+        protected boolean hasNextCalled;
+        protected E next;
+        protected boolean hasPreviousCalled;
+        protected E previous;
+        protected E last;
+
+        public DynamicIterator() {
+            this(0);
+        }
+
+        public DynamicIterator(int index) {
+            this.index = index;
+        }
+
+        protected void removedIndex(int index) {
+            synchronized (lock) {
+                if (index < this.index || (index == this.index && (hasNextCalled || hasPreviousCalled))) {
+                    this.index--;
+                }
+            }
+        }
+
+        protected void addedIndex(int index) {
+            synchronized (lock) {
+                if (index < this.index || (index == this.index && (next != null || previous != null))) {
+                    this.index++;
+                }
+            }
+        }
+
+        public boolean hasNext() {
+            synchronized (lock) {
+                hasPreviousCalled = false;
+                hasNextCalled = true;
+                next = index < storage.size() ? storage.get(index) : null;
+                return next != null;
+            }
+        }
+
+        public boolean hasPrevious() {
+            synchronized (lock) {
+                hasPreviousCalled = true;
+                hasNextCalled = false;
+                previous = index > 0 ? storage.get(index - 1) : null;
+                return previous != null;
+            }
+        }
+
+        public E next() {
+            synchronized (lock) {
+                try {
+                    if (!hasNextCalled) {
+                        hasNext();
+                    }
+                    last = next;
+                    if (next != null) {
+                        ++index;
+                        return next;
+                    } else {
+                        throw new NoSuchElementException();
+                    }
+                } finally {
+                    hasPreviousCalled = false;
+                    hasNextCalled = false;
+                    next = null;
+                    previous = null;
+                }
+            }
+        }
+
+        public E previous() {
+            synchronized (lock) {
+                try {
+                    if (!hasPreviousCalled) {
+                        hasPrevious();
+                    }
+                    last = previous;
+                    if (previous != null) {
+                        --index;
+                        return previous;
+                    } else {
+                        throw new NoSuchElementException();
+                    }
+                } finally {
+                    hasPreviousCalled = false;
+                    hasNextCalled = false;
+                    next = null;
+                    previous = null;
+                }
+            }
+        }
+
+        public int nextIndex() {
+            synchronized (lock) {
+                return index;
+            }
+        }
+
+        public int previousIndex() {
+            synchronized (lock) {
+                return index - 1;
+            }
+        }
+
+        public void set(E o) {
+            throw new UnsupportedOperationException();
+        }
+
+        public void add(E o) {
+            throw new UnsupportedOperationException();
+        }
+
+        public void remove() {
+            throw new UnsupportedOperationException();
+        }
+
+    }
+
+}

Added: aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/utils/HeaderParser.java
URL: http://svn.apache.org/viewvc/aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/utils/HeaderParser.java?rev=1075094&view=auto
==============================================================================
--- aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/utils/HeaderParser.java (added)
+++ aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/utils/HeaderParser.java Sun Feb 27 17:47:08 2011
@@ -0,0 +1,114 @@
+/**
+ * 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.aries.blueprint.utils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Utility class to parse a standard OSGi header with paths.
+ *
+ * @version $Rev: 820286 $, $Date: 2009-09-30 15:45:55 +0100 (Wed, 30 Sep 2009) $
+ */
+public class HeaderParser  {
+
+    /**
+     * Parse a given OSGi header into a list of paths
+     *
+     * @param header the OSGi header to parse
+     * @return the list of paths extracted from this header
+     */
+    public static List<PathElement> parseHeader(String header) {
+        List<PathElement> elements = new ArrayList<PathElement>();
+        if (header == null || header.trim().length() == 0) {
+            return elements;
+        }
+        String[] clauses = header.split(",");
+        for (String clause : clauses) {
+            String[] tokens = clause.split(";");
+            if (tokens.length < 1) {
+                throw new IllegalArgumentException("Invalid header clause: " + clause);
+            }
+            PathElement elem = new PathElement(tokens[0].trim());
+            elements.add(elem);
+            for (int i = 1; i < tokens.length; i++) {
+                int pos = tokens[i].indexOf('=');
+                if (pos != -1) {
+                    if (pos > 0 && tokens[i].charAt(pos - 1) == ':') {
+                        String name = tokens[i].substring(0, pos - 1).trim();
+                        String value = tokens[i].substring(pos + 1).trim();
+                        elem.addDirective(name, value);
+                    } else {
+                        String name = tokens[i].substring(0, pos).trim();
+                        String value = tokens[i].substring(pos + 1).trim();
+                        elem.addAttribute(name, value);
+                    }
+                } else {
+                    elem = new PathElement(tokens[i].trim());
+                    elements.add(elem);
+                }
+            }
+        }
+        return elements;
+    }
+
+    public static class PathElement {
+        
+        private String path;
+        private Map<String, String> attributes;
+        private Map<String, String> directives;
+        
+        public PathElement(String path) {
+            this.path = path;
+            this.attributes = new HashMap<String, String>();
+            this.directives = new HashMap<String, String>();
+        }
+        
+        public String getName() {
+            return this.path;
+        }
+        
+        public Map<String, String> getAttributes() {
+            return attributes;
+        }
+        
+        public String getAttribute(String name) {
+            return attributes.get(name);
+        }
+        
+        public void addAttribute(String name, String value) {
+            attributes.put(name, value);
+        }
+        
+        public Map<String, String> getDirectives() {
+            return directives;
+        }
+        
+        public String getDirective(String name) {
+            return directives.get(name);
+        }
+        
+        public void addDirective(String name, String value) {
+            directives.put(name, value);
+        }        
+        
+    }
+}

Added: aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/utils/JavaUtils.java
URL: http://svn.apache.org/viewvc/aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/utils/JavaUtils.java?rev=1075094&view=auto
==============================================================================
--- aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/utils/JavaUtils.java (added)
+++ aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/utils/JavaUtils.java Sun Feb 27 17:47:08 2011
@@ -0,0 +1,59 @@
+/**
+ * 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.aries.blueprint.utils;
+
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.Hashtable;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.Version;
+
+/**
+ * @version $Rev: 820636 $ $Date: 2009-10-01 13:55:42 +0100 (Thu, 01 Oct 2009) $
+ */
+public final class JavaUtils {
+
+    private JavaUtils() {
+    }
+
+    public static void copy(Dictionary destination, Dictionary source) {
+        Enumeration e = source.keys();
+        while (e.hasMoreElements()) {
+            Object key = e.nextElement();
+            Object value = source.get(key);
+            destination.put(key, value);
+        }
+    }
+
+    public static Hashtable getProperties(ServiceReference ref) {
+        Hashtable props = new Hashtable();
+        for (String key : ref.getPropertyKeys()) {
+            props.put(key, ref.getProperty(key));
+        }
+        return props;
+    }
+
+    public static Version getBundleVersion(Bundle bundle) {
+        Dictionary headers = bundle.getHeaders();
+        String version = (String)headers.get(Constants.BUNDLE_VERSION);
+        return (version != null) ? Version.parseVersion(version) : Version.emptyVersion;
+    }
+
+}

Added: aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/utils/ReflectionUtils.java
URL: http://svn.apache.org/viewvc/aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/utils/ReflectionUtils.java?rev=1075094&view=auto
==============================================================================
--- aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/utils/ReflectionUtils.java (added)
+++ aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/java/org/apache/aries/blueprint/utils/ReflectionUtils.java Sun Feb 27 17:47:08 2011
@@ -0,0 +1,392 @@
+/**
+ * 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.aries.blueprint.utils;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.lang.reflect.Type;
+import java.security.AccessControlContext;
+import java.security.AccessController;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.WeakHashMap;
+
+/**
+ * TODO: javadoc
+ *
+ * @version $Rev: 910448 $, $Date: 2010-02-16 09:50:18 +0000 (Tue, 16 Feb 2010) $
+ */
+public class ReflectionUtils {
+
+    // TODO: MLK: PropertyDescriptor holds a reference to Method which holds a reference to the Class itself
+    private static Map<Class<?>, PropertyDescriptor[][]> beanInfos = Collections.synchronizedMap(new WeakHashMap<Class<?>, PropertyDescriptor[][]>());
+
+    public static boolean hasDefaultConstructor(Class type) {
+        if (!Modifier.isPublic(type.getModifiers())) {
+            return false;
+        }
+        if (Modifier.isAbstract(type.getModifiers())) {
+            return false;
+        }
+        Constructor[] constructors = type.getConstructors();
+        for (Constructor constructor : constructors) {
+            if (Modifier.isPublic(constructor.getModifiers()) &&
+                    constructor.getParameterTypes().length == 0) {
+                return true;
+            }
+        }
+        return false;
+    }
+    
+    public static Set<String> getImplementedInterfaces(Set<String> classes, Class clazz) {
+        if (clazz != null && clazz != Object.class) {
+            for (Class itf : clazz.getInterfaces()) {
+                if (Modifier.isPublic(itf.getModifiers())) {
+                    classes.add(itf.getName());
+                }
+                getImplementedInterfaces(classes, itf);
+            }
+            getImplementedInterfaces(classes, clazz.getSuperclass());
+        }
+        return classes;
+    }
+
+    public static Set<String> getSuperClasses(Set<String> classes, Class clazz) {
+        if (clazz != null && clazz != Object.class) {
+            if (Modifier.isPublic(clazz.getModifiers())) {
+                classes.add(clazz.getName());
+            }
+            getSuperClasses(classes, clazz.getSuperclass());
+        }
+        return classes;
+    }
+
+    public static Method getLifecycleMethod(Class clazz, String name) {
+        if (name != null) {
+            try {
+                Method method = clazz.getMethod(name);
+                if (Void.TYPE.equals(method.getReturnType())) {
+                    return method;
+                }
+            } catch (NoSuchMethodException e) {
+                // fall thru
+            }
+        }
+        return null;
+    }
+    
+    public static List<Method> findCompatibleMethods(Class clazz, String name, Class[] paramTypes) {
+        List<Method> methods = new ArrayList<Method>();
+        for (Method method : clazz.getMethods()) {
+            Class[] methodParams = method.getParameterTypes();
+            if (name.equals(method.getName()) && Void.TYPE.equals(method.getReturnType()) && methodParams.length == paramTypes.length && !method.isBridge()) {
+                boolean assignable = true;
+                for (int i = 0; i < paramTypes.length && assignable; i++) {
+                    assignable &= paramTypes[i] == null || methodParams[i].isAssignableFrom(paramTypes[i]);
+                }
+                if (assignable) {
+                    methods.add(method);
+                }
+            }
+        }
+        return methods;
+    }
+
+    public static PropertyDescriptor[] getPropertyDescriptors(Class clazz, boolean allowFieldInjection) {
+        PropertyDescriptor[][] properties = beanInfos.get(clazz);
+        int index = allowFieldInjection ? 0 : 1;
+        
+        if (properties == null) {
+            properties = new PropertyDescriptor[2][];
+            beanInfos.put(clazz, properties);
+        }
+        
+        if (properties[index] == null) {
+            Map<String,PropertyDescriptor> props = new HashMap<String, PropertyDescriptor>();
+            for (Method method : clazz.getMethods()) {
+                if (Modifier.isStatic(method.getModifiers()) || method.isBridge()) {
+                    continue;
+                }
+                String name = method.getName();
+                Class<?> argTypes[] = method.getParameterTypes();
+                Class<?> resultType = method.getReturnType();
+                
+                Class<?> argType = resultType;
+                Method getter = null;
+                Method setter = null;
+                
+                if (name.length() > 3 && name.startsWith("set") && resultType == Void.TYPE && argTypes.length == 1) {
+                    name = decapitalize(name.substring(3));
+                    setter = method;
+                    argType = argTypes[0];
+                } else if (name.length() > 3 && name.startsWith("get") && argTypes.length == 0) {
+                    name = decapitalize(name.substring(3));
+                    getter = method;
+                } else if (name.length() > 2 && name.startsWith("is") && argTypes.length == 0 && resultType == boolean.class) {
+                    name = decapitalize(name.substring(2));
+                    getter = method;
+                } else {
+                    continue;
+                }
+                
+                if (props.containsKey(name)) {
+                    PropertyDescriptor pd = props.get(name);
+                    if (pd != INVALID_PROPERTY) {
+                        if (!argType.equals(pd.type)) {
+                            props.put(name, INVALID_PROPERTY);
+                        } else if (getter != null) {
+                            if (pd.getter == null || pd.getter.equals(getter))
+                                pd.getter = getter;
+                            else
+                                props.put(name, INVALID_PROPERTY);
+                        } else if (setter != null) {
+                            if (pd.setter == null || pd.setter.equals(setter)) 
+                                pd.setter = setter;
+                            else
+                                props.put(name, INVALID_PROPERTY);
+                        }
+                    }
+                } else {
+                    props.put(name, new PropertyDescriptor(name, argType, getter, setter));
+                }
+            }
+            
+            if (allowFieldInjection) {
+                for (Field field : clazz.getDeclaredFields()) {
+                    if (Modifier.isStatic(field.getModifiers())) {
+                        continue;
+                    }
+                    
+                    String name = decapitalize(field.getName());
+                    if (!props.containsKey(name)) {
+                        props.put(name, new PropertyDescriptor(name, field.getType(), field));
+                    } else {
+                        PropertyDescriptor pd = props.get(name);
+                        if (pd != INVALID_PROPERTY) {
+                            if (pd.type.equals(field.getType())) {
+                                pd.field = field;
+                            } 
+                            // no else, we don't require field implementations to have the same
+                            // type as the getter and setter
+                        }
+                    }
+                }
+            }
+            
+            Iterator<PropertyDescriptor> it = props.values().iterator();
+            while (it.hasNext()) {
+                if (it.next() == INVALID_PROPERTY)
+                    it.remove();
+            }
+            
+            Collection<PropertyDescriptor> tmp = props.values();
+            properties[index] = tmp.toArray(new PropertyDescriptor[tmp.size()]); 
+        }
+        return properties[index];
+    }
+
+    private static String decapitalize(String name) {
+        if (name == null || name.length() == 0) {
+            return name;
+        }
+        if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&
+                Character.isUpperCase(name.charAt(0))) {
+            return name;
+        }
+        char chars[] = name.toCharArray();
+        chars[0] = Character.toLowerCase(chars[0]);
+        return new String(chars);
+    }
+
+    public static Object invoke(AccessControlContext acc, final Method method, final Object instance, final Object... args) throws Exception {
+        if (acc == null) {
+            return method.invoke(instance, args);
+        } else {
+            try {
+                return AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
+                    public Object run() throws Exception {
+                        return method.invoke(instance, args);
+                    }            
+                }, acc);
+            } catch (PrivilegedActionException e) {
+                throw e.getException();
+            }
+        }
+    }
+    
+    public static Object newInstance(AccessControlContext acc, final Class clazz) throws Exception {
+        if (acc == null) {
+            return clazz.newInstance();
+        } else {
+            try {
+                return AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
+                    public Object run() throws Exception {
+                        return clazz.newInstance();
+                    }            
+                }, acc);
+            } catch (PrivilegedActionException e) {
+                throw e.getException();
+            }
+        }
+    }
+    
+    public static Object newInstance(AccessControlContext acc, final Constructor constructor, final Object... args) throws Exception {
+        if (acc == null) {
+            return constructor.newInstance(args);
+        } else {
+            try {
+                return AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
+                    public Object run() throws Exception {
+                        return constructor.newInstance(args);
+                    }            
+                }, acc);
+            } catch (PrivilegedActionException e) {
+                throw e.getException();
+            }
+        }
+    }
+    
+    private static final PropertyDescriptor INVALID_PROPERTY = new PropertyDescriptor(null, null, null, null);
+
+    public static class PropertyDescriptor {
+        private String name;
+        private Class<?> type;
+        private Method getter;
+        private Method setter;
+        private Field field;
+
+        public PropertyDescriptor(String name, Class<?> type, Method getter, Method setter) {
+            this.name = name;
+            this.type = type;
+            this.getter = getter;
+            this.setter = setter;
+        }
+        
+        public PropertyDescriptor(String name, Class<?> type, Field field) {
+            this.name = name;
+            this.type = type;
+            this.field = field;
+            this.getter = null;
+            this.setter = null;
+        }
+
+        public String getName() {
+            return name;
+        }
+        
+        public boolean allowsGet() {
+            return getter != null || field != null;
+        }
+        
+        public boolean allowsSet() {
+            return setter != null || field != null;
+        }
+        
+        public Object get(final Object instance, AccessControlContext acc) throws Exception {            
+            if (acc == null) {
+                return internalGet(instance);
+            } else {
+                try {
+                    return AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
+                        public Object run() throws Exception {
+                            return internalGet(instance);
+                        }            
+                    }, acc);
+                } catch (PrivilegedActionException e) {
+                    throw e.getException();
+                }
+            }
+        }
+            
+        private Object internalGet(Object instance) 
+                throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
+            if (getter != null) {
+                return getter.invoke(instance);
+            } else if (field != null) {
+                field.setAccessible(true);
+                return field.get(instance);
+            } else {
+                throw new UnsupportedOperationException();
+            }
+        }
+
+        public void set(final Object instance, final Object value, AccessControlContext acc) throws Exception {
+            if (acc == null) {
+                internalSet(instance, value);
+            } else {
+                try {
+                    AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
+                        public Object run() throws Exception {
+                            internalSet(instance, value);
+                            return null;
+                        }            
+                    }, acc);
+                } catch (PrivilegedActionException e) {
+                    throw e.getException();
+                }
+            }            
+        }
+        
+        private void internalSet(Object instance, Object value) 
+                throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
+            if (setter != null) {
+                setter.invoke(instance, value);
+            } else if (field != null) {
+                field.setAccessible(true);
+                field.set(instance, value);
+            } else {
+                throw new UnsupportedOperationException();
+            }
+        }
+        
+        public Type getGenericType() {
+            if (setter != null)
+                return setter.getGenericParameterTypes()[0];
+            else if (getter != null)
+                return getter.getGenericReturnType();
+            else 
+                return field.getGenericType();
+                
+        }
+        
+        public String toString() {
+            return "PropertyDescriptor <name: "+name+", getter: "+getter+", setter: "+setter+
+                ", field: "+field+">";
+        }
+    }
+
+    public static Throwable getRealCause(Throwable t) {
+        if (t instanceof InvocationTargetException && t.getCause() != null) {
+            return t.getCause();
+        }
+        return t;
+    }
+
+}

Added: aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/resources/OSGI-INF/blueprint/blueprint-ext.xml
URL: http://svn.apache.org/viewvc/aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/resources/OSGI-INF/blueprint/blueprint-ext.xml?rev=1075094&view=auto
==============================================================================
--- aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/resources/OSGI-INF/blueprint/blueprint-ext.xml (added)
+++ aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/resources/OSGI-INF/blueprint/blueprint-ext.xml Sun Feb 27 17:47:08 2011
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+
+    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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+    <service interface="org.apache.aries.blueprint.NamespaceHandler">
+        <service-properties>
+            <entry key="osgi.service.blueprint.namespace" value="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0"/>
+        </service-properties>
+        <bean class="org.apache.aries.blueprint.ext.ExtNamespaceHandler"/>
+    </service>
+
+</blueprint>

Added: aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/resources/OSGI-INF/permissions.perm
URL: http://svn.apache.org/viewvc/aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/resources/OSGI-INF/permissions.perm?rev=1075094&view=auto
==============================================================================
--- aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/resources/OSGI-INF/permissions.perm (added)
+++ aries/tags/blueprint-0.1-incubating/blueprint-core/src/main/resources/OSGI-INF/permissions.perm Sun Feb 27 17:47:08 2011
@@ -0,0 +1,26 @@
+################################################################################
+#
+#    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.
+#
+################################################################################
+# Lines beginning with '#' or '//' are comments
+#
+# This file contains the permissions to be granted.
+# The permissions are listed one per
+# line in PermissionInfo encoded format.
+# See org.osgi.service.permissionadmin.PermissionInfo
+
+(java.security.AllPermission "" "")



Mime
View raw message