Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.equinox.ds/src/org/eclipse/equinox/internal/ds/model/ServiceComponent.java')
-rw-r--r--bundles/org.eclipse.equinox.ds/src/org/eclipse/equinox/internal/ds/model/ServiceComponent.java971
1 files changed, 0 insertions, 971 deletions
diff --git a/bundles/org.eclipse.equinox.ds/src/org/eclipse/equinox/internal/ds/model/ServiceComponent.java b/bundles/org.eclipse.equinox.ds/src/org/eclipse/equinox/internal/ds/model/ServiceComponent.java
deleted file mode 100644
index 1cd041cc9..000000000
--- a/bundles/org.eclipse.equinox.ds/src/org/eclipse/equinox/internal/ds/model/ServiceComponent.java
+++ /dev/null
@@ -1,971 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 1997-2011 by ProSyst Software GmbH
- * http://www.prosyst.com
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * ProSyst Software GmbH - initial API and implementation
- * Simon Archer - bug.id = 225624
- * Bryan Hunt - bug.id = 275997
- * Lazar Kirchev - bug.id = 320377
- *******************************************************************************/
-package org.eclipse.equinox.internal.ds.model;
-
-import java.io.*;
-import java.lang.reflect.*;
-import java.util.*;
-import org.apache.felix.scr.Component;
-import org.apache.felix.scr.Reference;
-import org.eclipse.equinox.internal.ds.*;
-import org.eclipse.equinox.internal.ds.impl.ReadOnlyDictionary;
-import org.eclipse.equinox.internal.util.io.Externalizable;
-import org.eclipse.equinox.internal.util.io.ExternalizableDictionary;
-import org.eclipse.osgi.util.NLS;
-import org.osgi.framework.*;
-import org.osgi.service.component.*;
-import org.osgi.service.log.LogService;
-
-/**
- * This is an OO wrapper for the XML representing the components. It also caches
- * the activate and deactivate methods of the component.
- *
- * @author Valentin Valchev
- * @author Pavlin Dobrev
- * @author Stoyan Boshev
- */
-public class ServiceComponent implements Externalizable, Component {
-
- //constants defining possible SCR namespaces XML schemas
- public static final int NAMESPACE_1_0 = 0;
- public static final int NAMESPACE_1_1 = 1;
- public static final int NAMESPACE_1_2 = 2;
-
- public static final String CONF_POLICY_OPTIONAL = "optional"; //$NON-NLS-1$
- public static final String CONF_POLICY_REQUIRE = "require"; //$NON-NLS-1$
- public static final String CONF_POLICY_IGNORE = "ignore"; //$NON-NLS-1$
-
- public Vector componentProps = null;
-
- // --- begin: XML def
- public String name;
- public String factory;
- String implementation; // the class name
- Properties properties; // property or properties
- String configurationPolicy = CONF_POLICY_OPTIONAL;
- String activateMethodName = "activate"; //$NON-NLS-1$
- String deactivateMethodName = "deactivate"; //$NON-NLS-1$
- public String modifyMethodName = ""; //$NON-NLS-1$
-
- //Since DS 1.2
- public String configurationPID;
-
- // service
- public Vector serviceInterfaces; // all strings
- public String[] provides; // the same as above, but as String[]
- public boolean serviceFactory = false;
-
- public Vector references; // ComponentReference
-
- public boolean autoenable = true;
- public boolean immediate = false;
- public int namespace = NAMESPACE_1_0;
- // --- end: XML def
-
- // --- begin: cache
- private boolean activateCached = false;
- private boolean deactivateCached = false;
- private boolean modifyCached = false;
- private Method activateMethod;
- private Method deactivateMethod;
- private Method modifyMethod;
- // --- end: cache
-
- // --- begin: model
- public boolean enabled;
- public Bundle bundle;
- public BundleContext bc;
- boolean activateMethodDeclared = false;
- boolean deactivateMethodDeclared = false;
- int state = Component.STATE_UNSATISFIED;
- // --- end: model
-
- public HashSet componentIssues = new HashSet(1, 1);
- private ReadOnlyDictionary readOnlyProps;
-
- public String getComponentIssues() {
- if (!componentIssues.isEmpty()) {
- String result = ""; //$NON-NLS-1$
- Object[] issues = componentIssues.toArray();
- for (int i = 0; i < issues.length; i++) {
- result += issues[i] + "\n"; //$NON-NLS-1$
- }
- return result;
- }
- return null;
- }
-
- private static final Class ACTIVATE_METHODS_PARAMETERS[] = new Class[] {ComponentContext.class};
-
- public ServiceComponent() {
- //
- }
-
- private final Method getMethod(Object instance, String methodName, boolean isActivate) throws Exception {
- if (Activator.DEBUG) {
- Activator.log.debug("ServiceComponent.getMethod(): " + methodName, null); //$NON-NLS-1$
- }
- Method method = null;
- int methodPriority = Integer.MAX_VALUE;
- Class clazz = instance != null ? instance.getClass() : null;
-
- while (method == null && clazz != null) {
- if (isNamespaceAtLeast11()) {
- Method[] methods = clazz.getDeclaredMethods();
- for (int i = 0; i < methods.length; i++) {
- if (methods[i].getName().equals(methodName)) {
- Class[] params = methods[i].getParameterTypes();
- boolean accepted = true;
- for (int j = 0; j < params.length; j++) {
- if (params[j] == ComponentContext.class || params[j] == BundleContext.class || params[j] == Map.class) {
- // correct parameter for both activate and deactivate methods
- } else if (!isActivate && (params[j] == Integer.class || params[j] == int.class)) {
- //we are checking int/Integer as special deactivate parameters
-
- } else {
- //the parameter is not recognized
- accepted = false;
- break;
- }
- }
- if (accepted && SCRUtil.checkMethodAccess(instance.getClass(), clazz, methods[i], true)) {
- //check if the newly accepted method has higher priority than the previous one and use it
- int prio = getMethodPriority(params);
- if (prio < methodPriority) {
- //found a method with a higher priority
- method = methods[i];
- methodPriority = prio;
- }
- }
- }
- }
- } else {
- try {
- method = clazz.getDeclaredMethod(methodName, ACTIVATE_METHODS_PARAMETERS);
- if (method != null) {
- if (!SCRUtil.checkMethodAccess(instance.getClass(), clazz, method, false)) {
- //the method is not accessible. Stop the search
- Activator.log(bc, LogService.LOG_WARNING, NLS.bind(Messages.METHOD_UNACCESSABLE, methodName, clazz), null);
- componentIssues.add(NLS.bind(Messages.METHOD_UNACCESSABLE, methodName, clazz));
- method = null;
- break;
- }
- }
- } catch (NoSuchMethodException e) {
- // the method activate/deactivate may not exist in the component implementation class
- }
- }
-
- if (method != null)
- break;
-
- // search for the method in the parent classes!
- clazz = clazz.getSuperclass();
- }
- if (method != null) {
- int modifiers = method.getModifiers();
- if (!Modifier.isPublic(modifiers)) {
- SCRUtil.setAccessible(method);
- }
- }
- return method;
- }
-
- private int getMethodPriority(Class[] params) {
- int priority = Integer.MAX_VALUE;
- if (params.length == 1) {
- if (params[0] == ComponentContext.class) {
- priority = 0; //highest priority
- } else if (params[0] == BundleContext.class) {
- priority = 1;
- } else if (params[0] == Map.class) {
- priority = 2;
- } else if (params[0] == int.class) {
- priority = 3;
- } else if (params[0] == Integer.class) {
- priority = 4;
- }
- } else if (params.length >= 2) {
- priority = 5;
- } else if (params.length == 0) {
- priority = 6;
- }
- return priority;
- }
-
- void activate(Object instance, ComponentContext context) throws ComponentException {
- try {
- if (isNamespaceAtLeast11()) {
- if (!activateCached) {
- activateCached = true;
- activateMethod = getMethod(instance, activateMethodName, true);
- }
- // invoke the method if any
- if (activateMethod != null) {
- Class[] paramTypes = activateMethod.getParameterTypes();
- Object[] params = null;
- if (paramTypes.length == 1) {
- params = SCRUtil.getObjectArray();
- } else {
- params = new Object[paramTypes.length];
- }
- for (int i = 0; i < params.length; i++) {
- if (paramTypes[i] == ComponentContext.class) {
- params[i] = context;
- } else if (paramTypes[i] == BundleContext.class) {
- params[i] = context.getBundleContext();
- } else if (paramTypes[i] == Map.class) {
- params[i] = context.getProperties();
- }
- }
-
- try {
- activateMethod.invoke(instance, params);
- } finally {
- if (params.length == 1) {
- SCRUtil.release(params);
- }
- }
- } else {
- if (activateMethodName != "activate") { //$NON-NLS-1$
- //the activate method is specified in the component description XML by the user.
- //It is expected to find it in the implementation class
- componentIssues.add("Can not activate instance of component " + this.implementation + ". The specified activate method [" + activateMethodName + "] was not found."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
- throw new ComponentException(NLS.bind(Messages.SPECIFIED_ACTIVATE_METHOD_NOT_FOUND, instance, this));
- }
- }
- } else {
- // retrieve the activate method from cache
- if (!activateCached) {
- activateCached = true;
- activateMethod = getMethod(instance, "activate", true); //$NON-NLS-1$
- }
- // invoke the method if any
- if (activateMethod != null) {
- Object[] params = SCRUtil.getObjectArray();
- params[0] = context;
- try {
- activateMethod.invoke(instance, params);
- } finally {
- SCRUtil.release(params);
- }
- }
- }
- } catch (Throwable t) {
- if (t instanceof ComponentException) {
- throw (ComponentException) t;
- }
- String cause = t.toString();
- if (t instanceof InvocationTargetException) {
- cause = t.getCause().toString();
- }
- componentIssues.add("Can not activate instance of component " + this.implementation + ". The activation throws: " + cause); //$NON-NLS-1$ //$NON-NLS-2$
- throw new ComponentException(NLS.bind(Messages.EXCEPTION_ACTIVATING_INSTANCE, instance, name), t);
- // rethrow exception so resolver is eventually notified that
- // the processed SCP is bad
- }
- }
-
- void modified(Object instance, ComponentContext context) throws ComponentException {
- try {
- if (isNamespaceAtLeast11()) {
- if (!modifyCached) {
- modifyCached = true;
- if (modifyMethodName != "") { //$NON-NLS-1$
- modifyMethod = getMethod(instance, modifyMethodName, true);
- }
- }
- // invoke the method if any
- if (modifyMethod != null) {
- Class[] paramTypes = modifyMethod.getParameterTypes();
- Object[] params = null;
- if (paramTypes.length == 1) {
- params = SCRUtil.getObjectArray();
- } else {
- params = new Object[paramTypes.length];
- }
- for (int i = 0; i < params.length; i++) {
- if (paramTypes[i] == ComponentContext.class) {
- params[i] = context;
- } else if (paramTypes[i] == BundleContext.class) {
- params[i] = context.getBundleContext();
- } else if (paramTypes[i] == Map.class) {
- params[i] = context.getProperties();
- }
- }
-
- try {
- modifyMethod.invoke(instance, params);
- } finally {
- if (params.length == 1) {
- SCRUtil.release(params);
- }
- }
- } else {
- if (modifyMethodName != "") { //$NON-NLS-1$
- //the modify method is specified in the component description XML by the user.
- //It is expected to find it in the implementation class
- throw new ComponentException(NLS.bind(Messages.CANNOT_MODIFY_INSTANCE__MODIFY_METHOD_NOT_FOUND, instance, this));
- }
- }
- }
- } catch (Throwable t) {
- if (t instanceof ComponentException) {
- throw (ComponentException) t;
- }
- Activator.log(bc, LogService.LOG_ERROR, NLS.bind(Messages.EXCEPTION_MODIFYING_COMPONENT, instance, this), t);
- }
- }
-
- void deactivate(Object instance, ComponentContext context, int deactivateReason) {
- try {
- if (isNamespaceAtLeast11()) {
- if (!deactivateCached) {
- deactivateCached = true;
- deactivateMethod = getMethod(instance, deactivateMethodName, false);
- }
- // invoke the method if any
- if (deactivateMethod != null) {
- Class[] paramTypes = deactivateMethod.getParameterTypes();
- Object[] params = null;
- if (paramTypes.length == 1) {
- params = SCRUtil.getObjectArray();
- } else {
- params = new Object[paramTypes.length];
- }
- for (int i = 0; i < params.length; i++) {
- if (paramTypes[i] == ComponentContext.class) {
- params[i] = context;
- } else if (paramTypes[i] == BundleContext.class) {
- params[i] = context.getBundleContext();
- } else if (paramTypes[i] == Map.class) {
- params[i] = context.getProperties();
- } else if (paramTypes[i] == int.class) {
- params[i] = new Integer(deactivateReason);
- } else if (paramTypes[i] == Integer.class) {
- params[i] = new Integer(deactivateReason);
- }
- }
-
- try {
- deactivateMethod.invoke(instance, params);
- } finally {
- if (params.length == 1) {
- SCRUtil.release(params);
- }
- }
- } else {
- if (deactivateMethodName != "deactivate") { //$NON-NLS-1$
- //the deactivate method is specified in the component description XML by the user.
- //It is expected to find it in the implementation class
- Activator.log(bc, LogService.LOG_ERROR, NLS.bind(Messages.SPECIFIED_DEACTIVATE_METHOD_NOT_FOUND, instance, this), null);
- }
- }
- } else {
- // retrieve the activate method from cache
- if (!deactivateCached) {
- deactivateCached = true;
- deactivateMethod = getMethod(instance, "deactivate", false); //$NON-NLS-1$
- }
- // invoke the method
- if (deactivateMethod != null) {
- Object[] params = SCRUtil.getObjectArray();
- params[0] = context;
- try {
- deactivateMethod.invoke(instance, params);
- } finally {
- SCRUtil.release(params);
- }
- }
- }
- } catch (Throwable t) {
- Activator.log(bc, LogService.LOG_ERROR, NLS.bind(Messages.ERROR_DEACTIVATING_INSTANCE, this), t);
- }
- }
-
- /**
- * This method is called from the XML parser to validate the component once
- * it is fully loaded!
- *
- * @param line
- * the line at which the the component definition ends
- * @param _namespace specify the namespace of the component according to XML SCR schema
- */
- void validate(int line, int _namespace) {
- // System.out.println("Validating component " + name + " with namespace " + (namespace11 ? "1.1" : "1.0"));
- this.namespace = _namespace;
- if (name == null) {
- if (isNamespaceAtLeast11()) {
- name = implementation;
- } else {
- throw new IllegalArgumentException(NLS.bind(Messages.NO_NAME_ATTRIBUTE, Integer.toString(line)));
- }
- }
- if (isNamespaceAtLeast11()) {
- if (!(configurationPolicy == CONF_POLICY_OPTIONAL || configurationPolicy == CONF_POLICY_REQUIRE || configurationPolicy == CONF_POLICY_IGNORE)) {
- throw new IllegalArgumentException(NLS.bind(Messages.INCORRECT_ACTIVATION_POLICY, name, Integer.toString(line)));
- }
- }
-
- if (isNamespaceAtLeast12()) {
- if (configurationPID == null) {
- configurationPID = name;
- }
- }
-
- if (implementation == null) {
- throw new IllegalArgumentException(NLS.bind(Messages.NO_IMPLEMENTATION_ATTRIBUTE, name, Integer.toString(line)));
- }
-
- // component factory is incompatible with service factory
- if (factory != null && serviceFactory) {
- throw new IllegalArgumentException(NLS.bind(Messages.INVALID_COMPONENT_FACTORY_AND_SERVICE_FACTORY, name));
- }
-
- if (immediate) {
- if (serviceFactory)
- throw new IllegalArgumentException(NLS.bind(Messages.INVALID_COMPONENT_IMMEDIATE_AND_SERVICE_FACTORY, name));
- if (factory != null)
- throw new IllegalArgumentException(NLS.bind(Messages.INVALID_COMPONENT_IMMEDIATE_AND_FACTORY, name));
- } else {
- if ((serviceInterfaces == null) && (factory == null)) {
- throw new IllegalArgumentException(NLS.bind(Messages.INVALID_COMPONENT_NO_SERVICES_NO_IMMEDIATE, name));
- }
- }
-
- // make sure that references are also valid
- if (references != null) {
- for (int i = 0; i < references.size(); i++) {
- ComponentReference r = (ComponentReference) references.elementAt(i);
- if (r.name == null) {
- if (isNamespaceAtLeast11()) {
- r.name = r.interfaceName;
- } else {
- throw new IllegalArgumentException(NLS.bind(Messages.COMPONENT_HAS_ILLEGAL_REFERENCE, new Object[] {name, Integer.toString(line), r}));
- }
- }
- if (r.interfaceName == null || r.name.length() == 0 || r.interfaceName.length() == 0) {
- throw new IllegalArgumentException(NLS.bind(Messages.COMPONENT_HAS_ILLEGAL_REFERENCE, new Object[] {name, Integer.toString(line), r}));
- }
- for (int j = i + 1; j < references.size(); j++) {
- ComponentReference ref2 = (ComponentReference) references.elementAt(j);
- if (r.name.equals(ref2.name)) {
- throw new IllegalArgumentException(NLS.bind(Messages.DUPLICATED_REFERENCE_NAMES, name, Integer.toString(line)));
- }
- }
- }
- }
-
- // cache the service interfaces as String[] too.
- if (serviceInterfaces != null && !serviceInterfaces.isEmpty()) {
- provides = new String[serviceInterfaces.size()];
- serviceInterfaces.copyInto(provides);
- }
-
- // make sure that the component will get automatically enabled!
- enabled = autoenable;
- }
-
- /**
- * This method will instantiate the implementation class!
- *
- * @return instance of the component implementation class. If the components
- * exports some services, the implementation must implement all of
- * them
- * @throws Exception
- * is thrown if the implementation cannot be instantiated for
- * some reasons.
- */
- final Object createInstance() throws Exception {
- try {
- return bundle.loadClass(implementation).newInstance();
- } catch (Throwable t) {
- throw new ComponentException(NLS.bind(Messages.EXCEPTION_CREATING_COMPONENT_INSTANCE, this), t);
- }
- }
-
- /**
- * This method will dispose everything
- */
- // TODO : this method is not used - should be removed?
- public final void dispose() {
-
- activateCached = deactivateCached = false;
- activateMethod = deactivateMethod = null;
-
- enabled = false;
- bundle = null;
- // bc = null;
-
- if (references != null) {
- for (int i = 0; i < references.size(); i++) {
- ComponentReference ref = (ComponentReference) references.elementAt(i);
- ref.dispose();
- }
- references.removeAllElements();
- references = null;
- }
-
- if (properties != null) {
- properties.clear();
- properties = null;
- }
-
- if (serviceInterfaces != null) {
- serviceInterfaces.removeAllElements();
- serviceInterfaces = null;
- }
- }
-
- public boolean provides(String interfaceName) {
- return serviceInterfaces != null && serviceInterfaces.contains(interfaceName);
- }
-
- public String getConfigurationPID() {
- if (isNamespaceAtLeast12()) {
- return configurationPID;
- }
- return name;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.lang.Object#toString()
- */
- public final String toString() {
- StringBuffer buffer = new StringBuffer();
- buffer.append("Component["); //$NON-NLS-1$
- buffer.append("\n\tname = ").append(name); //$NON-NLS-1$
- if (isNamespaceAtLeast11()) {
- buffer.append("\n\tactivate = ").append(activateMethodName); //$NON-NLS-1$
- buffer.append("\n\tdeactivate = ").append(deactivateMethodName); //$NON-NLS-1$
- buffer.append("\n\tmodified = ").append(modifyMethodName); //$NON-NLS-1$
- buffer.append("\n\tconfiguration-policy = ").append(configurationPolicy); //$NON-NLS-1$
- }
- if (isNamespaceAtLeast12()) {
- buffer.append("\n\tconfiguration-pid = ").append(configurationPID); //$NON-NLS-1$
- }
- buffer.append("\n\tfactory = ").append(factory); //$NON-NLS-1$
- buffer.append("\n\tautoenable = ").append(autoenable); //$NON-NLS-1$
- buffer.append("\n\timmediate = ").append(immediate); //$NON-NLS-1$
-
- buffer.append("\n\timplementation = ").append(implementation); //$NON-NLS-1$
- buffer.append("\n\tstate = ").append(SCRUtil.getStateStringRepresentation(state)); //$NON-NLS-1$
- StringBuffer buf = new StringBuffer(200);
- if (properties != null) {
- buf.append('{');
- Enumeration keys = properties.keys();
- while (keys.hasMoreElements()) {
- Object key = keys.nextElement();
- buf.append(key).append('=').append(SCRUtil.getStringRepresentation(properties.get(key)));
- if (keys.hasMoreElements()) {
- buf.append(", "); //$NON-NLS-1$
- }
- }
- buf.append('}');
- }
- buffer.append("\n\tproperties = ").append(buf.toString()); //$NON-NLS-1$
-
- buffer.append("\n\tserviceFactory = ").append(serviceFactory); //$NON-NLS-1$
- buffer.append("\n\tserviceInterface = ").append(serviceInterfaces); //$NON-NLS-1$
-
- if (references == null) {
- buffer.append("\n\treferences = ").append("null"); //$NON-NLS-1$ //$NON-NLS-2$
- } else {
- buffer.append("\n\treferences = {"); //$NON-NLS-1$
- for (int i = 0; i < references.size(); i++) {
- buffer.append("\n\t\t").append(references.elementAt(i)); //$NON-NLS-1$
- }
- buffer.append("\n\t}"); //$NON-NLS-1$
- }
- buffer.append("\n\tlocated in bundle = ").append(bundle); //$NON-NLS-1$
- buffer.append("\n]"); //$NON-NLS-1$
- return buffer.toString();
- }
-
- public synchronized void writeObject(OutputStream s) throws Exception {
- try {
- DataOutputStream out;
- if (s instanceof DataOutputStream) {
- out = (DataOutputStream) s;
- } else {
- out = new DataOutputStream(s);
- }
-
- boolean flag;
- int count;
-
- out.writeUTF(name);
- out.writeUTF(implementation);
- out.writeBoolean(serviceFactory);
- out.writeBoolean(autoenable);
- out.writeBoolean(immediate);
-
- flag = factory != null;
- out.writeBoolean(flag);
- if (flag)
- out.writeUTF(factory);
-
- count = serviceInterfaces == null ? 0 : serviceInterfaces.size();
- out.writeInt(count);
- for (int i = 0; i < count; i++) {
- out.writeUTF(serviceInterfaces.elementAt(i).toString());
- }
-
- count = references == null ? 0 : references.size();
- out.writeInt(count);
- for (int i = 0; i < count; i++) {
- ComponentReference ref = (ComponentReference) references.elementAt(i);
- ref.writeObject(out);
- }
-
- flag = properties != null && !properties.isEmpty();
- out.writeBoolean(flag);
- if (flag) {
- ExternalizableDictionary dictionary = new ExternalizableDictionary();
- dictionary.copyFrom(properties);
- dictionary.writeObject(out);
- }
-
- out.writeInt(namespace);
- if (isNamespaceAtLeast11()) {
- if (configurationPolicy == CONF_POLICY_OPTIONAL) {
- //this is the default value. Do not write it. Just add a mark
- out.writeBoolean(false);
- } else {
- out.writeBoolean(true);
- out.writeUTF(configurationPolicy);
- }
- if (!activateMethodDeclared) {
- //this is the default value. Do not write it. Just add a mark
- out.writeBoolean(false);
- } else {
- out.writeBoolean(true);
- out.writeUTF(activateMethodName);
- }
- if (!deactivateMethodDeclared) {
- //this is the default value. Do not write it. Just add a mark
- out.writeBoolean(false);
- } else {
- out.writeBoolean(true);
- out.writeUTF(deactivateMethodName);
- }
- if (modifyMethodName == "") { //$NON-NLS-1$
- //this is the default value. Do not write it. Just add a mark
- out.writeBoolean(false);
- } else {
- out.writeBoolean(true);
- out.writeUTF(modifyMethodName);
- }
- }
- if (isNamespaceAtLeast12()) {
- if (configurationPID == name) {
- out.writeBoolean(false);
- } else {
- out.writeBoolean(true);
- out.writeUTF(configurationPID);
- }
- }
- } catch (Exception e) {
- Activator.log(null, LogService.LOG_ERROR, Messages.ERROR_WRITING_OBJECT, e);
- throw e;
- }
- }
-
- /**
- * Don't forget to set the bundle & the bc attributes!!!!!!
- *
- * @param s
- * the input stream from which to read the object
- * @throws Exception
- * @see org.eclipse.equinox.internal.util.io.Externalizable#readObject(java.io.InputStream)
- */
- public synchronized void readObject(InputStream s) throws Exception {
- try {
- DataInputStream in;
- if (s instanceof DataInputStream) {
- in = (DataInputStream) s;
- } else {
- in = new DataInputStream(s);
- }
- boolean flag;
- int count;
-
- name = in.readUTF();
- implementation = in.readUTF();
- serviceFactory = in.readBoolean();
- autoenable = in.readBoolean();
- immediate = in.readBoolean();
-
- flag = in.readBoolean();
- if (flag)
- factory = in.readUTF();
-
- count = in.readInt();
- if (count > 0) {
- serviceInterfaces = new Vector(count);
- provides = new String[count];
- for (int i = 0; i < count; i++) {
- String entry = in.readUTF();
- serviceInterfaces.addElement(entry);
- provides[i] = entry;
- }
- }
-
- count = in.readInt();
- if (count > 0) {
- references = new Vector(count);
- for (int i = 0; i < count; i++) {
- ComponentReference ref = new ComponentReference(this);
- ref.readObject(in);
- }
- }
-
- flag = in.readBoolean();
- if (flag) {
- ExternalizableDictionary dictionary = new ExternalizableDictionary();
- dictionary.readObject(in);
- Properties props = new Properties();
- for (Enumeration keys = dictionary.keys(); keys.hasMoreElements();) {
- String key = (String) keys.nextElement();
- props.put(key, dictionary.get(key));
- }
- properties = props;
- }
- namespace = in.readInt();
- if (isNamespaceAtLeast11()) {
- flag = in.readBoolean();
- if (flag) {
- configurationPolicy = in.readUTF();
- if (configurationPolicy.equals(CONF_POLICY_IGNORE)) {
- configurationPolicy = CONF_POLICY_IGNORE;
- } else {
- configurationPolicy = CONF_POLICY_REQUIRE;
- }
- }
- flag = in.readBoolean();
- if (flag) {
- activateMethodName = in.readUTF();
- activateMethodDeclared = true;
- }
- flag = in.readBoolean();
- if (flag) {
- deactivateMethodName = in.readUTF();
- deactivateMethodDeclared = true;
- }
- flag = in.readBoolean();
- if (flag)
- modifyMethodName = in.readUTF();
- }
- if (isNamespaceAtLeast12()) {
- flag = in.readBoolean();
- if (flag) {
- configurationPID = in.readUTF();
- } else {
- configurationPID = name;
- }
- }
- } catch (Exception e) {
- Activator.log(null, LogService.LOG_ERROR, Messages.ERROR_READING_OBJECT, e);
- throw e;
- }
- }
-
- public ServiceComponentProp getComponentPropByPID(String pid) {
- if (componentProps != null) {
- for (int i = 0; i < componentProps.size(); i++) {
- ServiceComponentProp scp = (ServiceComponentProp) componentProps.elementAt(i);
- if (scp.getProperties() != null) {
- if (pid.equals(scp.getProperties().get(Constants.SERVICE_PID))) {
- return scp;
- }
- }
- }
- }
- return null;
- }
-
- public void addServiceComponentProp(ServiceComponentProp scp) {
- if (componentProps == null) {
- componentProps = new Vector(1);
- }
- componentProps.addElement(scp);
- }
-
- /**
- * Return the ServiceComponentProp object created for this component. Note there might be more than one SCP objects.
- * This method will return always the first one
- * @return the ServiceComponentProp object created for this component
- */
- public ServiceComponentProp getServiceComponentProp() {
- if (componentProps != null) {
- synchronized (componentProps) {
- if (!componentProps.isEmpty()) {
- return (ServiceComponentProp) componentProps.elementAt(0);
- }
- }
- }
- return null;
- }
-
- public boolean isNamespaceAtLeast11() {
- return namespace >= NAMESPACE_1_1;
- }
-
- public boolean isNamespaceAtLeast12() {
- return namespace >= NAMESPACE_1_2;
- }
-
- public boolean isImmediate() {
- return immediate;
- }
-
- public void setImmediate(boolean immediate) {
- this.immediate = immediate;
- }
-
- public String getConfigurationPolicy() {
- return configurationPolicy;
- }
-
- public void disable() {
- if (getState() == STATE_DISPOSED) {
- throw new IllegalStateException(Messages.COMPONENT_DISPOSED);
- } else if (getState() != STATE_DISABLED) {
- InstanceProcess.resolver.mgr.disableComponent(name, bundle);
- }
- }
-
- public void enable() {
- if (getState() == STATE_DISPOSED) {
- throw new IllegalStateException(Messages.COMPONENT_DISPOSED);
- } else if (getState() == STATE_DISABLED) {
- InstanceProcess.resolver.mgr.enableComponent(name, bundle);
- }
- }
-
- public String getActivate() {
- return activateMethodName;
- }
-
- public Bundle getBundle() {
- return bundle;
- }
-
- public String getClassName() {
- return implementation;
- }
-
- public ComponentInstance getComponentInstance() {
- if (componentProps != null && !componentProps.isEmpty()) {
- //get the first built compoent's instance
- Vector instances = ((ServiceComponentProp) componentProps.elementAt(0)).instances;
- if (!instances.isEmpty()) {
- return (ComponentInstance) instances.elementAt(0);
- }
- }
- //The component is not yet built
- return null;
- }
-
- public String getDeactivate() {
- return deactivateMethodName;
- }
-
- public String getFactory() {
- return factory;
- }
-
- public long getId() {
- if (componentProps != null && !componentProps.isEmpty()) {
- //get the first built component's ID
- return ((Long) ((ServiceComponentProp) componentProps.elementAt(0)).properties.get(ComponentConstants.COMPONENT_ID)).longValue();
- }
- //The component is not yet given an ID by the SRC because it is not active
- return -1;
- }
-
- public String getModified() {
- if (!isNamespaceAtLeast11()) {
- return null;
- }
- return modifyMethodName;
- }
-
- public String getName() {
- return name;
- }
-
- public Dictionary getProperties() {
- if (readOnlyProps == null) {
- readOnlyProps = new ReadOnlyDictionary(properties);
- } else {
- // the scp properties may have been modified by configuration
- // update the instance with the current properties
- readOnlyProps.updateDelegate(properties);
- }
- return readOnlyProps;
- }
-
- public Reference[] getReferences() {
- if (references != null && !references.isEmpty()) {
- org.apache.felix.scr.Reference[] res = new org.apache.felix.scr.Reference[references.size()];
- references.copyInto(res);
- return res;
- }
- return null;
- }
-
- public String[] getServices() {
- return provides;
- }
-
- public int getState() {
- //check if there is at least one SCP created and return its state
- if (componentProps != null && !componentProps.isEmpty()) {
- //get the first component's state
- return ((ServiceComponentProp) componentProps.elementAt(0)).getState();
- }
- //return the current state of the component
- return state;
- }
-
- public boolean isActivateDeclared() {
- if (!isNamespaceAtLeast11()) {
- return false;
- }
- return activateMethodDeclared;
- }
-
- public boolean isDeactivateDeclared() {
- if (!isNamespaceAtLeast11()) {
- return false;
- }
- return deactivateMethodDeclared;
- }
-
- public boolean isDefaultEnabled() {
- return autoenable;
- }
-
- public boolean isServiceFactory() {
- return serviceFactory;
- }
-
- public void setState(int newState) {
- state = newState;
- }
-} \ No newline at end of file

Back to the top