blob: 66ac0764eeba11c1a2c1b2fa1f4e8b0d23173fd6 [file] [log] [blame]
/*
* 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.parser;
import java.util.logging.Level;
import org.apache.felix.ipojo.metadata.Attribute;
import org.apache.felix.ipojo.metadata.Element;
import org.apache.felix.ipojo.plugin.IPojoPluginConfiguration;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
public class XMLMetadataParser implements ContentHandler {
/**
* Element of the metadata.
*/
private Element[] m_elements = new Element[0];
/**
* @return a components metadata
* @throws ParseException when an error occurs in the xml parsing
*/
public Element[] getComponentsMetadata() throws ParseException {
return m_elements[0].getElements("Component");
}
public Element[] getMetadata() throws ParseException {
Element[] comp = m_elements[0].getElements("Component");
Element[] conf = m_elements[0].getElements("Instance");
Element[] metadata = new Element[comp.length + conf.length];
int l = 0;
for(int i = 0; i < comp.length; i++) { metadata[l] = comp[i]; l++;}
for(int i = 0; i < conf.length; i++) { metadata[l] = conf[i]; l++;}
return metadata;
}
/* (non-Javadoc)
* @see org.xml.sax.ContentHandler#characters(char[], int, int)
*/
public void characters(char[] ch, int start, int length)
throws SAXException {
// NOTHING TO DO
}
/* (non-Javadoc)
* @see org.xml.sax.ContentHandler#endDocument()
*/
public void endDocument() throws SAXException {
IPojoPluginConfiguration.getLogger().log(Level.INFO, "End of the XML parsing, " + m_elements.length + " primary elements found");
}
/* (non-Javadoc)
* @see org.xml.sax.ContentHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
*/
public void endElement(String namespaceURI, String localName, String qName)
throws SAXException {
// Get the last element of the list
Element lastElement = removeLastElement();
// Check if the name is consitent with the name of this end tag
if (!lastElement.getName().equalsIgnoreCase(qName) && !lastElement.getNameSpace().equals(namespaceURI)) {
IPojoPluginConfiguration.getLogger().log(Level.SEVERE, "Parse error when ending an element : " + qName + " [" + namespaceURI + "]");
throw new SAXException("Parse error when ending an element : " + qName + " [" + namespaceURI + "]");
}
// The name is consitent
// Add this element last element with if it is not the root
if (m_elements.length != 0) {
Element newQueue = m_elements[m_elements.length - 1];
newQueue.addElement(lastElement);
}
else {
// It is the last element
addElement(lastElement);
}
}
/* (non-Javadoc)
* @see org.xml.sax.ContentHandler#endPrefixMapping(java.lang.String)
*/
public void endPrefixMapping(String prefix) throws SAXException {
//NOTHING TO DO
}
/* (non-Javadoc)
* @see org.xml.sax.ContentHandler#ignorableWhitespace(char[], int, int)
*/
public void ignorableWhitespace(char[] ch, int start, int length)
throws SAXException {
// NOTHING TO DO
}
/* (non-Javadoc)
* @see org.xml.sax.ContentHandler#processingInstruction(java.lang.String, java.lang.String)
*/
public void processingInstruction(String target, String data)
throws SAXException {
// DO NOTHING
}
/* (non-Javadoc)
* @see org.xml.sax.ContentHandler#setDocumentLocator(org.xml.sax.Locator)
*/
public void setDocumentLocator(Locator locator) {
// NOTHING TO DO
}
/* (non-Javadoc)
* @see org.xml.sax.ContentHandler#skippedEntity(java.lang.String)
*/
public void skippedEntity(String name) throws SAXException {
// NOTHING TO DO
}
/* (non-Javadoc)
* @see org.xml.sax.ContentHandler#startDocument()
*/
public void startDocument() throws SAXException {
IPojoPluginConfiguration.getLogger().log(Level.INFO, "Start of the XML parsing");
}
/* (non-Javadoc)
* @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
*/
public void startElement(String namespaceURI, String localName,
String qName, Attributes atts) throws SAXException {
IPojoPluginConfiguration.getLogger().log(Level.INFO, "An XML tag was openend : " + localName + " [" + namespaceURI + "]");
Element elem = new Element(localName, namespaceURI);
for (int i = 0; i < atts.getLength(); i++) {
String name = (String)atts.getLocalName(i);
String ns = (String) atts.getURI(i);
String value = (String)atts.getValue(i);
Attribute att = new Attribute(name, ns, value);
elem.addAttribute(att);
}
addElement(elem);
}
/* (non-Javadoc)
* @see org.xml.sax.ContentHandler#startPrefixMapping(java.lang.String, java.lang.String)
*/
public void startPrefixMapping(String prefix, String uri)
throws SAXException {
// NOTHING TO DO
}
private void addElement(Element elem) {
for (int i = 0; (m_elements != null) && (i < m_elements.length); i++) {
if (m_elements[i] == elem) { return; }
}
if (m_elements != null) {
Element[] newElementsList = new Element[m_elements.length + 1];
System.arraycopy(m_elements, 0, newElementsList, 0, m_elements.length);
newElementsList[m_elements.length] = elem;
m_elements = newElementsList;
}
else { m_elements = new Element[] {elem}; }
}
private Element removeLastElement() {
int idx = -1;
idx = m_elements.length - 1;
Element last = m_elements[idx];
if (idx >= 0) {
if ((m_elements.length - 1) == 0) {
// It is the last element of the list;
m_elements = new Element[0];
}
else {
// Remove the last element of the list :
Element[] newElementsList = new Element[m_elements.length - 1];
System.arraycopy(m_elements, 0, newElementsList, 0, idx);
m_elements = newElementsList;
}
}
return last;
}
}