You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by pd...@apache.org on 2015/07/09 00:10:16 UTC

svn commit: r1689973 [24/25] - in /felix/sandbox/pderop/dependencymanager.ds: cnf/ext/ cnf/localrepo/ cnf/localrepo/org.apache.felix.framework/ cnf/releaserepo/ org.apache.felix.dependencymanager.ds.itest/ org.apache.felix.dependencymanager.ds.itest/.s...

Added: felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/manager/components/T1MapSR.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/manager/components/T1MapSR.java?rev=1689973&view=auto
==============================================================================
--- felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/manager/components/T1MapSR.java (added)
+++ felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/manager/components/T1MapSR.java Wed Jul  8 22:10:14 2015
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.scr.impl.manager.components;
+
+import java.util.Map;
+
+import org.osgi.framework.ServiceReference;
+
+public class T1MapSR extends T1
+{
+    
+    void packageT1MapSR( Map props, ServiceReference sr)
+    {
+        if ( props != null && !props.isEmpty() && sr != null )
+        {
+            callPerformed = "packageT1MapSR";
+        }
+        else
+        {
+            callPerformed = "packageT1MapSR error: props: " + props + " SR " + sr;
+        }
+
+    }
+
+
+}

Added: felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/manager/components/T1a.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/manager/components/T1a.java?rev=1689973&view=auto
==============================================================================
--- felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/manager/components/T1a.java (added)
+++ felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/manager/components/T1a.java Wed Jul  8 22:10:14 2015
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.scr.impl.manager.components;
+
+
+public class T1a extends T1
+{
+
+    // this class sees package private methods from T1
+
+}

Added: felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/manager/components/T3.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/manager/components/T3.java?rev=1689973&view=auto
==============================================================================
--- felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/manager/components/T3.java (added)
+++ felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/manager/components/T3.java Wed Jul  8 22:10:14 2015
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.scr.impl.manager.components;
+
+
+import org.apache.felix.scr.impl.manager.components2.T2;
+
+
+public class T3 extends T2
+{
+
+    // this class does not see any package private methods of other classes
+
+}

Added: felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/manager/components2/T2.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/manager/components2/T2.java?rev=1689973&view=auto
==============================================================================
--- felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/manager/components2/T2.java (added)
+++ felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/manager/components2/T2.java Wed Jul  8 22:10:14 2015
@@ -0,0 +1,211 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.scr.impl.manager.components2;
+
+
+import java.util.Map;
+
+import org.apache.felix.scr.impl.manager.components.FakeService;
+import org.apache.felix.scr.impl.manager.components.SuperFakeService;
+import org.apache.felix.scr.impl.manager.components.T1;
+import org.osgi.framework.ServiceReference;
+
+
+public class T2 extends T1
+{
+    private void privateT2()
+    {
+        callPerformed = "privateT2";
+    }
+
+
+    private void privateT2SR( ServiceReference sr )
+    {
+        if ( sr != null )
+        {
+            callPerformed = "privateT2SR";
+        }
+        else
+        {
+            callPerformed = "privateT2SR with null param";
+        }
+    }
+
+
+    private void privateT2SI( FakeService si )
+    {
+        if ( si != null )
+        {
+            callPerformed = "privateT2SI";
+        }
+        else
+        {
+            callPerformed = "privateT2SI with null param";
+        }
+    }
+
+
+    private void privateT2SIMap( FakeService si, Map props )
+    {
+        if ( si != null && props != null && props.size() > 0 )
+        {
+            callPerformed = "privateT2SIMap";
+        }
+        else if ( si == null )
+        {
+            callPerformed = "privateT2SIMap with null service instance";
+        }
+        else if ( props == null )
+        {
+            callPerformed = "privateT2SIMap with null props";
+        }
+        else
+        {
+            callPerformed = "privateT2SIMap with empty props";
+        }
+    }
+
+
+    private void privateT2SSI( SuperFakeService si )
+    {
+        if ( si != null )
+        {
+            callPerformed = "privateT2SSI";
+        }
+        else
+        {
+            callPerformed = "privateT2SSI with null param";
+        }
+    }
+
+
+    private void privateT2SSIMap( SuperFakeService si, Map props )
+    {
+        if ( si != null && props != null && props.size() > 0 )
+        {
+            callPerformed = "privateT2SSIMap";
+        }
+        else if ( si == null )
+        {
+            callPerformed = "privateT2SSIMap with null service instance";
+        }
+        else if ( props == null )
+        {
+            callPerformed = "privateT2SSIMap with null props";
+        }
+        else
+        {
+            callPerformed = "privateT2SSIMap with empty props";
+        }
+    }
+
+
+    void packageT2()
+    {
+        callPerformed = "packageT2";
+    }
+
+
+    void packageT2SR( ServiceReference sr )
+    {
+        if ( sr != null )
+        {
+            callPerformed = "packageT2SR";
+        }
+        else
+        {
+            callPerformed = "packageT2SR with null param";
+        }
+    }
+
+
+    void packageT2SI( FakeService si )
+    {
+        if ( si != null )
+        {
+            callPerformed = "packageT2SI";
+        }
+        else
+        {
+            callPerformed = "packageT2SI with null param";
+        }
+    }
+
+
+    void packageT2SIMap( FakeService si, Map props )
+    {
+        if ( si != null && props != null && props.size() > 0 )
+        {
+            callPerformed = "packageT2SIMap";
+        }
+        else if ( si == null )
+        {
+            callPerformed = "packageT2SIMap with null service instance";
+        }
+        else if ( props == null )
+        {
+            callPerformed = "packageT2SIMap with null props";
+        }
+        else
+        {
+            callPerformed = "packageT2SIMap with empty props";
+        }
+    }
+
+
+    void packageT2SSI( SuperFakeService si )
+    {
+        if ( si != null )
+        {
+            callPerformed = "packageT2SSI";
+        }
+        else
+        {
+            callPerformed = "packageT2SSI with null param";
+        }
+    }
+
+
+    void packageT2SSIMap( SuperFakeService si, Map props )
+    {
+        if ( si != null && props != null && props.size() > 0 )
+        {
+            callPerformed = "packageT2SSIMap";
+        }
+        else if ( si == null )
+        {
+            callPerformed = "packageT2SSIMap with null service instance";
+        }
+        else if ( props == null )
+        {
+            callPerformed = "packageT2SSIMap with null props";
+        }
+        else
+        {
+            callPerformed = "packageT2SSIMap with empty props";
+        }
+    }
+
+
+    // this method must hide the T1#suitable method !
+    private void suitable( FakeService si )
+    {
+        callPerformed = "suitableT2";
+    }
+}
\ No newline at end of file

