You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cz...@apache.org on 2017/01/10 14:59:45 UTC
svn commit: r1778137 [1/2] - in /felix/trunk/osgi-r7/scr: ./
src/main/java/org/apache/felix/scr/impl/
src/main/java/org/apache/felix/scr/impl/helper/
src/main/java/org/apache/felix/scr/impl/inject/
src/main/java/org/apache/felix/scr/impl/inject/field/ ...
Author: cziegeler
Date: Tue Jan 10 14:59:45 2017
New Revision: 1778137
URL: http://svn.apache.org/viewvc?rev=1778137&view=rev
Log:
FELIX-5354 : Implement Declarative Service Updates for R7 (RFC 222)
Added:
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ComponentMethods.java
- copied, changed from r1778136, felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/ComponentMethods.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ConstructorMethod.java
- copied, changed from r1778136, felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/ConstructorMethod.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/InitReferenceMethod.java
- copied, changed from r1778136, felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/InitReferenceMethod.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/LifecycleMethod.java
- copied, changed from r1778136, felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/ComponentMethod.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/MethodResult.java
- copied, changed from r1778136, felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/MethodResult.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ReferenceMethod.java
- copied, changed from r1778136, felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/ReferenceMethod.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ReferenceMethods.java
- copied, changed from r1778136, felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/ReferenceMethods.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ValueUtils.java (with props)
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/field/
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/field/FieldHandler.java
- copied, changed from r1778136, felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/FieldHandler.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/field/FieldMethods.java
- copied, changed from r1778136, felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/FieldMethods.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/field/FieldUtils.java
- copied, changed from r1778136, felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/FieldUtils.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/methods/
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/methods/ActivateMethod.java
- copied, changed from r1778136, felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ActivateMethod.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/methods/BaseMethod.java
- copied, changed from r1778136, felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/BaseMethod.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/methods/BindMethod.java
- copied, changed from r1778136, felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/BindMethod.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/methods/BindMethods.java
- copied, changed from r1778136, felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/BindMethods.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/methods/DeactivateMethod.java
- copied, changed from r1778136, felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/DeactivateMethod.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/methods/ModifiedMethod.java
- copied, changed from r1778136, felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ModifiedMethod.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/methods/UnbindMethod.java
- copied, changed from r1778136, felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/UnbindMethod.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/methods/UpdatedMethod.java
- copied, changed from r1778136, felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/UpdatedMethod.java
felix/trunk/osgi-r7/scr/src/test/java/org/apache/felix/scr/impl/inject/methods/
felix/trunk/osgi-r7/scr/src/test/java/org/apache/felix/scr/impl/inject/methods/ActivateMethodTest.java
- copied, changed from r1778136, felix/trunk/osgi-r7/scr/src/test/java/org/apache/felix/scr/impl/inject/ActivateMethodTest.java
Removed:
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/ComponentMethod.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/ComponentMethods.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/ConstructorMethod.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/InitReferenceMethod.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/MethodResult.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/ReferenceMethod.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/ReferenceMethods.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ActivateMethod.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/BaseMethod.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/BindMethod.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/BindMethods.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/DeactivateMethod.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/FieldHandler.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/FieldMethods.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/FieldUtils.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ModifiedMethod.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/UnbindMethod.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/UpdatedMethod.java
felix/trunk/osgi-r7/scr/src/test/java/org/apache/felix/scr/impl/inject/ActivateMethodTest.java
Modified:
felix/trunk/osgi-r7/scr/bnd.bnd
felix/trunk/osgi-r7/scr/pom.xml
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/Activator.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/ComponentRegistry.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/ComponentRegistryKey.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/SimpleLogger.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/BindParameters.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ClassUtils.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ComponentMethodsImpl.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ConstructorMethodImpl.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/DuplexReferenceMethods.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/manager/ConfigurableComponentHolder.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/manager/PrototypeServiceFactoryComponentManager.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/manager/ThreadDump.java
felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/metadata/ComponentMetadata.java
felix/trunk/osgi-r7/scr/src/test/java/org/apache/felix/scr/impl/PackageIsolationTest.java
felix/trunk/osgi-r7/scr/src/test/java/org/apache/felix/scr/impl/inject/BindMethodTest.java
felix/trunk/osgi-r7/scr/src/test/java/org/apache/felix/scr/impl/manager/ConfiguredComponentHolderTest.java
felix/trunk/osgi-r7/scr/src/test/java/org/apache/felix/scr/impl/manager/SingleComponentManagerTest.java
Modified: felix/trunk/osgi-r7/scr/bnd.bnd
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/scr/bnd.bnd?rev=1778137&r1=1778136&r2=1778137&view=diff
==============================================================================
--- felix/trunk/osgi-r7/scr/bnd.bnd (original)
+++ felix/trunk/osgi-r7/scr/bnd.bnd Tue Jan 10 14:59:45 2017
@@ -13,9 +13,9 @@ Provide-Capability: osgi.extender;\
Export-Package: org.apache.felix.scr.component;version=1.1.0;provide:=true, \
org.apache.felix.scr.info;version=1.0.0;provide:=true, \
- org.osgi.service.component;version=1.3;-split-package:=first;provide:=true, \
- org.osgi.service.component.runtime;version=1.3;provide:=true, \
- org.osgi.service.component.runtime.dto;version=1.3;provide:=true, \
+ org.osgi.service.component;version=1.4;provide:=true, \
+ org.osgi.service.component.runtime;version=1.4;provide:=true, \
+ org.osgi.service.component.runtime.dto;version=1.4;provide:=true, \
org.osgi.util.function;version=1.0, \
org.osgi.util.promise;version=1.0
@@ -30,7 +30,7 @@ Private-Package: org.apache.felix.scr.im
# optional import for Gogo annotations
# The Felix Shell support is optional
Import-Package: \
- org.osgi.service.cm;version="[1.5,2)";resolution:=optional, \
+ org.osgi.service.cm;version="[1.6,2)";resolution:=optional, \
org.osgi.service.log;version="[1.3,2)";resolution:=optional, \
org.osgi.service.metatype;version="[1.1,2)";resolution:=optional, \
org.osgi.service.packageadmin;version="[1.2,2)";resolution:=optional, \
@@ -40,7 +40,7 @@ Import-Package: \
*
DynamicImport-Package: \
- org.osgi.service.cm;version="[1.2,2)", \
+ org.osgi.service.cm;version="[1.6,2)", \
org.osgi.service.metatype;version="[1.1,2)"
Embed-Dependency: kxml2;inline=org/kxml2/io/KXmlParser.class|org/xmlpull/v1/XmlPull**
Modified: felix/trunk/osgi-r7/scr/pom.xml
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/scr/pom.xml?rev=1778137&r1=1778136&r2=1778137&view=diff
==============================================================================
--- felix/trunk/osgi-r7/scr/pom.xml (original)
+++ felix/trunk/osgi-r7/scr/pom.xml Tue Jan 10 14:59:45 2017
@@ -256,7 +256,7 @@
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
- <version>2.5.3</version>
+ <version>3.2.0</version>
<extensions>true</extensions>
<configuration>
<instructions>
@@ -315,25 +315,6 @@
<excludePackageNames>*.impl</excludePackageNames>
</configuration>
</plugin>
-<!-- Disable for now
- <plugin>
- <groupId>org.apache.aries.versioning</groupId>
- <artifactId>org.apache.aries.versioning.plugin</artifactId>
- <version>0.1.0</version>
- <executions>
- <execution>
- <id>default-verify</id>
- <phase>verify</phase>
- <goals>
- <goal>version-check</goal>
- </goals>
- <configuration>
- <oldArtifact>org.apache.felix:org.apache.felix.scr:1.6.2</oldArtifact>
- </configuration>
- </execution>
- </executions>
- </plugin>
--->
</plugins>
</build>
Modified: felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/Activator.java
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/Activator.java?rev=1778137&r1=1778136&r2=1778137&view=diff
==============================================================================
--- felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/Activator.java (original)
+++ felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/Activator.java Tue Jan 10 14:59:45 2017
@@ -523,7 +523,7 @@ public class Activator extends AbstractE
PrintStream out = ( level == LogService.LOG_ERROR )? System.err: System.out;
// level as a string
- StringBuffer buf = new StringBuffer();
+ StringBuilder buf = new StringBuilder();
switch (level)
{
case ( LogService.LOG_DEBUG ):
Modified: felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/ComponentRegistry.java
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/ComponentRegistry.java?rev=1778137&r1=1778136&r2=1778137&view=diff
==============================================================================
--- felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/ComponentRegistry.java (original)
+++ felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/ComponentRegistry.java Tue Jan 10 14:59:45 2017
@@ -29,8 +29,8 @@ import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
-import org.apache.felix.scr.impl.helper.ComponentMethods;
import org.apache.felix.scr.impl.helper.SimpleLogger;
+import org.apache.felix.scr.impl.inject.ComponentMethods;
import org.apache.felix.scr.impl.inject.ComponentMethodsImpl;
import org.apache.felix.scr.impl.manager.AbstractComponentManager;
import org.apache.felix.scr.impl.manager.ComponentActivator;
@@ -209,7 +209,7 @@ public class ComponentRegistry
Bundle cBundle = existingRegistration.getActivator().getBundleContext().getBundle();
ComponentMetadata cMeta = existingRegistration.getComponentMetadata();
- StringBuffer buf = new StringBuffer( message );
+ StringBuilder buf = new StringBuilder( message );
buf.append( " by Bundle " ).append( cBundle.getBundleId() );
if ( cBundle.getSymbolicName() != null )
{
@@ -433,9 +433,9 @@ public class ComponentRegistry
}
@Override
- protected ComponentMethods createComponentMethods()
+ protected ComponentMethods<S> createComponentMethods()
{
- return new ComponentMethodsImpl();
+ return new ComponentMethodsImpl<S>();
}
}
@@ -537,7 +537,7 @@ public class ComponentRegistry
@Override
public String toString()
{
- StringBuffer sb = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
for (ServiceReference<?> sr: info)
{
sb.append("ServiceReference: ").append(sr).append("\n");
Modified: felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/ComponentRegistryKey.java
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/ComponentRegistryKey.java?rev=1778137&r1=1778136&r2=1778137&view=diff
==============================================================================
--- felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/ComponentRegistryKey.java (original)
+++ felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/ComponentRegistryKey.java Tue Jan 10 14:59:45 2017
@@ -23,8 +23,8 @@ import org.osgi.framework.Bundle;
/**
- * The <code>ComponentRegistryKey</code> isused as the key in the
- * component register to register components by their names.
+ * The <code>ComponentRegistryKey</code> is used as the key in the
+ * component registry to register components by their names.
* <p>
* Two instances of this class are equal if they are the same or if there
* component name and bundle ID is equal.
@@ -78,6 +78,4 @@ final class ComponentRegistryKey
{
return componentName;
}
-
-
}
Modified: felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/SimpleLogger.java
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/SimpleLogger.java?rev=1778137&r1=1778136&r2=1778137&view=diff
==============================================================================
--- felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/SimpleLogger.java (original)
+++ felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/SimpleLogger.java Tue Jan 10 14:59:45 2017
@@ -16,12 +16,10 @@
* specific language governing permissions and limitations
* under the License.
*/
-
-
package org.apache.felix.scr.impl.helper;
/**
- * @version $Rev:$ $Date:$
+ * @version $Rev$ $Date$
*/
public interface SimpleLogger
{
Modified: felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/BindParameters.java
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/BindParameters.java?rev=1778137&r1=1778136&r2=1778137&view=diff
==============================================================================
--- felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/BindParameters.java (original)
+++ felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/BindParameters.java Tue Jan 10 14:59:45 2017
@@ -32,12 +32,12 @@ public class BindParameters
this.refPair = refPair;
}
- public ComponentContextImpl<?> getComponentContext()
+ public ComponentContextImpl getComponentContext()
{
return componentContext;
}
- public RefPair<?, ?> getRefPair()
+ public RefPair getRefPair()
{
return refPair;
}
Modified: felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ClassUtils.java
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ClassUtils.java?rev=1778137&r1=1778136&r2=1778137&view=diff
==============================================================================
--- felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ClassUtils.java (original)
+++ felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ClassUtils.java Tue Jan 10 14:59:45 2017
@@ -18,7 +18,6 @@
*/
package org.apache.felix.scr.impl.inject;
-
import java.util.Collection;
import java.util.List;
import java.util.Map;
Copied: felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ComponentMethods.java (from r1778136, felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/ComponentMethods.java)
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ComponentMethods.java?p2=felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ComponentMethods.java&p1=felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/ComponentMethods.java&r1=1778136&r2=1778137&rev=1778137&view=diff
==============================================================================
--- felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/ComponentMethods.java (original)
+++ felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ComponentMethods.java Tue Jan 10 14:59:45 2017
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.felix.scr.impl.helper;
+package org.apache.felix.scr.impl.inject;
import org.apache.felix.scr.impl.metadata.ComponentMetadata;
@@ -27,11 +27,11 @@ public interface ComponentMethods<T>
{
void initComponentMethods( ComponentMetadata componentMetadata, Class<T> implementationObjectClass );
- ComponentMethod getActivateMethod();
+ LifecycleMethod getActivateMethod();
- ComponentMethod getDeactivateMethod();
+ LifecycleMethod getDeactivateMethod();
- ComponentMethod getModifiedMethod();
+ LifecycleMethod getModifiedMethod();
ReferenceMethods getBindMethods(String refName );
Modified: felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ComponentMethodsImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ComponentMethodsImpl.java?rev=1778137&r1=1778136&r2=1778137&view=diff
==============================================================================
--- felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ComponentMethodsImpl.java (original)
+++ felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ComponentMethodsImpl.java Tue Jan 10 14:59:45 2017
@@ -25,10 +25,11 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import org.apache.felix.scr.impl.helper.ComponentMethod;
-import org.apache.felix.scr.impl.helper.ComponentMethods;
-import org.apache.felix.scr.impl.helper.ConstructorMethod;
-import org.apache.felix.scr.impl.helper.ReferenceMethods;
+import org.apache.felix.scr.impl.inject.field.FieldMethods;
+import org.apache.felix.scr.impl.inject.methods.ActivateMethod;
+import org.apache.felix.scr.impl.inject.methods.BindMethods;
+import org.apache.felix.scr.impl.inject.methods.DeactivateMethod;
+import org.apache.felix.scr.impl.inject.methods.ModifiedMethod;
import org.apache.felix.scr.impl.metadata.ComponentMetadata;
import org.apache.felix.scr.impl.metadata.DSVersion;
import org.apache.felix.scr.impl.metadata.ReferenceMetadata;
@@ -39,9 +40,9 @@ import org.apache.felix.scr.impl.metadat
*/
public class ComponentMethodsImpl<T> implements ComponentMethods<T>
{
- private ComponentMethod m_activateMethod;
- private ComponentMethod m_modifiedMethod;
- private ComponentMethod m_deactivateMethod;
+ private LifecycleMethod m_activateMethod;
+ private LifecycleMethod m_modifiedMethod;
+ private LifecycleMethod m_deactivateMethod;
private ConstructorMethod<T> m_constructor;
private final Map<String, ReferenceMethods> bindMethodMap = new HashMap<String, ReferenceMethods>();
@@ -58,7 +59,7 @@ public class ComponentMethodsImpl<T> imp
boolean supportsInterfaces = componentMetadata.isConfigureWithInterfaces();
m_activateMethod = new ActivateMethod(
- ComponentMetadata.CONSTRUCTOR_MARKER.equals(componentMetadata.getActivate()) ? null : componentMetadata.getActivate(),
+ componentMetadata.isActivateConstructor() ? null : componentMetadata.getActivate(),
componentMetadata.isActivateDeclared(),
implementationObjectClass,
dsVersion,
@@ -73,7 +74,6 @@ public class ComponentMethodsImpl<T> imp
{
final String refName = referenceMetadata.getName();
final List<ReferenceMethods> methods = new ArrayList<ReferenceMethods>();
- // TODO add methods for constructor injection
if ( referenceMetadata.getField() != null )
{
methods.add(new FieldMethods( referenceMetadata, implementationObjectClass, dsVersion, configurableServiceProperties));
@@ -83,7 +83,11 @@ public class ComponentMethodsImpl<T> imp
methods.add(new BindMethods( referenceMetadata, implementationObjectClass, dsVersion, configurableServiceProperties));
}
- if ( methods.size() == 1 )
+ if ( methods.isEmpty() )
+ {
+ bindMethodMap.put( refName, ReferenceMethods.NOPReferenceMethod );
+ }
+ else if ( methods.size() == 1 )
{
bindMethodMap.put( refName, methods.get(0) );
}
@@ -95,7 +99,7 @@ public class ComponentMethodsImpl<T> imp
// special constructor handling with activation fields and/or constructor injection
if ( componentMetadata.getActivationFields() != null
- || ComponentMetadata.CONSTRUCTOR_MARKER.equals(componentMetadata.getActivate()))
+ || componentMetadata.isActivateConstructor())
{
m_constructor = new ConstructorMethodImpl();
}
@@ -106,19 +110,19 @@ public class ComponentMethodsImpl<T> imp
}
@Override
- public ComponentMethod getActivateMethod()
+ public LifecycleMethod getActivateMethod()
{
return m_activateMethod;
}
@Override
- public ComponentMethod getDeactivateMethod()
+ public LifecycleMethod getDeactivateMethod()
{
return m_deactivateMethod;
}
@Override
- public ComponentMethod getModifiedMethod()
+ public LifecycleMethod getModifiedMethod()
{
return m_modifiedMethod;
}
Copied: felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ConstructorMethod.java (from r1778136, felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/ConstructorMethod.java)
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ConstructorMethod.java?p2=felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ConstructorMethod.java&p1=felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/ConstructorMethod.java&r1=1778136&r2=1778137&rev=1778137&view=diff
==============================================================================
--- felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/ConstructorMethod.java (original)
+++ felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ConstructorMethod.java Tue Jan 10 14:59:45 2017
@@ -16,10 +16,11 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.felix.scr.impl.helper;
+package org.apache.felix.scr.impl.inject;
-import java.util.TreeMap;
+import java.util.Map;
+import org.apache.felix.scr.impl.helper.SimpleLogger;
import org.apache.felix.scr.impl.manager.ComponentContextImpl;
import org.apache.felix.scr.impl.manager.DependencyManager;
@@ -30,6 +31,11 @@ import org.apache.felix.scr.impl.manager
*/
public interface ConstructorMethod<T> {
+ public class ReferencePair<S> {
+ public DependencyManager<S, ?> dependencyManager;
+ public DependencyManager.OpenStatus<S, ?> openStatus;
+ }
+
/**
* Create a new instance
* @param componentClass The implementation class of the component
@@ -39,7 +45,7 @@ public interface ConstructorMethod<T> {
*/
<S> T newInstance(Class<T> componentClass,
ComponentContextImpl<T> componentContext,
- TreeMap<Integer, DependencyManager<S, ?>> parameterMap,
+ Map<Integer, ReferencePair<S>> parameterMap,
SimpleLogger logger )
throws Exception;
@@ -48,7 +54,7 @@ public interface ConstructorMethod<T> {
@Override
public <S> Object newInstance(Class<Object> componentClass,
ComponentContextImpl<Object> componentContext,
- TreeMap<Integer, DependencyManager<S, ?>> parameterMap,
+ Map<Integer, ReferencePair<S>> parameterMap,
SimpleLogger logger)
throws Exception
{
Modified: felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ConstructorMethodImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ConstructorMethodImpl.java?rev=1778137&r1=1778136&r2=1778137&view=diff
==============================================================================
--- felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ConstructorMethodImpl.java (original)
+++ felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ConstructorMethodImpl.java Tue Jan 10 14:59:45 2017
@@ -20,13 +20,12 @@ package org.apache.felix.scr.impl.inject
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
-import java.util.TreeMap;
+import java.util.Map;
-import org.apache.felix.scr.impl.helper.ConstructorMethod;
import org.apache.felix.scr.impl.helper.SimpleLogger;
+import org.apache.felix.scr.impl.inject.ValueUtils.ValueType;
+import org.apache.felix.scr.impl.inject.field.FieldUtils;
import org.apache.felix.scr.impl.manager.ComponentContextImpl;
-import org.apache.felix.scr.impl.manager.DependencyManager;
-import org.apache.felix.scr.impl.metadata.ComponentMetadata;
import org.apache.felix.scr.impl.metadata.ReferenceMetadata;
import org.osgi.service.log.LogService;
@@ -38,17 +37,17 @@ public class ConstructorMethodImpl<T> im
{
private volatile boolean m_initialized = false;
- private volatile FieldUtils.ValueType[] m_paramTypes;
+ private volatile ValueType[] m_paramTypes;
private volatile Field[] m_fields;
private volatile Constructor<T> m_constructor;
- private volatile FieldUtils.ValueType[] m_constructorArgTypes;
+ private volatile ValueType[] m_constructorArgTypes;
@SuppressWarnings("unchecked")
@Override
public <S> T newInstance(Class<T> componentClass,
ComponentContextImpl<T> componentContext,
- TreeMap<Integer, DependencyManager<S, ?>> parameterMap,
+ Map<Integer, ReferencePair<S>> parameterMap,
SimpleLogger logger)
throws Exception
{
@@ -56,7 +55,7 @@ public class ConstructorMethodImpl<T> im
// activation fields
if ( componentContext.getComponentMetadata().getActivationFields() != null )
{
- m_paramTypes = new FieldUtils.ValueType[componentContext.getComponentMetadata().getActivationFields().size()];
+ m_paramTypes = new ValueType[componentContext.getComponentMetadata().getActivationFields().size()];
m_fields = new Field[m_paramTypes.length];
int index = 0;
@@ -72,12 +71,12 @@ public class ConstructorMethodImpl<T> im
{
if ( result.usable )
{
- m_paramTypes[index] = FieldUtils.getValueType(result.field.getType());
+ m_paramTypes[index] = ValueUtils.getValueType(result.field.getType());
m_fields[index] = result.field;
}
else
{
- m_paramTypes[index] = FieldUtils.ValueType.ignore;
+ m_paramTypes[index] = ValueType.ignore;
m_fields[index] = null;
}
}
@@ -86,31 +85,31 @@ public class ConstructorMethodImpl<T> im
}
else
{
- m_paramTypes = FieldUtils.EMPTY_TYPES;
+ m_paramTypes = ValueUtils.EMPTY_VALUE_TYPES;
m_fields = null;
}
// constructor injection
- if ( ComponentMetadata.CONSTRUCTOR_MARKER.equals(componentContext.getComponentMetadata().getActivate() ) )
+ if ( componentContext.getComponentMetadata().isActivateConstructor() )
{
// TODO search constructor
m_constructor = null;
boolean hasFailure = false;
final Class<?>[] argTypes = m_constructor.getParameterTypes();
- m_constructorArgTypes = new FieldUtils.ValueType[argTypes.length];
+ m_constructorArgTypes = new ValueType[argTypes.length];
for(int i=0;i<m_constructorArgTypes.length;i++)
{
- final DependencyManager<S, ?> dm = parameterMap.get(i);
- ReferenceMetadata reference = dm == null ? null : dm.getReferenceMetadata();
+ final ReferencePair<S> pair = parameterMap.get(i);
+ ReferenceMetadata reference = pair == null ? null : pair.dependencyManager.getReferenceMetadata();
if ( reference == null )
{
- m_constructorArgTypes[i] = FieldUtils.getValueType(argTypes[i]);
+ m_constructorArgTypes[i] = ValueUtils.getValueType(argTypes[i]);
}
else
{
- m_constructorArgTypes[i] = FieldUtils.getReferenceValueType(componentClass, reference, argTypes[i], null, logger);
+ m_constructorArgTypes[i] = ValueUtils.getReferenceValueType(componentClass, reference, argTypes[i], null, logger);
}
- if ( m_constructorArgTypes[i] == FieldUtils.ValueType.ignore )
+ if ( m_constructorArgTypes[i] == ValueType.ignore )
{
hasFailure = true;
break;
@@ -127,7 +126,7 @@ public class ConstructorMethodImpl<T> im
}
// if we have fields and one is in state failure (type == null) we can directly throw
- for(final FieldUtils.ValueType t : m_paramTypes)
+ for(final ValueType t : m_paramTypes)
{
if ( t == null )
{
@@ -137,7 +136,7 @@ public class ConstructorMethodImpl<T> im
// constructor
final T component;
- if ( ComponentMetadata.CONSTRUCTOR_MARKER.equals(componentContext.getComponentMetadata().getActivate() ) )
+ if ( componentContext.getComponentMetadata().isActivateConstructor() )
{
if ( m_constructor == null )
{
@@ -146,8 +145,9 @@ public class ConstructorMethodImpl<T> im
final Object[] args = new Object[m_constructorArgTypes.length];
for(int i=0; i<args.length; i++)
{
- final DependencyManager<S, ?> dm = parameterMap.get(i);
- args[i] = FieldUtils.getValue(m_constructorArgTypes[i],
+ // TODO - get ref pair
+ final ReferencePair<S> pair = parameterMap.get(i);
+ args[i] = ValueUtils.getValue(m_constructorArgTypes[i],
m_constructor.getParameterTypes()[i],
componentContext,
null);
@@ -163,9 +163,9 @@ public class ConstructorMethodImpl<T> im
// activation fields
for(int i = 0; i<m_paramTypes.length; i++)
{
- if ( m_paramTypes[i] != FieldUtils.ValueType.ignore )
+ if ( m_paramTypes[i] != ValueType.ignore )
{
- final Object value = FieldUtils.getValue(m_paramTypes[i],
+ final Object value = ValueUtils.getValue(m_paramTypes[i],
m_fields[i].getType(),
(ComponentContextImpl<T>) componentContext,
null);
Modified: felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/DuplexReferenceMethods.java
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/DuplexReferenceMethods.java?rev=1778137&r1=1778136&r2=1778137&view=diff
==============================================================================
--- felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/DuplexReferenceMethods.java (original)
+++ felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/DuplexReferenceMethods.java Tue Jan 10 14:59:45 2017
@@ -20,67 +20,35 @@ package org.apache.felix.scr.impl.inject
import java.util.List;
-import org.apache.felix.scr.impl.helper.InitReferenceMethod;
-import org.apache.felix.scr.impl.helper.MethodResult;
-import org.apache.felix.scr.impl.helper.ReferenceMethod;
-import org.apache.felix.scr.impl.helper.ReferenceMethods;
import org.apache.felix.scr.impl.helper.SimpleLogger;
-import org.apache.felix.scr.impl.manager.ComponentContextImpl;
-import org.apache.felix.scr.impl.manager.RefPair;
import org.osgi.framework.BundleContext;
public class DuplexReferenceMethods implements ReferenceMethods
{
- /** The methods in the order they need to be called. */
- private final List<ReferenceMethods> methods;
+ private final ReferenceMethod bind;
+ private final ReferenceMethod updated;
+ private final ReferenceMethod unbind;
+ private final InitReferenceMethod init;
public DuplexReferenceMethods(final List<ReferenceMethods> methods)
{
- this.methods = methods;
- }
-
- public ReferenceMethod getBind()
- {
- final ReferenceMethod[] list = new ReferenceMethod[methods.size()];
- int index = 0;
- for(final ReferenceMethods m : methods)
- {
- list[index] = m.getBind();
- index++;
- }
- return new DuplexReferenceMethod(list);
- }
-
- public ReferenceMethod getUnbind()
- {
- final ReferenceMethod[] list = new ReferenceMethod[methods.size()];
- int index = 0;
- for(final ReferenceMethods m : methods)
- {
- list[index] = m.getUnbind();
- index++;
- }
- return new DuplexReferenceMethod(list);
- }
-
- public ReferenceMethod getUpdated()
- {
- final ReferenceMethod[] list = new ReferenceMethod[methods.size()];
+ final ReferenceMethod[] bindList = new ReferenceMethod[methods.size()];
+ final ReferenceMethod[] updatedList = new ReferenceMethod[methods.size()];
+ final ReferenceMethod[] unbindList = new ReferenceMethod[methods.size()];
int index = 0;
for(final ReferenceMethods m : methods)
{
- list[index] = m.getUpdated();
+ bindList[index] = m.getBind();
+ updatedList[index] = m.getUpdated();
+ unbindList[index] = m.getUnbind();
index++;
}
- return new DuplexReferenceMethod(list);
- }
-
- public InitReferenceMethod getInit()
- {
- return new InitReferenceMethod()
+ this.bind = new DuplexReferenceMethod(bindList);
+ this.updated = new DuplexReferenceMethod(updatedList);
+ this.unbind = new DuplexReferenceMethod(unbindList);
+ this.init = new InitReferenceMethod()
{
-
- public boolean init(Object componentInstance, SimpleLogger logger)
+ public boolean init(final Object componentInstance, final SimpleLogger logger)
{
boolean result = true;
for(final ReferenceMethods m : methods)
@@ -100,6 +68,26 @@ public class DuplexReferenceMethods impl
};
}
+ public ReferenceMethod getBind()
+ {
+ return this.bind;
+ }
+
+ public ReferenceMethod getUnbind()
+ {
+ return this.unbind;
+ }
+
+ public ReferenceMethod getUpdated()
+ {
+ return this.updated;
+ }
+
+ public InitReferenceMethod getInit()
+ {
+ return this.init;
+ }
+
private static final class DuplexReferenceMethod implements ReferenceMethod
{
@@ -110,15 +98,14 @@ public class DuplexReferenceMethods impl
this.methods = methods;
}
- public MethodResult invoke(Object componentInstance,
- ComponentContextImpl<?> componentContext,
- RefPair<?, ?> refPair,
- MethodResult methodCallFailureResult,
- SimpleLogger logger) {
+ public MethodResult invoke(final Object componentInstance,
+ final BindParameters parameters,
+ final MethodResult methodCallFailureResult,
+ final SimpleLogger logger) {
MethodResult result = null;
for(final ReferenceMethod m : methods)
{
- result = m.invoke(componentInstance, componentContext, refPair, methodCallFailureResult, logger);
+ result = m.invoke(componentInstance, parameters, methodCallFailureResult, logger);
if ( result == null )
{
break;
@@ -127,15 +114,16 @@ public class DuplexReferenceMethods impl
return result;
}
- public <S, T> boolean getServiceObject(ComponentContextImpl<S> key,
- RefPair<S, T> refPair, BundleContext context,
- SimpleLogger logger)
+ public <S, T> boolean getServiceObject(
+ final BindParameters parameters,
+ final BundleContext context,
+ final SimpleLogger logger)
{
// only if all return true, we return true
boolean result = false;
for(final ReferenceMethod m : methods)
{
- result = m.getServiceObject(key, refPair, context, logger);
+ result = m.getServiceObject(parameters, context, logger);
if (!result )
{
break;
Copied: felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/InitReferenceMethod.java (from r1778136, felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/InitReferenceMethod.java)
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/InitReferenceMethod.java?p2=felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/InitReferenceMethod.java&p1=felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/InitReferenceMethod.java&r1=1778136&r2=1778137&rev=1778137&view=diff
==============================================================================
--- felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/InitReferenceMethod.java (original)
+++ felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/InitReferenceMethod.java Tue Jan 10 14:59:45 2017
@@ -16,7 +16,9 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.felix.scr.impl.helper;
+package org.apache.felix.scr.impl.inject;
+
+import org.apache.felix.scr.impl.helper.SimpleLogger;
/**
* Callback for initializing the reference (field references)
Copied: felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/LifecycleMethod.java (from r1778136, felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/ComponentMethod.java)
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/LifecycleMethod.java?p2=felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/LifecycleMethod.java&p1=felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/ComponentMethod.java&r1=1778136&r2=1778137&rev=1778137&view=diff
==============================================================================
--- felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/ComponentMethod.java (original)
+++ felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/LifecycleMethod.java Tue Jan 10 14:59:45 2017
@@ -16,11 +16,20 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.felix.scr.impl.helper;
+package org.apache.felix.scr.impl.inject;
+import org.apache.felix.scr.impl.helper.SimpleLogger;
import org.osgi.service.component.ComponentContext;
-public interface ComponentMethod {
+/**
+ * Interface for invocation one of the lifecycle methods:
+ * <ul>
+ * <li>activate</li>
+ * <li>modified</li>
+ * <li>deactivate</li>
+ * </ul>
+ */
+public interface LifecycleMethod {
MethodResult invoke(Object componentInstance,
ComponentContext componentContext,
Copied: felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/MethodResult.java (from r1778136, felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/MethodResult.java)
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/MethodResult.java?p2=felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/MethodResult.java&p1=felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/MethodResult.java&r1=1778136&r2=1778137&rev=1778137&view=diff
==============================================================================
--- felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/MethodResult.java (original)
+++ felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/MethodResult.java Tue Jan 10 14:59:45 2017
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.felix.scr.impl.helper;
+package org.apache.felix.scr.impl.inject;
import java.util.Map;
Copied: felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ReferenceMethod.java (from r1778136, felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/ReferenceMethod.java)
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ReferenceMethod.java?p2=felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ReferenceMethod.java&p1=felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/ReferenceMethod.java&r1=1778136&r2=1778137&rev=1778137&view=diff
==============================================================================
--- felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/ReferenceMethod.java (original)
+++ felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ReferenceMethod.java Tue Jan 10 14:59:45 2017
@@ -16,10 +16,9 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.felix.scr.impl.helper;
+package org.apache.felix.scr.impl.inject;
-import org.apache.felix.scr.impl.manager.ComponentContextImpl;
-import org.apache.felix.scr.impl.manager.RefPair;
+import org.apache.felix.scr.impl.helper.SimpleLogger;
import org.osgi.framework.BundleContext;
/**
@@ -27,14 +26,43 @@ import org.osgi.framework.BundleContext;
*/
public interface ReferenceMethod
{
- MethodResult invoke( Object componentInstance,
- ComponentContextImpl<?> componentContext,
- RefPair<?, ?> refPair,
+ /**
+ * Invoke the reference method and bind/unbind/update the reference.
+ *
+ * @param componentInstance The component instance
+ * @param parameters The parameters for the reference.
+ * @param methodCallFailureResult Return result for failure
+ * @param logger Logger
+ * @return The method result
+ */
+
+ <S, T> MethodResult invoke( Object componentInstance,
+ BindParameters parameters,
MethodResult methodCallFailureResult,
SimpleLogger logger );
- <S, T> boolean getServiceObject( ComponentContextImpl<S> key,
- RefPair<S, T> refPair,
+ <S, T> boolean getServiceObject( BindParameters parameters,
BundleContext context,
SimpleLogger logger );
+
+ /**
+ * A NOP implementation.
+ */
+ ReferenceMethod NOPReferenceMethod = new ReferenceMethod() {
+
+ @Override
+ public <S, T> MethodResult invoke(final Object componentInstance,
+ final BindParameters parameters,
+ final MethodResult methodCallFailureResult,
+ final SimpleLogger logger) {
+ return MethodResult.VOID;
+ }
+
+ @Override
+ public <S, T> boolean getServiceObject(final BindParameters parameters,
+ final BundleContext context,
+ final SimpleLogger logger) {
+ return true;
+ }
+ };
}
Copied: felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ReferenceMethods.java (from r1778136, felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/ReferenceMethods.java)
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ReferenceMethods.java?p2=felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ReferenceMethods.java&p1=felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/ReferenceMethods.java&r1=1778136&r2=1778137&rev=1778137&view=diff
==============================================================================
--- felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/helper/ReferenceMethods.java (original)
+++ felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ReferenceMethods.java Tue Jan 10 14:59:45 2017
@@ -16,10 +16,12 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.felix.scr.impl.helper;
+package org.apache.felix.scr.impl.inject;
/**
* {@code ReferenceMethods} holds pointers to methods for a single reference.
+ * The methods are used for event (method) injection and field injection.
+ *
* <ul>
* <li>The bind method
* <li>The unbind method
@@ -29,15 +31,53 @@ package org.apache.felix.scr.impl.helper
*/
public interface ReferenceMethods
{
- /** Never returns {@code null}. */
+ /**
+ * Get the method to bind a service.
+ * Never returns {@code null}.
+ */
ReferenceMethod getBind();
- /** Never returns {@code null}. */
+ /**
+ * Get the method to unbind a service.
+ * Never returns {@code null}.
+ */
ReferenceMethod getUnbind();
- /** Never returns {@code null}. */
+ /**
+ * Get the method to update a service.
+ * Never returns {@code null}.
+ */
ReferenceMethod getUpdated();
- /** This is optional and might return {@code null} */
+ /**
+ * Get an optional method to initialize the component reference handling.
+ * This is optional and might return {@code null}
+ */
InitReferenceMethod getInit();
+
+ /**
+ * This is a NOP implementation.
+ */
+ ReferenceMethods NOPReferenceMethod = new ReferenceMethods() {
+
+ @Override
+ public ReferenceMethod getBind() {
+ return ReferenceMethod.NOPReferenceMethod;
+ }
+
+ @Override
+ public ReferenceMethod getUnbind() {
+ return ReferenceMethod.NOPReferenceMethod;
+ }
+
+ @Override
+ public ReferenceMethod getUpdated() {
+ return ReferenceMethod.NOPReferenceMethod;
+ }
+
+ @Override
+ public InitReferenceMethod getInit() {
+ return null;
+ }
+ };
}
Added: felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ValueUtils.java
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ValueUtils.java?rev=1778137&view=auto
==============================================================================
--- felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ValueUtils.java (added)
+++ felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ValueUtils.java Tue Jan 10 14:59:45 2017
@@ -0,0 +1,320 @@
+/*
+ * 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.inject;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.Map;
+
+import org.apache.felix.scr.impl.helper.ReadOnlyDictionary;
+import org.apache.felix.scr.impl.helper.SimpleLogger;
+import org.apache.felix.scr.impl.manager.ComponentContextImpl;
+import org.apache.felix.scr.impl.manager.RefPair;
+import org.apache.felix.scr.impl.metadata.ReferenceMetadata;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.log.LogService;
+
+/**
+ * Utility methods for handling references and activation
+ */
+public class ValueUtils {
+
+ /**
+ * The value type of the field, activation field or constructor parameter
+ */
+ public enum ValueType
+ {
+ ignore,
+ componentContext,
+ bundleContext,
+ config_map,
+ config_annotation,
+ ref_serviceReference,
+ ref_serviceObjects,
+ ref_serviceType,
+ ref_map,
+ ref_tuple
+ }
+
+ /** Empty array. */
+ public static final ValueType[] EMPTY_VALUE_TYPES = new ValueType[0];
+
+ /**
+ * Get the value type for the parameter class.
+ * @param typeClass The class of the parameter
+ * @return The value type
+ */
+ public static ValueType getValueType( final Class<?> typeClass )
+ {
+ if ( typeClass == ClassUtils.COMPONENT_CONTEXT_CLASS )
+ {
+ return ValueType.componentContext;
+ }
+ else if ( typeClass == ClassUtils.BUNDLE_CONTEXT_CLASS )
+ {
+ return ValueType.bundleContext;
+ }
+ else if ( typeClass == ClassUtils.MAP_CLASS )
+ {
+ return ValueType.config_map;
+ }
+ else
+ {
+ return ValueType.config_annotation;
+ }
+ }
+
+ /**
+ * Get the value type of the reference
+ * @param componentClass The component class declaring the reference
+ * @param metadata The reference metadata
+ * @param typeClass The type of the field/parameter
+ * @param f The optional field. If null, this is a constructor reference
+ * @param logger The logger
+ * @return The value type for the field. If invalid, {@code ValueType#ignore}
+ */
+ public static ValueType getReferenceValueType(
+ final Class<?> componentClass,
+ final ReferenceMetadata metadata,
+ final Class<?> typeClass,
+ final Field field,
+ final SimpleLogger logger )
+ {
+ final Class<?> referenceType = ClassUtils.getClassFromComponentClassLoader(
+ componentClass, metadata.getInterface(), logger);
+
+ ValueType valueType = ValueType.ignore;
+
+ // unary reference
+ if ( !metadata.isMultiple() )
+ {
+ if ( typeClass.isAssignableFrom(referenceType) )
+ {
+ valueType = ValueType.ref_serviceType;
+ }
+ else if ( typeClass == ClassUtils.SERVICE_REFERENCE_CLASS )
+ {
+ valueType = ValueType.ref_serviceReference;
+ }
+ else if ( typeClass == ClassUtils.COMPONENTS_SERVICE_OBJECTS_CLASS )
+ {
+ valueType = ValueType.ref_serviceObjects;
+ }
+ else if ( typeClass == ClassUtils.MAP_CLASS )
+ {
+ valueType = ValueType.ref_map;
+ }
+ else if ( typeClass == ClassUtils.MAP_ENTRY_CLASS )
+ {
+ valueType = ValueType.ref_tuple;
+ }
+ else
+ {
+ if ( field != null )
+ {
+ logger.log( LogService.LOG_ERROR, "Field {0} in component {1} has unsupported type {2}", new Object[]
+ {metadata.getField(), componentClass, typeClass.getName()}, null );
+ }
+ else
+ {
+ logger.log( LogService.LOG_ERROR, "Constructor argument {0} in component {1} has unsupported type {2}", new Object[]
+ {metadata.getParameterIndex(), componentClass, typeClass.getName()}, null );
+ }
+ valueType = ValueType.ignore;
+ }
+
+ // if the field is dynamic, it has to be volatile (field is ignored, case logged) (112.3.8.1)
+ if ( field != null && !metadata.isStatic() && !Modifier.isVolatile(field.getModifiers()) ) {
+ logger.log( LogService.LOG_ERROR, "Field {0} in component {1} must be declared volatile to handle a dynamic reference", new Object[]
+ {metadata.getField(), componentClass}, null );
+ valueType = ValueType.ignore;
+ }
+
+ // the field must not be final (field is ignored, case logged) (112.3.8.1)
+ if ( field != null && Modifier.isFinal(field.getModifiers()) )
+ {
+ logger.log( LogService.LOG_ERROR, "Field {0} in component {1} must not be declared as final", new Object[]
+ {metadata.getField(), componentClass}, null );
+ valueType = ValueType.ignore;
+ }
+ }
+ else
+ {
+ if ( ReferenceMetadata.FIELD_VALUE_TYPE_SERVICE.equals(metadata.getFieldCollectionType()) )
+ {
+ valueType = ValueType.ref_serviceType;
+ }
+ else if ( ReferenceMetadata.FIELD_VALUE_TYPE_REFERENCE.equals(metadata.getFieldCollectionType()) )
+ {
+ valueType = ValueType.ref_serviceReference;
+ }
+ else if ( ReferenceMetadata.FIELD_VALUE_TYPE_SERVICEOBJECTS.equals(metadata.getFieldCollectionType()) )
+ {
+ valueType = ValueType.ref_serviceObjects;
+ }
+ else if ( ReferenceMetadata.FIELD_VALUE_TYPE_PROPERTIES.equals(metadata.getFieldCollectionType()) )
+ {
+ valueType = ValueType.ref_map;
+ }
+ else if ( ReferenceMetadata.FIELD_VALUE_TYPE_TUPLE.equals(metadata.getFieldCollectionType()) )
+ {
+ valueType = ValueType.ref_tuple;
+ }
+
+ // multiple cardinality, field type must be collection or subtype
+ if ( !ClassUtils.COLLECTION_CLASS.isAssignableFrom(typeClass) )
+ {
+ if ( field != null )
+ {
+ logger.log( LogService.LOG_ERROR, "Field {0} in component {1} has unsupported type {2}", new Object[]
+ {metadata.getField(), componentClass, typeClass.getName()}, null );
+ }
+ else
+ {
+ logger.log( LogService.LOG_ERROR, "Constructor argument {0} in component {1} has unsupported type {2}", new Object[]
+ {metadata.getParameterIndex(), componentClass, typeClass.getName()}, null );
+ }
+ valueType = ValueType.ignore;
+ }
+
+ // additional checks for replace strategy:
+ if ( metadata.isReplace() && field != null )
+ {
+ // if the field is dynamic wit has to be volatile (field is ignored, case logged) (112.3.8.1)
+ if ( !metadata.isStatic() && !Modifier.isVolatile(field.getModifiers()) )
+ {
+ logger.log( LogService.LOG_ERROR, "Field {0} in component {1} must be declared volatile to handle a dynamic reference", new Object[]
+ {metadata.getField(), componentClass}, null );
+ valueType = ValueType.ignore;
+ }
+
+ // replace strategy: field must not be final (field is ignored, case logged) (112.3.8.1)
+ // only collection and list allowed
+ if ( typeClass != ClassUtils.LIST_CLASS && typeClass != ClassUtils.COLLECTION_CLASS )
+ {
+ logger.log( LogService.LOG_ERROR, "Field {0} in component {1} has unsupported type {2}."+
+ " It must be one of java.util.Collection or java.util.List.",
+ new Object[] {metadata.getField(), componentClass, typeClass.getName()}, null );
+ valueType = ValueType.ignore;
+
+ }
+ if ( Modifier.isFinal(field.getModifiers()) )
+ {
+ logger.log( LogService.LOG_ERROR, "Field {0} in component {1} must not be declared as final", new Object[]
+ {metadata.getField(), componentClass}, null );
+ valueType = ValueType.ignore;
+ }
+ }
+ }
+ // static references only allowed for replace strategy
+ if ( metadata.isStatic() && !metadata.isReplace() )
+ {
+ logger.log( LogService.LOG_ERROR, "Update strategy for field {0} in component {1} only allowed for non static field references.", new Object[]
+ {metadata.getField(), componentClass}, null );
+ valueType = ValueType.ignore;
+ }
+ return valueType;
+ }
+
+ /**
+ * Get the value for the parameter type
+ * @param type The parameter type
+ * @param componentContext The component context
+ */
+ @SuppressWarnings("unchecked")
+ public static Object getValue( final ValueType type,
+ final Class<?> targetType,
+ @SuppressWarnings("rawtypes") final ComponentContextImpl componentContext,
+ final RefPair<?, ?> refPair)
+ {
+ final Object value;
+ switch ( type ) {
+ case ignore : value = null; break;
+ case componentContext : value = componentContext; break;
+ case bundleContext : value = componentContext.getBundleContext(); break;
+ case config_map : // note: getProperties() returns a ReadOnlyDictionary which is a Map
+ value = componentContext.getProperties(); break;
+ case config_annotation : value = Annotations.toObject(targetType,
+ (Map<String, Object>) componentContext.getProperties(),
+ componentContext.getBundleContext().getBundle(), componentContext.getComponentMetadata().isConfigureWithInterfaces());
+ break;
+ case ref_serviceType : value = refPair.getServiceObject(componentContext); break;
+ case ref_serviceReference : value = refPair.getRef(); break;
+ case ref_serviceObjects : value = componentContext.getComponentServiceObjectsHelper().getServiceObjects(refPair.getRef()); break;
+ case ref_map : value = new ReadOnlyDictionary( refPair.getRef() ); break;
+ case ref_tuple : final Object tupleKey = new ReadOnlyDictionary( refPair.getRef() );
+ final Object tupleValue = refPair.getServiceObject(componentContext);
+ value = new MapEntryImpl(tupleKey, tupleValue, refPair.getRef());
+ break;
+ default: value = null;
+ }
+ return value;
+ }
+
+ /**
+ * Comparable map entry using the service reference to compare.
+ */
+ @SuppressWarnings("rawtypes")
+ private static final class MapEntryImpl implements Map.Entry, Comparable<Map.Entry<?, ?>>
+ {
+
+ private final Object key;
+ private final Object value;
+ private final ServiceReference<?> ref;
+
+ public MapEntryImpl(final Object key,
+ final Object value,
+ final ServiceReference<?> ref)
+ {
+ this.key = key;
+ this.value = value;
+ this.ref = ref;
+ }
+
+ public Object getKey()
+ {
+ return this.key;
+ }
+
+ public Object getValue()
+ {
+ return this.value;
+ }
+
+ public Object setValue(final Object value)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public int compareTo(final Map.Entry<?, ?> o)
+ {
+ if ( o == null )
+ {
+ return 1;
+ }
+ if ( o instanceof MapEntryImpl )
+ {
+ final MapEntryImpl other = (MapEntryImpl)o;
+ return ref.compareTo(other.ref);
+
+ }
+ return new Integer(this.hashCode()).compareTo(o.hashCode());
+ }
+ }
+}
Propchange: felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ValueUtils.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/ValueUtils.java
------------------------------------------------------------------------------
svn:keywords = author date id revision rev url
Copied: felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/field/FieldHandler.java (from r1778136, felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/FieldHandler.java)
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/field/FieldHandler.java?p2=felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/field/FieldHandler.java&p1=felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/FieldHandler.java&r1=1778136&r2=1778137&rev=1778137&view=diff
==============================================================================
--- felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/FieldHandler.java (original)
+++ felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/field/FieldHandler.java Tue Jan 10 14:59:45 2017
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.felix.scr.impl.inject;
+package org.apache.felix.scr.impl.inject.field;
import java.lang.reflect.Field;
@@ -31,10 +31,14 @@ import java.util.TreeMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;
-import org.apache.felix.scr.impl.helper.InitReferenceMethod;
-import org.apache.felix.scr.impl.helper.MethodResult;
-import org.apache.felix.scr.impl.helper.ReferenceMethod;
import org.apache.felix.scr.impl.helper.SimpleLogger;
+import org.apache.felix.scr.impl.inject.BindParameters;
+import org.apache.felix.scr.impl.inject.ClassUtils;
+import org.apache.felix.scr.impl.inject.InitReferenceMethod;
+import org.apache.felix.scr.impl.inject.MethodResult;
+import org.apache.felix.scr.impl.inject.ReferenceMethod;
+import org.apache.felix.scr.impl.inject.ValueUtils;
+import org.apache.felix.scr.impl.inject.ValueUtils.ValueType;
import org.apache.felix.scr.impl.manager.ComponentContextImpl;
import org.apache.felix.scr.impl.manager.RefPair;
import org.apache.felix.scr.impl.metadata.ReferenceMetadata;
@@ -56,7 +60,7 @@ public class FieldHandler
private volatile Field field;
/** Value type. */
- private volatile FieldUtils.ValueType valueType;
+ private volatile ValueType valueType;
/** State handling. */
private volatile State state;
@@ -97,7 +101,7 @@ public class FieldHandler
private boolean initField(final Object componentInstance,
final SimpleLogger logger )
{
- if ( valueType == FieldUtils.ValueType.ignore )
+ if ( valueType == ValueType.ignore )
{
return true;
}
@@ -122,7 +126,7 @@ public class FieldHandler
{
logger.log( LogService.LOG_ERROR, "Field {0} in component {1} must not be declared as final", new Object[]
{metadata.getField(), this.componentClass}, null );
- valueType = FieldUtils.ValueType.ignore;
+ valueType = ValueType.ignore;
return true;
}
if ( fieldType != ClassUtils.LIST_CLASS && fieldType != ClassUtils.COLLECTION_CLASS )
@@ -130,7 +134,7 @@ public class FieldHandler
logger.log( LogService.LOG_ERROR, "Field {0} in component {1} has unsupported type {2}."+
" It must be one of java.util.Collection or java.util.List.",
new Object[] {metadata.getField(), this.componentClass, fieldType.getName()}, null );
- valueType = FieldUtils.ValueType.ignore;
+ valueType = ValueType.ignore;
return true;
}
if ( fieldType == ClassUtils.LIST_CLASS )
@@ -156,7 +160,7 @@ public class FieldHandler
}
catch ( final InvocationTargetException ite)
{
- valueType = FieldUtils.ValueType.ignore;
+ valueType = ValueType.ignore;
logger.log( LogService.LOG_ERROR, "Field {0} in component {1} can't be initialized.",
new Object[] {metadata.getField(), this.componentClass}, ite );
@@ -208,13 +212,13 @@ public class FieldHandler
// for a static reference we need a reactivation
else if ( mType == METHOD_TYPE.UPDATED )
{
- if ( this.valueType == FieldUtils.ValueType.ref_map || this.valueType == FieldUtils.ValueType.ref_tuple )
+ if ( this.valueType == ValueType.ref_map || this.valueType == ValueType.ref_tuple )
{
if ( this.metadata.isStatic() )
{
return MethodResult.REACTIVATE;
}
- final Object obj = FieldUtils.getValue(valueType, field.getType(), key, refPair);
+ final Object obj = ValueUtils.getValue(valueType, field.getType(), key, refPair);
this.setFieldValue(componentInstance, obj);
this.boundValues.put(refPair, obj);
}
@@ -222,7 +226,7 @@ public class FieldHandler
// bind needs always be done
else
{
- final Object obj = FieldUtils.getValue(valueType, field.getType(), key, refPair);
+ final Object obj = ValueUtils.getValue(valueType, field.getType(), key, refPair);
this.setFieldValue(componentInstance, obj);
this.boundValues.put(refPair, obj);
}
@@ -234,7 +238,7 @@ public class FieldHandler
// bind: replace or update the field
if ( mType == METHOD_TYPE.BIND )
{
- final Object obj = FieldUtils.getValue(valueType, field.getType(), key, refPair);
+ final Object obj = ValueUtils.getValue(valueType, field.getType(), key, refPair);
this.boundValues.put(refPair, obj);
if ( metadata.isReplace() )
{
@@ -268,11 +272,11 @@ public class FieldHandler
// updated needs only be done, if the value type is map or tuple
else if ( mType == METHOD_TYPE.UPDATED)
{
- if ( this.valueType == FieldUtils.ValueType.ref_map || this.valueType == FieldUtils.ValueType.ref_tuple )
+ if ( this.valueType == ValueType.ref_map || this.valueType == ValueType.ref_tuple )
{
if ( !this.metadata.isStatic() )
{
- final Object obj = FieldUtils.getValue(valueType, field.getType(), key, refPair);
+ final Object obj = ValueUtils.getValue(valueType, field.getType(), key, refPair);
final Object oldObj = this.boundValues.put(refPair, obj);
if ( metadata.isReplace() )
@@ -379,11 +383,11 @@ public class FieldHandler
handler.field = result.field;
if ( !result.usable )
{
- handler.valueType = FieldUtils.ValueType.ignore;
+ handler.valueType = ValueType.ignore;
}
else
{
- handler.valueType = FieldUtils.getReferenceValueType(
+ handler.valueType = ValueUtils.getReferenceValueType(
handler.componentClass,
handler.metadata,
result.field.getType(),
@@ -480,23 +484,12 @@ public class FieldHandler
this.handler = handler;
}
- public MethodResult invoke(Object componentInstance,
- ComponentContextImpl<?> componentContext,
- RefPair<?, ?> refPair,
- MethodResult methodCallFailureResult,
- SimpleLogger logger) {
- return invoke(componentInstance,
- new BindParameters(componentContext, refPair),
- methodCallFailureResult,
- logger);
- }
-
- public MethodResult invoke(final Object componentInstance,
+ public <S, T> MethodResult invoke(final Object componentInstance,
final BindParameters rawParameter,
final MethodResult methodCallFailureResult,
final SimpleLogger logger)
{
- if ( handler.valueType == FieldUtils.ValueType.ignore )
+ if ( handler.valueType == ValueType.ignore )
{
return MethodResult.VOID;
}
@@ -518,19 +511,19 @@ public class FieldHandler
return methodCallFailureResult;
}
- public <S, T> boolean getServiceObject(final ComponentContextImpl<S> key,
- final RefPair<S, T> refPair,
+ public <S, T> boolean getServiceObject(
+ final BindParameters rawParameter,
final BundleContext context,
final SimpleLogger logger)
{
if ( methodType != METHOD_TYPE.UNBIND )
{
//??? this resolves which we need.... better way?
- if ( refPair.getServiceObject(key) == null
+ if ( rawParameter.getRefPair().getServiceObject(rawParameter.getComponentContext()) == null
&& handler.fieldExists( logger )
- && (handler.valueType == FieldUtils.ValueType.ref_serviceType || handler.valueType == FieldUtils.ValueType.ref_tuple ) )
+ && (handler.valueType == ValueType.ref_serviceType || handler.valueType == ValueType.ref_tuple ) )
{
- return refPair.getServiceObject(key, context, logger);
+ return rawParameter.getRefPair().getServiceObject(rawParameter.getComponentContext(), context, logger);
}
}
return true;
@@ -554,7 +547,7 @@ public class FieldHandler
public InitReferenceMethod getInit()
{
- if ( valueType == FieldUtils.ValueType.ignore )
+ if ( valueType == ValueType.ignore )
{
return null;
}
Copied: felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/field/FieldMethods.java (from r1778136, felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/FieldMethods.java)
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/field/FieldMethods.java?p2=felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/field/FieldMethods.java&p1=felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/FieldMethods.java&r1=1778136&r2=1778137&rev=1778137&view=diff
==============================================================================
--- felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/FieldMethods.java (original)
+++ felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/field/FieldMethods.java Tue Jan 10 14:59:45 2017
@@ -16,11 +16,11 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.felix.scr.impl.inject;
+package org.apache.felix.scr.impl.inject.field;
-import org.apache.felix.scr.impl.helper.InitReferenceMethod;
-import org.apache.felix.scr.impl.helper.ReferenceMethod;
-import org.apache.felix.scr.impl.helper.ReferenceMethods;
+import org.apache.felix.scr.impl.inject.InitReferenceMethod;
+import org.apache.felix.scr.impl.inject.ReferenceMethod;
+import org.apache.felix.scr.impl.inject.ReferenceMethods;
import org.apache.felix.scr.impl.metadata.DSVersion;
import org.apache.felix.scr.impl.metadata.ReferenceMetadata;
Copied: felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/field/FieldUtils.java (from r1778136, felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/FieldUtils.java)
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/field/FieldUtils.java?p2=felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/field/FieldUtils.java&p1=felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/FieldUtils.java&r1=1778136&r2=1778137&rev=1778137&view=diff
==============================================================================
--- felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/FieldUtils.java (original)
+++ felix/trunk/osgi-r7/scr/src/main/java/org/apache/felix/scr/impl/inject/field/FieldUtils.java Tue Jan 10 14:59:45 2017
@@ -16,49 +16,24 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.felix.scr.impl.inject;
+package org.apache.felix.scr.impl.inject.field;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
import java.security.AccessController;
import java.security.PrivilegedAction;
-import java.util.Map;
-import org.apache.felix.scr.impl.helper.ReadOnlyDictionary;
import org.apache.felix.scr.impl.helper.SimpleLogger;
-import org.apache.felix.scr.impl.manager.ComponentContextImpl;
-import org.apache.felix.scr.impl.manager.RefPair;
-import org.apache.felix.scr.impl.metadata.ReferenceMetadata;
-import org.osgi.framework.ServiceReference;
+import org.apache.felix.scr.impl.inject.ClassUtils;
import org.osgi.service.log.LogService;
/**
- * Utility methods for handling field and constructor injection.
+ * Utility methods for handling field injection.
*/
public class FieldUtils {
/**
- * The value type of the field, activation field or constructor parameter
- */
- public enum ValueType
- {
- ignore,
- componentContext,
- bundleContext,
- config_map,
- config_annotation,
- ref_serviceReference,
- ref_serviceObjects,
- ref_serviceType,
- ref_map,
- ref_tuple
- }
-
- /** Empty array. */
- public static final ValueType[] EMPTY_TYPES = new ValueType[0];
-
- /**
* Return type for {@link FieldUtils#searchField(Class, String, SimpleLogger)}
*/
public static final class FieldSearchResult
@@ -310,267 +285,4 @@ public class FieldUtils {
}
} );
}
-
- /**
- * Get the value type for the parameter class.
- * @param typeClass The class of the parameter
- * @return The value type
- */
- public static ValueType getValueType( final Class<?> typeClass )
- {
- if ( typeClass == ClassUtils.COMPONENT_CONTEXT_CLASS )
- {
- return ValueType.componentContext;
- }
- else if ( typeClass == ClassUtils.BUNDLE_CONTEXT_CLASS )
- {
- return ValueType.bundleContext;
- }
- else if ( typeClass == ClassUtils.MAP_CLASS )
- {
- return ValueType.config_map;
- }
- else
- {
- return ValueType.config_annotation;
- }
- }
-
- /**
- * Get the value type of the reference
- * @param componentClass The component class declaring the reference
- * @param metadata The reference metadata
- * @param typeClass The type of the field/parameter
- * @param f The optional field. If null, this is a constructor reference
- * @param logger The logger
- * @return The value type for the field. If invalid, {@code ValueType#ignore}
- */
- public static ValueType getReferenceValueType(
- final Class<?> componentClass,
- final ReferenceMetadata metadata,
- final Class<?> typeClass,
- final Field field,
- final SimpleLogger logger )
- {
- final Class<?> referenceType = ClassUtils.getClassFromComponentClassLoader(
- componentClass, metadata.getInterface(), logger);
-
- ValueType valueType = ValueType.ignore;
-
- // unary reference
- if ( !metadata.isMultiple() )
- {
- if ( typeClass.isAssignableFrom(referenceType) )
- {
- valueType = ValueType.ref_serviceType;
- }
- else if ( typeClass == ClassUtils.SERVICE_REFERENCE_CLASS )
- {
- valueType = ValueType.ref_serviceReference;
- }
- else if ( typeClass == ClassUtils.COMPONENTS_SERVICE_OBJECTS_CLASS )
- {
- valueType = ValueType.ref_serviceObjects;
- }
- else if ( typeClass == ClassUtils.MAP_CLASS )
- {
- valueType = ValueType.ref_map;
- }
- else if ( typeClass == ClassUtils.MAP_ENTRY_CLASS )
- {
- valueType = ValueType.ref_tuple;
- }
- else
- {
- if ( field != null )
- {
- logger.log( LogService.LOG_ERROR, "Field {0} in component {1} has unsupported type {2}", new Object[]
- {metadata.getField(), componentClass, typeClass.getName()}, null );
- }
- else
- {
- logger.log( LogService.LOG_ERROR, "Constructor argument {0} in component {1} has unsupported type {2}", new Object[]
- {metadata.getParameterIndex(), componentClass, typeClass.getName()}, null );
- }
- valueType = ValueType.ignore;
- }
-
- // if the field is dynamic, it has to be volatile (field is ignored, case logged) (112.3.8.1)
- if ( field != null && !metadata.isStatic() && !Modifier.isVolatile(field.getModifiers()) ) {
- logger.log( LogService.LOG_ERROR, "Field {0} in component {1} must be declared volatile to handle a dynamic reference", new Object[]
- {metadata.getField(), componentClass}, null );
- valueType = ValueType.ignore;
- }
-
- // the field must not be final (field is ignored, case logged) (112.3.8.1)
- if ( field != null && Modifier.isFinal(field.getModifiers()) )
- {
- logger.log( LogService.LOG_ERROR, "Field {0} in component {1} must not be declared as final", new Object[]
- {metadata.getField(), componentClass}, null );
- valueType = ValueType.ignore;
- }
- }
- else
- {
- if ( ReferenceMetadata.FIELD_VALUE_TYPE_SERVICE.equals(metadata.getFieldCollectionType()) )
- {
- valueType = ValueType.ref_serviceType;
- }
- else if ( ReferenceMetadata.FIELD_VALUE_TYPE_REFERENCE.equals(metadata.getFieldCollectionType()) )
- {
- valueType = ValueType.ref_serviceReference;
- }
- else if ( ReferenceMetadata.FIELD_VALUE_TYPE_SERVICEOBJECTS.equals(metadata.getFieldCollectionType()) )
- {
- valueType = ValueType.ref_serviceObjects;
- }
- else if ( ReferenceMetadata.FIELD_VALUE_TYPE_PROPERTIES.equals(metadata.getFieldCollectionType()) )
- {
- valueType = ValueType.ref_map;
- }
- else if ( ReferenceMetadata.FIELD_VALUE_TYPE_TUPLE.equals(metadata.getFieldCollectionType()) )
- {
- valueType = ValueType.ref_tuple;
- }
-
- // multiple cardinality, field type must be collection or subtype
- if ( !ClassUtils.COLLECTION_CLASS.isAssignableFrom(typeClass) )
- {
- if ( field != null )
- {
- logger.log( LogService.LOG_ERROR, "Field {0} in component {1} has unsupported type {2}", new Object[]
- {metadata.getField(), componentClass, typeClass.getName()}, null );
- }
- else
- {
- logger.log( LogService.LOG_ERROR, "Constructor argument {0} in component {1} has unsupported type {2}", new Object[]
- {metadata.getParameterIndex(), componentClass, typeClass.getName()}, null );
- }
- valueType = ValueType.ignore;
- }
-
- // additional checks for replace strategy:
- if ( metadata.isReplace() && field != null )
- {
- // if the field is dynamic wit has to be volatile (field is ignored, case logged) (112.3.8.1)
- if ( !metadata.isStatic() && !Modifier.isVolatile(field.getModifiers()) )
- {
- logger.log( LogService.LOG_ERROR, "Field {0} in component {1} must be declared volatile to handle a dynamic reference", new Object[]
- {metadata.getField(), componentClass}, null );
- valueType = ValueType.ignore;
- }
-
- // replace strategy: field must not be final (field is ignored, case logged) (112.3.8.1)
- // only collection and list allowed
- if ( typeClass != ClassUtils.LIST_CLASS && typeClass != ClassUtils.COLLECTION_CLASS )
- {
- logger.log( LogService.LOG_ERROR, "Field {0} in component {1} has unsupported type {2}."+
- " It must be one of java.util.Collection or java.util.List.",
- new Object[] {metadata.getField(), componentClass, typeClass.getName()}, null );
- valueType = ValueType.ignore;
-
- }
- if ( Modifier.isFinal(field.getModifiers()) )
- {
- logger.log( LogService.LOG_ERROR, "Field {0} in component {1} must not be declared as final", new Object[]
- {metadata.getField(), componentClass}, null );
- valueType = ValueType.ignore;
- }
- }
- }
- // static references only allowed for replace strategy
- if ( metadata.isStatic() && !metadata.isReplace() )
- {
- logger.log( LogService.LOG_ERROR, "Update strategy for field {0} in component {1} only allowed for non static field references.", new Object[]
- {metadata.getField(), componentClass}, null );
- valueType = ValueType.ignore;
- }
- return valueType;
- }
-
- /**
- * Get the value for the parameter type
- * @param type The parameter type
- * @param componentContext The component context
- */
- @SuppressWarnings("unchecked")
- public static Object getValue( final ValueType type,
- final Class<?> targetType,
- @SuppressWarnings("rawtypes") final ComponentContextImpl componentContext,
- final RefPair<?, ?> refPair)
- {
- final Object value;
- switch ( type ) {
- case ignore : value = null; break;
- case componentContext : value = componentContext; break;
- case bundleContext : value = componentContext.getBundleContext(); break;
- case config_map : // note: getProperties() returns a ReadOnlyDictionary which is a Map
- value = componentContext.getProperties(); break;
- case config_annotation : value = Annotations.toObject(targetType,
- (Map<String, Object>) componentContext.getProperties(),
- componentContext.getBundleContext().getBundle(), componentContext.getComponentMetadata().isConfigureWithInterfaces());
- break;
- case ref_serviceType : value = refPair.getServiceObject(componentContext); break;
- case ref_serviceReference : value = refPair.getRef(); break;
- case ref_serviceObjects : value = componentContext.getComponentServiceObjectsHelper().getServiceObjects(refPair.getRef()); break;
- case ref_map : value = new ReadOnlyDictionary( refPair.getRef() ); break;
- case ref_tuple : final Object tupleKey = new ReadOnlyDictionary( refPair.getRef() );
- final Object tupleValue = refPair.getServiceObject(componentContext);
- value = new MapEntryImpl(tupleKey, tupleValue, refPair.getRef());
- break;
- default: value = null;
- }
- return value;
- }
-
- /**
- * Comparable map entry using the service reference to compare.
- */
- @SuppressWarnings("rawtypes")
- private static final class MapEntryImpl implements Map.Entry, Comparable<Map.Entry<?, ?>>
- {
-
- private final Object key;
- private final Object value;
- private final ServiceReference<?> ref;
-
- public MapEntryImpl(final Object key,
- final Object value,
- final ServiceReference<?> ref)
- {
- this.key = key;
- this.value = value;
- this.ref = ref;
- }
-
- public Object getKey()
- {
- return this.key;
- }
-
- public Object getValue()
- {
- return this.value;
- }
-
- public Object setValue(final Object value)
- {
- throw new UnsupportedOperationException();
- }
-
- public int compareTo(final Map.Entry<?, ?> o)
- {
- if ( o == null )
- {
- return 1;
- }
- if ( o instanceof MapEntryImpl )
- {
- final MapEntryImpl other = (MapEntryImpl)o;
- return ref.compareTo(other.ref);
-
- }
- return new Integer(this.hashCode()).compareTo(o.hashCode());
- }
- }
}