diff options
Diffstat (limited to 'scripting/java/com/sun/star/script/framework/container/ScriptMetaData.java')
-rw-r--r-- | scripting/java/com/sun/star/script/framework/container/ScriptMetaData.java | 410 |
1 files changed, 410 insertions, 0 deletions
diff --git a/scripting/java/com/sun/star/script/framework/container/ScriptMetaData.java b/scripting/java/com/sun/star/script/framework/container/ScriptMetaData.java new file mode 100644 index 000000000000..e7007972936b --- /dev/null +++ b/scripting/java/com/sun/star/script/framework/container/ScriptMetaData.java @@ -0,0 +1,410 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +package com.sun.star.script.framework.container; + +import java.net.URL; + +import java.io.ByteArrayInputStream; + +import java.util.Vector; +import java.util.StringTokenizer; + +import java.io.InputStream; +import java.io.OutputStream; + +import com.sun.star.script.framework.log.LogUtils; + +import com.sun.star.script.framework.provider.PathUtils; + +import com.sun.star.script.framework.io.XInputStreamImpl; + +import com.sun.star.script.framework.container.ScriptEntry; +import com.sun.star.script.framework.container.Parcel; + +import com.sun.star.script.framework.io.UCBStreamHandler; + +import com.sun.star.ucb.XSimpleFileAccess2; + +import com.sun.star.uno.UnoRuntime; + +public class ScriptMetaData extends ScriptEntry implements Cloneable { + private boolean hasSource = false; + private String locationPlaceHolder = ""; + private String source; + private Parcel parent; + + + public ScriptMetaData( Parcel parent, ScriptEntry entry, + String source ) + { + super( entry ); + this.parent = parent; + if ( source != null ) + { + this.hasSource = true; + this.source = source; + } + + } + + public boolean hasSource() + { + return hasSource; + } + public String getSource() + { + + if ( source !=null && hasSource ) + { + return source; + } + else + { + return null; + } + } + + public byte[] getSourceBytes() + { + if ( source !=null && hasSource ) + { + return source.getBytes(); + } + else + { + return null; + } + + } + public Object clone() throws CloneNotSupportedException { + return super.clone(); + } + + public boolean equals(ScriptMetaData other) { + if (super.equals(other) && + hasSource == other.hasSource() ) + { + return true; + } + return false; + } + + public String getScriptFullURL() + { + String url = "vnd.sun.star.script:" + parent.getName() + "." + getLanguageName() + + "?" + "language=" + getLanguage() + + "&location=" + getParcelLocation(); + return url; + } + + public String getShortFormScriptURL() + { + String url = "vnd.sun.star.script:" + parent.getName() + "." + getLanguageName() + + "?" + "language=" + getLanguage() + + "&location=" + getLocationPlaceHolder(); + return url; + } + + // TODO probably should be private should not be necessary + // to be exposed at all + + private static final String SHARE = + "vnd.sun.star.expand:${$BRAND_BASE_DIR/program/" + + PathUtils.BOOTSTRAP_NAME + + "::BaseInstallation}/share"; + + private static final String USER = + "vnd.sun.star.expand:${$BRAND_BASE_DIR/program/" + + PathUtils.BOOTSTRAP_NAME + + "::UserInstallation}/user"; + + private static final String UNO_USER_PACKAGES1 = + "vnd.sun.star.expand:$UNO_USER_PACKAGES_CACHE"; + + private static final String UNO_USER_PACKAGES2 = + USER + "/uno_packages"; + + private static final String UNO_SHARED_PACKAGES1 = + "$UNO_SHARED_PACKAGES_CACHE"; + + private static final String UNO_SHARED_PACKAGES2 = + SHARE + "/uno_packages"; + + public static String getLocationPlaceHolder(String url, String pkgname) + { + String result = "Unknown"; + + if ( url.indexOf(UNO_USER_PACKAGES1) > -1 || + url.indexOf(UNO_USER_PACKAGES2) > -1 ) + { + result = PathUtils.make_url( "user:uno_packages", pkgname ); + } + else if ( url.indexOf(UNO_SHARED_PACKAGES1) > -1 || + url.indexOf(UNO_SHARED_PACKAGES2) > -1 ) + { + result = PathUtils.make_url( "share:uno_packages", pkgname ); + } + else if ( url.indexOf(SHARE) == 0 ) + { + result = "share"; + } + else if ( url.indexOf(USER) == 0 ) + { + result = "user"; + } + else if ( url.indexOf("vnd.sun.star.tdoc:") == 0 ) + { + result = "document"; + } + return result; + } + + public String getLocationPlaceHolder() + { + String placeHolder = "Unknown"; + String pathToParcel = parent.getPathToParcel(); + + if ( pathToParcel.indexOf(UNO_USER_PACKAGES1) > -1 || + pathToParcel.indexOf(UNO_USER_PACKAGES2) > -1 ) + { + // its a package + placeHolder = "user:uno_packages"; + String unoPkg = parent.parent.getName(); + if ( unoPkg != null ) + { + placeHolder = PathUtils.make_url( placeHolder, unoPkg ); + } + } + else if ( pathToParcel.indexOf(UNO_SHARED_PACKAGES1) > -1 || + pathToParcel.indexOf(UNO_SHARED_PACKAGES2) > -1 ) + { + //its a package + placeHolder = "share:uno_packages"; + String unoPkg = parent.parent.getName(); + if ( unoPkg != null ) + { + placeHolder = PathUtils.make_url( placeHolder, unoPkg ); + } + } + else if ( pathToParcel.indexOf(SHARE) == 0 ) + { + placeHolder = "share"; + } + else if ( pathToParcel.indexOf(USER) == 0 ) + { + placeHolder = "user"; + } + else if ( pathToParcel.indexOf("vnd.sun.star.tdoc:") == 0 ) + { + placeHolder = "document"; + } + // TODO handling document packages ??? not really sure of package url +/* else + { + } */ + return placeHolder; + } + + // TODO probably should be private should not be necessary + // to be exposed at all only used in lang providers at the moment + // to generate URL for script, editors should use a model of script + // source and not interact with the URL + // Also if it is to remain needs to be renamed to getParcelLocationURL + + // return URL string to parcel + public String getParcelLocation() + { + return parent.getPathToParcel(); + } + + + public String toString() + { + return "\nParcelLocation = " + getParcelLocation() + "\nLocationPlaceHolder = " + locationPlaceHolder + super.toString(); + } + + public URL[] getClassPath() throws java.net.MalformedURLException + { + try + { + String classpath = (String)getLanguageProperties().get("classpath"); + Vector paths = null; + + if ( classpath == null ) + { + classpath = ""; + } + + String parcelPath = getParcelLocation(); + // make sure path ends with / + if ( !parcelPath.endsWith("/") ) + { + parcelPath += "/"; + } + + // replace \ with / + parcelPath = parcelPath.replace( '\\', '/' ); + + Vector classPathVec = new Vector(); + StringTokenizer stk = new StringTokenizer(classpath, ":"); + while ( stk.hasMoreElements() ) + { + String relativeClasspath = (String)stk.nextElement(); + String pathToProcess = PathUtils.make_url( parcelPath, relativeClasspath); + URL url = createURL( pathToProcess ); + if ( url != null ) + { + classPathVec.add ( url ); + } + + } + if ( classPathVec.size() == 0) + { + URL url = createURL( parcelPath ); + if ( url != null ) + { + classPathVec.add(url); + } + } + + return (URL[])classPathVec.toArray( new URL[0]); + } + catch ( Exception e ) + { + LogUtils.DEBUG("Failed to build class path " + e.toString() ); + LogUtils.DEBUG( LogUtils.getTrace( e ) ); + return new URL[0]; + } + + } + private URL createURL( String path ) throws java.net.MalformedURLException + { + URL url = null; + int indexOfColon = path.indexOf(":"); + String scheme = path.substring( 0, indexOfColon ); + UCBStreamHandler handler = new UCBStreamHandler( parent.parent.m_xCtx, scheme, parent.m_xSFA); + + path += UCBStreamHandler.separator; + url = new URL(null, path, handler); + return url; + } + + // TODO should decide whether this should throw or not + // decide whether it should be public or protected ( final ? ) + public void loadSource() + { + try + { + URL sourceUrl = getSourceURL(); + LogUtils.DEBUG("** In load source BUT not loading yet for " + sourceUrl ); + + if ( sourceUrl != null ) + { + StringBuffer buf = new StringBuffer(); + InputStream in = sourceUrl.openStream(); + + byte[] contents = new byte[1024]; + int len = 0; + + while ((len = in.read(contents, 0, 1024)) != -1) { + buf.append(new String(contents, 0, len)); + } + + try { + in.close(); + } + catch (java.io.IOException ignore ) { + LogUtils.DEBUG("** Failed to read scriot from url " + ignore.toString() ); + } + + source = buf.toString(); + hasSource = true; + } + } + catch (java.io.IOException e) { + LogUtils.DEBUG("** Failed to read scriot from url " + e.toString()); + } + + } + protected boolean writeSourceFile() + { + String parcelLocation = parent.getPathToParcel(); + String sourceFilePath = parent.getPathToParcel() + "/" + getLanguageName(); + boolean result = false; + OutputStream os = null; + try + { + XSimpleFileAccess2 xSFA2 = ( XSimpleFileAccess2 ) + UnoRuntime.queryInterface( XSimpleFileAccess2.class, + parent.m_xSFA ); + if ( xSFA2 != null ) + { + ByteArrayInputStream bis = new ByteArrayInputStream( getSourceBytes() ); + XInputStreamImpl xis = new XInputStreamImpl( bis ); + xSFA2.writeFile( sourceFilePath, xis ); + xis.closeInput(); + result = true; + } + } + // TODO re-examine exception processing should probably throw + // exceptions back to caller + catch ( Exception ignore ) + + { + } + return result; + } + protected boolean removeSourceFile() + { + String parcelLocation = parent.getPathToParcel(); + String sourceFilePath = parcelLocation + "/" + getLanguageName(); + boolean result = false; + try + { + parent.m_xSFA.kill( sourceFilePath ); + result = true; + } + // TODO reexamine exception handling + catch ( Exception e ) + { + } + return result; + } + + public URL getSourceURL() throws java.net.MalformedURLException + { + String sUrl = null; + URL scriptURL = null; + + sUrl = getParcelLocation(); + sUrl = PathUtils.make_url( sUrl, getLanguageName() ); + LogUtils.DEBUG("Creating script url for " + sUrl ); + scriptURL = createURL( sUrl ); + return scriptURL; + } +} |