Added: felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/metadata/ComponentMetadataTest.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/metadata/ComponentMetadataTest.java?rev=1689973&view=auto
==============================================================================
--- felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/metadata/ComponentMetadataTest.java (added)
+++ felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/metadata/ComponentMetadataTest.java Wed Jul  8 22:10:14 2015
@@ -0,0 +1,992 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.scr.impl.metadata;
+
+
+import java.lang.reflect.Array;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.apache.felix.scr.impl.MockLogger;
+import org.osgi.service.component.ComponentException;
+
+
+public class ComponentMetadataTest extends TestCase
+{
+
+    private MockLogger logger = new MockLogger();
+
+
+    // test various combinations of component metadata with respect to
+    //  -- immediate: true, false, unset
+    //  -- factory: set, unset
+    //  -- service: set, unset
+    //  -- servicefactory: true, false, unset
+
+    public void testImmediate()
+    {
+        // immediate is default true if no service element is defined
+        final ComponentMetadata cm0 = createComponentMetadata( null, null );
+        cm0.validate( logger );
+        assertTrue( "Component without service must be immediate", cm0.isImmediate() );
+
+        // immediate is explicit true
+        final ComponentMetadata cm1 = createComponentMetadata( Boolean.TRUE, null );
+        cm1.validate( logger );
+        assertTrue( "Component must be immediate", cm1.isImmediate() );
+
+        // immediate is explicit true
+        final ComponentMetadata cm2 = createComponentMetadata( Boolean.TRUE, null );
+        cm2.setService( createServiceMetadata( null ) );
+        cm2.validate( logger );
+        assertTrue( "Component must be immediate", cm2.isImmediate() );
+
+        // immediate is explicit true
+        final ComponentMetadata cm3 = createComponentMetadata( Boolean.TRUE, null );
+        cm3.setService( createServiceMetadata( Boolean.FALSE ) );
+        cm3.validate( logger );
+        assertTrue( "Component must be immediate", cm3.isImmediate() );
+
+        // validation failure of immediate with service factory
+        final ComponentMetadata cm4 = createComponentMetadata( Boolean.TRUE, null );
+        cm4.setService( createServiceMetadata( Boolean.TRUE ) );
+        try
+        {
+            cm4.validate( logger );
+            fail( "Expect validation failure for immediate service factory" );
+        }
+        catch ( ComponentException ce )
+        {
+            // expect
+        }
+    }
+
+
+    public void testDelayed()
+    {
+        // immediate is default false if service element is defined
+        final ComponentMetadata cm0 = createComponentMetadata( null, null );
+        cm0.setService( createServiceMetadata( null ) );
+        cm0.validate( logger );
+        assertFalse( "Component with service must be delayed", cm0.isImmediate() );
+
+        // immediate is default false if service element is defined
+        final ComponentMetadata cm1 = createComponentMetadata( null, null );
+        cm1.setService( createServiceMetadata( Boolean.TRUE ) );
+        cm1.validate( logger );
+        assertFalse( "Component with service must be delayed", cm1.isImmediate() );
+
+        // immediate is default false if service element is defined
+        final ComponentMetadata cm2 = createComponentMetadata( null, null );
+        cm2.setService( createServiceMetadata( Boolean.FALSE ) );
+        cm2.validate( logger );
+        assertFalse( "Component with service must be delayed", cm2.isImmediate() );
+
+        // immediate is false if service element is defined
+        final ComponentMetadata cm3 = createComponentMetadata( Boolean.FALSE, null );
+        cm3.setService( createServiceMetadata( null ) );
+        cm3.validate( logger );
+        assertFalse( "Component with service must be delayed", cm3.isImmediate() );
+
+        // immediate is false if service element is defined
+        final ComponentMetadata cm4 = createComponentMetadata( Boolean.FALSE, null );
+        cm4.setService( createServiceMetadata( Boolean.TRUE ) );
+        cm4.validate( logger );
+        assertFalse( "Component with service must be delayed", cm4.isImmediate() );
+
+        // immediate is false if service element is defined
+        final ComponentMetadata cm5 = createComponentMetadata( Boolean.FALSE, null );
+        cm5.setService( createServiceMetadata( Boolean.FALSE ) );
+        cm5.validate( logger );
+        assertFalse( "Component with service must be delayed", cm5.isImmediate() );
+
+        // explicit delayed fails when there is no service
+        final ComponentMetadata cm6 = createComponentMetadata( Boolean.FALSE, null );
+        try
+        {
+            cm6.validate( logger );
+            fail( "Expect validation failure for delayed component without service" );
+        }
+        catch ( ComponentException ce )
+        {
+            // expect
+        }
+    }
+
+
+    public void testFactory()
+    {
+        // immediate is default false if factory is defined
+        final ComponentMetadata cm0 = createComponentMetadata( null, "factory" );
+        cm0.validate( logger );
+        assertFalse( "Component with factory must be delayed", cm0.isImmediate() );
+
+        // immediate is false if factory is defined
+        final ComponentMetadata cm1 = createComponentMetadata( Boolean.FALSE, "factory" );
+        cm1.validate( logger );
+        assertFalse( "Component with factory must be delayed", cm1.isImmediate() );
+
+        // immediate is default false if factory is defined
+        final ComponentMetadata cm2 = createComponentMetadata( Boolean.TRUE, "factory" );
+        try
+        {
+            cm2.validate( logger );
+            fail( "Expect validation failure for immediate factory component" );
+        }
+        catch ( ComponentException ce )
+        {
+            // expect
+        }
+
+        // immediate is default false if factory is defined
+        final ComponentMetadata cm10 = createComponentMetadata( null, "factory" );
+        cm10.setService( createServiceMetadata( null ) );
+        cm10.validate( logger );
+        assertFalse( "Component with factory must be delayed", cm10.isImmediate() );
+
+        // immediate is false if factory is defined
+        final ComponentMetadata cm11 = createComponentMetadata( Boolean.FALSE, "factory" );
+        cm11.setService( createServiceMetadata( null ) );
+        cm11.validate( logger );
+        assertFalse( "Component with factory must be delayed", cm11.isImmediate() );
+
+        // immediate is default false if factory is defined
+        final ComponentMetadata cm12 = createComponentMetadata( Boolean.TRUE, "factory" );
+        cm12.setService( createServiceMetadata( null ) );
+        try
+        {
+            cm12.validate( logger );
+            fail( "Expect validation failure for immediate factory component" );
+        }
+        catch ( ComponentException ce )
+        {
+            // expect
+        }
+
+        // immediate is default false if factory is defined
+        final ComponentMetadata cm20 = createComponentMetadata( null, "factory" );
+        cm20.setService( createServiceMetadata( Boolean.FALSE ) );
+        cm20.validate( logger );
+        assertFalse( "Component with factory must be delayed", cm20.isImmediate() );
+
+        // immediate is false if factory is defined
+        final ComponentMetadata cm21 = createComponentMetadata( Boolean.FALSE, "factory" );
+        cm21.setService( createServiceMetadata( Boolean.FALSE ) );
+        cm21.validate( logger );
+        assertFalse( "Component with factory must be delayed", cm21.isImmediate() );
+
+        // immediate is default false if factory is defined
+        final ComponentMetadata cm22 = createComponentMetadata( Boolean.TRUE, "factory" );
+        cm22.setService( createServiceMetadata( Boolean.FALSE ) );
+        try
+        {
+            cm22.validate( logger );
+            fail( "Expect validation failure for immediate factory component" );
+        }
+        catch ( ComponentException ce )
+        {
+            // expect
+        }
+
+        // immediate is default false if factory is defined
+        final ComponentMetadata cm30 = createComponentMetadata( null, "factory" );
+        cm30.setService( createServiceMetadata( Boolean.TRUE ) );
+        try
+        {
+            cm30.validate( logger );
+            fail( "Expect validation failure for factory component with service factory" );
+        }
+        catch ( ComponentException ce )
+        {
+            // expect
+        }
+
+        // immediate is false if factory is defined
+        final ComponentMetadata cm31 = createComponentMetadata( Boolean.FALSE, "factory" );
+        cm31.setService( createServiceMetadata( Boolean.TRUE ) );
+        try
+        {
+            cm31.validate( logger );
+            fail( "Expect validation failure for factory component with service factory" );
+        }
+        catch ( ComponentException ce )
+        {
+            // expect
+        }
+
+        // immediate is default false if factory is defined
+        final ComponentMetadata cm32 = createComponentMetadata( Boolean.TRUE, "factory" );
+        cm32.setService( createServiceMetadata( Boolean.TRUE ) );
+        try
+        {
+            cm32.validate( logger );
+            fail( "Expect validation failure for immediate factory component with service factory" );
+        }
+        catch ( ComponentException ce )
+        {
+            // expect
+        }
+
+    }
+
+
+    public void test_component_no_name_ds10()
+    {
+        final ComponentMetadata cm1 = createComponentMetadata( Boolean.TRUE, null );
+        cm1.setName( null );
+        try
+        {
+            cm1.validate( logger );
+            fail( "Expected validation failure for DS 1.0 component without name" );
+        }
+        catch ( ComponentException ce )
+        {
+            // expected
+        }
+    }
+
+
+    public void test_component_no_name_ds11()
+    {
+        final ComponentMetadata cm1 = createComponentMetadata11( Boolean.TRUE, null );
+        cm1.setName( null );
+        cm1.validate( logger );
+        assertEquals( "Expected name to equal implementation class name", cm1.getImplementationClassName(),
+            cm1.getName() );
+    }
+
+
+    public void test_component_activate_ds10()
+    {
+        final ComponentMetadata cm1 = createComponentMetadata( Boolean.TRUE, null );
+        cm1.validate( logger );
+        assertEquals( "Activate method name", "activate", cm1.getActivate() );
+        assertFalse( "Activate method expected to not be declared", cm1.isActivateDeclared() );
+
+        final ComponentMetadata cm2 = createComponentMetadata( Boolean.TRUE, null );
+        cm2.setActivate( "someMethod" );
+        failDS10Validation( cm2, "activate", logger );
+    }
+
+
+    public void test_component_activate_ds11()
+    {
+        final ComponentMetadata cm1 = createComponentMetadata11( Boolean.TRUE, null );
+        cm1.validate( logger );
+        assertEquals( "Activate method name", "activate", cm1.getActivate() );
+        assertFalse( "Activate method expected to not be declared", cm1.isActivateDeclared() );
+
+        final ComponentMetadata cm2 = createComponentMetadata11( Boolean.TRUE, null );
+        cm2.setActivate( "someMethod" );
+        cm2.validate( logger );
+        assertEquals( "Activate method name", "someMethod", cm2.getActivate() );
+        assertTrue( "Activate method expected to be declared", cm2.isActivateDeclared() );
+    }
+
+
+    public void test_component_deactivate_ds10()
+    {
+        final ComponentMetadata cm1 = createComponentMetadata( Boolean.TRUE, null );
+        cm1.validate( logger );
+        assertEquals( "Deactivate method name", "deactivate", cm1.getDeactivate() );
+        assertFalse( "Deactivate method expected to not be declared", cm1.isDeactivateDeclared() );
+
+        final ComponentMetadata cm2 = createComponentMetadata( Boolean.TRUE, null );
+        cm2.setDeactivate( "someMethod" );
+        failDS10Validation( cm2, "deactivate", logger );
+    }
+
+
+    public void test_component_deactivate_ds11()
+    {
+        final ComponentMetadata cm1 = createComponentMetadata11( Boolean.TRUE, null );
+        cm1.validate( logger );
+        assertEquals( "Deactivate method name", "deactivate", cm1.getDeactivate() );
+        assertFalse( "Deactivate method expected to not be declared", cm1.isDeactivateDeclared() );
+
+        final ComponentMetadata cm2 = createComponentMetadata11( Boolean.TRUE, null );
+        cm2.setDeactivate( "someMethod" );
+        cm2.validate( logger );
+        assertEquals( "Deactivate method name", "someMethod", cm2.getDeactivate() );
+        assertTrue( "Deactivate method expected to be declared", cm2.isDeactivateDeclared() );
+    }
+
+
+    public void test_component_modified_ds10()
+    {
+        final ComponentMetadata cm1 = createComponentMetadata( Boolean.TRUE, null );
+        cm1.validate( logger );
+        assertNull( "Modified method name", cm1.getModified() );
+
+        final ComponentMetadata cm2 = createComponentMetadata( Boolean.TRUE, null );
+        cm2.setModified( "someName" );
+        failDS10Validation( cm2, "modified", logger );
+    }
+
+
+    public void test_component_modified_ds11()
+    {
+        final ComponentMetadata cm1 = createComponentMetadata11( Boolean.TRUE, null );
+        cm1.validate( logger );
+        assertNull( "Modified method name", cm1.getModified() );
+
+        final ComponentMetadata cm2 = createComponentMetadata11( Boolean.TRUE, null );
+        cm2.setModified( "someMethod" );
+        cm2.validate( logger );
+        assertEquals( "Modified method name", "someMethod", cm2.getModified() );
+    }
+
+
+    public void test_component_configuration_policy_ds10()
+    {
+        final ComponentMetadata cm1 = createComponentMetadata( Boolean.TRUE, null );
+        cm1.validate( logger );
+        assertEquals( "Configuration policy", ComponentMetadata.CONFIGURATION_POLICY_OPTIONAL,
+            cm1.getConfigurationPolicy() );
+
+        final ComponentMetadata cm2 = createComponentMetadata( Boolean.TRUE, null );
+        cm2.setConfigurationPolicy( ComponentMetadata.CONFIGURATION_POLICY_IGNORE );
+        failDS10Validation( cm2, "configuration-policy", logger );
+
+        final ComponentMetadata cm3 = createComponentMetadata( Boolean.TRUE, null );
+        cm3.setConfigurationPolicy( ComponentMetadata.CONFIGURATION_POLICY_OPTIONAL );
+        failDS10Validation( cm3, "configuration-policy", logger );
+
+        final ComponentMetadata cm4 = createComponentMetadata( Boolean.TRUE, null );
+        cm4.setConfigurationPolicy( ComponentMetadata.CONFIGURATION_POLICY_REQUIRE );
+        failDS10Validation( cm4, "configuration-policy", logger );
+
+        final ComponentMetadata cm5 = createComponentMetadata( Boolean.TRUE, null );
+        cm5.setConfigurationPolicy( "undefined" );
+        failDS10Validation( cm5, "configuration-policy", logger );
+    }
+
+
+    public void test_component_configuration_policy_ds11()
+    {
+        final ComponentMetadata cm1 = createComponentMetadata11( Boolean.TRUE, null );
+        cm1.validate( logger );
+        assertEquals( "Configuration policy", ComponentMetadata.CONFIGURATION_POLICY_OPTIONAL,
+            cm1.getConfigurationPolicy() );
+
+        final ComponentMetadata cm2 = createComponentMetadata11( Boolean.TRUE, null );
+        cm2.setConfigurationPolicy( ComponentMetadata.CONFIGURATION_POLICY_IGNORE );
+        cm2.validate( logger );
+        assertEquals( "Configuration policy", ComponentMetadata.CONFIGURATION_POLICY_IGNORE,
+            cm2.getConfigurationPolicy() );
+
+        final ComponentMetadata cm3 = createComponentMetadata11( Boolean.TRUE, null );
+        cm3.setConfigurationPolicy( ComponentMetadata.CONFIGURATION_POLICY_OPTIONAL );
+        cm3.validate( logger );
+        assertEquals( "Configuration policy", ComponentMetadata.CONFIGURATION_POLICY_OPTIONAL,
+            cm3.getConfigurationPolicy() );
+
+        final ComponentMetadata cm4 = createComponentMetadata11( Boolean.TRUE, null );
+        cm4.setConfigurationPolicy( ComponentMetadata.CONFIGURATION_POLICY_REQUIRE );
+        cm4.validate( logger );
+        assertEquals( "Configuration policy", ComponentMetadata.CONFIGURATION_POLICY_REQUIRE,
+            cm4.getConfigurationPolicy() );
+
+        final ComponentMetadata cm5 = createComponentMetadata11( Boolean.TRUE, null );
+        cm5.setConfigurationPolicy( "undefined" );
+        try
+        {
+            cm5.validate( logger );
+            fail( "Expected validation failure due to undefined configuration policy" );
+        }
+        catch ( ComponentException ce )
+        {
+            // expected due to undefned configuration policy
+        }
+    }
+
+
+    public void test_reference_valid()
+    {
+        // two references, should validate
+        final ComponentMetadata cm1 = createComponentMetadata( Boolean.TRUE, null );
+        cm1.addDependency( createReferenceMetadata( "name1" ) );
+        cm1.addDependency( createReferenceMetadata( "name2" ) );
+        cm1.validate( logger );
+    }
+
+
+    public void test_reference_duplicate_name()
+    {
+        // two references with same name, must warn
+        final ComponentMetadata cm2 = createComponentMetadata( Boolean.TRUE, null );
+        cm2.addDependency( createReferenceMetadata( "name1" ) );
+        cm2.addDependency( createReferenceMetadata( "name1" ) );
+        try
+        {
+            cm2.validate( logger );
+            fail( "Expect validation failure for duplicate reference name" );
+        }
+        catch ( ComponentException ee )
+        {
+             //expected
+        }
+    }
+
+
+    public void test_reference_no_name_ds10()
+    {
+        // un-named reference, illegal for pre DS 1.1
+        final ComponentMetadata cm3 = createComponentMetadata( Boolean.TRUE, null );
+        cm3.addDependency( createReferenceMetadata( null ) );
+        try
+        {
+            cm3.validate( logger );
+            fail( "Expect validation failure for DS 1.0 reference without name" );
+        }
+        catch ( ComponentException ce )
+        {
+            // expected
+        }
+    }
+
+
+    public void test_reference_no_name_ds11()
+    {
+        // un-named reference, illegal for DS 1.1
+        final ComponentMetadata cm4 = createComponentMetadata11( Boolean.TRUE, null );
+        final ReferenceMetadata rm4 = createReferenceMetadata( null );
+        cm4.addDependency( rm4 );
+        cm4.validate( logger );
+        assertEquals( "Reference name defaults to interface", rm4.getInterface(), rm4.getName() );
+    }
+
+
+    public void test_reference_updated_ds10()
+    {
+        // updated method ignored for DS 1.0
+        final ReferenceMetadata rm3 = createReferenceMetadata( "test" );
+        rm3.setUpdated( "my_updated_method" );
+        final ComponentMetadata cm3 = createComponentMetadata( Boolean.TRUE, null );
+        cm3.addDependency( rm3 );
+
+        // according to DS 1.2 must fail validation (FELIX-3648)
+        failDS10Validation( cm3, "updated", logger );
+    }
+
+
+    public void test_reference_updated_ds11()
+    {
+        // updated method ignored for DS 1.1
+        final ReferenceMetadata rm3 = createReferenceMetadata( "test" );
+        rm3.setUpdated( "my_updated_method" );
+        final ComponentMetadata cm3 = createComponentMetadata11( Boolean.TRUE, null );
+        cm3.addDependency( rm3 );
+
+        // according to DS 1.2 must fail validation (FELIX-3648)
+        failDS10Validation( cm3, "updated", logger );
+    }
+
+
+    public void test_reference_updated_ds11_felix()
+    {
+        // updated method accepted for DS 1.1-felix
+        final ReferenceMetadata rm3 = createReferenceMetadata( "test" );
+        rm3.setUpdated( "my_updated_method" );
+        final ComponentMetadata cm3 = createComponentMetadata( DSVersion.DS11Felix, Boolean.TRUE, null );
+        cm3.addDependency( rm3 );
+
+        // validates fine and logs no message
+        cm3.validate( logger );
+
+        assertEquals( "my_updated_method", rm3.getUpdated() );
+    }
+
+
+    public void test_reference_updated_ds12()
+    {
+        // updated method accepted for DS 1.2
+        final ReferenceMetadata rm3 = createReferenceMetadata( "test" );
+        rm3.setUpdated( "my_updated_method" );
+        final ComponentMetadata cm3 = createComponentMetadata( DSVersion.DS12, Boolean.TRUE, null );
+        cm3.addDependency( rm3 );
+
+        // validates fine and logs no message
+        cm3.validate( logger );
+
+        assertEquals( "my_updated_method", rm3.getUpdated() );
+    }
+
+
+    public void test_duplicate_implementation_ds10()
+    {
+        final ComponentMetadata cm = createComponentMetadata( Boolean.TRUE, null );
+        cm.setImplementationClassName( "second.implementation.class" );
+        try
+        {
+            cm.validate( logger );
+            fail( "Expect validation failure for duplicate implementation element" );
+        }
+        catch ( ComponentException ce )
+        {
+            // expected
+        }
+    }
+
+
+    public void test_duplicate_implementation_ds11()
+    {
+        final ComponentMetadata cm = createComponentMetadata11( Boolean.TRUE, null );
+        cm.setImplementationClassName( "second.implementation.class" );
+        try
+        {
+            cm.validate( logger );
+            fail( "Expect validation failure for duplicate implementation element" );
+        }
+        catch ( ComponentException ce )
+        {
+            // expected
+        }
+    }
+
+
+    public void test_duplicate_service_ds10()
+    {
+        final ComponentMetadata cm = createComponentMetadata( Boolean.TRUE, null );
+        cm.setService( createServiceMetadata( Boolean.TRUE ) );
+        cm.setService( createServiceMetadata( Boolean.TRUE ) );
+        try
+        {
+            cm.validate( logger );
+            fail( "Expect validation failure for duplicate service element" );
+        }
+        catch ( ComponentException ce )
+        {
+            // expected
+        }
+    }
+
+
+    public void test_duplicate_service_ds11()
+    {
+        final ComponentMetadata cm = createComponentMetadata11( Boolean.TRUE, null );
+        cm.setService( createServiceMetadata( Boolean.TRUE ) );
+        cm.setService( createServiceMetadata( Boolean.TRUE ) );
+        try
+        {
+            cm.validate( logger );
+            fail( "Expect validation failure for duplicate service element" );
+        }
+        catch ( ComponentException ce )
+        {
+            // expected
+        }
+    }
+
+
+    public void test_property_no_name_ds10()
+    {
+        final ComponentMetadata cm = createComponentMetadata( null, null );
+        cm.addProperty( createPropertyMetadata( null, null, "" ) );
+        try
+        {
+            cm.validate( logger );
+            fail( "Expect validation failure for missing property name" );
+        }
+        catch ( ComponentException ce )
+        {
+            // expected
+        }
+    }
+
+
+    public void test_property_no_name_ds11()
+    {
+        final ComponentMetadata cm = createComponentMetadata11( null, null );
+        cm.addProperty( createPropertyMetadata( null, null, "" ) );
+        try
+        {
+            cm.validate( logger );
+            fail( "Expect validation failure for missing property name" );
+        }
+        catch ( ComponentException ce )
+        {
+            // expected
+        }
+    }
+
+
+    public void test_property_char_ds10() throws ComponentException
+    {
+        final ComponentMetadata cm = createComponentMetadata( null, null );
+        PropertyMetadata prop = createPropertyMetadata( "x", "Char", Integer.toString( 'x' ) );
+        cm.addProperty( prop );
+        cm.validate( logger );
+        assertTrue( prop.getValue() instanceof Character );
+        assertEquals( new Character( 'x' ), prop.getValue() );
+    }
+
+
+    public void test_property_char_ds11()
+    {
+        final ComponentMetadata cm = createComponentMetadata11( null, null );
+        cm.addProperty( createPropertyMetadata( "x", "Char", "x" ) );
+        try
+        {
+            cm.validate( logger );
+            fail( "Expect validation failure for illegal property type Char" );
+        }
+        catch ( ComponentException ce )
+        {
+            // expected
+        }
+    }
+
+
+    public void test_property_non_character()
+    {
+        final ComponentMetadata cm = createComponentMetadata( null, null );
+
+        assertProperty( "String", "Ein String", cm );
+        assertProperty( "Double", new Double( 2.5 ), cm );
+        assertProperty( "Float", new Float( 2.5 ), cm );
+        assertProperty( "Long", new Long( 2 ), cm );
+        assertProperty( "Integer", new Integer( 2 ), cm );
+        assertProperty( "Short", new Short( ( short ) 2 ), cm );
+        assertProperty( "Byte", new Byte( ( byte ) 2 ), cm );
+        assertProperty( "Boolean", Boolean.TRUE, cm );
+
+        assertPropertyFail( "Double", "x", cm );
+        assertPropertyFail( "Float", "x", cm );
+        assertPropertyFail( "Long", "x", cm );
+        assertPropertyFail( "Integer", "x", cm );
+        assertPropertyFail( "Short", "x", cm );
+        assertPropertyFail( "Byte", "x", cm );
+    }
+
+
+    public void test_property_array_non_character()
+    {
+        final ComponentMetadata cm = createComponentMetadata( null, null );
+        assertPropertyArray( "String", "Ein String", cm );
+        assertPropertyArray( "Double", new Double( 2.5 ), cm );
+        assertPropertyArray( "Float", new Float( 2.5 ), cm );
+        assertPropertyArray( "Long", new Long( 2 ), cm );
+        assertPropertyArray( "Integer", new Integer( 2 ), cm );
+        assertPropertyArray( "Short", new Short( ( short ) 2 ), cm );
+        assertPropertyArray( "Byte", new Byte( ( byte ) 2 ), cm );
+        assertPropertyArray( "Boolean", Boolean.TRUE, cm );
+
+        assertPropertyArrayFail( "Double", "x", cm );
+        assertPropertyArrayFail( "Float", "x", cm );
+        assertPropertyArrayFail( "Long", "x", cm );
+        assertPropertyArrayFail( "Integer", "x", cm );
+        assertPropertyArrayFail( "Short", "x", cm );
+        assertPropertyArrayFail( "Byte", "x", cm );
+    }
+
+
+    public void test_property_character_ds10()
+    {
+        final ComponentMetadata cm = createComponentMetadata( null, null );
+        try
+        {
+            createPropertyMetadata( "x", "Character", Integer.toString( 'x' ) ).validate( cm );
+            fail( "Expect validation failure for illegal property type Character" );
+        }
+        catch ( ComponentException ce )
+        {
+            // expected
+        }
+    }
+
+    public void test_configuration_pid_use_ds12()
+    {
+      ComponentMetadata cm = createComponentMetadata11( null, null );
+        try
+        {
+          cm.setConfigurationPid( new String[] {"configurationPid"} );
+          cm.validate( logger );
+          fail( "Expect validation failure for illegal configuration-pid usage in ds 1.1 namespace" );
+        }
+        catch ( ComponentException ce )
+        {
+            // expected
+        }
+
+        cm = createComponentMetadata12( null, null );
+        try
+        {
+          cm.setConfigurationPid( new String[] {"configurationPid"} );
+          cm.validate( logger );
+        }
+        catch ( ComponentException ce )
+        {
+          ce.printStackTrace();
+          fail( "Expect correct validation for legal configuration-pid usage in ds 1.2 or later namespace" );
+        }
+    }
+
+    public void test_get_configuration_pid_method()
+    {
+        doTest_get_configuration_pid_method(DSVersion.DS10);
+        doTest_get_configuration_pid_method(DSVersion.DS11);
+        doTest_get_configuration_pid_method(DSVersion.DS12);
+    }
+
+    private void doTest_get_configuration_pid_method(DSVersion specVersion)
+    {
+        // Make sure that getConfigurationPid returns the default component name (implementation class name).
+        // We only do this kind of test if spec is greater than ds 1.0, because in ds 1.0, the component name is mandatory.
+        if ( specVersion.isDS11() )
+        {
+            ComponentMetadata cm = new ComponentMetadata( specVersion );
+            try
+            {
+                cm.setImplementationClassName("implementation.class");
+                cm.setName( null );
+                cm.validate( logger );
+            }
+            catch ( ComponentException ce )
+            {
+                fail( "Expect correct validation for unnamed component" );
+            }
+            List<String> pid = cm.getConfigurationPid();
+            assertFalse( "Expect non-null configuration pid when component name is not specified", pid.isEmpty() );
+            assertEquals( "Expect configuration-pid to be equals to component implementation",
+                          "implementation.class", pid.get( 0 ) );
+        }
+
+        // Make sure that getConfigurationPid returns the name of the component, if specified
+        ComponentMetadata cm = new ComponentMetadata( specVersion );
+        try
+        {
+            cm.setImplementationClassName("implementation.class");
+            cm.setName("my.component.name");
+            cm.validate( logger );
+        }
+        catch ( ComponentException ce )
+        {
+            fail( "Expect correct validation for named component" );
+        }
+        List<String> pid = cm.getConfigurationPid();
+        assertFalse( "Expect non-null configuration pid when component name is not specified", pid.isEmpty() );
+        assertEquals( "Expect configuration-pid to be equals to component name",
+                      "my.component.name", pid.get( 0 ) );
+    }
+
+    public void test_property_character_ds11() throws ComponentException
+    {
+        final ComponentMetadata cm = createComponentMetadata11( null, null );
+        PropertyMetadata prop = createPropertyMetadata( "x", "Character", Integer.toString( 'x' ) );
+        cm.addProperty( prop );
+        cm.validate( logger );
+        assertTrue( prop.getValue() instanceof Character );
+        assertEquals( new Character( 'x' ), prop.getValue() );
+    }
+
+
+    //---------- Helper methods
+
+    // method also used by XmlHandlerTest
+    static void failDS10Validation( final ComponentMetadata metadata, final String expectedValidationReason,
+        final MockLogger logger )
+    {
+        try
+        {
+            metadata.validate( logger );
+            fail( "Expected validation failure for Component " + metadata.getName() + " containing '"
+                + expectedValidationReason + "'" );
+        }
+        catch ( ComponentException ce )
+        {
+            assertTrue(
+                "Expected validation reason to contain '" + expectedValidationReason + "': actual: " + ce.getMessage(),
+                ce.getMessage().indexOf( expectedValidationReason ) >= 0 );
+        }
+    }
+
+
+    // Creates Component Metadata for the given namespace
+    private ComponentMetadata createComponentMetadata( DSVersion dsVersion, Boolean immediate, String factory )
+    {
+        ComponentMetadata meta = new ComponentMetadata( dsVersion );
+        meta.setName( "place.holder" );
+        meta.setImplementationClassName( "place.holder.implementation" );
+        if ( immediate != null )
+        {
+            meta.setImmediate( immediate.booleanValue() );
+        }
+        if ( factory != null )
+        {
+            meta.setFactoryIdentifier( factory );
+        }
+        return meta;
+    }
+
+
+    // Creates DS 1.0 Component Metadata
+    private ComponentMetadata createComponentMetadata( Boolean immediate, String factory )
+    {
+        return createComponentMetadata( DSVersion.DS10, immediate, factory );
+    }
+
+
+    // Creates DS 1.1 Component Metadata
+    private ComponentMetadata createComponentMetadata11( Boolean immediate, String factory )
+    {
+        return createComponentMetadata( DSVersion.DS11, immediate, factory );
+    }
+
+    // Creates DS 1.2 Component Metadata
+    private ComponentMetadata createComponentMetadata12( Boolean immediate, String factory )
+    {
+        return createComponentMetadata( DSVersion.DS12, immediate, factory );
+    }
+
+    private ServiceMetadata createServiceMetadata( Boolean serviceFactory )
+    {
+        ServiceMetadata meta = new ServiceMetadata();
+        meta.addProvide( "place.holder.service" );
+        if ( serviceFactory != null )
+        {
+            meta.setServiceFactory( serviceFactory.booleanValue() );
+        }
+        return meta;
+    }
+
+
+    private ReferenceMetadata createReferenceMetadata( String name )
+    {
+        ReferenceMetadata meta = new ReferenceMetadata();
+        meta.setName( name );
+        meta.setInterface( "place.holder" );
+        return meta;
+    }
+
+
+    private PropertyMetadata createPropertyMetadata( String propertyName, String type, String value )
+    {
+        PropertyMetadata meta = new PropertyMetadata();
+        if ( propertyName != null )
+        {
+            meta.setName( propertyName );
+        }
+        if ( type != null )
+        {
+            meta.setType( type );
+        }
+        if ( value != null )
+        {
+            meta.setValue( value );
+        }
+        return meta;
+    }
+
+
+    private void assertProperty( String type, Object value, ComponentMetadata cmeta )
+    {
+        PropertyMetadata meta = createPropertyMetadata( "dummy", type, String.valueOf( value ) );
+        meta.validate( cmeta );
+        assertSame( value.getClass(), meta.getValue().getClass() );
+        assertEquals( value, meta.getValue() );
+    }
+
+
+    private void assertPropertyArray( String type, Object value, ComponentMetadata cmeta )
+    {
+        PropertyMetadata meta = createPropertyMetadata( "dummy", type, null );
+        meta.setValues( String.valueOf( value ) );
+        meta.validate( cmeta );
+
+        Object propVal = meta.getValue();
+        assertTrue( propVal.getClass().isArray() );
+        assertPrimitiveType( value.getClass(), propVal.getClass().getComponentType() );
+        assertEquals( 1, Array.getLength( propVal ) );
+        assertEquals( value, Array.get( propVal, 0 ) );
+    }
+
+
+    private void assertPropertyFail( String type, String value, ComponentMetadata cmeta )
+    {
+        try
+        {
+            PropertyMetadata meta = createPropertyMetadata( "dummy", type, value );
+            meta.validate( cmeta );
+            fail( "Expected validation failure for " + type + "=" + value );
+        }
+        catch ( ComponentException ce )
+        {
+            // expected
+        }
+    }
+
+
+    private void assertPropertyArrayFail( String type, String value, ComponentMetadata cmeta )
+    {
+        try
+        {
+            PropertyMetadata meta = createPropertyMetadata( "dummy", type, null );
+            meta.setValues( value );
+            meta.validate( cmeta );
+            fail( "Expected validation failure for " + type + "=" + value );
+        }
+        catch ( ComponentException ce )
+        {
+            // expected
+        }
+    }
+
+
+    private void assertPrimitiveType( final Class expectedBoxClass, final Class actualClass )
+    {
+        if ( expectedBoxClass == String.class )
+        {
+            assertEquals( expectedBoxClass, actualClass );
+        }
+        else if ( expectedBoxClass == Double.class )
+        {
+            assertEquals( Double.TYPE, actualClass );
+        }
+        else if ( expectedBoxClass == Float.class )
+        {
+            assertEquals( Float.TYPE, actualClass );
+        }
+        else if ( expectedBoxClass == Long.class )
+        {
+            assertEquals( Long.TYPE, actualClass );
+        }
+        else if ( expectedBoxClass == Integer.class )
+        {
+            assertEquals( Integer.TYPE, actualClass );
+        }
+        else if ( expectedBoxClass == Short.class )
+        {
+            assertEquals( Short.TYPE, actualClass );
+        }
+        else if ( expectedBoxClass == Byte.class )
+        {
+            assertEquals( Byte.TYPE, actualClass );
+        }
+        else if ( expectedBoxClass == Boolean.class )
+        {
+            assertEquals( Boolean.TYPE, actualClass );
+        }
+        else
+        {
+            fail( "Unexpected box class " + expectedBoxClass );
+        }
+    }
+}

