in batik-bridge/src/main/java/org/apache/batik/bridge/BaseScriptingEnvironment.java [362:577]
protected void loadScript(AbstractElement script) {
// Don't execute <script> elements more than once.
if (executedScripts.containsKey(script)) {
return;
}
// Don't execute a <script> element that has been removed from
// the document.
{
Node n = script;
do {
n = n.getParentNode();
if (n == null) {
return;
}
} while (n.getNodeType() != Node.DOCUMENT_NODE);
}
String type = script.getAttributeNS
(null, SVGConstants.SVG_TYPE_ATTRIBUTE);
if (type.length() == 0) {
type = SVGConstants.SVG_SCRIPT_TYPE_DEFAULT_VALUE;
}
//
// Java code invocation.
//
if (type.equals(SVGConstants.SVG_SCRIPT_TYPE_JAVA)) {
try {
String href = XLinkSupport.getXLinkHref(script);
ParsedURL purl = new ParsedURL(script.getBaseURI(), href);
checkCompatibleScriptURL(type, purl);
DocumentJarClassLoader cll;
URL docURL = null;
try {
docURL = new URL(docPURL.toString());
} catch (MalformedURLException mue) {
/* nothing just let docURL be null */
}
cll = new DocumentJarClassLoader
(new URL(purl.toString()), docURL);
// Get the 'Script-Handler' entry in the manifest.
URL url = cll.findResource("META-INF/MANIFEST.MF");
if (url == null) {
return;
}
Manifest man = new Manifest(url.openStream());
String sh;
executedScripts.put(script, null);
sh = man.getMainAttributes().getValue("Script-Handler");
if (sh != null) {
// Run the script handler.
ScriptHandler h;
h = (ScriptHandler)cll.loadClass(sh).getDeclaredConstructor().newInstance();
h.run(document, getWindow());
}
sh = man.getMainAttributes().getValue("SVG-Handler-Class");
if (sh != null) {
// Run the initializer
EventListenerInitializer initializer;
initializer =
(EventListenerInitializer)cll.loadClass(sh).getDeclaredConstructor().newInstance();
getWindow();
initializer.initializeEventListeners((SVGDocument)document);
}
} catch (Exception e) {
if (userAgent != null) {
userAgent.displayError(e);
}
}
return;
}
//
// Scripting language invocation.
//
Interpreter interpreter = getInterpreter(type);
if (interpreter == null) {
// Can't find interpreter so just skip this script block.
return;
}
try {
String href = XLinkSupport.getXLinkHref(script);
String desc = null;
Reader reader = null;
if (href.length() > 0) {
desc = href;
// External script.
ParsedURL purl = new ParsedURL(script.getBaseURI(), href);
checkCompatibleScriptURL(type, purl);
InputStream is = purl.openStream();
String mediaType = purl.getContentTypeMediaType();
String enc = purl.getContentTypeCharset();
if (enc != null) {
try {
reader = new InputStreamReader(is, enc);
} catch (UnsupportedEncodingException uee) {
enc = null;
}
}
if (reader == null) {
if (APPLICATION_ECMASCRIPT.equals(mediaType)) {
// No encoding was specified in the MIME type, so
// infer it according to RFC 4329.
if (purl.hasContentTypeParameter("version")) {
// Future versions of application/ecmascript
// are not supported, so skip this script
// element if the version parameter is present.
return;
}
PushbackInputStream pbis =
new PushbackInputStream(is, 8);
byte[] buf = new byte[4];
int read = pbis.read(buf);
if (read > 0) {
pbis.unread(buf, 0, read);
if (read >= 2) {
if (buf[0] == (byte)0xff &&
buf[1] == (byte)0xfe) {
if (read >= 4 && buf[2] == 0 &&
buf[3] == 0) {
enc = "UTF32-LE";
pbis.skip(4);
} else {
enc = "UTF-16LE";
pbis.skip(2);
}
} else if (buf[0] == (byte)0xfe &&
buf[1] == (byte)0xff) {
enc = "UTF-16BE";
pbis.skip(2);
} else if (read >= 3
&& buf[0] == (byte)0xef
&& buf[1] == (byte)0xbb
&& buf[2] == (byte)0xbf) {
enc = "UTF-8";
pbis.skip(3);
} else if (read >= 4 && buf[0] == 0 &&
buf[1] == 0 &&
buf[2] == (byte)0xfe &&
buf[3] == (byte)0xff) {
enc = "UTF-32BE";
pbis.skip(4);
}
}
if (enc == null) {
enc = "UTF-8";
}
}
reader = new InputStreamReader(pbis, enc);
} else {
reader = new InputStreamReader(is);
}
}
} else {
checkCompatibleScriptURL(type, docPURL);
DocumentLoader dl = bridgeContext.getDocumentLoader();
Element e = script;
SVGDocument d = (SVGDocument)e.getOwnerDocument();
int line = dl.getLineNumber(script);
desc = Messages.formatMessage
(INLINE_SCRIPT_DESCRIPTION,
new Object [] {d.getURL(),
"<"+script.getNodeName()+">",
line});
// Inline script.
Node n = script.getFirstChild();
if (n != null) {
StringBuffer sb = new StringBuffer();
while (n != null) {
if (n.getNodeType() == Node.CDATA_SECTION_NODE
|| n.getNodeType() == Node.TEXT_NODE)
sb.append(n.getNodeValue());
n = n.getNextSibling();
}
reader = new StringReader(sb.toString());
} else {
return;
}
}
executedScripts.put(script, null);
interpreter.evaluate(reader, desc);
} catch (IOException e) {
if (userAgent != null) {
userAgent.displayError(e);
}
return;
} catch (InterpreterException e) {
System.err.println("InterpExcept: " + e);
handleInterpreterException(e);
return;
} catch (SecurityException e) {
if (userAgent != null) {
userAgent.displayError(e);
}
}
}