Search in sources :

Example 16 with PropertyDescription

use of org.apache.felix.ipojo.architecture.PropertyDescription in project felix by apache.

the class ConfigurationHandler method initializeComponentFactory.

/**
 * Initialize the component type.
 *
 * @param desc     : component type description to populate.
 * @param metadata : component type metadata.
 * @throws ConfigurationException : metadata are incorrect.
 * @see org.apache.felix.ipojo.Handler#initializeComponentFactory(org.apache.felix.ipojo.architecture.ComponentTypeDescription, org.apache.felix.ipojo.metadata.Element)
 */
public void initializeComponentFactory(ComponentTypeDescription desc, Element metadata) throws ConfigurationException {
    Element[] confs = metadata.getElements("Properties", "");
    if (confs == null) {
        return;
    }
    Element[] configurables = confs[0].getElements("Property");
    for (int i = 0; configurables != null && i < configurables.length; i++) {
        String fieldName = configurables[i].getAttribute("field");
        String methodName = configurables[i].getAttribute("method");
        String paramIndex = configurables[i].getAttribute("constructor-parameter");
        if (fieldName == null && methodName == null && paramIndex == null) {
            throw new ConfigurationException("Malformed property : The property needs to contain" + " at least a field, a method or a constructor-parameter");
        }
        String name = configurables[i].getAttribute("name");
        if (name == null) {
            if (fieldName == null && methodName != null) {
                name = methodName;
            } else if (fieldName == null && paramIndex != null) {
                // Extract the name from the arguments.
                MethodMetadata[] constructors = getFactory().getPojoMetadata().getConstructors();
                if (constructors.length != 1) {
                    throw new ConfigurationException("Cannot infer the property name injected in the constructor " + "parameter #" + paramIndex + " - add the `name` attribute");
                } else {
                    int idx = Integer.valueOf(paramIndex);
                    if (constructors[0].getMethodArgumentNames().length > idx) {
                        name = constructors[0].getMethodArgumentNames()[idx];
                    } else {
                        throw new ConfigurationException("Cannot infer the property name injected in the constructor " + "parameter #" + paramIndex + " - not enough argument in the constructor :" + constructors[0].getArguments());
                    }
                }
            } else {
                name = fieldName;
            }
            // Add the type to avoid configure checking
            configurables[i].addAttribute(new Attribute("name", name));
        }
        String value = configurables[i].getAttribute("value");
        // Detect the type of the property
        PojoMetadata manipulation = getFactory().getPojoMetadata();
        String type = null;
        if (methodName != null) {
            MethodMetadata[] method = manipulation.getMethods(methodName);
            if (method.length == 0) {
                type = configurables[i].getAttribute("type");
                if (type == null) {
                    throw new ConfigurationException("Malformed property : The type of the property cannot be discovered, add a 'type' attribute");
                }
            } else {
                if (method[0].getMethodArguments().length != 1) {
                    throw new ConfigurationException("Malformed property :  The method " + methodName + " does not have one argument");
                }
                type = method[0].getMethodArguments()[0];
                // Add the type to avoid configure checking
                configurables[i].addAttribute(new Attribute("type", type));
            }
        } else if (fieldName != null) {
            FieldMetadata field = manipulation.getField(fieldName);
            if (field == null) {
                throw new ConfigurationException("Malformed property : The field " + fieldName + " does not exist in the implementation class");
            }
            type = field.getFieldType();
            // Add the type to avoid configure checking
            configurables[i].addAttribute(new Attribute("type", type));
        } else if (paramIndex != null) {
            int index = Integer.parseInt(paramIndex);
            type = configurables[i].getAttribute("type");
            MethodMetadata[] cts = manipulation.getConstructors();
            // we the index 'index'.
            if (type == null && cts.length > 0 && cts[0].getMethodArguments().length > index) {
                type = cts[0].getMethodArguments()[index];
            } else if (type == null) {
                // Applied only if type was not determined.
                throw new ConfigurationException("Cannot determine the type of the property " + index + ", please use the type attribute");
            }
            configurables[i].addAttribute(new Attribute("type", type));
        }
        // Is the property set to immutable
        boolean immutable = false;
        String imm = configurables[i].getAttribute("immutable");
        immutable = imm != null && imm.equalsIgnoreCase("true");
        boolean mandatory = false;
        String man = configurables[i].getAttribute("mandatory");
        mandatory = man != null && man.equalsIgnoreCase("true");
        PropertyDescription pd;
        if (value == null) {
            // Cannot be immutable if we have no value.
            pd = new PropertyDescription(name, type, null, false);
        } else {
            pd = new PropertyDescription(name, type, value, immutable);
        }
        if (mandatory) {
            pd.setMandatory();
        }
        desc.addProperty(pd);
    }
}
Also used : PropertyDescription(org.apache.felix.ipojo.architecture.PropertyDescription) FieldMetadata(org.apache.felix.ipojo.parser.FieldMetadata) Attribute(org.apache.felix.ipojo.metadata.Attribute) Element(org.apache.felix.ipojo.metadata.Element) PojoMetadata(org.apache.felix.ipojo.parser.PojoMetadata) MethodMetadata(org.apache.felix.ipojo.parser.MethodMetadata)

Example 17 with PropertyDescription

use of org.apache.felix.ipojo.architecture.PropertyDescription in project felix by apache.

the class ProvidedServiceHandler method initializeComponentFactory.

/**
 * Initialize the component type.
 * @param desc : component type description to populate.
 * @param metadata : component type metadata.
 * @throws ConfigurationException : occurs when the POJO does not implement any interfaces.
 * @see org.apache.felix.ipojo.Handler#initializeComponentFactory(org.apache.felix.ipojo.architecture.ComponentTypeDescription, org.apache.felix.ipojo.metadata.Element)
 */