Added: felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/metadata/XmlHandlerTest.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/metadata/XmlHandlerTest.java?rev=1689973&view=auto
==============================================================================
--- felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/metadata/XmlHandlerTest.java (added)
+++ felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/metadata/XmlHandlerTest.java Wed Jul  8 22:10:14 2015
@@ -0,0 +1,480 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.scr.impl.metadata;
+
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.Iterator;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.apache.felix.scr.impl.MockBundle;
+import org.apache.felix.scr.impl.MockLogger;
+import org.apache.felix.scr.impl.parser.KXml2SAXParser;
+import org.apache.felix.scr.impl.parser.ParseException;
+import org.osgi.service.component.ComponentException;
+import org.xmlpull.v1.XmlPullParserException;
+
+
+public class XmlHandlerTest extends TestCase
+{
+    private MockLogger logger;
+
+
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+
+        logger = new MockLogger();
+    }
+
+
+    public void test_unclosed_elements() throws Exception
+    {
+        try
+        {
+            readMetadataFromString( "<component name=\"n\"><implementation class=\"n\" /><component name=\"x\">" );
+            fail( "ParseException expected for unclosed elements" );
+        }
+        catch ( ParseException pe )
+        {
+            // exptected
+        }
+    }
+
+
+    public void test_no_opening_element() throws Exception
+    {
+        try
+        {
+            readMetadataFromString( "</component>" );
+            fail( "Exception expected for element without opening element" );
+        }
+        catch ( Exception p )
+        {
+            // exptected
+        }
+    }
+
+
+    public void test_interleaved_elements() throws Exception
+    {
+        try
+        {
+            readMetadataFromString( "<component name=\"n\" ><implementation class=\"n\"></component></implementation>" );
+            fail( "Exception expected for interleaved elements" );
+        }
+        catch ( Exception p )
+        {
+            // exptected
+        }
+    }
+
+
+    public void test_namespace_1_0_0() throws Exception
+    {
+        final List metadataList = readMetadataFromString( "<scr:component xmlns:scr=\"http://www.osgi.org/xmlns/scr/v1.0.0\" name=\"n\" ><implementation class=\"n\"/></scr:component>" );
+        assertEquals( "1 Descriptor expected", 1, metadataList.size() );
+        final ComponentMetadata metadata = ( ComponentMetadata ) metadataList.get( 0 );
+        assertEquals( "Expect NS 1.0.0", DSVersion.DS10, metadata.getDSVersion() );
+    }
+
+
+    public void test_namespace_1_1_0() throws Exception
+    {
+        final List metadataList = readMetadataFromString( "<scr:component xmlns:scr=\"http://www.osgi.org/xmlns/scr/v1.1.0\" name=\"n\" ><implementation class=\"n\"/></scr:component>" );
+        assertEquals( "1 Descriptor expected", 1, metadataList.size() );
+        final ComponentMetadata metadata = ( ComponentMetadata ) metadataList.get( 0 );
+        assertEquals( "Expect NS 1.1.0", DSVersion.DS11, metadata.getDSVersion() );
+    }
+
+
+    public void test_namespace_1_1_0_felix() throws Exception
+    {
+        final List metadataList = readMetadataFromString( "<scr:component xmlns:scr=\"http://felix.apache.org/xmlns/scr/v1.1.0-felix\" name=\"n\" ><implementation class=\"n\"/></scr:component>" );
+        assertEquals( "1 Descriptor expected", 1, metadataList.size() );
+        final ComponentMetadata metadata = ( ComponentMetadata ) metadataList.get( 0 );
+        assertEquals( "Expect NS 1.1.0-felix", DSVersion.DS11Felix, metadata.getDSVersion() );
+    }
+
+
+    public void test_namespace_1_2_0() throws Exception
+    {
+        final List metadataList = readMetadataFromString( "<scr:component xmlns:scr=\"http://www.osgi.org/xmlns/scr/v1.2.0\" name=\"n\" ><implementation class=\"n\"/></scr:component>" );
+        assertEquals( "1 Descriptor expected", 1, metadataList.size() );
+        final ComponentMetadata metadata = ( ComponentMetadata ) metadataList.get( 0 );
+        assertEquals( "Expect NS 1.2.0", DSVersion.DS12, metadata.getDSVersion() );
+    }
+
+
+    public void test_namespace_1_2_0_felix() throws Exception
+    {
+        final List metadataList = readMetadataFromString( "<scr:component xmlns:scr=\"http://felix.apache.org/xmlns/scr/v1.2.0-felix\" name=\"n\" ><implementation class=\"n\"/></scr:component>" );
+        assertEquals( "1 Descriptor expected", 1, metadataList.size() );
+        final ComponentMetadata metadata = ( ComponentMetadata ) metadataList.get( 0 );
+        assertEquals( "Expect NS 1.2.0-felix", DSVersion.DS12Felix, metadata.getDSVersion() );
+    }
+
+
+    public void test_namespace_unknown() throws Exception
+    {
+        final List metadataList = readMetadataFromString( "<components xmlns:scr=\"http://www.osgi.org/xmlns/scr/v1.1.0-felix\"><scr:component name=\"n\" ><implementation class=\"n\"/></scr:component></components>" );
+        assertTrue( "No Descriptor expected", metadataList.isEmpty() );
+    }
+
+
+    public void test_no_namespace() throws Exception
+    {
+        final List metadataList = readMetadata( "/components_no_namespace.xml" );
+        assertEquals( "1 Descriptor expected", 1, metadataList.size() );
+
+        final ComponentMetadata metadata = ( ComponentMetadata ) metadataList.get( 0 );
+        assertEquals( "Expect NS 1.0.0", DSVersion.DS10, metadata.getDSVersion() );
+    }
+
+
+    public void test_component_attributes_11() throws Exception
+    {
+        final List metadataList10 = readMetadata( "/components_activate_10.xml" );
+        assertEquals( "Component Descriptors", 4, metadataList10.size() );
+        ComponentMetadataTest.failDS10Validation( ( ComponentMetadata ) metadataList10.get( 0 ), "activate", logger );
+        ComponentMetadataTest.failDS10Validation( ( ComponentMetadata ) metadataList10.get( 1 ), "deactivate", logger );
+        ComponentMetadataTest.failDS10Validation( ( ComponentMetadata ) metadataList10.get( 2 ), "modified", logger );
+        ComponentMetadataTest.failDS10Validation( ( ComponentMetadata ) metadataList10.get( 3 ),
+            "configuration-policy", logger );
+
+        final List metadataList11 = readMetadata( "/components_activate_11.xml" );
+        assertEquals( "Component Descriptors", 1, metadataList11.size() );
+        final ComponentMetadata cm11 = ( ComponentMetadata ) metadataList11.get( 0 );
+        cm11.validate( logger );
+        assertEquals( "DS Version 1.1", DSVersion.DS11, cm11.getDSVersion() );
+        assertEquals( "Expected Activate Method set", "myactivate", cm11.getActivate() );
+        assertTrue( "Activate method expected to be declared", cm11.isActivateDeclared() );
+        assertEquals( "Expected Deactivate Method set", "mydeactivate", cm11.getDeactivate() );
+        assertTrue( "Activate method expected to be declared", cm11.isDeactivateDeclared() );
+        assertEquals( "Expected Modified Method set", "mymodified", cm11.getModified() );
+        assertEquals( "Expected Configuration Policy set", ComponentMetadata.CONFIGURATION_POLICY_IGNORE,
+            cm11.getConfigurationPolicy() );
+    }
+
+
+    public void test_component_no_name() throws Exception
+    {
+        final List metadataList10 = readMetadata( "/components_anonymous_10.xml" );
+        assertEquals( "Component Descriptors", 1, metadataList10.size() );
+        final ComponentMetadata cm10 = ( ComponentMetadata ) metadataList10.get( 0 );
+        try
+        {
+            cm10.validate( logger );
+            fail( "Expected validation failure for component without name" );
+        }
+        catch ( ComponentException ce )
+        {
+            // expected !!
+        }
+
+        final List metadataList11 = readMetadata( "/components_anonymous_11.xml" );
+        assertEquals( "Component Descriptors", 1, metadataList11.size() );
+        final ComponentMetadata cm11 = ( ComponentMetadata ) metadataList11.get( 0 );
+        cm11.validate( logger );
+        assertEquals( "Expected name equals class", cm11.getImplementationClassName(), cm11.getName() );
+    }
+
+
+    public void test_reference_no_name() throws Exception
+    {
+        final List metadataList10 = readMetadata( "/components_anonymous_10.xml" );
+        assertEquals( "Component Descriptors", 1, metadataList10.size() );
+        final ComponentMetadata cm10 = ( ComponentMetadata ) metadataList10.get( 0 );
+        try
+        {
+            cm10.validate( logger );
+            fail( "Expected validation failure for component without name" );
+        }
+        catch ( ComponentException ce )
+        {
+            // expected !!
+        }
+
+        final List metadataList11 = readMetadata( "/components_anonymous_11.xml" );
+        assertEquals( "Component Descriptors", 1, metadataList11.size() );
+        final ComponentMetadata cm11 = ( ComponentMetadata ) metadataList11.get( 0 );
+        cm11.validate( logger );
+        assertEquals( "Expected name equals class", cm11.getImplementationClassName(), cm11.getName() );
+    }
+
+
+    public void test_all_elements_10() throws Exception
+    {
+        final List metadataList10 = readMetadata( "/components_all_elements_10.xml" );
+        assertEquals( "Component Descriptors", 1, metadataList10.size() );
+        final ComponentMetadata cm10 = ( ComponentMetadata ) metadataList10.get( 0 );
+
+        // dont validate this, we test the raw reading
+
+        // ds namespace
+        assertEquals( "DS Version 1.0", DSVersion.DS10, cm10.getDSVersion() );
+        assertFalse( "DS Version 1.0", cm10.getDSVersion().isDS11() );
+
+        // base component attributes
+        assertEquals( "component name", true, cm10.isEnabled() );
+        assertEquals( "component name", "components.all.name", cm10.getName() );
+        assertEquals( "component name", "components.all.factory", cm10.getFactoryIdentifier() );
+        assertEquals( "component name", true, cm10.isFactory() );
+        assertEquals( "component name", true, cm10.isImmediate() );
+
+        // ds 1.1 elements
+        assertEquals( "activate method", "myactivate", cm10.getActivate() );
+        assertEquals( "deactivate method", "mydeactivate", cm10.getDeactivate() );
+        assertTrue( "Activate method expected to be declared", cm10.isActivateDeclared() );
+        assertEquals( "modified method", "mymodified", cm10.getModified() );
+        assertTrue( "Deactivate method expected to be declared", cm10.isDeactivateDeclared() );
+        assertEquals( "configuration policy", "ignore", cm10.getConfigurationPolicy() );
+
+        // from the implementation element
+        assertEquals( "component name", "components.all.impl", cm10.getImplementationClassName() );
+
+        // property setting
+        final PropertyMetadata prop = getPropertyMetadata( cm10, "prop" );
+        prop.validate( cm10 ); // property value requires validation
+        assertNotNull( "prop exists", prop );
+        assertEquals( "prop type", "Integer", prop.getType() );
+        assertEquals( "prop value", 1234, ( ( Integer ) prop.getValue() ).intValue() );
+
+        final PropertyMetadata file_property = getPropertyMetadata( cm10, "file.property" );
+        file_property.validate( cm10 ); // property value requires validation
+        assertNotNull( "file.property exists", file_property );
+        assertEquals( "file.property type", "String", file_property.getType() );
+        assertEquals( "file.property value", "Property from File", file_property.getValue() );
+
+        // service setup
+        final ServiceMetadata sm = cm10.getServiceMetadata();
+        sm.validate( cm10 ); // service metadata requires validation to set scope properly
+        assertNotNull( "service", sm );
+        assertEquals( "servicefactory", ServiceMetadata.Scope.bundle, sm.getScope() );
+        assertEquals( "1 interface", 1, sm.getProvides().length );
+        assertEquals( "service interface", "components.all.service", sm.getProvides()[0] );
+
+        // references - basic
+        final ReferenceMetadata rm = getReference( cm10, "ref.name" );
+        assertNotNull( "refeference ref.name", rm );
+        assertEquals( "ref.name name", "ref.name", rm.getName() );
+        assertEquals( "ref.name interface", "ref.service", rm.getInterface() );
+        assertEquals( "ref.name cardinality", "0..n", rm.getCardinality() );
+        assertEquals( "ref.name policy", "dynamic", rm.getPolicy() );
+        assertEquals( "ref.name target", "ref.target", rm.getTarget() );
+        assertEquals( "ref.name target prop name", "ref.name.target", rm.getTargetPropertyName() );
+        assertEquals( "ref.name bind method", "ref_bind", rm.getBind() );
+        assertEquals( "ref.name undbind method", "ref_unbind", rm.getUnbind() );
+
+        // references - cardinality side properties (isOptional, isMultiple)
+        final ReferenceMetadata rm01 = getReference( cm10, "ref.01" );
+        assertNotNull( "refeference ref.01", rm01 );
+        assertEquals( "ref.01 cardinality", "0..1", rm01.getCardinality() );
+        final ReferenceMetadata rm11 = getReference( cm10, "ref.11" );
+        assertNotNull( "refeference ref.11", rm11 );
+        assertEquals( "ref.11 cardinality", "1..1", rm11.getCardinality() );
+        final ReferenceMetadata rm0n = getReference( cm10, "ref.0n" );
+        assertNotNull( "refeference ref.0n", rm0n );
+        assertEquals( "ref.0n cardinality", "0..n", rm0n.getCardinality() );
+        final ReferenceMetadata rm1n = getReference( cm10, "ref.1n" );
+        assertNotNull( "refeference ref.1n", rm1n );
+        assertEquals( "ref.1n cardinality", "1..n", rm1n.getCardinality() );
+    }
+
+
+    public void test_duplicate_implementation_class_10() throws Exception
+    {
+        final List metadataList10 = readMetadata( "/components_duplicate_implementation_10.xml" );
+        assertEquals( "Component Descriptors", 1, metadataList10.size() );
+        final ComponentMetadata cm10 = ( ComponentMetadata ) metadataList10.get( 0 );
+        try
+        {
+            cm10.validate( logger );
+            fail( "Expect validation failure for duplicate implementation element" );
+        }
+        catch ( ComponentException ce )
+        {
+            // expected
+        }
+    }
+
+
+    public void test_duplicate_implementation_class_11() throws Exception
+    {
+        final List metadataList11 = readMetadata( "/components_duplicate_implementation_11.xml" );
+        assertEquals( "Component Descriptors", 1, metadataList11.size() );
+        final ComponentMetadata cm11 = ( ComponentMetadata ) metadataList11.get( 0 );
+        try
+        {
+            cm11.validate( logger );
+            fail( "Expect validation failure for duplicate implementation element" );
+        }
+        catch ( ComponentException ce )
+        {
+            // expected
+        }
+    }
+
+
+    public void test_duplicate_service_10() throws Exception
+    {
+        final List metadataList10 = readMetadata( "/components_duplicate_service_10.xml" );
+        assertEquals( "Component Descriptors", 1, metadataList10.size() );
+        final ComponentMetadata cm10 = ( ComponentMetadata ) metadataList10.get( 0 );
+        try
+        {
+            cm10.validate( logger );
+            fail( "Expect validation failure for duplicate service element" );
+        }
+        catch ( ComponentException ce )
+        {
+            // expected
+        }
+    }
+
+
+    public void test_duplicate_service_11() throws Exception
+    {
+        final List metadataList11 = readMetadata( "/components_duplicate_service_11.xml" );
+        assertEquals( "Component Descriptors", 1, metadataList11.size() );
+        final ComponentMetadata cm11 = ( ComponentMetadata ) metadataList11.get( 0 );
+        try
+        {
+            cm11.validate( logger );
+            fail( "Expect validation failure for duplicate service element" );
+        }
+        catch ( ComponentException ce )
+        {
+            // expected
+        }
+    }
+
+
+    //---------- helper
+
+    private List readMetadata( final Reader reader ) throws IOException, ComponentException, XmlPullParserException,
+        Exception
+    {
+
+        try
+        {
+            final KXml2SAXParser parser = new KXml2SAXParser( reader );
+
+            XmlHandler handler = new XmlHandler( new MockBundle(), logger, false, false );
+            parser.parseXML( handler );
+
+            return handler.getComponentMetadataList();
+        }
+        finally
+        {
+            try
+            {
+                reader.close();
+            }
+            catch ( IOException ignore )
+            {
+            }
+        }
+    }
+
+
+    private List readMetadata( String filename ) throws IOException, ComponentException, XmlPullParserException,
+        Exception
+    {
+        BufferedReader in = new BufferedReader( new InputStreamReader( getClass().getResourceAsStream( filename ),
+            "UTF-8" ) );
+        return readMetadata( in );
+    }
+
+
+    private List readMetadataFromString( final String source ) throws IOException, ComponentException,
+        XmlPullParserException, Exception
+    {
+        return readMetadata( new StringReader( source ) );
+    }
+
+
+    private ReferenceMetadata getReference( final ComponentMetadata cm, final String name )
+    {
+        List rmlist = cm.getDependencies();
+        for ( Iterator rmi = rmlist.iterator(); rmi.hasNext(); )
+        {
+            ReferenceMetadata rm = ( ReferenceMetadata ) rmi.next();
+            if ( name.equals( rm.getName() ) )
+            {
+                return rm;
+            }
+        }
+
+        // none found
+        return null;
+    }
+
+
+    private PropertyMetadata getPropertyMetadata( final ComponentMetadata cm, final String name )
+    {
+        List pmlist = cm.getPropertyMetaData();
+        for ( Iterator pmi = pmlist.iterator(); pmi.hasNext(); )
+        {
+            PropertyMetadata pm = ( PropertyMetadata ) pmi.next();
+            if ( name.equals( pm.getName() ) )
+            {
+                return pm;
+            }
+        }
+
+        // none found
+        return null;
+    }
+
+    public void test_properties_11() throws Exception
+    {
+        final List metadataList11 = readMetadata( "/components_properties_11.xml" );
+        assertEquals( "Component Descriptors", 1, metadataList11.size() );
+        final ComponentMetadata cm11 = ( ComponentMetadata ) metadataList11.get( 0 );
+
+        // dont validate this, we test the raw reading
+
+        // ds namespace
+        assertEquals( "DS Version 1.1", DSVersion.DS11, cm11.getDSVersion() );
+        assertTrue( "DS Version 1.1", cm11.getDSVersion().isDS11() );
+
+        assertEquals( "component name", "DummyClass", cm11.getName() );
+        assertEquals( "component name", "DummyClass", cm11.getImplementationClassName() );
+
+        // property setting
+        final PropertyMetadata prop = getPropertyMetadata( cm11, "char_array_property" );
+        assertNotNull( "prop exists", prop );
+        assertEquals( "prop type", "Character", prop.getType() );
+        prop.validate( cm11 ); // property value conversion requires validation
+        Object value = prop.getValue();
+        assertTrue( "prop array", value instanceof char[] );
+        char[] chars = ( char[] ) value;
+        assertEquals( "prop number of values", 2, chars.length );
+        assertEquals( "prop value 0", 'A', chars[0] );
+        assertEquals( "prop value 1", 'B', chars[1] );
+    }
+
+}

