/* * 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.ipojo.composite.service.instantiator; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.felix.ipojo.ComponentInstance; import org.apache.felix.ipojo.architecture.HandlerDescription; import org.apache.felix.ipojo.composite.CompositeHandler; import org.apache.felix.ipojo.metadata.Attribute; import org.apache.felix.ipojo.metadata.Element; import org.apache.felix.ipojo.util.DependencyModel; import org.osgi.framework.ServiceReference; /** * Description of the Service Creator Handler. * * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a> */ public class ServiceInstantiatorDescription extends HandlerDescription { /** * List of managed service instances. */ private List m_instances; /** * List of exports. */ private List m_imports; /** * Constructor. * * @param handler : composite handler * @param insts : list of service instances * @param imps : list of service importers */ public ServiceInstantiatorDescription(CompositeHandler handler, List insts, List imps) { super(handler); m_instances = insts; m_imports = imps; } /** * Build service instantiator handler description. * @return the handler description * @see org.apache.felix.ipojo.architecture.HandlerDescription#getHandlerInfo() */ public Element getHandlerInfo() { Element services = super.getHandlerInfo(); for (int i = 0; i < m_imports.size(); i++) { ServiceImporter imp = (ServiceImporter) m_imports.get(i); Element impo = new Element("Requires", ""); impo.addAttribute(new Attribute("Specification", imp.getSpecification().getName())); if (imp.getFilter() != null) { impo.addAttribute(new Attribute("Filter", imp.getFilter())); } if (imp.getState() == DependencyModel.RESOLVED) { impo.addAttribute(new Attribute("State", "resolved")); for (int j = 0; j < imp.getProviders().size(); j++) { Element prov = new Element("Provider", ""); prov.addAttribute(new Attribute("name", (String) imp.getProviders().get(j))); impo.addElement(prov); } } else { impo.addAttribute(new Attribute("State", "unresolved")); } services.addElement(impo); } for (int i = 0; i < m_instances.size(); i++) { SvcInstance inst = (SvcInstance) m_instances.get(i); Element service = new Element("Service", ""); service.addAttribute(new Attribute("Specification", inst.getServiceSpecification())); String state = "unresolved"; if (inst.getState() == DependencyModel.RESOLVED) { state = "resolved"; } service.addAttribute(new Attribute("State", state)); Map map = inst.getMatchingFactories(); Set keys = map.keySet(); Iterator iterator = keys.iterator(); while (iterator.hasNext()) { ServiceReference ref = (ServiceReference) iterator.next(); Object object = map.get(ref); if (object != null) { Element fact = new Element("Factory", ""); fact.addAttribute(new Attribute("Name", ((ComponentInstance) object).getFactory().getName())); service.addElement(fact); } } services.addElement(service); } return services; } }