| /************************************************************** |
| * |
| * 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.util.Vector; |
| import java.util.Enumeration; |
| import java.net.URL; |
| import java.net.URLClassLoader; |
| import java.lang.reflect.Constructor; |
| import org.openoffice.xmerge.PluginFactory; |
| import org.openoffice.xmerge.DocumentSerializerFactory; |
| import org.openoffice.xmerge.DocumentDeserializerFactory; |
| import org.openoffice.xmerge.DocumentMergerFactory; |
| |
| /** |
| * Class for storing the information about a converter plugin. |
| * |
| * @author Brian Cameron |
| */ |
| public class ConverterInfo { |
| |
| /** |
| * Keep track of the valid Office mime types |
| */ |
| private static String[] validOfficeTypes; |
| public static String SxwType = "staroffice/sxw"; |
| public static String SxcType = "staroffice/sxc"; |
| |
| |
| static { |
| // This needs to be updated to reflect all valid office types. |
| // |
| validOfficeTypes = new String[2]; |
| validOfficeTypes[0] = SxwType; |
| validOfficeTypes[1] = SxcType; |
| } |
| |
| private String piJarName; |
| private String piOfficeMime; |
| private Vector piDeviceMime; |
| private String piDisplayName; |
| private String piDescription; |
| private String piVersion; |
| private String piVendor; |
| private String piClassImpl; |
| private String piXsltSerial; |
| private String piXsltDeserial; |
| private boolean piCanSerialize = false; |
| private boolean piCanDeserialize = false; |
| private boolean piCanMerge = false; |
| private ClassLoader piClassLoader = null; |
| private PluginFactory piPluginFactory; |
| |
| |
| /** |
| * The constructor builds a ConverterInfo structure. |
| * |
| * @param jarName The URL of the jarfile. |
| * @param officeMime The office mime-type. |
| * @param deviceMime The device mime-type. |
| * @param displayName The display name. |
| * @param description The description. |
| * @param version The version. |
| * @param vendor The vendor name. |
| * @param impl The implementation class name of |
| * PluginFactory. |
| * @param xsltSerial The url of the serializer xsl stylesheet |
| * @param xsltDeserial The url of the deserializer xsl stylesheet |
| * |
| * @throws RegistryException If <code>ci</code> cannot |
| * be loaded. |
| */ |
| public ConverterInfo(String jarName, String officeMime, |
| Vector deviceMime, String displayName, String description, |
| String version, String vendor, String impl,String xsltSerial, |
| String xsltDeserial) |
| throws RegistryException { |
| |
| if (isValidOfficeType(officeMime.trim()) == false) { |
| RegistryException re = new RegistryException( |
| "Invalid office type"); |
| throw re; |
| } |
| |
| piJarName = jarName.trim(); |
| piOfficeMime = officeMime.trim(); |
| piDeviceMime = deviceMime; |
| piDisplayName = displayName.trim(); |
| piDescription = description.trim(); |
| piVersion = version.trim(); |
| piVendor = vendor.trim(); |
| piXsltSerial = xsltSerial.trim(); |
| piXsltDeserial= xsltDeserial.trim(); |
| piClassImpl = impl.trim(); |
| piClassLoader = this.getClass().getClassLoader(); |
| |
| // Get instance of the PluginFactory. |
| // |
| try { |
| URL jarURL = new URL(jarName); |
| URLClassLoader loader = new URLClassLoader(new URL[] { jarURL }, |
| piClassLoader); |
| Class clas = loader.loadClass(piClassImpl); |
| Class[] argumentTypes = { org.openoffice.xmerge.util.registry.ConverterInfo.class }; |
| Constructor construct = clas.getConstructor(argumentTypes); |
| |
| Object[] arguments = { this }; |
| piPluginFactory = ( PluginFactory ) construct.newInstance(arguments); |
| |
| // See which interfaces the plug-in PluginFactory supports. |
| // |
| Class[] cl = piPluginFactory.getClass().getInterfaces(); |
| for (int i=0; i < cl.length; i++) { |
| |
| if (cl[i].getName().equals("org.openoffice.xmerge.DocumentSerializerFactory")) { |
| piCanSerialize = true; |
| } |
| if (cl[i].getName().equals("org.openoffice.xmerge.DocumentDeserializerFactory")) { |
| piCanDeserialize = true; |
| } |
| if (cl[i].getName().equals("org.openoffice.xmerge.DocumentMergerFactory")) { |
| piCanMerge = true; |
| } |
| } |
| |
| } catch (Exception e) { |
| RegistryException re = new RegistryException( |
| "Class implementation of the plug-in cannot be loaded."); |
| throw re; |
| } |
| } |
| |
| /** |
| * The constructor builds a ConverterInfo structure. |
| * |
| * @param jarName The URL of the jarfile. |
| * @param officeMime The office mime-type. |
| * @param deviceMime The device mime-type. |
| * @param displayName The display name. |
| * @param description The description. |
| * @param version The version. |
| * @param vendor The vendor name. |
| * @param impl The implementation class name of |
| * PluginFactory. |
| * |
| * @throws RegistryException If <code>ci</code> cannot |
| * be loaded. |
| */ |
| |
| |
| public ConverterInfo(String jarName, String officeMime, |
| Vector deviceMime, String displayName, String description, |
| String version, String vendor, String impl) |
| throws RegistryException { |
| |
| if (isValidOfficeType(officeMime.trim()) == false) { |
| RegistryException re = new RegistryException( |
| "Invalid office type"); |
| throw re; |
| } |
| |
| piJarName = jarName.trim(); |
| piOfficeMime = officeMime.trim(); |
| piDeviceMime = deviceMime; |
| piDisplayName = displayName.trim(); |
| piDescription = description.trim(); |
| piVersion = version.trim(); |
| piVendor = vendor.trim(); |
| piClassImpl = impl.trim(); |
| piClassLoader = this.getClass().getClassLoader(); |
| |
| // Get instance of the PluginFactory. |
| // |
| try { |
| URL jarURL = new URL(jarName); |
| URLClassLoader loader = new URLClassLoader(new URL[] { jarURL }, |
| piClassLoader); |
| Class clas = loader.loadClass(piClassImpl); |
| Class[] argumentTypes = { org.openoffice.xmerge.util.registry.ConverterInfo.class }; |
| Constructor construct = clas.getConstructor(argumentTypes); |
| |
| Object[] arguments = { this }; |
| piPluginFactory = ( PluginFactory ) construct.newInstance(arguments); |
| |
| // See which interfaces the plug-in PluginFactory supports. |
| // |
| Class[] cl = piPluginFactory.getClass().getInterfaces(); |
| for (int i=0; i < cl.length; i++) { |
| |
| if (cl[i].getName().equals("org.openoffice.xmerge.DocumentSerializerFactory")) { |
| piCanSerialize = true; |
| } |
| if (cl[i].getName().equals("org.openoffice.xmerge.DocumentDeserializerFactory")) { |
| piCanDeserialize = true; |
| } |
| if (cl[i].getName().equals("org.openoffice.xmerge.DocumentMergerFactory")) { |
| piCanMerge = true; |
| } |
| } |
| |
| } catch (Exception e) { |
| RegistryException re = new RegistryException( |
| "Class implementation of the plug-in cannot be loaded."); |
| throw re; |
| } |
| } |
| |
| |
| |
| |
| /** |
| * Create a default constructor so we can use isValidOfficeType |
| * without having to actually have a valid ConverterInfo. |
| */ |
| private ConverterInfo() { |
| } |
| |
| |
| /** |
| * Returns an instance of the DocumentDeserializerFactory interface. |
| * |
| * @return instance of the DocumentDeserializer for this ConverterInfo. |
| */ |
| public DocumentSerializerFactory getDocSerializerFactory() { |
| return (DocumentSerializerFactory)piPluginFactory; |
| } |
| |
| |
| /** |
| * Returns an instance of the DocumentSerializerFactory interface. |
| * |
| * @return instance of the DocumentSerializer for this ConverterInfo. |
| */ |
| public DocumentDeserializerFactory getDocDeserializerFactory() { |
| return (DocumentDeserializerFactory)piPluginFactory; |
| } |
| |
| |
| /** |
| * Returns an instance of the DocumentMergerFactory interface. |
| * |
| * @return instance of the DocumentMergerFactory for this ConverterInfo. |
| */ |
| public DocumentMergerFactory getDocMergerFactory() { |
| return (DocumentMergerFactory)piPluginFactory; |
| } |
| |
| |
| /** |
| * Returns the jar file name. |
| * |
| * @return The jar file name, null if none exists. |
| */ |
| public String getJarName() { |
| return piJarName; |
| } |
| |
| |
| /** |
| * Returns the office mime-type. |
| * |
| * @return The office mime-type, null if none exists. |
| */ |
| public String getOfficeMime() { |
| return piOfficeMime; |
| } |
| |
| |
| /** |
| * Returns an <code>Enumeration</code> of <code>String</code> |
| * objects indicating the device mime-type. |
| * |
| * @return An <code>Enumeration</code> of <code>String</code> |
| * objects indicating the device mime-type. |
| */ |
| public Enumeration getDeviceMime() { |
| return(piDeviceMime.elements()); |
| } |
| |
| |
| /** |
| * Returns the display name. |
| * |
| * @return The display name, null if none exists. |
| */ |
| public String getDisplayName() { |
| return piDisplayName; |
| } |
| |
| |
| /** |
| * Returns the description. |
| * |
| * @return The description, null if none exists. |
| */ |
| public String getDescription() { |
| return piDescription; |
| } |
| |
| |
| /** |
| * Returns the version. |
| * |
| * @return The version, null if none exists. |
| */ |
| public String getVersion() { |
| return piVersion; |
| } |
| |
| |
| /** |
| * Returns the vendor name. |
| * |
| * @return The vendor name, null if none exists. |
| */ |
| public String getVendor() { |
| return piVendor; |
| } |
| |
| |
| /** |
| * Returns the implementation class name of PluginFactory. |
| * |
| * @return The implementation class name of PluginFactory, |
| * null if none exists. |
| */ |
| public String getClassImpl() { |
| return piClassImpl; |
| } |
| |
| |
| /** |
| * Returns the PluginFactory instance for this plug-in. |
| * |
| * @return The PluginFactory instance for this plug-in. |
| */ |
| public PluginFactory getPluginFactory() { |
| return piPluginFactory; |
| } |
| |
| |
| /** |
| * Returns true if this plug-in has a serializier, false otherwise. |
| * |
| * @return true if this plug-in has a serializier, false otherwise. |
| */ |
| public boolean canSerialize() { |
| return piCanSerialize; |
| } |
| |
| |
| /** |
| * Returns true if this plug-in has a deserializier, false otherwise. |
| * |
| * @return true if this plug-in has a deserializier, false otherwise. |
| */ |
| public boolean canDeserialize() { |
| return piCanDeserialize; |
| } |
| |
| |
| /** |
| * Returns true if this plug-in has a merger, false otherwise. |
| * |
| * @return true if this plug-in has a merger, false otherwise. |
| */ |
| public boolean canMerge() { |
| return piCanMerge; |
| } |
| |
| |
| /** |
| * Returns true if the officeMime is a valid Office mime type. |
| * |
| * @return true if the officeMime is a valid Office mime type. |
| */ |
| public static boolean isValidOfficeType(String officeMime) { |
| |
| boolean rc = false; |
| for (int i=0; i < validOfficeTypes.length; i++) { |
| if (officeMime.equals(validOfficeTypes[i])) { |
| rc = true; |
| } |
| } |
| |
| return rc; |
| } |
| |
| /** |
| * Returns a <code>String</code> containing the Xslt stylesheet url that |
| * is to be used by the Xslt Plugin Serializer. |
| * |
| * @return <code>String</code> |
| */ |
| |
| public String getXsltSerial() { |
| return piXsltSerial; |
| } |
| |
| /** |
| * Returns a <code>String</code> containing the xslt stylesheet url that |
| * is to be used by the Xslt Plugin Deserializer. |
| * |
| * @return <code>String</code> |
| */ |
| |
| public String getXsltDeserial() { |
| return piXsltDeserial; |
| } |
| } |
| |