/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* 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 .
*/
package com.sun.star.script.framework.container;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class DeployedUnoPackagesDB {
// This is the default contents of a parcel descriptor to be used when
// creating empty descriptors
private static final byte[] EMPTY_DOCUMENT =
("\n" +
"\n" +
"").getBytes();
private Document document = null;
public DeployedUnoPackagesDB() throws IOException {
ByteArrayInputStream bis = null;
try {
bis = new ByteArrayInputStream(EMPTY_DOCUMENT);
this.document = XMLParserFactory.getParser().parse(bis);
} finally {
if (bis != null)
bis.close();
}
}
private DeployedUnoPackagesDB(Document document) {
this.document = document;
}
public DeployedUnoPackagesDB(InputStream is) throws IOException {
this(XMLParserFactory.getParser().parse(is));
}
public String[] getDeployedPackages(String language) {
ArrayList packageUrls = new ArrayList(4);
Element main = document.getDocumentElement();
Element root = null;
int len = 0;
NodeList langNodes = null;
if ((langNodes = main.getElementsByTagName("language")) != null &&
(len = langNodes.getLength()) != 0) {
for (int i = 0; i < len; i++) {
Element e = (Element)langNodes.item(i);
if (e.getAttribute("value").equals(language)) {
root = e;
break;
}
}
}
if (root != null) {
len = 0;
NodeList packages = null;
if ((packages = root.getElementsByTagName("package")) != null &&
(len = packages.getLength()) != 0) {
for (int i = 0; i < len; i++) {
Element e = (Element)packages.item(i);
packageUrls.add(e.getAttribute("value"));
}
}
}
if (!packageUrls.isEmpty()) {
return packageUrls.toArray(new String[packageUrls.size()]);
}
return new String[0];
}
public void write(OutputStream out) throws IOException {
XMLParserFactory.getParser().write(document, out);
}
public Document getDocument() {
return document;
}
public boolean removePackage(String language, String url) {
Element main = document.getDocumentElement();
Element langNode = null;
int len = 0;
NodeList langNodes = null;
if ((langNodes = main.getElementsByTagName("language")) != null &&
(len = langNodes.getLength()) != 0) {
for (int i = 0; i < len; i++) {
Element e = (Element)langNodes.item(i);
if (e.getAttribute("value").equals(language)) {
langNode = e;
break;
}
}
}
if (langNode == null) {
return false;
}
len = 0;
NodeList packages = null;
boolean result = false;
if ((packages = langNode.getElementsByTagName("package")) != null &&
(len = packages.getLength()) != 0) {
for (int i = 0; i < len; i++) {
Element e = (Element)packages.item(i);
String value = e.getAttribute("value");
if (value.equals(url)) {
langNode.removeChild(e);
result = true;
break;
}
}
}
return result;
}
public void addPackage(String language, String url) {
Element main = document.getDocumentElement();
Element langNode = null;
Element pkgNode = null;
int len = 0;
NodeList langNodes = null;
if ((langNodes = document.getElementsByTagName("language")) != null &&
(len = langNodes.getLength()) != 0) {
for (int i = 0; i < len; i++) {
Element e = (Element)langNodes.item(i);
if (e.getAttribute("value").equals(language)) {
langNode = e;
break;
}
}
}
if (langNode == null) {
langNode = document.createElement("language");
langNode.setAttribute("value", language);
}
pkgNode = document.createElement("package");
pkgNode.setAttribute("value", url);
langNode.appendChild(pkgNode);
//add to the Top Element
main.appendChild(langNode);
}
}