public void startElement(String uri, String localName, String name, 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 = NAMESPACE_URI_1_0; } } 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 = NAMESPACE_URI_1_0; } // from here on, uri has the namespace regardless of the used xml format if (NAMESPACE_URI_1_0.equals(uri) || NAMESPACE_URI_1_1.equals(uri) || NAMESPACE_URI_1_1_FELIX.equals(uri)) { if (NAMESPACE_URI_1_1.equals(uri)) { components.setSpecVersion(Constants.VERSION_1_1); } else if (NAMESPACE_URI_1_1_FELIX.equals(uri)) { components.setSpecVersion(Constants.VERSION_1_1_FELIX); } if (localName.equals(COMPONENT)) { this.isComponent = true; this.currentComponent = new Component(); this.currentComponent.setName(attributes.getValue(COMPONENT_ATTR_NAME)); // enabled attribute is optional if (attributes.getValue(COMPONENT_ATTR_ENABLED) != null) { this.currentComponent.setEnabled( Boolean.valueOf(attributes.getValue(COMPONENT_ATTR_ENABLED))); } // immediate attribute is optional if (attributes.getValue(COMPONENT_ATTR_IMMEDIATE) != null) { this.currentComponent.setImmediate( Boolean.valueOf(attributes.getValue(COMPONENT_ATTR_IMMEDIATE))); } this.currentComponent.setFactory(attributes.getValue(COMPONENT_ATTR_FACTORY)); // check for version 1.1 attributes if (components.getSpecVersion() == Constants.VERSION_1_1) { this.currentComponent.setConfigurationPolicy( attributes.getValue(COMPONENT_ATTR_POLICY)); this.currentComponent.setActivate(attributes.getValue(COMPONENT_ATTR_ACTIVATE)); this.currentComponent.setDeactivate(attributes.getValue(COMPONENT_ATTR_DEACTIVATE)); this.currentComponent.setModified(attributes.getValue(COMPONENT_ATTR_MODIFIED)); } } else if (localName.equals(IMPLEMENTATION)) { // Set the implementation class name (mandatory) final Implementation impl = new Implementation(); this.currentComponent.setImplementation(impl); impl.setClassname(attributes.getValue("class")); } 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("name"); if (!org.osgi.framework.Constants.SERVICE_PID.equals(propName)) { final Property prop = new Property(); prop.setName(propName); prop.setType(attributes.getValue("type")); if (attributes.getValue("value") != null) { prop.setValue(attributes.getValue("value")); this.currentComponent.addProperty(prop); } else { // hold the property pending as we have a multi value this.pendingProperty = prop; } // check for abstract properties prop.setLabel(attributes.getValue("label")); prop.setDescription(attributes.getValue("description")); prop.setCardinality(attributes.getValue("cardinality")); final String pValue = attributes.getValue("private"); if (pValue != null) { prop.setPrivate(Boolean.valueOf(pValue).booleanValue()); } } } else if (localName.equals("properties")) { // TODO: implement the properties tag } else if (localName.equals(SERVICE)) { this.currentService = new Service(); this.currentService.setServicefactory(attributes.getValue("servicefactory")); this.currentComponent.setService(this.currentService); } else if (localName.equals(INTERFACE)) { final Interface interf = new Interface(); this.currentService.addInterface(interf); interf.setInterfacename(attributes.getValue("interface")); } else if (localName.equals(REFERENCE)) { final Reference ref = new Reference(); ref.setName(attributes.getValue("name")); ref.setInterfacename(attributes.getValue("interface")); ref.setCardinality(attributes.getValue("cardinality")); ref.setPolicy(attributes.getValue("policy")); ref.setTarget(attributes.getValue("target")); ref.setBind(attributes.getValue("bind")); ref.setUnbind(attributes.getValue("unbind")); if (attributes.getValue("checked") != null) { ref.setChecked(Boolean.valueOf(attributes.getValue("checked")).booleanValue()); } if (attributes.getValue("strategy") != null) { ref.setStrategy(attributes.getValue("strategy")); } this.currentComponent.addReference(ref); } } }
public void load() { BufferedReader buffer = null; try { if (file.getParentFile() != null) { file.getParentFile().mkdirs(); } if (!file.exists() && !file.createNewFile()) { return; } if (file.canRead()) { UnicodeInputStreamReader input = new UnicodeInputStreamReader(new FileInputStream(file), defaultEncoding); defaultEncoding = input.getEncoding(); buffer = new BufferedReader(input); String line; Map<String, Property> currentMap = null; while (true) { line = buffer.readLine(); if (line == null) { break; } int nameStart = -1, nameEnd = -1; boolean skip = false; boolean quoted = false; for (int i = 0; i < line.length() && !skip; ++i) { if (Character.isLetterOrDigit(line.charAt(i)) || ALLOWED_CHARS.indexOf(line.charAt(i)) != -1 || (quoted && line.charAt(i) != '"')) { if (nameStart == -1) { nameStart = i; } nameEnd = i; } else if (Character.isWhitespace(line.charAt(i))) { // ignore space charaters } else { switch (line.charAt(i)) { case '#': skip = true; continue; case '"': if (quoted) { quoted = false; } if (!quoted && nameStart == -1) { quoted = true; } break; case '{': String scopeName = line.substring(nameStart, nameEnd + 1); currentMap = categories.get(scopeName); if (currentMap == null) { currentMap = new TreeMap<String, Property>(); categories.put(scopeName, currentMap); } break; case '}': currentMap = null; break; case '=': String propertyName = line.substring(nameStart, nameEnd + 1); if (currentMap == null) { throw new RuntimeException("property " + propertyName + " has no scope"); } Property prop = new Property(); prop.setName(propertyName); prop.value = line.substring(i + 1); i = line.length(); currentMap.put(propertyName, prop); break; default: throw new RuntimeException("unknown character " + line.charAt(i)); } } } if (quoted) { throw new RuntimeException("unmatched quote"); } } } } catch (IOException e) { e.printStackTrace(); } finally { if (buffer != null) { try { buffer.close(); } catch (IOException e) { } } } }