/*
* 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 com.sun.star.container.ElementExistException;
import com.sun.star.container.XNameContainer;
import com.sun.star.script.framework.io.XInputStreamImpl;
import com.sun.star.script.framework.log.LogUtils;
import com.sun.star.script.framework.provider.PathUtils;
import com.sun.star.ucb.XSimpleFileAccess;
import com.sun.star.ucb.XSimpleFileAccess2;
import com.sun.star.uno.Type;
import com.sun.star.uno.UnoRuntime;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
public class Parcel implements XNameContainer {
private ParcelDescriptor m_descriptor;
private String name;
protected ParcelContainer parent;
protected XSimpleFileAccess m_xSFA;
public Parcel(XSimpleFileAccess xSFA, ParcelContainer parent,
ParcelDescriptor desc, String parcelName) {
this(parent, desc, parcelName);
this.m_xSFA = xSFA;
}
private Parcel(ParcelContainer parent, ParcelDescriptor desc,
String parcelName) {
this.parent = parent;
this.m_descriptor = desc;
this.name = parcelName;
}
/**
* Tests if this Parcel is in a UNO package
* or within a sub package within a UNO package
*
* @return true if has parent false otherwise
*/
public boolean isUnoPkg() {
return parent.isUnoPkg();
}
public String getName() {
return name;
}
public ScriptMetaData getByName(String aName) throws
com.sun.star.container.NoSuchElementException,
com.sun.star.lang.WrappedTargetException {
LogUtils.DEBUG("** Parcel.getByName for " + aName);
ScriptEntry thescript = null;
try {
if (m_descriptor != null && hasElements()) {
ScriptEntry[] scripts = m_descriptor.getScriptEntries();
if (scripts.length != 0) {
for (ScriptEntry script : scripts) {
if (script.getLanguageName().equals(aName)) {
thescript = script;
break;
}
}
}
}
}
// catch unknown or un-checked exceptions
catch (Exception e) {
throw new com.sun.star.lang.WrappedTargetException(e);
}
if (thescript == null) {
LogUtils.DEBUG("No script for " + aName);
throw new com.sun.star.container.NoSuchElementException("No script named " +
aName);
}
ScriptMetaData data = new ScriptMetaData(this, thescript, null);
LogUtils.DEBUG("returning date for " + aName);
return data;
}
public String[] getElementNames() {
String[] results = new String[0];
if (m_descriptor != null) {
ScriptEntry[] scripts = m_descriptor.getScriptEntries();
results = new String[ scripts.length ];
for (int index = 0; index < scripts.length; index++) {
results[ index ] = scripts[ index ].getLanguageName();
}
}
return results;
}
public boolean hasByName(String aName) {
boolean result = true;
ScriptMetaData containee = null;
try {
containee = getByName(aName);
if (containee != null) {
result = true;
}
} catch (Exception e) {
result = false;
}
return result;
}
public com.sun.star.uno.Type getElementType() {
// TODO at the moment this returns void indicating
// type is unknown ( from UNO point of view this is correct )
// but, maybe we want to have a private UNO interface
return new Type();
}
public boolean hasElements() {
return m_descriptor != null && m_descriptor.getScriptEntries().length > 0;
}
public void replaceByName(String aName, java.lang.Object aElement) throws
com.sun.star.lang.IllegalArgumentException,
com.sun.star.container.NoSuchElementException,
com.sun.star.lang.WrappedTargetException {
// TODO check type of aElement
// if not ok, throw IllegalArgument
if (m_descriptor != null) {
try {
ScriptMetaData script = getByName(aName);
if (script != null) {
//m_descriptor.removeScriptEntry( script );
// TODO needs to create source file ( if there is one )
//m_descriptor.write();
} else {
throw new com.sun.star.container.NoSuchElementException(
"No script named " + aName);
}
}
// TO DO should catch specified exceptions
catch (Exception ex) {
throw new com.sun.star.lang.WrappedTargetException(ex);
}
}
}
// create
public void insertByName(String aName, java.lang.Object aElement) throws
com.sun.star.lang.IllegalArgumentException, ElementExistException,
com.sun.star.lang.WrappedTargetException {
// TODO check the type of aElement and throw#
// if not appropriate
try {
if (hasByName(aName)) {
throw new ElementExistException(aName);
}
ScriptMetaData script = (ScriptMetaData)aElement;
if (script.hasSource()) {
LogUtils.DEBUG("Inserting source: " + script.getSource());
if (!script.writeSourceFile()) {
throw new com.sun.star.lang.WrappedTargetException(
"Failed to create source file " + script.getLanguageName());
}
}
m_descriptor.addScriptEntry(script);
writeParcelDescriptor();
} catch (Exception e) {
LogUtils.DEBUG("Failed to insert entry " + aName + ": " + e.getMessage());
throw new com.sun.star.lang.WrappedTargetException(e);
}
}
private void writeParcelDescriptor()
throws com.sun.star.ucb.CommandAbortedException,
com.sun.star.io.IOException,
com.sun.star.uno.Exception, java.io.IOException {
String pathToDescriptor =
PathUtils.make_url(getPathToParcel(), ParcelDescriptor.PARCEL_DESCRIPTOR_NAME);
XSimpleFileAccess2 xSFA2 =
UnoRuntime.queryInterface(XSimpleFileAccess2.class, m_xSFA);
if (xSFA2 != null) {
ByteArrayOutputStream bos = null;
ByteArrayInputStream bis = null;
XInputStreamImpl xis = null;
try {
bos = new ByteArrayOutputStream(1024);
m_descriptor.write(bos);
bis = new ByteArrayInputStream(bos.toByteArray());
xis = new XInputStreamImpl(bis);
xSFA2.writeFile(pathToDescriptor, xis);
} finally {
if (bos != null) bos.close();
if (bis != null) bis.close();
if (xis != null) xis.closeInput();
}
}
}
// delete
public void removeByName(String Name) throws
com.sun.star.container.NoSuchElementException,
com.sun.star.lang.WrappedTargetException {
try {
ScriptMetaData script = getByName(Name);
if (script != null) {
if (!script.removeSourceFile()) {
LogUtils.DEBUG("** Parcel.removeByName Failed to remove script "
+ Name);
throw new com.sun.star.lang.WrappedTargetException(
"Failed to remove script " + Name);
}
LogUtils.DEBUG("** Parcel.removeByName have removed script source file "
+ Name);
m_descriptor.removeScriptEntry(script);
writeParcelDescriptor();
} else {
throw new com.sun.star.container.NoSuchElementException(
"No script named " + Name);
}
} catch (Exception e) {
LogUtils.DEBUG("** Parcel.removeByName Exception: " + e);
throw new com.sun.star.lang.WrappedTargetException(e);
}
}
// rename parcel
public void rename(String name) {
this.name = name;
}
public ParcelContainer getParent() {
return parent;
}
/**
* Returns the path of this Parcel
*
* @return String path to parcel
*/
public String getPathToParcel() {
String path = parent.getParcelContainerDir() + "/" + name;
return path;
}
}