001 /* 002 * Copyright 2007 - 2007 JEuclid, http://jeuclid.sf.net 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017 /* $Id: BatikDetector.java,v 584e9b40f728 2009/04/09 07:41:44 maxberger $ */ 018 019 package net.sourceforge.jeuclid.converter; 020 021 import java.lang.reflect.InvocationTargetException; 022 import java.lang.reflect.Method; 023 024 import net.sourceforge.jeuclid.elements.generic.JEuclidDOMImplementation; 025 import net.sourceforge.jeuclid.elements.support.ClassLoaderSupport; 026 027 import org.apache.commons.logging.Log; 028 import org.apache.commons.logging.LogFactory; 029 import org.w3c.dom.DOMImplementation; 030 031 /** 032 * Detects if Batik is in the class path and registers it if its available. 033 * 034 * @version $Revision: 584e9b40f728 $ 035 */ 036 public final class BatikDetector implements ConverterDetector { 037 /** 038 * Logger for this class 039 */ 040 private static final Log LOGGER = LogFactory.getLog(BatikDetector.class); 041 042 /** 043 * Default constructor. 044 */ 045 public BatikDetector() { 046 // Empty on purpose 047 } 048 049 private static DOMImplementation findSVGDOMImplementation() { 050 DOMImplementation impl; 051 try { 052 final Class<?> svgdomimpl = ClassLoaderSupport.getInstance() 053 .loadClass( 054 "org.apache.batik.dom.svg.SVGDOMImplementation"); 055 final Method getDOMimpl = svgdomimpl.getMethod( 056 "getDOMImplementation", new Class<?>[] {}); 057 impl = (DOMImplementation) getDOMimpl.invoke(null, 058 (Object[]) null); 059 // CHECKSTYLE:OFF 060 // In this case, ANY runtime exception must be caught, since batik 061 // may not be available. 062 } catch (final RuntimeException e) { 063 // CHECKSYTLE:ON 064 impl = null; 065 } catch (final LinkageError e) { 066 impl = null; 067 } catch (final ClassNotFoundException e) { 068 impl = null; 069 } catch (final NoSuchMethodException e) { 070 impl = null; 071 } catch (final IllegalAccessException e) { 072 impl = null; 073 } catch (final InvocationTargetException e) { 074 impl = null; 075 } 076 if (impl == null) { 077 impl = JEuclidDOMImplementation.getInstance(); 078 } 079 return impl; 080 } 081 082 /** 083 * Detects if Batik is in the classpath. 084 * 085 * @param registry 086 * ConverterRegisty to register with. 087 */ 088 public void detectConversionPlugins(final ConverterRegistry registry) { 089 try { 090 ClassLoaderSupport.getInstance().loadClass( 091 "org.apache.batik.svggen.SVGGraphics2D"); 092 BatikDetector.LOGGER.debug("Batik detected!"); 093 registry 094 .registerMimeTypeAndSuffix( 095 net.sourceforge.jeuclid.converter.Converter.TYPE_SVG, 096 net.sourceforge.jeuclid.converter.Converter.EXTENSION_SVG, 097 true); 098 final DOMImplementation impl = BatikDetector 099 .findSVGDOMImplementation(); 100 if (impl != null) { 101 registry.registerConverter( 102 net.sourceforge.jeuclid.converter.Converter.TYPE_SVG, 103 new BatikConverter(impl), true); 104 } 105 } catch (final ClassNotFoundException e) { 106 BatikDetector.LOGGER.debug("Batik is not in classpath!"); 107 } 108 } 109 110 }