/** * Gets all the methods available which get this name. * * @param methodName the name of the required methods * @param manipulation the metadata extract from metadata.xml file * @param description the description which appears in JMX console * @return the array of methods with the right name */ private MethodField[] getMethodsFromName( String methodName, PojoMetadata manipulation, String description) { MethodMetadata[] methods = manipulation.getMethods(methodName); if (methods.length == 0) { return null; } MethodField[] ret = new MethodField[methods.length]; if (methods.length == 1) { ret[0] = new MethodField(methods[0], description); return ret; } else { for (int i = 0; i < methods.length; i++) { ret[i] = new MethodField(methods[i], description); } return ret; } }
/** * 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"); if (fieldName == null && methodName == null) { throw new ConfigurationException( "Malformed property : The property needs to contain at least a field or a method"); } String name = configurables[i].getAttribute("name"); if (name == null) { if (fieldName == null) { name = methodName; } else { name = fieldName; } configurables[i].addAttribute( new Attribute("name", name)); // Add the type to avoid configure checking } String value = configurables[i].getAttribute("value"); // Detect the type of the property PojoMetadata manipulation = getFactory().getPojoMetadata(); String type = null; if (fieldName == 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]; configurables[i].addAttribute( new Attribute("type", type)); // Add the type to avoid configure checking } } else { 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(); configurables[i].addAttribute( new Attribute("type", type)); // Add the type to avoid configure checking } // 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 = null; if (value == null) { pd = new PropertyDescription( name, type, null, false); // Cannot be immutable if we have no value. } else { pd = new PropertyDescription(name, type, value, immutable); } if (mandatory) { pd.setMandatory(); } desc.addProperty(pd); } }