Added: felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/metadata/instances/AcceptMethod.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/metadata/instances/AcceptMethod.java?rev=1689973&view=auto
==============================================================================
--- felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/metadata/instances/AcceptMethod.java (added)
+++ felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/metadata/instances/AcceptMethod.java Wed Jul  8 22:10:14 2015
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.scr.impl.metadata.instances;
+
+
+/**
+ * The <code>AcceptMethod</code> class provides methods, which are used to
+ * test the ReflectionHelper.acceptMethod() method.
+ */
+public class AcceptMethod
+{
+
+    public void public_void()
+    {
+    }
+
+
+    public String public_string()
+    {
+        return "";
+    }
+
+
+    protected void protected_void()
+    {
+    }
+
+
+    protected String protected_string()
+    {
+        return "";
+    }
+
+
+    private void private_void()
+    {
+    }
+
+
+    private String private_string()
+    {
+        return "";
+    }
+
+
+    void package_void()
+    {
+    }
+
+
+    String package_string()
+    {
+        return "";
+    }
+}

Added: felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/metadata/instances/BaseObject.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/metadata/instances/BaseObject.java?rev=1689973&view=auto
==============================================================================
--- felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/metadata/instances/BaseObject.java (added)
+++ felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/metadata/instances/BaseObject.java Wed Jul  8 22:10:14 2015
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.scr.impl.metadata.instances;
+
+
+import java.util.Map;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.service.component.ComponentContext;
+
+
+/**
+ * The <code>BaseObject</code> is a base class providing a number of methods
+ * to check. All methods take various combinations of arguments and return
+ * a single helper string to indicate what method has been called.
+ */
+public class BaseObject
+{
+
+    private String m_calledMethod;
+
+
+    public String getCalledMethod()
+    {
+        String cm = m_calledMethod;
+        m_calledMethod = null;
+        return cm;
+    }
+
+
+    protected void setCalledMethod(String calledMethod) {
+        m_calledMethod = calledMethod;
+    }
+
+    private void activate_no_arg()
+    {
+        setCalledMethod( "activate_no_arg" );
+    }
+
+
+    protected void activate_comp( ComponentContext ctx )
+    {
+        setCalledMethod( "activate_comp" );
+    }
+
+
+    void activate_comp_bundle( ComponentContext ctx, BundleContext bundle )
+    {
+        setCalledMethod( "activate_comp_bundle" );
+    }
+
+
+    protected void activate_suitable( ComponentContext ctx )
+    {
+        setCalledMethod( "activate_suitable" );
+    }
+
+    //precedence rules
+
+    private void activate_precedence_1( ComponentContext ctx )
+    {
+        setCalledMethod("activate_precedence_1_comp");
+    }
+
+    void activate_precedence_1( BundleContext bundleContext )
+    {
+        setCalledMethod("activate_precedence_1_bundleContext");
+    }
+
+    protected void activate_precedence_1( Map map)
+    {
+        setCalledMethod("activate_precedence_1_map");
+    }
+
+    private void activate_precedence_2( Map map )
+    {
+        setCalledMethod("activate_precedence_2_map");
+    }
+
+    void activate_precedence_2( ComponentContext ctx, BundleContext bundle )
+    {
+        setCalledMethod("activate_precedence_2_comp_bundleContext");
+    }
+
+    protected void activate_precedence_2()
+    {
+        setCalledMethod("activate_precedence_2_empty");
+    }
+
+
+    public @interface Ann1 { }
+    public @interface Ann2 { }
+   
+    void activate_13_2_annotations(ComponentContext cc, Ann1 a1, BundleContext c, Ann2 a2, Map<String, Object> map, ComponentContext cc2) {
+        setCalledMethod("activate_13_2_annotations");
+    }
+}