public void initializeComponentFactory(ComponentTypeDescription desc, Element metadata) throws ConfigurationException {
    // Change ComponentInfo
    Element[] provides = metadata.getElements("provides");
    PojoMetadata manipulation = getFactory().getPojoMetadata();
    for (Element provide : provides) {
        // First : create the serviceSpecification list
        String[] serviceSpecification = manipulation.getInterfaces();
        String parent = manipulation.getSuperClass();
        Set<String> interfaces = new HashSet<String>();
        Set<String> parentClasses = new HashSet<String>();
        try {
            computeInterfacesAndSuperClasses(serviceSpecification, parent, desc.getBundleContext().getBundle(), interfaces, parentClasses);
            getLogger().log(Logger.INFO, "Collected interfaces from " + metadata.getAttribute("classname") + " : " + interfaces);
            getLogger().log(Logger.INFO, "Collected super classes from " + metadata.getAttribute("classname") + " : " + parentClasses);
        } catch (ClassNotFoundException e) {
            throw new ConfigurationException("An interface or parent class cannot be loaded", e);
        }
        String serviceSpecificationStr = provide.getAttribute("specifications");
        if (serviceSpecificationStr == null) {
            serviceSpecificationStr = provide.getAttribute("interface");
            if (serviceSpecificationStr != null) {
                warn("The 'interface' attribute is deprecated, use the 'specifications' attribute instead of 'interface'");
            }
        }
        if (serviceSpecificationStr != null) {
            List<String> itfs = ParseUtils.parseArraysAsList(serviceSpecificationStr);
            for (String itf : itfs) if (!interfaces.contains(itf) && !parentClasses.contains(itf) && !desc.getFactory().getClassName().equals(itf)) {
                desc.getFactory().getLogger().log(Logger.ERROR, "The specification " + itf + " is not implemented by " + metadata.getAttribute("classname"));
            }
            interfaces.clear();
            interfaces.addAll(itfs);
        }
        if (interfaces.isEmpty()) {
            warn("No service interface found in the class hierarchy, use the implementation class");
            interfaces.add(desc.getFactory().getClassName());
        }
        StringBuffer specs = null;
        Set<String> set = new HashSet<String>(interfaces);
        // Remove POJO.
        set.remove(Pojo.class.getName());
        for (String spec : set) {
            desc.addProvidedServiceSpecification(spec);
            if (specs == null) {
                specs = new StringBuffer("{");
                specs.append(spec);
            } else {
                specs.append(',');
                specs.append(spec);
            }
        }
        specs.append('}');
        // Add interface attribute to avoid checking in the configure method
        provide.addAttribute(new Attribute("specifications", specs.toString()));
        Element[] props = provide.getElements("property");
        for (int j = 0; props != null && j < props.length; j++) {
            String name = props[j].getAttribute("name");
            String value = props[j].getAttribute("value");
            String type = props[j].getAttribute("type");
            String field = props[j].getAttribute("field");
            // Get property name :
            if (field != null && name == null) {
                name = field;
            }
            // Check type if not already set
            if (type == null) {
                if (field == null) {
                    throw new ConfigurationException("The property " + name + " has neither type nor field.");
                }
                FieldMetadata fieldMeta = manipulation.getField(field);
                if (fieldMeta == null) {
                    throw new ConfigurationException("A declared property was not found in the implementation class : " + field);
                }
                type = fieldMeta.getFieldType();
                props[j].addAttribute(new Attribute("type", type));
            }
            // Is the property set to immutable
            boolean immutable = false;
            String imm = props[j].getAttribute("immutable");
            if (imm != null && imm.equalsIgnoreCase("true")) {
                immutable = true;
            }
            PropertyDescription pd = new PropertyDescription(name, type, value, immutable);
            desc.addProperty(pd);
            String man = props[j].getAttribute("mandatory");
            if (man != null && man.equalsIgnoreCase("true")) {
                pd.setMandatory();
            }
        }
    }
}
Also used : Pojo(org.apache.felix.ipojo.Pojo) FieldMetadata(org.apache.felix.ipojo.parser.FieldMetadata) Attribute(org.apache.felix.ipojo.metadata.Attribute) Element(org.apache.felix.ipojo.metadata.Element) PropertyDescription(org.apache.felix.ipojo.architecture.PropertyDescription) ConfigurationException(org.apache.felix.ipojo.ConfigurationException) PojoMetadata(org.apache.felix.ipojo.parser.PojoMetadata)

Aggregations

PropertyDescription (org.apache.felix.ipojo.architecture.PropertyDescription)17 Element (org.apache.felix.ipojo.metadata.Element)9 Test (org.junit.Test)8 ComponentTypeDescription (org.apache.felix.ipojo.architecture.ComponentTypeDescription)6 FooService (org.apache.felix.ipojo.runtime.core.services.FooService)6 ConfigurationException (org.apache.felix.ipojo.ConfigurationException)3 Factory (org.apache.felix.ipojo.Factory)3 FieldMetadata (org.apache.felix.ipojo.parser.FieldMetadata)3 PojoMetadata (org.apache.felix.ipojo.parser.PojoMetadata)3 ServiceReference (org.osgi.framework.ServiceReference)3 Hashtable (java.util.Hashtable)2 Properties (java.util.Properties)2 PrimitiveInstanceDescription (org.apache.felix.ipojo.PrimitiveInstanceDescription)2 Attribute (org.apache.felix.ipojo.metadata.Attribute)2 MethodMetadata (org.apache.felix.ipojo.parser.MethodMetadata)2 Dictionary (java.util.Dictionary)1 Enumeration (java.util.Enumeration)1 HashSet (java.util.HashSet)1 Set (java.util.Set)1 ComponentInstance (org.apache.felix.ipojo.ComponentInstance)1