INTEGRATION: CWS scriptingf5 (1.1.2); FILE ADDED

2004/02/25 18:38:24 npower 1.1.2.1: #i25272# Added a container implementation ( new com/sun/star/script/framework/container defined ) to better seperate Browse functionality from
io and script registry.

moved this class from  com/sun/star/script/framework/browse
This commit is contained in:
Sander Vesik
2004-04-19 22:06:13 +00:00
parent e7cd1f2b71
commit f7e53b6f88

View File

@@ -0,0 +1,441 @@
/*************************************************************************
*
* $RCSfile: ParcelDescriptor.java,v $
*
* $Revision: 1.2 $
*
* last change: $Author: svesik $ $Date: 2004-04-19 23:06:13 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
*
* - GNU Lesser General Public License Version 2.1
* - Sun Industry Standards Source License Version 1.1
*
* Sun Microsystems Inc., October, 2000
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2000 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
*
* This library 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 for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
*
* Sun Industry Standards Source License Version 1.1
* =================================================
* The contents of this file are subject to the Sun Industry Standards
* Source License Version 1.1 (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.openoffice.org/license.html.
*
* Software provided under this License is provided on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
* See the License for the specific provisions governing your rights and
* obligations concerning the Software.
*
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
*
* Copyright: 2000 by Sun Microsystems, Inc.
*
* All Rights Reserved.
*
* Contributor(s): _______________________________________
*
*
************************************************************************/
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
private 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);
// 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);
}
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;
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");
}
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 );
}
}
}
scripts.add(new ScriptEntry(language, languagename, logicalname, "",langProps));
}
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");
tempitem.appendChild(document.createTextNode(script.getLogicalName()));
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);
}
}