Added: felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/metadata/instances/Level1Object.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/metadata/instances/Level1Object.java?rev=1689973&view=auto
==============================================================================
--- felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/metadata/instances/Level1Object.java (added)
+++ felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/metadata/instances/Level1Object.java Wed Jul  8 22:10:14 2015
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.scr.impl.metadata.instances;
+
+
+import java.util.Map;
+
+import org.osgi.framework.BundleContext;
+
+
+public class Level1Object extends BaseObject
+{
+
+    private void activate_level1_bundle( BundleContext ctx )
+    {
+        setCalledMethod("activate_level1_bundle");
+    }
+
+
+    protected void activate_level1_map( Map props )
+    {
+        setCalledMethod("activate_level1_map");
+    }
+
+}

Added: felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/metadata/instances/Level3Object.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/metadata/instances/Level3Object.java?rev=1689973&view=auto
==============================================================================
--- felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/metadata/instances/Level3Object.java (added)
+++ felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/metadata/instances/Level3Object.java Wed Jul  8 22:10:14 2015
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.scr.impl.metadata.instances;
+
+
+import java.util.Map;
+
+import org.apache.felix.scr.impl.metadata.instances2.Level2Object;
+import org.osgi.service.component.ComponentContext;
+
+
+public class Level3Object extends Level2Object
+{
+
+    private void activate_comp_map( ComponentContext ctx, Map map )
+    {
+        setCalledMethod("activate_comp_map");
+    }
+
+
+    // this method should not be found, since the method taking a
+    // Map has higher precedence
+    public void activate_collision()
+    {
+        setCalledMethod("not_expected_to_be_found");
+    }
+
+
+    public void activate_collision( Map map )
+    {
+        setCalledMethod("activate_collision");
+    }
+}

