summaryrefslogtreecommitdiff
path: root/scripting/java/com/sun/star/script/framework/container/ParcelDescriptor.java
diff options
context:
space:
mode:
Diffstat (limited to 'scripting/java/com/sun/star/script/framework/container/ParcelDescriptor.java')
-rw-r--r--scripting/java/com/sun/star/script/framework/container/ParcelDescriptor.java450
1 files changed, 450 insertions, 0 deletions
diff --git a/scripting/java/com/sun/star/script/framework/container/ParcelDescriptor.java b/scripting/java/com/sun/star/script/framework/container/ParcelDescriptor.java
new file mode 100644
index 000000000000..b78f07079f0c
--- /dev/null
+++ b/scripting/java/com/sun/star/script/framework/container/ParcelDescriptor.java
@@ -0,0 +1,450 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+package com.sun.star.script.framework.container;
+
+import java.io.File;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.FileNotFoundException;
+import java.io.ByteArrayInputStream;
+
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Enumeration;
+import java.util.Iterator;
+
+// import javax.xml.parsers.DocumentBuilderFactory;
+// import javax.xml.parsers.DocumentBuilder;
+// import javax.xml.parsers.ParserConfigurationException;
+
+import org.w3c.dom.*;
+
+public class ParcelDescriptor {
+
+ // File name to be used for parcel descriptor files
+ public static final String
+ PARCEL_DESCRIPTOR_NAME = "parcel-descriptor.xml";
+
+ // Collection of all ParcelDescriptor created for files
+ private static final Map PARCEL_DESCRIPTOR_MAP = new HashMap(5);
+
+ // This is the default contents of a parcel descriptor to be used when
+ // creating empty descriptors
+ private static final byte[] EMPTY_DOCUMENT =
+ ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+ "<parcel xmlns:parcel=\"scripting.dtd\" language=\"Java\">\n" +
+ "</parcel>").getBytes();
+
+ private File file = null;
+ private Document document = null;
+ private String language = null;
+ private Map languagedepprops = new Hashtable(3);
+
+ public static synchronized void removeParcelDescriptor(File parent) {
+ File path = new File(parent, PARCEL_DESCRIPTOR_NAME);
+ PARCEL_DESCRIPTOR_MAP.remove(path);
+ }
+
+ public static synchronized void renameParcelDescriptor(File oldFile, File newFile) {
+ File oldPath = new File(oldFile, PARCEL_DESCRIPTOR_NAME);
+ ParcelDescriptor pd = (ParcelDescriptor)PARCEL_DESCRIPTOR_MAP.get(oldPath);
+ if(pd != null) {
+ PARCEL_DESCRIPTOR_MAP.remove(oldPath);
+ File newPath = new File(newFile, PARCEL_DESCRIPTOR_NAME);
+ pd.file = newPath;
+ PARCEL_DESCRIPTOR_MAP.put(newPath, pd);
+ }
+ }
+
+ // returns the ParcelDescriptor in the corresponding directory
+ // returns null if no ParcelDescriptor is found in the directory
+ public static synchronized ParcelDescriptor
+ getParcelDescriptor(File parent) {
+
+ File path = new File(parent, PARCEL_DESCRIPTOR_NAME);
+ ParcelDescriptor pd = (ParcelDescriptor)PARCEL_DESCRIPTOR_MAP.get(path);
+
+ if (pd == null && path.exists()) {
+ try {
+ pd = new ParcelDescriptor(path);
+ }
+ catch (IOException ioe) {
+ return null;
+ }
+ PARCEL_DESCRIPTOR_MAP.put(path, pd);
+ }
+ return pd;
+ }
+
+ // returns a ParcelDescriptor for the corresponding directory
+ // if no ParcelDescriptor exists, one is created
+ public static synchronized ParcelDescriptor
+ createParcelDescriptor(File parent) throws IOException {
+
+ ParcelDescriptor pd = getParcelDescriptor(parent);
+
+ if (pd == null) {
+ if (parent == null || !parent.exists() || !parent.isDirectory()) {
+ throw new IOException("Cannot create Parcel Descriptor");
+ }
+
+ File path = new File(parent, PARCEL_DESCRIPTOR_NAME);
+ pd = new ParcelDescriptor(path);
+ PARCEL_DESCRIPTOR_MAP.put(path, pd);
+ }
+ return pd;
+ }
+
+ public ParcelDescriptor() throws IOException {
+ ByteArrayInputStream bis = null;
+ try {
+ bis = new ByteArrayInputStream(EMPTY_DOCUMENT);
+ this.document = XMLParserFactory.getParser().parse(bis);
+ }
+ finally {
+ if (bis != null)
+ bis.close();
+ }
+ }
+
+ public ParcelDescriptor(Document document) {
+ this.document = document;
+ initLanguageProperties();
+ }
+
+ public ParcelDescriptor(InputStream is) throws IOException {
+ this(XMLParserFactory.getParser().parse(is));
+ }
+
+ public ParcelDescriptor(File file) throws IOException {
+ this(file, "Java");
+ }
+
+ public ParcelDescriptor(File file, String language) throws IOException {
+ this.file = file;
+
+ if (file.exists()) {
+ FileInputStream fis = null;
+ try {
+ fis = new FileInputStream(file);
+ this.document = XMLParserFactory.getParser().parse(fis);
+ }
+ finally {
+ if (fis != null)
+ fis.close();
+ }
+ }
+ else {
+ ByteArrayInputStream bis = null;
+ try {
+ bis = new ByteArrayInputStream(EMPTY_DOCUMENT);
+ this.document = XMLParserFactory.getParser().parse(bis);
+ }
+ finally {
+ if (bis != null)
+ bis.close();
+ }
+ setLanguage(language);
+ }
+ initLanguageProperties();
+ }
+
+ public void write(File file) throws IOException {
+ FileOutputStream fos = new FileOutputStream(file);
+ XMLParserFactory.getParser().write(document, fos);
+ fos.close();
+ }
+
+ public void write() throws IOException {
+ if (file == null)
+ throw new FileNotFoundException("No file specified");
+
+ write(file);
+ }
+
+ public void write(OutputStream out) throws IOException {
+ XMLParserFactory.getParser().write(document, out);
+ }
+
+ public Document getDocument() {
+ return document;
+ }
+
+ public String getLanguage() {
+ if (language == null) {
+ if (document != null) {
+ Element e = document.getDocumentElement();
+ language = e.getAttribute("language");
+ }
+ }
+ return language;
+ }
+
+ public void setLanguage(String language) {
+ this.language = language;
+
+ if (document != null) {
+ try {
+ Element e = document.getDocumentElement();
+ e.setAttribute("language", language);
+ }
+ catch (DOMException de) {
+ }
+ }
+ }
+
+ public ScriptEntry[] getScriptEntries() {
+ ArrayList scripts = new ArrayList();
+ NodeList scriptNodes;
+ int len;
+
+ if (document == null ||
+ (scriptNodes = document.getElementsByTagName("script")) == null ||
+ (len = scriptNodes.getLength()) == 0)
+ return new ScriptEntry[0];
+
+ for (int i = 0; i < len; i++) {
+ String language, languagename, logicalname, description = "";
+ Map langProps = new HashMap();
+ NodeList nl;
+ Element tmp;
+
+ Element scriptElement = (Element)scriptNodes.item(i);
+ language = scriptElement.getAttribute("language");
+
+ nl = scriptElement.getElementsByTagName("logicalname");
+ if (nl == null)
+ logicalname = "";
+ else {
+ tmp = (Element)nl.item(0);
+ logicalname = tmp.getAttribute("value");
+ }
+
+ // get the text of the description element
+ nl = scriptElement.getElementsByTagName("locale");
+ if (nl != null)
+ {
+ nl = nl.item(0).getChildNodes();
+ if (nl != null)
+ {
+ for (int j = 0 ; j < nl.getLength(); j++)
+ {
+ if (nl.item(j).getNodeName().equals("description"))
+ {
+ CharacterData cd =
+ (CharacterData)nl.item(j).getFirstChild();
+ description = cd.getData().trim();
+ }
+ }
+ }
+ }
+
+ nl = scriptElement.getElementsByTagName("functionname");
+ if (nl == null) {
+ languagename = "";
+ } else {
+ tmp = (Element)nl.item(0);
+ languagename = tmp.getAttribute("value");
+ }
+ nl = scriptElement.getElementsByTagName("languagedepprops");
+ if ( nl != null && nl.getLength() > 0 )
+ {
+
+ NodeList props = ((Element)nl.item(0)).getElementsByTagName("prop");
+ if ( props != null )
+ {
+ for ( int j=0; j < props.getLength(); j++ )
+ {
+ tmp = (Element)props.item(j);
+ String key = tmp.getAttribute("name");
+ String val = tmp.getAttribute("value");
+ langProps.put( key,val );
+ }
+ }
+ }
+ ScriptEntry entry = new ScriptEntry(language, languagename, logicalname, "",langProps, description);
+ scripts.add(entry);
+ }
+ return (ScriptEntry[])scripts.toArray(new ScriptEntry[0]);
+ }
+
+ public void setScriptEntries(ScriptEntry[] scripts) {
+ clearEntries();
+ for (int i = 0; i < scripts.length; i++)
+ addScriptEntry(scripts[i]);
+ }
+
+ public void setScriptEntries(Enumeration scripts) {
+ clearEntries();
+ while (scripts.hasMoreElements())
+ addScriptEntry((ScriptEntry) scripts.nextElement());
+ }
+
+ public String getLanguageProperty(String name) {
+ return (String)languagedepprops.get(name);
+ }
+
+ public void setLanguageProperty(String name, String value) {
+ languagedepprops.put(name, value);
+ setScriptEntries(getScriptEntries());
+ }
+
+ private void initLanguageProperties() {
+ NodeList nl = document.getElementsByTagName("languagedepprops");
+ int len;
+
+ if (nl != null && (len = nl.getLength()) != 0) {
+
+ for (int i = 0; i < len; i++) {
+ Element e = (Element)nl.item(i);
+ NodeList nl2 = e.getElementsByTagName("prop");
+ int len2;
+
+ if (nl2 != null && (len2 = nl2.getLength()) != 0) {
+ for (int j = 0; j < len2; j++) {
+ Element e2 = (Element)nl2.item(j);
+
+ String name = e2.getAttribute("name");
+ String value = e2.getAttribute("value");
+
+ if (getLanguageProperty(name) == null) {
+ languagedepprops.put(name, value);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private void clearEntries() {
+ NodeList scriptNodes;
+ Element main = document.getDocumentElement();
+ int len;
+
+ if ((scriptNodes = document.getElementsByTagName("script")) != null &&
+ (len = scriptNodes.getLength()) != 0)
+ {
+ for (int i = len - 1; i >= 0; i--) {
+ try {
+ main.removeChild(scriptNodes.item(i));
+ }
+ catch (DOMException de) {
+ // ignore
+ }
+ }
+ }
+ }
+
+ public void removeScriptEntry(ScriptEntry script) {
+ NodeList scriptNodes;
+ Element main = document.getDocumentElement();
+ int len;
+
+ if ((scriptNodes = document.getElementsByTagName("script")) != null &&
+ (len = scriptNodes.getLength()) != 0)
+ {
+ for (int i = len - 1; i >= 0; i--) {
+ try {
+ Element scriptElement = (Element)scriptNodes.item(i);
+ String languagename = "";
+
+ NodeList nl =
+ scriptElement.getElementsByTagName("functionname");
+ if (nl == null) {
+ continue;
+ } else {
+ Element tmp = (Element)nl.item(0);
+ languagename = tmp.getAttribute("value");
+ }
+
+ if (languagename.equals(script.getLanguageName())) {
+ main.removeChild(scriptElement);
+ }
+ }
+ catch (DOMException de) {
+ // ignore
+ }
+ }
+ }
+ }
+
+ public void addScriptEntry(ScriptEntry script) {
+ Element main = document.getDocumentElement();
+ Element root, item, tempitem;
+
+ root = document.createElement("script");
+ root.setAttribute("language", script.getLanguage());
+
+ item = document.createElement("locale");
+ item.setAttribute("lang", "en");
+ tempitem = document.createElement("displayname");
+ tempitem.setAttribute("value", script.getLogicalName());
+ item.appendChild(tempitem);
+
+ tempitem = document.createElement("description");
+ String description = script.getDescription();
+ if (description == null || description.equals(""))
+ {
+ description = script.getLogicalName();
+ }
+ tempitem.appendChild(document.createTextNode(description));
+ item.appendChild(tempitem);
+
+ root.appendChild(item);
+
+ item = document.createElement("logicalname");
+ item.setAttribute("value", script.getLogicalName());
+ root.appendChild(item);
+
+ item = document.createElement("functionname");
+ item.setAttribute("value", script.getLanguageName());
+ root.appendChild(item);
+
+ if (languagedepprops != null && languagedepprops.size() != 0) {
+ String key;
+ item = document.createElement("languagedepprops");
+
+ Iterator iter = languagedepprops.keySet().iterator();
+ while (iter.hasNext()) {
+ tempitem = document.createElement("prop");
+ key = (String)iter.next();
+ tempitem.setAttribute("name", key);
+ tempitem.setAttribute("value", (String)languagedepprops.get(key));
+ item.appendChild(tempitem);
+ }
+ root.appendChild(item);
+ }
+
+ //add to the Top Element
+ main.appendChild(root);
+ }
+}