blob: 3a7e3d229197d877e0eb51c94ab9eed763f24a52 [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.openoffice.xmerge.util.registry;
import java.io.*;
import java.util.*;
import java.util.jar.*;
import org.xml.sax.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.net.URL;
import java.net.JarURLConnection;
/**
* The <code>ConverterInfoReader</code> pulls a META-INF/converter.xml
* file out of a jar file and parses it, providing access to this
* information in a <code>Vector</code> of <code>ConverterInfo</code>
* objects.
*
* @author Brian Cameron
*/
public class ConverterInfoReader {
private final static String TAG_CONVERTER = "converter";
private final static String ATTRIB_OFFICE_TYPE = "type";
private final static String ATTRIB_VERSION = "version";
private final static String TAG_NAME = "converter-display-name";
private final static String TAG_DESC = "converter-description";
private final static String TAG_VENDOR = "converter-vendor";
private final static String TAG_CLASS_IMPL = "converter-class-impl";
private final static String TAG_TARGET = "converter-target";
private final static String ATTRIB_DEVICE_TYPE = "type";
private final static String TAG_XSLT_DESERIAL = "converter-xslt-deserialize";
private final static String TAG_XSLT_SERIAL = "converter-xslt-serialize";
private String jarfilename;
private Document document;
private Vector converterInfoList;
/**
* Constructor. A jar file is passed in. The jar file is
* parsed and the <code>Vector</code> of <code>ConverterInfo</code>
* objects is built.
*
* @param jar The URL of the jar file to process.
* @param shouldvalidate Boolean to enable or disable xml validation.
*
* @throws IOException If the jar file cannot
* be read or if the
* META-INF/converter.xml
* can not be read in the
* jar file.
* @throws ParserConfigurationException If the DocumentBuilder
* can not be built.
* @throws org.xml.sax.SAXException If the converter.xml
* file can not be parsed.
* @throws RegistryException If the ConverterFactory
* implementation of a
* plug-in cannot be loaded.
*/
public ConverterInfoReader(String jar,boolean shouldvalidate) throws IOException,
ParserConfigurationException, org.xml.sax.SAXException,
RegistryException {
InputStream istream;
InputSource isource;
DocumentBuilderFactory builderFactory;
DocumentBuilder builder;
JarURLConnection jarConnection;
JarEntry jarentry;
JarFile jarfile;
URL url;
converterInfoList = new Vector();
jarfilename = jar;
// Get Jar via URL
//
url = new URL("jar:" + jar + "!/META-INF/converter.xml");
jarConnection = (JarURLConnection)url.openConnection();
jarentry = jarConnection.getJarEntry();
jarfile = jarConnection.getJarFile();
// Build the InputSource
//
istream = jarfile.getInputStream(jarentry);
isource = new InputSource(istream);
// Get the DOM builder and build the document.
//
builderFactory = DocumentBuilderFactory.newInstance();
//DTD validation
if (shouldvalidate){
System.out.println("Validating xml...");
builderFactory.setValidating(true);
}
//
builder = builderFactory.newDocumentBuilder();
document = builder.parse(isource);
// Parse the document.
//
parseDocument();
}
/**
* Loops over the <i>converter</i> <code>Node</code> in the converter.xml
* file and processes them.
*
* @throws RegistryException If the plug-in associated with a
* specific <i>converter</i> <code>Node</code>
* cannot be loaded.
*/
private void parseDocument() throws RegistryException {
Node converterNode;
NodeList converterNodes = document.getElementsByTagName(TAG_CONVERTER);
for (int i=0; i < converterNodes.getLength(); i++) {
converterNode = converterNodes.item(i);
if (converterNode.getNodeType() == Node.ELEMENT_NODE) {
parseConverterNode((Element)converterNode);
}
}
}
/**
* Parses a <i>converter</i> node, pulling the information out of
* the <code>Node</code> and placing it in a <code>ConverterInfo</code>
* object, and adds that object to a <code>Vector</code> of
* <code>ConverterInfo</code> objects.
*
* @param e The <code>Element</code> corresponding to the
* <i>converter</i> XML tag.
*
*
* @throws RegistryException If the plug-in cannot be loaded.
*/
private void parseConverterNode(Element e) throws RegistryException {
Element detailElement;
Node detailNode;
String elementTagName;
String officeMime = null;
Vector deviceMime = new Vector();
String name = null;
String desc = null;
String version = null;
String vendor = null;
String classImpl = null;
String xsltSerial = null;
String xsltDeserial= null;
String temp;
temp = e.getAttribute(ATTRIB_OFFICE_TYPE);
if (temp.length() != 0) {
officeMime = temp;
}
temp = e.getAttribute(ATTRIB_VERSION);
if (temp.length() != 0) {
version = temp;
}
NodeList detailNodes = e.getChildNodes();
for (int i=0; i < detailNodes.getLength(); i++) {
detailNode = detailNodes.item(i);
if (detailNode.getNodeType() == Node.ELEMENT_NODE) {
detailElement = (Element)detailNode;
elementTagName = detailElement.getTagName();
if (TAG_NAME.equalsIgnoreCase(elementTagName)) {
name = getTextValue(detailElement);
} else if (TAG_DESC.equalsIgnoreCase(elementTagName)) {
desc = getTextValue(detailElement);
} else if (TAG_VENDOR.equalsIgnoreCase(elementTagName)) {
vendor = getTextValue(detailElement);
} else if (TAG_XSLT_SERIAL.equalsIgnoreCase(elementTagName)) {
xsltSerial = getTextValue(detailElement);
} else if (TAG_XSLT_DESERIAL.equalsIgnoreCase(elementTagName)) {
xsltDeserial = getTextValue(detailElement);
} else if (TAG_CLASS_IMPL.equalsIgnoreCase(elementTagName)) {
classImpl = getTextValue(detailElement);
} else if (TAG_TARGET.equalsIgnoreCase(elementTagName)) {
temp = detailElement.getAttribute(ATTRIB_DEVICE_TYPE);
if (temp.length() != 0) {
deviceMime.add(temp);
}
}
}
}
ConverterInfo converterInfo;
if ((xsltSerial==null) || (xsltDeserial==null)){
converterInfo = new ConverterInfo(jarfilename,
officeMime, deviceMime, name,
desc, version, vendor,classImpl);
}
else{
converterInfo = new ConverterInfo(jarfilename,
officeMime, deviceMime, name,
desc, version, vendor,classImpl,
xsltSerial,xsltDeserial);
}
/*ConverterInfo converterInfo = new ConverterInfo(jarfilename,
officeMime, deviceMime, name, desc, version, vendor,
classImpl);*/
converterInfoList.add(converterInfo);
}
/**
* Helper function to get the text value of an
* <code>Element</code>.
*
* @param e The <code>Element</code> to process.
*
* @return The text value of the <code>Element</code>.
*/
private String getTextValue(Element e) {
NodeList tempNodes = e.getChildNodes();
String text = null;
Node tempNode;
for (int j=0; j < tempNodes.getLength(); j++) {
tempNode = tempNodes.item(j);
if (tempNode.getNodeType() == Node.TEXT_NODE) {
text = tempNode.getNodeValue().trim();
break;
}
}
return text;
}
/**
* Returns an <code>Enumeration</code> of <code>ConverterInfo</code>
* objects.
*
* @return An <code>Enumeration</code> of <code>ConverterInfo</code>
* objects.
*/
public Enumeration getConverterInfoEnumeration() {
return (converterInfoList.elements());
}
}