Added: felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/metadata/instances2/Level2Object.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/metadata/instances2/Level2Object.java?rev=1689973&view=auto
==============================================================================
--- felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/metadata/instances2/Level2Object.java (added)
+++ felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/metadata/instances2/Level2Object.java Wed Jul  8 22:10:14 2015
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.scr.impl.metadata.instances2;
+
+
+import java.util.Map;
+
+import org.apache.felix.scr.impl.metadata.instances.Level1Object;
+import org.osgi.service.component.ComponentContext;
+
+
+public class Level2Object extends Level1Object
+{
+
+    private void activate_comp_map( ComponentContext ctx, Map map )
+    {
+        setCalledMethod( "activate_comp_map" );
+    }
+
+
+    // this method should not be found, since the method taking a
+    // Map has higher precedence
+    public void activate_collision()
+    {
+        setCalledMethod( "not_expected_to_be_found" );
+    }
+
+
+    public void activate_collision( Map map )
+    {
+        setCalledMethod( "activate_collision" );
+    }
+
+
+    private void activate_suitable( Map map )
+    {
+        setCalledMethod( "activate_suitable" );
+    }
+
+    private void activate_comp_unsuitable( ComponentContext ctx )
+    {
+        setCalledMethod( "activate_comp_unsuitable" );
+    }
+
+    protected void activate_comp_unsuitable( Map map )
+    {
+        setCalledMethod( "activate_comp_unsuitable" );
+    }
+}

