blob: 9936bf95467f41449a94fd92207b92520994a22d [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.browse;
import com.sun.star.script.browse.XBrowseNode;
import com.sun.star.script.browse.BrowseNodeTypes;
import com.sun.star.script.provider.XScriptContext;
import com.sun.star.lib.uno.helper.PropertySet;
import com.sun.star.uno.AnyConverter;
import com.sun.star.uno.Any;
import com.sun.star.uno.Type;
import com.sun.star.uno.XComponentContext;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.ucb.XSimpleFileAccess;
import com.sun.star.beans.XIntrospectionAccess;
import com.sun.star.script.XInvocation;
import com.sun.star.lang.NoSupportException;
import com.sun.star.lang.WrappedTargetException;
import com.sun.star.reflection.InvocationTargetException;
import com.sun.star.container.NoSuchElementException;
import com.sun.star.container.ElementExistException;
import java.util.*;
import com.sun.star.script.framework.log.LogUtils;
import com.sun.star.script.framework.provider.ScriptProvider;
import com.sun.star.script.framework.container.*;
public class ScriptBrowseNode extends PropertySet
implements XBrowseNode, XInvocation
{
private ScriptProvider provider;
private Parcel parent;
private String name;
public String uri;
public String description;
public boolean editable = false;
public boolean deletable = false;
public boolean renamable = false;
public ScriptBrowseNode( ScriptProvider provider, Parcel parent,
String name )
{
this.provider = provider;
this.name = name;
this.parent = parent;
ScriptMetaData data = null;
XSimpleFileAccess xSFA = null;
XComponentContext xCtx = provider.getScriptingContext().getComponentContext();
XMultiComponentFactory xFac = xCtx.getServiceManager();
try
{
data = (ScriptMetaData)parent.getByName( name );
xSFA = ( XSimpleFileAccess)
UnoRuntime.queryInterface( XSimpleFileAccess.class,
xFac.createInstanceWithContext(
"com.sun.star.ucb.SimpleFileAccess",
xCtx ) );
}
// TODO fix exception types to be caught here, should we rethrow?
catch ( Exception e )
{
LogUtils.DEBUG("** caught exception getting script data for " + name + " ->" + e.toString() );
}
uri = data.getShortFormScriptURL();
description = data.getDescription();
if (provider.hasScriptEditor() == true)
{
this.editable = true;
try
{
if ( !parent.isUnoPkg() &&
!xSFA.isReadOnly( parent.getPathToParcel() ) )
{
this.deletable = true;
this.renamable = true;
}
}
// TODO propagate errors
catch ( Exception e )
{
LogUtils.DEBUG("Caught exception in creation of ScriptBrowseNode");
LogUtils.DEBUG( LogUtils.getTrace(e));
}
}
registerProperty("Deletable", new Type(boolean.class),
(short)0, "deletable");
registerProperty("Editable", new Type(boolean.class),
(short)0, "editable");
registerProperty("Renamable", new Type(boolean.class),
(short)0, "renamable");
registerProperty("URI", new Type(String.class),
(short)0, "uri");
registerProperty("Description", new Type(String.class),
(short)0, "description");
}
public String getName() {
return name;
}
public XBrowseNode[] getChildNodes() {
return new XBrowseNode[0];
}
public boolean hasChildNodes() {
return false;
}
public short getType() {
return BrowseNodeTypes.SCRIPT;
}
public String toString() {
return getName();
}
public void updateURI( Parcel p ) {
parent = p;
ScriptMetaData data = null;
try
{
data = (ScriptMetaData)parent.getByName( name );
}
// TODO fix exception types to be caught here, should we rethrow?
catch ( Exception e )
{
LogUtils.DEBUG("** caught exception getting script data for " + name + " ->" + e.toString() );
}
uri = data.getShortFormScriptURL();
}
// implementation of XInvocation interface
public XIntrospectionAccess getIntrospection() {
return null;
}
public Object invoke(String aFunctionName, Object[] aParams,
short[][] aOutParamIndex, Object[][] aOutParam)
throws com.sun.star.lang.IllegalArgumentException,
com.sun.star.script.CannotConvertException,
com.sun.star.reflection.InvocationTargetException
{
// Initialise the out paramters - not used but prevents error in
// UNO bridge
aOutParamIndex[0] = new short[0];
aOutParam[0] = new Object[0];
Any result = new Any(new Type(Boolean.class), Boolean.TRUE);
if (aFunctionName.equals("Editable"))
{
if (!editable)
{
NoSupportException nse = new NoSupportException(
aFunctionName + " is not editable " );
throw new InvocationTargetException(
"Scripting framework error editing script", null, nse );
}
XScriptContext ctxt = provider.getScriptingContext();
ScriptMetaData data = null;
try
{
data = (ScriptMetaData)parent.getByName( name );
}
catch ( NoSuchElementException nse )
{
throw new com.sun.star.lang.IllegalArgumentException(
name + " does not exist or can't be found " );
}
catch ( com.sun.star.lang.WrappedTargetException wte )
{
// rethrow
throw new InvocationTargetException(
"Scripting framework editing script ",
null, wte.TargetException );
}
provider.getScriptEditor().edit(ctxt, data);
}
else if (aFunctionName.equals("Deletable"))
{
if (!deletable)
{
NoSupportException nse = new NoSupportException(
aFunctionName + " is not supported for this node" );
throw new InvocationTargetException(
"Scripting framework error deleting script", null, nse );
}
try
{
parent.removeByName( name );
result = new Any(new Type(Boolean.class), Boolean.TRUE);
}
catch ( NoSuchElementException nse )
{
throw new com.sun.star.lang.IllegalArgumentException(
name + " does not exist or can't be found " );
}
catch ( WrappedTargetException wte )
{
// rethrow
throw new InvocationTargetException(
"Scripting framework deleting script ",
null, wte.TargetException );
}
}
else if (aFunctionName.equals("Renamable"))
{
result = new Any(new Type(XBrowseNode.class), new XBrowseNode[0]);
if (!renamable)
{
NoSupportException nse = new NoSupportException(
aFunctionName + " is not supported for this node" );
throw new InvocationTargetException(
"Scripting framework error renaming script", null, nse );
}
try
{
String newName = (String) AnyConverter.toString(aParams[0]);
ScriptMetaData oldData = (ScriptMetaData)parent.getByName( name );
oldData.loadSource();
String oldSource = oldData.getSource();
LogUtils.DEBUG("Create renamed script");
String languageName =
newName + "." + provider.getScriptEditor().getExtension();
String language = provider.getName();
ScriptEntry entry = new ScriptEntry(
language, languageName, languageName, "", new HashMap() );
ScriptMetaData data = new ScriptMetaData(
parent, entry, oldSource );
parent.insertByName( languageName, data );
LogUtils.DEBUG("Now remove old script");
parent.removeByName( name );
uri = data.getShortFormScriptURL();
name = languageName;
result = new Any(new Type(XBrowseNode.class), this);
}
catch ( NoSuchElementException nse )
{
throw new com.sun.star.lang.IllegalArgumentException(
name + " does not exist or can't be found " );
}
catch ( ElementExistException eee )
{
// rethrow
throw new InvocationTargetException(
"Scripting framework error renaming script ",
null, eee );
}
catch ( WrappedTargetException wte )
{
// rethrow
throw new InvocationTargetException(
"Scripting framework rename script ",
null, wte.TargetException );
}
}
else {
throw new com.sun.star.lang.IllegalArgumentException(
"Function " + aFunctionName + " not supported.");
}
return result;
}
public void setValue(String aPropertyName, Object aValue)
throws com.sun.star.beans.UnknownPropertyException,
com.sun.star.script.CannotConvertException,
com.sun.star.reflection.InvocationTargetException
{
}
public Object getValue(String aPropertyName)
throws com.sun.star.beans.UnknownPropertyException
{
return null;
}
public boolean hasMethod(String aName) {
return false;
}
public boolean hasProperty(String aName) {
return false;
}
}