001/*
002 * Copyright 2004-2006 Geert Bevin <gbevin[remove] at uwyn dot com>
003 * Distributed under the terms of either:
004 * - the common development and distribution license (CDDL), v1.0; or
005 * - the GNU Lesser General Public License, v2.1 or later
006 * $Id: XhtmlRendererFactory.java 3106 2006-03-13 17:53:50Z gbevin $
007 */
008package com.uwyn.jhighlight.renderer;
009
010import java.util.Collections;
011import java.util.HashMap;
012import java.util.Map;
013import java.util.Set;
014
015/**
016 * Provides a single point of entry to instantiate Xhtml renderers.
017 *
018 * @author Geert Bevin (gbevin[remove] at uwyn dot com)
019 * @version $Revision: 3106 $
020 * @since 1.0
021 */
022public abstract class XhtmlRendererFactory
023{
024        public final static String GROOVY = "groovy";
025        public final static String JAVA = "java";
026        public final static String BEANSHELL = "beanshell";
027        public final static String BSH = "bsh";
028        public final static String XML = "xml";
029        public final static String XHTML = "xhtml";
030        public final static String LZX = "lzx";
031        public final static String HTML = "html";
032        public final static String CPP = "cpp";
033        public final static String CXX = "cxx";
034        public final static String CPLUSPLUS = "c++";
035        
036        private final static Map RENDERERS_CLASSNAMES = new HashMap() {{
037                        put(GROOVY, GroovyXhtmlRenderer.class.getName());
038                        put(JAVA, JavaXhtmlRenderer.class.getName());
039                        put(BEANSHELL, JavaXhtmlRenderer.class.getName());
040                        put(BSH, JavaXhtmlRenderer.class.getName());
041                        put(XML, XmlXhtmlRenderer.class.getName());
042                        put(XHTML, XmlXhtmlRenderer.class.getName());
043                        put(LZX, XmlXhtmlRenderer.class.getName());
044                        put(HTML, XmlXhtmlRenderer.class.getName());
045                        put(CPP, CppXhtmlRenderer.class.getName());
046                        put(CXX, CppXhtmlRenderer.class.getName());
047                        put(CPLUSPLUS, CppXhtmlRenderer.class.getName());
048                }};
049        
050        /**
051         * Instantiates an instance of a known <code>XhtmlRenderer</code> according to
052         * the type that's provided.
053         *
054         * @param type The type of renderer, look at the static variables of this
055         * class to see which ones are supported.
056         * @return an instance of the <code>XhtmlRenderer</code> that corresponds to the type; or
057         * <p><code>null</code> if the type wasn't known
058         * @since 1.0
059         */
060        public static Renderer getRenderer(String type)
061        {
062                String classname = (String)RENDERERS_CLASSNAMES.get(type.toLowerCase());
063                if (null == classname)
064                {
065                        return null;
066                }
067                
068                try
069                {
070                        Class klass = Class.forName(classname);
071                        return (Renderer)klass.newInstance();
072                }
073                catch (Exception e)
074                {
075                        throw new RuntimeException(e);
076                }
077        }
078        
079        /**
080         * Returned a set with all the supported XHTML renderer types.
081         *
082         * @return a <code>Set</code> with the supported XHTML renderer types as strings.
083         * @since 1.0
084         */
085        public static Set getSupportedTypes()
086        {
087                return Collections.unmodifiableSet(RENDERERS_CLASSNAMES.keySet());
088        }
089}