in tools/org.apache.felix.scr.generator/src/main/java/org/apache/felix/scrplugin/xml/ComponentDescriptorIO.java [489:695]
public void startElement(String uri, final String localName, final String name, final Attributes attributes)
throws SAXException {
// according to the spec, the elements should have the namespace,
// except when the root element is the "component" element
// So we check this for the first element, we receive.
if (this.firstElement) {
this.firstElement = false;
if (localName.equals(COMPONENT) && "".equals(uri)) {
this.overrideNamespace = SpecVersion.VERSION_1_0.getNamespaceUrl();
}
}
if (this.overrideNamespace != null && "".equals(uri)) {
uri = this.overrideNamespace;
}
// however the spec also states that the inner elements
// of a component are unqualified, so they don't have
// the namespace - we allow both: with or without namespace!
if (this.isComponent && "".equals(uri)) {
uri = SpecVersion.VERSION_1_0.getNamespaceUrl();
}
// from here on, uri has the namespace regardless of the used xml format
specVersion = SpecVersion.fromNamespaceUrl(uri);
if (specVersion != null) {
if (localName.equals(COMPONENT)) {
this.isComponent = true;
final ComponentDescription desc = new ComponentDescription(null);
desc.setName(attributes.getValue(ATTR_NAME));
// enabled attribute is optional
if (attributes.getValue(COMPONENT_ATTR_ENABLED) != null) {
desc.setEnabled(Boolean.valueOf(attributes.getValue(COMPONENT_ATTR_ENABLED)));
}
// immediate attribute is optional
if (attributes.getValue(COMPONENT_ATTR_IMMEDIATE) != null) {
desc.setImmediate(Boolean.valueOf(attributes.getValue(COMPONENT_ATTR_IMMEDIATE)));
}
desc.setFactory(attributes.getValue(COMPONENT_ATTR_FACTORY));
desc.setConfigurationPolicy(ComponentConfigurationPolicy.OPTIONAL);
// check for version 1.1 attributes
if (specVersion.ordinal() >= SpecVersion.VERSION_1_1.ordinal()) {
final String policy = attributes.getValue(COMPONENT_ATTR_POLICY);
if ( policy != null ) {
try {
desc.setConfigurationPolicy(ComponentConfigurationPolicy.valueOf(policy.toUpperCase()));
} catch (final IllegalArgumentException iae) {
iLog.addWarning("Invalid value for attribute " + COMPONENT_ATTR_POLICY + " : " + policy, this.location);
}
}
if ( attributes.getValue(COMPONENT_ATTR_ACTIVATE) != null ) {
desc.setActivate(attributes.getValue(COMPONENT_ATTR_ACTIVATE));
}
if ( attributes.getValue(COMPONENT_ATTR_DEACTIVATE) != null ) {
desc.setDeactivate(attributes.getValue(COMPONENT_ATTR_DEACTIVATE));
}
if ( attributes.getValue(COMPONENT_ATTR_MODIFIED) != null ) {
desc.setModified(attributes.getValue(COMPONENT_ATTR_MODIFIED));
}
}
this.currentComponent = desc;
} else if (localName.equals(IMPLEMENTATION)) {
// now we can create the class description and attach the component description
// Set the implementation class name (mandatory)
final String className = attributes.getValue(IMPLEMENTATION_ATTR_CLASS);
Class<?> cl = null;
try {
cl = this.classLoader.loadClass(className);
} catch (final Throwable e) {
// this doesn't have an effect as the classes we processed are loaded
// anyway.
}
this.currentClass = new ClassDescription(cl, "classpath:" + className);
this.currentClass.add(this.currentComponent);
this.components.add(this.currentClass);
} else if (localName.equals(PROPERTY)) {
// read the property, unless it is the service.pid
// property which must not be inherited
final String propName = attributes.getValue(ATTR_NAME);
if (!org.osgi.framework.Constants.SERVICE_PID.equals(propName)) {
final PropertyDescription prop = new PropertyDescription(null);
prop.setName(propName);
final String type = attributes.getValue(PROPERTY_ATTR_TYPE);
if ( type != null ) {
try {
prop.setType(PropertyType.valueOf(type));
} catch (final IllegalArgumentException iae) {
iLog.addWarning("Invalid value for attribute type : " + type, this.location);
}
}
if ( prop.getType() == null ) {
prop.setType(PropertyType.String);
}
if (attributes.getValue(PROPERTY_ATTR_VALUE) != null) {
if ( prop.getType() == PropertyType.Char || prop.getType() == PropertyType.Character ) {
final int val = Integer.valueOf(attributes.getValue(PROPERTY_ATTR_VALUE));
final Character c = Character.valueOf((char)val);
prop.setValue(c.toString());
} else {
prop.setValue(attributes.getValue(PROPERTY_ATTR_VALUE));
}
propsAndRefs.add(prop);
} else {
// hold the property pending as we have a multi value
this.pendingProperty = prop;
}
// check for abstract properties
prop.setLabel(attributes.getValue(ATTR_LABEL));
prop.setDescription(attributes.getValue(ATTR_DESCRIPTION));
final String cardinality = attributes.getValue(ATTR_CARDINALITY);
prop.setUnbounded(PropertyUnbounded.DEFAULT);
if ( cardinality != null ) {
prop.setCardinality(Integer.valueOf(cardinality));
if ( prop.getCardinality() == Integer.MAX_VALUE ) {
prop.setCardinality(0);
prop.setUnbounded(PropertyUnbounded.ARRAY);
} else if ( prop.getCardinality() == Integer.MIN_VALUE ) {
prop.setCardinality(0);
prop.setUnbounded(PropertyUnbounded.VECTOR);
}
}
final String pValue = attributes.getValue(PROPERTY_ATTR_PRIVATE);
if (pValue != null) {
prop.setPrivate(Boolean.valueOf(pValue));
}
}
} else if (localName.equals(PROPERTIES)) {
// TODO: implement the properties tag
} else if (localName.equals(SERVICE)) {
this.currentService = new ServiceDescription(null);
if (attributes.getValue(SERVICE_ATTR_FACTORY) != null) {
this.currentService.setServiceFactory(Boolean.valueOf(attributes.getValue(SERVICE_ATTR_FACTORY)));
}
} else if (localName.equals(INTERFACE)) {
this.currentService.addInterface(attributes.getValue(INTERFACE_ATTR_NAME));
} else if (localName.equals(REFERENCE)) {
final ReferenceDescription ref = new ReferenceDescription(null);
ref.setName(attributes.getValue(ATTR_NAME));
ref.setInterfaceName(attributes.getValue(INTERFACE_ATTR_NAME));
final String cardinality = attributes.getValue(ATTR_CARDINALITY);
if ( cardinality != null ) {
ref.setCardinality(ReferenceCardinality.fromValue(cardinality));
if ( ref.getCardinality() == null ) {
iLog.addWarning("Invalid value for attribute cardinality : " + cardinality, this.location);
}
}
ref.setPolicy(ReferencePolicy.STATIC);
final String policy = attributes.getValue(REFERENCE_ATTR_POLICY);
if ( policy != null ) {
try {
ref.setPolicy(ReferencePolicy.valueOf(policy.toUpperCase()));
} catch (final IllegalArgumentException iae) {
iLog.addWarning("Invalid value for attribute policy : " + policy, this.location);
}
}
ref.setPolicyOption(ReferencePolicyOption.RELUCTANT);
final String policyOption = attributes.getValue(REFERENCE_ATTR_POLICY_OPTION);
if ( policyOption != null ) {
try {
ref.setPolicyOption(ReferencePolicyOption.valueOf(policyOption.toUpperCase()));
} catch (final IllegalArgumentException iae) {
iLog.addWarning("Invalid value for attribute policy-option : " + policyOption, this.location);
}
}
ref.setTarget(attributes.getValue(REFERENCE_ATTR_TARGET));
if ( attributes.getValue(REFERENCE_ATTR_BIND) != null ) {
ref.setBind(attributes.getValue(REFERENCE_ATTR_BIND));
}
if ( attributes.getValue(REFERENCE_ATTR_UNBIND) != null ) {
ref.setUnbind(attributes.getValue(REFERENCE_ATTR_UNBIND));
}
if ( attributes.getValue(REFERENCE_ATTR_UPDATED) != null ) {
ref.setUnbind(attributes.getValue(REFERENCE_ATTR_UPDATED));
}
final String strategy = attributes.getValue(REFERENCE_ATTR_STRATEGY);
if ( strategy != null ) {
try {
ref.setStrategy(ReferenceStrategy.valueOf(strategy.toUpperCase()));
} catch (final IllegalArgumentException iae) {
throw new SAXException("Invalid value for attribute strategy : " + strategy);
}
}
propsAndRefs.add(ref);
}
}
}