blob: f852b5c0c4c91d12f1973d90ec28289179b74410 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the 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);
}
}