/*******************************************************************************
* Copyright 2010 Simon Mieth
*
* Licensed 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.kabeja.ui.xml;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import org.kabeja.tools.Component;
import org.kabeja.ui.impl.ServiceContainer;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
public class SAXServiceContainerBuilder implements ContentHandler {
public static final String NAMESPACE = "http://kabeja.org/processing/ui/1.0";
public static final String ELEMET_UICONFIGURATION = "uiconfiguration";
public static final String ELEMET_COMPONENTS = "components";
public static final String ELEMET_COMPONENT = "component";
public static final String ATTRIBUTE_CLASS = "class";
protected ServiceContainer container;
protected boolean components = false;
public void characters(char[] ch, int start, int length)
throws SAXException {
}
public void endDocument() throws SAXException {
}
public void endElement(String uri, String localName, String name)
throws SAXException {
}
public void endPrefixMapping(String prefix) throws SAXException {
}
public void ignorableWhitespace(char[] ch, int start, int length)
throws SAXException {
}
public void processingInstruction(String target, String data)
throws SAXException {
}
public void setDocumentLocator(Locator locator) {
}
public void skippedEntity(String name) throws SAXException {
}
public void startDocument() throws SAXException {
this.container = new ServiceContainer();
this.components = false;
}
public void startElement(String uri, String localName, String name,
Attributes atts) throws SAXException {
if (uri.equals(NAMESPACE)) {
if (ELEMET_COMPONENT.equals(localName) && this.components) {
String className = atts.getValue(ATTRIBUTE_CLASS);
try {
Object obj = this.getClass().getClassLoader()
.loadClass(className).newInstance();
this.container.addComponent((Component) obj);
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else if (ELEMET_COMPONENTS.equals(localName)) {
this.components = true;
}
}
}
public void startPrefixMapping(String prefix, String uri)
throws SAXException {
// TODO Auto-generated method stub
}
public ServiceContainer getServiceContainer() {
return this.container;
}
public static ServiceContainer buildFromStream(InputStream in) {
SAXServiceContainerBuilder builder = new SAXServiceContainerBuilder();
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
XMLReader saxparser = factory.newSAXParser().getXMLReader();
saxparser.setContentHandler(builder);
saxparser.parse(new InputSource(in));
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
return builder.getServiceContainer();
}
}