Added: felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/runtime/ServiceComponentRuntimeImplTest.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/runtime/ServiceComponentRuntimeImplTest.java?rev=1689973&view=auto
==============================================================================
--- felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/runtime/ServiceComponentRuntimeImplTest.java (added)
+++ felix/sandbox/pderop/dependencymanager.ds/org.apache.felix.dependencymanager.ds/test/org/apache/felix/scr/impl/runtime/ServiceComponentRuntimeImplTest.java Wed Jul  8 22:10:14 2015
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.scr.impl.runtime;
+
+import java.lang.reflect.Method;
+import java.util.Arrays;
+
+import junit.framework.TestCase;
+
+import org.mockito.Mockito;
+import org.osgi.dto.DTO;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.dto.BundleDTO;
+import org.osgi.framework.dto.ServiceReferenceDTO;
+
+public class ServiceComponentRuntimeImplTest extends TestCase
+{
+
+    /* in case behavior is supposed to actually involve copying
+    public void testCopy()
+    {
+        ServiceComponentRuntimeImpl scr = new ServiceComponentRuntimeImpl(null, null);
+        assertEquals(1, scr.convert(1));
+        assertEquals("foo", scr.convert("foo"));
+        equalCopy(new int[] {1, 2, 3}, scr);
+        equalCopy(new byte[] {1, 2, 3}, scr);
+        equalCopy(new String[] {"1", "2", "3"}, scr);
+        equalCopy(new Long[] {1l, 2l, 3l}, scr);
+    }
+
+    private void equalCopy(Object o1, ServiceComponentRuntimeImpl scr)
+    {
+        Object o2 = scr.convert(o1);
+        assertEquals("expected same length", Array.getLength(o1), Array.getLength(o2));
+        assertEquals("expceted same component type", o1.getClass().getComponentType(), o2.getClass().getComponentType());
+        for (int i = 0; i < Array.getLength(o1); i++)
+        {
+            assertEquals("expected same value at " + i, Array.get(o1, i), Array.get(o2, i));
+        }
+
+    }
+    */
+
+    public void testNullBundleServiceReferenceDTO() throws Exception
+    {
+        ServiceReference<?> sr = Mockito.mock(ServiceReference.class);
+        Mockito.when(sr.getProperty(Constants.SERVICE_ID)).thenReturn(327L);
+        Mockito.when(sr.getPropertyKeys()).thenReturn(new String[] {});
+
+        ServiceComponentRuntimeImpl scr = new ServiceComponentRuntimeImpl(null, null);
+        Method m = scr.getClass().getDeclaredMethod("serviceReferenceToDTO", ServiceReference.class);
+        m.setAccessible(true);
+        ServiceReferenceDTO dto = (ServiceReferenceDTO) m.invoke(scr, sr);
+        assertEquals(-1, dto.bundle);
+    }
+
+    public void testNullBundleServiceReferenceDTO2() throws Exception
+    {
+        Bundle b = Mockito.mock(Bundle.class);
+        Mockito.when(b.getBundleId()).thenReturn(42L);
+
+        ServiceReference<?> sr = Mockito.mock(ServiceReference.class);
+        Mockito.when(sr.getProperty(Constants.SERVICE_ID)).thenReturn(327L);
+        Mockito.when(sr.getPropertyKeys()).thenReturn(new String[] {});
+        Mockito.when(sr.getBundle()).thenReturn(b);
+
+        ServiceComponentRuntimeImpl scr = new ServiceComponentRuntimeImpl(null, null);
+        Method m = scr.getClass().getDeclaredMethod("serviceReferenceToDTO", ServiceReference.class);
+        m.setAccessible(true);
+        ServiceReferenceDTO dto = (ServiceReferenceDTO) m.invoke(scr, sr);
+        assertEquals(42, dto.bundle);
+    }
+
+    public void testConvert()
+    {
+        ServiceComponentRuntimeImpl scr = new ServiceComponentRuntimeImpl(null, null);
+        same("foo", scr);
+        same(Boolean.TRUE, scr);
+        same(1, scr);
+        same(1l, scr);
+        same(new ServiceReferenceDTO(), scr);
+        same( new String[] {"foo", "bar"}, scr);
+        same( new Boolean[] {true, false}, scr);
+        same( new Long[] {1l, 2l}, scr);
+        same( new DTO[] {new ServiceReferenceDTO(), new BundleDTO()}, scr);
+        equalsToString(new int[] {1, 2}, scr);
+        equalsToString(Arrays.asList(new int[] {1, 2}), scr);
+        equalsToString(Arrays.asList(new String[] {"foo", "bar"}), scr);
+    }
+
+    private void equalsToString(Object o, ServiceComponentRuntimeImpl scr)
+    {
+        assertEquals(String.valueOf(o), scr.convert(o));
+    }
+
+    private void same(Object o, ServiceComponentRuntimeImpl scr)
+    {
+        assertSame(o, scr.convert(o));
+    }
+
+}