| /******************************************************************************* |
| * Copyright (c) 2017 IBM Corporation and others. |
| * 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: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.equinox.internal.ds; |
| |
| import java.util.*; |
| import java.util.Map.Entry; |
| import org.apache.felix.scr.*; |
| import org.osgi.framework.*; |
| import org.osgi.framework.dto.ServiceReferenceDTO; |
| import org.osgi.service.component.ComponentConstants; |
| import org.osgi.service.component.ComponentInstance; |
| import org.osgi.service.component.runtime.ServiceComponentRuntime; |
| import org.osgi.service.component.runtime.dto.*; |
| |
| @Deprecated |
| public class ScrServiceImpl implements ScrService { |
| final ServiceComponentRuntime scr; |
| final BundleContext context; |
| |
| ScrServiceImpl(ServiceComponentRuntime scr, BundleContext context) { |
| this.scr = scr; |
| this.context = context.getBundle(Constants.SYSTEM_BUNDLE_LOCATION).getBundleContext(); |
| } |
| |
| @Override |
| public Component[] getComponents() { |
| return toComponents(scr.getComponentDescriptionDTOs()); |
| } |
| |
| private Component[] toComponents(Collection<ComponentDescriptionDTO> componentDescriptionDTOs) { |
| Collection<Component> components = new ArrayList<Component>(); |
| for (ComponentDescriptionDTO dto : componentDescriptionDTOs) { |
| Component component = toComponent(dto); |
| if (component != null) { |
| components.add(component); |
| } |
| } |
| return components.isEmpty() ? null : components.toArray(new Component[0]); |
| } |
| |
| @Override |
| public Component getComponent(long componentId) { |
| for (ComponentDescriptionDTO dto : scr.getComponentDescriptionDTOs()) { |
| Long id = (Long) dto.properties.get(ComponentConstants.COMPONENT_ID); |
| if (componentId == id) { |
| return toComponent(dto); |
| } |
| } |
| return null; |
| } |
| |
| private Component toComponent(ComponentDescriptionDTO dto) { |
| Collection<ComponentConfigurationDTO> configs = scr.getComponentConfigurationDTOs(dto); |
| if (configs.isEmpty()) { |
| return null; |
| } |
| |
| return new ComponentImpl(configs.iterator().next()); |
| } |
| |
| @Override |
| public Component[] getComponents(String componentName) { |
| Collection<ComponentDescriptionDTO> dtos = new ArrayList<ComponentDescriptionDTO>(); |
| for (ComponentDescriptionDTO dto : scr.getComponentDescriptionDTOs()) { |
| if (componentName.equals(dto.name)) { |
| dtos.add(dto); |
| } |
| } |
| return toComponents(dtos); |
| } |
| |
| @Override |
| public Component[] getComponents(Bundle bundle) { |
| return toComponents(scr.getComponentDescriptionDTOs(bundle)); |
| } |
| |
| ServiceReference<?> getServiceReference(long id) { |
| try { |
| ServiceReference<?>[] refs = context.getServiceReferences((String) null, "(" + Constants.SERVICE_ID + "=" + id + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ |
| if (refs != null && refs.length > 0) { |
| return refs[0]; |
| } |
| } catch (InvalidSyntaxException e) { |
| throw new RuntimeException(e); |
| } |
| return null; |
| } |
| |
| class ComponentImpl implements Component { |
| private final ComponentConfigurationDTO config; |
| |
| ComponentImpl(ComponentConfigurationDTO config) { |
| this.config = config; |
| } |
| |
| @Override |
| public long getId() { |
| return config.id; |
| } |
| |
| @Override |
| public String getName() { |
| return config.description.name; |
| } |
| |
| @Override |
| public int getState() { |
| switch (config.state) { |
| case ComponentConfigurationDTO.ACTIVE : |
| return Component.STATE_ACTIVE; |
| case ComponentConfigurationDTO.SATISFIED : |
| return Component.STATE_REGISTERED; |
| case ComponentConfigurationDTO.UNSATISFIED_CONFIGURATION : |
| return Component.STATE_UNSATISFIED; |
| case ComponentConfigurationDTO.UNSATISFIED_REFERENCE : |
| return Component.STATE_UNSATISFIED; |
| default : |
| break; |
| } |
| return Component.STATE_DISABLED; |
| } |
| |
| @Override |
| public Bundle getBundle() { |
| return context.getBundle(config.description.bundle.id); |
| } |
| |
| @Override |
| public String getFactory() { |
| return config.description.factory; |
| } |
| |
| @Override |
| public boolean isServiceFactory() { |
| return Constants.SCOPE_BUNDLE.equals(config.description.scope); |
| } |
| |
| @Override |
| public String getClassName() { |
| return config.description.implementationClass; |
| } |
| |
| @Override |
| public boolean isDefaultEnabled() { |
| return config.description.defaultEnabled; |
| } |
| |
| @Override |
| public boolean isImmediate() { |
| return config.description.immediate; |
| } |
| |
| @Override |
| public String[] getServices() { |
| return config.description.serviceInterfaces; |
| } |
| |
| @SuppressWarnings({"rawtypes", "unchecked"}) |
| @Override |
| public Dictionary getProperties() { |
| return new Hashtable(config.description.properties); |
| } |
| |
| @Override |
| public Reference[] getReferences() { |
| if (config.description.references.length == 0) { |
| return null; |
| } |
| Map<String, ReferenceDTO> referenceDTOs = new HashMap<String, ReferenceDTO>(); |
| for (ReferenceDTO reference : config.description.references) { |
| referenceDTOs.put(reference.name, reference); |
| } |
| Map<String, SatisfiedReferenceDTO> satisfiedDTOs = new HashMap<String, SatisfiedReferenceDTO>(); |
| for (SatisfiedReferenceDTO satisfied : config.satisfiedReferences) { |
| satisfiedDTOs.put(satisfied.name, satisfied); |
| } |
| Map<String, UnsatisfiedReferenceDTO> unsatisfiedDTOs = new HashMap<String, UnsatisfiedReferenceDTO>(); |
| for (UnsatisfiedReferenceDTO unsatisfied : config.unsatisfiedReferences) { |
| unsatisfiedDTOs.put(unsatisfied.name, unsatisfied); |
| } |
| return toReferences(referenceDTOs, satisfiedDTOs, unsatisfiedDTOs); |
| } |
| |
| private Reference[] toReferences(Map<String, ReferenceDTO> referenceDTOs, Map<String, SatisfiedReferenceDTO> satisfiedDTOs, Map<String, UnsatisfiedReferenceDTO> unsatisfiedDTOs) { |
| Collection<Reference> references = new ArrayList<Reference>(); |
| for (Entry<String, SatisfiedReferenceDTO> satisfied : satisfiedDTOs.entrySet()) { |
| references.add(new SatsifiedReference(satisfied.getValue(), referenceDTOs.get(satisfied.getValue().name))); |
| } |
| for (Entry<String, UnsatisfiedReferenceDTO> unsatisfied : unsatisfiedDTOs.entrySet()) { |
| references.add(new UnsatsifiedReference(unsatisfied.getValue(), referenceDTOs.get(unsatisfied.getValue().name))); |
| } |
| return references.toArray(new Reference[0]); |
| } |
| |
| @Override |
| public ComponentInstance getComponentInstance() { |
| throw new UnsupportedOperationException("Not supported."); //$NON-NLS-1$ |
| } |
| |
| @Override |
| public String getActivate() { |
| return config.description.activate; |
| } |
| |
| @Override |
| public boolean isActivateDeclared() { |
| return config.description.activate != null; |
| } |
| |
| @Override |
| public String getDeactivate() { |
| return config.description.deactivate; |
| } |
| |
| @Override |
| public boolean isDeactivateDeclared() { |
| return config.description.deactivate != null; |
| } |
| |
| @Override |
| public String getModified() { |
| return config.description.modified; |
| } |
| |
| @Override |
| public String getConfigurationPolicy() { |
| return config.description.configurationPolicy; |
| } |
| |
| @Override |
| public void enable() { |
| scr.disableComponent(config.description); |
| } |
| |
| @Override |
| public void disable() { |
| scr.disableComponent(config.description); |
| } |
| } |
| |
| abstract class ReferenceBase implements Reference { |
| protected final ReferenceDTO reference; |
| |
| ReferenceBase(ReferenceDTO reference) { |
| this.reference = reference; |
| } |
| |
| @Override |
| public String getName() { |
| return reference.name; |
| } |
| |
| @Override |
| public String getServiceName() { |
| return reference.interfaceName; |
| } |
| |
| @Override |
| public boolean isOptional() { |
| return reference.cardinality.startsWith("0"); //$NON-NLS-1$ |
| } |
| |
| @Override |
| public boolean isMultiple() { |
| return reference.cardinality.startsWith("1"); //$NON-NLS-1$ |
| } |
| |
| @Override |
| public boolean isStatic() { |
| return "static".equals(reference.policy); //$NON-NLS-1$ |
| } |
| |
| @Override |
| public String getTarget() { |
| return reference.target; |
| } |
| |
| @Override |
| public String getBindMethodName() { |
| return reference.bind; |
| } |
| |
| @Override |
| public String getUnbindMethodName() { |
| return reference.unbind; |
| } |
| |
| @Override |
| public String getUpdatedMethodName() { |
| return reference.updated; |
| } |
| } |
| |
| class SatsifiedReference extends ReferenceBase { |
| private final SatisfiedReferenceDTO satisfied; |
| |
| SatsifiedReference(SatisfiedReferenceDTO satisifed, ReferenceDTO reference) { |
| super(reference); |
| this.satisfied = satisifed; |
| } |
| |
| @SuppressWarnings("rawtypes") |
| @Override |
| public ServiceReference[] getServiceReferences() { |
| Collection<ServiceReference<?>> serviceReferences = new ArrayList<ServiceReference<?>>(); |
| for (ServiceReferenceDTO serviceRefDTO : satisfied.boundServices) { |
| ServiceReference<?> ref = getServiceReference(serviceRefDTO.id); |
| if (ref != null) { |
| serviceReferences.add(ref); |
| } |
| } |
| return serviceReferences.isEmpty() ? null : serviceReferences.toArray(new ServiceReference[0]); |
| } |
| |
| @Override |
| public boolean isSatisfied() { |
| return true; |
| } |
| } |
| |
| class UnsatsifiedReference extends ReferenceBase { |
| private final UnsatisfiedReferenceDTO unsatisfied; |
| |
| UnsatsifiedReference(UnsatisfiedReferenceDTO unsatisifed, ReferenceDTO reference) { |
| super(reference); |
| this.unsatisfied = unsatisifed; |
| } |
| |
| @Override |
| @SuppressWarnings("rawtypes") |
| public ServiceReference[] getServiceReferences() { |
| Collection<ServiceReference<?>> serviceReferences = new ArrayList<ServiceReference<?>>(); |
| for (ServiceReferenceDTO serviceRefDTO : unsatisfied.targetServices) { |
| ServiceReference<?> ref = getServiceReference(serviceRefDTO.id); |
| if (ref != null) { |
| serviceReferences.add(ref); |
| } |
| } |
| return serviceReferences.isEmpty() ? null : serviceReferences.toArray(new ServiceReference[0]); |
| } |
| |
| @Override |
| public boolean isSatisfied() { |
| return false; |
| } |
| } |
| |
| } |