001: /*
002:
003: Licensed to the Apache Software Foundation (ASF) under one or more
004: contributor license agreements. See the NOTICE file distributed with
005: this work for additional information regarding copyright ownership.
006: The ASF licenses this file to You under the Apache License, Version 2.0
007: (the "License"); you may not use this file except in compliance with
008: the License. You may obtain a copy of the License at
009:
010: http://www.apache.org/licenses/LICENSE-2.0
011:
012: Unless required by applicable law or agreed to in writing, software
013: distributed under the License is distributed on an "AS IS" BASIS,
014: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015: See the License for the specific language governing permissions and
016: limitations under the License.
017:
018: */
019: package org.apache.batik.script;
020:
021: import java.util.HashMap;
022: import java.util.Iterator;
023: import java.util.Map;
024:
025: import org.apache.batik.dom.svg.SVGOMDocument;
026: import org.apache.batik.util.Service;
027:
028: import org.w3c.dom.Document;
029:
030: /**
031: * A class allowing to create/query an {@link
032: * org.apache.batik.script.Interpreter} corresponding to a particular
033: * <tt>Document</tt> and scripting language.
034: *
035: * <p>By default, it is able to create interpreters for ECMAScript,
036: * Python and Tcl scripting languages if you provide the right jar
037: * files in your CLASSPATH (i.e. Rhino, JPython and Jacl jar
038: * files).</p>
039: *
040: * @author <a href="mailto:cjolif@ilog.fr">Christophe Jolif</a>
041: * @version $Id: InterpreterPool.java 482913 2006-12-06 05:57:52Z cam $
042: */
043: public class InterpreterPool {
044:
045: /**
046: * Name of the "document" object when referenced by scripts
047: */
048: public static final String BIND_NAME_DOCUMENT = "document";
049:
050: /**
051: * The default InterpreterFactory map.
052: */
053: protected static Map defaultFactories = new HashMap(7);
054:
055: /**
056: * The InterpreterFactory map.
057: */
058: protected Map factories = new HashMap(7);
059:
060: static {
061: Iterator iter = Service.providers(InterpreterFactory.class);
062: while (iter.hasNext()) {
063: InterpreterFactory factory = null;
064: factory = (InterpreterFactory) iter.next();
065: String[] mimeTypes = factory.getMimeTypes();
066: for (int i = 0; i < mimeTypes.length; i++) {
067: defaultFactories.put(mimeTypes[i], factory);
068: }
069: }
070: }
071:
072: /**
073: * Constructs a new <tt>InterpreterPool</tt>.
074: */
075: public InterpreterPool() {
076: factories.putAll(defaultFactories);
077: }
078:
079: /**
080: * Creates a new interpreter for the specified document and
081: * according to the specified language. This method can return
082: * null if no interpreter has been found for the specified
083: * language.
084: *
085: * @param document the document that needs the interpreter
086: * @param language the scripting language
087: */
088: public Interpreter createInterpreter(Document document,
089: String language) {
090: InterpreterFactory factory = (InterpreterFactory) factories
091: .get(language);
092: if (factory == null)
093: return null;
094:
095: SVGOMDocument svgDoc = (SVGOMDocument) document;
096: Interpreter interpreter = factory.createInterpreter(svgDoc
097: .getURLObject(), svgDoc.isSVG12());
098:
099: if (interpreter == null)
100: return null;
101:
102: if (document != null)
103: interpreter.bindObject(BIND_NAME_DOCUMENT, document);
104:
105: return interpreter;
106: }
107:
108: /**
109: * Adds for the specified language, the specified Interpreter factory.
110: *
111: * @param language the language for which the factory is registered
112: * @param factory the <code>InterpreterFactory</code> to register
113: */
114: public void putInterpreterFactory(String language,
115: InterpreterFactory factory) {
116: factories.put(language, factory);
117: }
118:
119: /**
120: * Removes the InterpreterFactory associated to the specified language.
121: *
122: * @param language the language for which the factory should be removed.
123: */
124: public void removeInterpreterFactory(String language) {
125: factories.remove(language);
126: }
127: }
|