1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir package com.sun.star.script.framework.container; 28*cdf0e10cSrcweir import com.sun.star.script.framework.log.*; 29*cdf0e10cSrcweir import com.sun.star.script.framework.io.*; 30*cdf0e10cSrcweir import com.sun.star.script.framework.provider.PathUtils; 31*cdf0e10cSrcweir 32*cdf0e10cSrcweir import com.sun.star.container.*; 33*cdf0e10cSrcweir import com.sun.star.uno.Type; 34*cdf0e10cSrcweir import com.sun.star.uno.UnoRuntime; 35*cdf0e10cSrcweir 36*cdf0e10cSrcweir import com.sun.star.ucb.XSimpleFileAccess; 37*cdf0e10cSrcweir import com.sun.star.ucb.XSimpleFileAccess2; 38*cdf0e10cSrcweir import java.io.*; 39*cdf0e10cSrcweir 40*cdf0e10cSrcweir public class Parcel implements XNameContainer 41*cdf0e10cSrcweir { 42*cdf0e10cSrcweir protected ParcelDescriptor m_descriptor; 43*cdf0e10cSrcweir protected String name; 44*cdf0e10cSrcweir protected ParcelContainer parent; 45*cdf0e10cSrcweir protected XSimpleFileAccess m_xSFA; 46*cdf0e10cSrcweir public Parcel( XSimpleFileAccess xSFA, ParcelContainer parent, ParcelDescriptor desc, String parcelName ) 47*cdf0e10cSrcweir { 48*cdf0e10cSrcweir this( parent, desc, parcelName ); 49*cdf0e10cSrcweir this.m_xSFA = xSFA; 50*cdf0e10cSrcweir } 51*cdf0e10cSrcweir 52*cdf0e10cSrcweir public Parcel( ParcelContainer parent, ParcelDescriptor desc, String parcelName ) 53*cdf0e10cSrcweir { 54*cdf0e10cSrcweir this.parent = parent; 55*cdf0e10cSrcweir this.m_descriptor = desc; 56*cdf0e10cSrcweir this.name = parcelName; 57*cdf0e10cSrcweir } 58*cdf0e10cSrcweir 59*cdf0e10cSrcweir /** 60*cdf0e10cSrcweir * Tests if this <tt>Parcel</tt> is in an UNO package 61*cdf0e10cSrcweir * or within a sub package within an UNO package 62*cdf0e10cSrcweir * 63*cdf0e10cSrcweir * @return <tt>true</tt> if has parent <tt>false</tt> otherwise 64*cdf0e10cSrcweir */ 65*cdf0e10cSrcweir public boolean isUnoPkg() { return parent.isUnoPkg(); } 66*cdf0e10cSrcweir 67*cdf0e10cSrcweir public String getName() 68*cdf0e10cSrcweir { 69*cdf0e10cSrcweir return name; 70*cdf0e10cSrcweir } 71*cdf0e10cSrcweir public java.lang.Object getByName( String aName ) throws com.sun.star.container.NoSuchElementException, com.sun.star.lang.WrappedTargetException 72*cdf0e10cSrcweir { 73*cdf0e10cSrcweir LogUtils.DEBUG("** Parcel.getByName for " + aName ); 74*cdf0e10cSrcweir ScriptEntry script = null; 75*cdf0e10cSrcweir try 76*cdf0e10cSrcweir { 77*cdf0e10cSrcweir if ( m_descriptor != null && hasElements() ) 78*cdf0e10cSrcweir { 79*cdf0e10cSrcweir ScriptEntry[] scripts = m_descriptor.getScriptEntries(); 80*cdf0e10cSrcweir if ( scripts.length != 0 ) 81*cdf0e10cSrcweir { 82*cdf0e10cSrcweir for ( int index = 0; index < scripts.length; index++ ) 83*cdf0e10cSrcweir { 84*cdf0e10cSrcweir if ( scripts[ index ].getLanguageName().equals( aName ) ) 85*cdf0e10cSrcweir { 86*cdf0e10cSrcweir script = scripts[ index ]; 87*cdf0e10cSrcweir break; 88*cdf0e10cSrcweir } 89*cdf0e10cSrcweir } 90*cdf0e10cSrcweir } 91*cdf0e10cSrcweir } 92*cdf0e10cSrcweir } 93*cdf0e10cSrcweir // catch unknown or un-checked exceptions 94*cdf0e10cSrcweir catch ( Exception e ) 95*cdf0e10cSrcweir { 96*cdf0e10cSrcweir throw new com.sun.star.lang.WrappedTargetException( e.toString() ); 97*cdf0e10cSrcweir } 98*cdf0e10cSrcweir if ( script == null ) 99*cdf0e10cSrcweir { 100*cdf0e10cSrcweir LogUtils.DEBUG("No script for " + aName ); 101*cdf0e10cSrcweir throw new com.sun.star.container.NoSuchElementException("No script named " + aName ); 102*cdf0e10cSrcweir } 103*cdf0e10cSrcweir ScriptMetaData data = new ScriptMetaData( this, script, null ); 104*cdf0e10cSrcweir 105*cdf0e10cSrcweir LogUtils.DEBUG("returning date for " + aName ); 106*cdf0e10cSrcweir return data; 107*cdf0e10cSrcweir } 108*cdf0e10cSrcweir public String[] getElementNames() 109*cdf0e10cSrcweir { 110*cdf0e10cSrcweir String[] results = new String[0]; 111*cdf0e10cSrcweir if ( m_descriptor != null ) 112*cdf0e10cSrcweir { 113*cdf0e10cSrcweir ScriptEntry[] scripts = m_descriptor.getScriptEntries(); 114*cdf0e10cSrcweir results = new String[ scripts.length ]; 115*cdf0e10cSrcweir for ( int index = 0; index < scripts.length; index++ ) 116*cdf0e10cSrcweir { 117*cdf0e10cSrcweir results[ index ] = scripts[ index ].getLanguageName(); 118*cdf0e10cSrcweir } 119*cdf0e10cSrcweir } 120*cdf0e10cSrcweir return results; 121*cdf0e10cSrcweir } 122*cdf0e10cSrcweir public boolean hasByName( String aName ) 123*cdf0e10cSrcweir { 124*cdf0e10cSrcweir 125*cdf0e10cSrcweir boolean result = true; 126*cdf0e10cSrcweir Object containee = null; 127*cdf0e10cSrcweir try 128*cdf0e10cSrcweir { 129*cdf0e10cSrcweir containee = getByName( aName ); 130*cdf0e10cSrcweir if ( containee != null ) 131*cdf0e10cSrcweir { 132*cdf0e10cSrcweir result = true; 133*cdf0e10cSrcweir } 134*cdf0e10cSrcweir } 135*cdf0e10cSrcweir catch( Exception e ) 136*cdf0e10cSrcweir { 137*cdf0e10cSrcweir result = false; 138*cdf0e10cSrcweir } 139*cdf0e10cSrcweir return result; 140*cdf0e10cSrcweir } 141*cdf0e10cSrcweir 142*cdf0e10cSrcweir public com.sun.star.uno.Type getElementType() { 143*cdf0e10cSrcweir // TODO at the moment this returns void indicating 144*cdf0e10cSrcweir // type is unknown ( from UNO point of view this is correct ) 145*cdf0e10cSrcweir // but, maybe we want to have a private UNO interface 146*cdf0e10cSrcweir // 147*cdf0e10cSrcweir return new Type(); 148*cdf0e10cSrcweir } 149*cdf0e10cSrcweir 150*cdf0e10cSrcweir public boolean hasElements() 151*cdf0e10cSrcweir { 152*cdf0e10cSrcweir if ( m_descriptor != null && m_descriptor.getScriptEntries().length > 0 ) 153*cdf0e10cSrcweir { 154*cdf0e10cSrcweir return true; 155*cdf0e10cSrcweir } 156*cdf0e10cSrcweir return false; 157*cdf0e10cSrcweir } 158*cdf0e10cSrcweir 159*cdf0e10cSrcweir 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 160*cdf0e10cSrcweir { 161*cdf0e10cSrcweir // TODO check type of aElement 162*cdf0e10cSrcweir // if not ok, throw IllegalArgument 163*cdf0e10cSrcweir if ( m_descriptor != null ) 164*cdf0e10cSrcweir { 165*cdf0e10cSrcweir try 166*cdf0e10cSrcweir { 167*cdf0e10cSrcweir ScriptEntry script = (ScriptEntry)getByName( aName ); 168*cdf0e10cSrcweir if ( script != null ) 169*cdf0e10cSrcweir { 170*cdf0e10cSrcweir //m_descriptor.removeScriptEntry( script ); 171*cdf0e10cSrcweir // TODO needs to create source file ( if there is one ) 172*cdf0e10cSrcweir //m_descriptor.write(); 173*cdf0e10cSrcweir } 174*cdf0e10cSrcweir else 175*cdf0e10cSrcweir { 176*cdf0e10cSrcweir throw new com.sun.star.container.NoSuchElementException("No script named " + aName ); 177*cdf0e10cSrcweir } 178*cdf0e10cSrcweir 179*cdf0e10cSrcweir 180*cdf0e10cSrcweir } 181*cdf0e10cSrcweir // TO DO should catch specified exceptions 182*cdf0e10cSrcweir catch ( Exception e ) 183*cdf0e10cSrcweir { 184*cdf0e10cSrcweir throw new com.sun.star.lang.WrappedTargetException(); 185*cdf0e10cSrcweir } 186*cdf0e10cSrcweir 187*cdf0e10cSrcweir } 188*cdf0e10cSrcweir } 189*cdf0e10cSrcweir 190*cdf0e10cSrcweir // create 191*cdf0e10cSrcweir public void insertByName( String aName, java.lang.Object aElement ) throws com.sun.star.lang.IllegalArgumentException, ElementExistException, com.sun.star.lang.WrappedTargetException 192*cdf0e10cSrcweir { 193*cdf0e10cSrcweir // TODO check the type of aElement and throw# 194*cdf0e10cSrcweir // if not appropriate 195*cdf0e10cSrcweir try 196*cdf0e10cSrcweir { 197*cdf0e10cSrcweir if ( hasByName( aName ) ) 198*cdf0e10cSrcweir { 199*cdf0e10cSrcweir throw new ElementExistException( aName ); 200*cdf0e10cSrcweir } 201*cdf0e10cSrcweir ScriptMetaData script = (ScriptMetaData)aElement; 202*cdf0e10cSrcweir 203*cdf0e10cSrcweir if ( script.hasSource() ) 204*cdf0e10cSrcweir { 205*cdf0e10cSrcweir LogUtils.DEBUG("Inserting source: " + script.getSource()); 206*cdf0e10cSrcweir if ( !script.writeSourceFile() ) 207*cdf0e10cSrcweir { 208*cdf0e10cSrcweir throw new com.sun.star.lang.WrappedTargetException( "Failed to create source file " + script.getLanguageName() ); 209*cdf0e10cSrcweir } 210*cdf0e10cSrcweir } 211*cdf0e10cSrcweir m_descriptor.addScriptEntry( script ); 212*cdf0e10cSrcweir writeParcelDescriptor(); 213*cdf0e10cSrcweir } 214*cdf0e10cSrcweir catch ( Exception e ) 215*cdf0e10cSrcweir { 216*cdf0e10cSrcweir LogUtils.DEBUG("Failed to insert entry " + aName + ": " + e.getMessage()); 217*cdf0e10cSrcweir throw new com.sun.star.lang.WrappedTargetException( e.toString() ); 218*cdf0e10cSrcweir } 219*cdf0e10cSrcweir } 220*cdf0e10cSrcweir 221*cdf0e10cSrcweir 222*cdf0e10cSrcweir private void writeParcelDescriptor() 223*cdf0e10cSrcweir throws com.sun.star.ucb.CommandAbortedException, 224*cdf0e10cSrcweir com.sun.star.io.IOException, 225*cdf0e10cSrcweir com.sun.star.uno.Exception, java.io.IOException 226*cdf0e10cSrcweir { 227*cdf0e10cSrcweir String pathToDescriptor = PathUtils.make_url( 228*cdf0e10cSrcweir getPathToParcel(), ParcelDescriptor.PARCEL_DESCRIPTOR_NAME ); 229*cdf0e10cSrcweir 230*cdf0e10cSrcweir XSimpleFileAccess2 xSFA2 = ( XSimpleFileAccess2 ) 231*cdf0e10cSrcweir UnoRuntime.queryInterface( XSimpleFileAccess2.class, m_xSFA ); 232*cdf0e10cSrcweir 233*cdf0e10cSrcweir if ( xSFA2 != null ) 234*cdf0e10cSrcweir { 235*cdf0e10cSrcweir ByteArrayOutputStream bos = null; 236*cdf0e10cSrcweir ByteArrayInputStream bis = null; 237*cdf0e10cSrcweir XInputStreamImpl xis = null; 238*cdf0e10cSrcweir try 239*cdf0e10cSrcweir { 240*cdf0e10cSrcweir bos = new ByteArrayOutputStream( 1024 ); 241*cdf0e10cSrcweir m_descriptor.write( bos ); 242*cdf0e10cSrcweir bis = new ByteArrayInputStream( bos.toByteArray() ); 243*cdf0e10cSrcweir 244*cdf0e10cSrcweir xis = new XInputStreamImpl( bis ); 245*cdf0e10cSrcweir xSFA2.writeFile( pathToDescriptor, xis ); 246*cdf0e10cSrcweir } 247*cdf0e10cSrcweir finally 248*cdf0e10cSrcweir { 249*cdf0e10cSrcweir if (bos != null) bos.close(); 250*cdf0e10cSrcweir if (bis != null) bis.close(); 251*cdf0e10cSrcweir if (xis != null) xis.closeInput(); 252*cdf0e10cSrcweir } 253*cdf0e10cSrcweir } 254*cdf0e10cSrcweir } 255*cdf0e10cSrcweir 256*cdf0e10cSrcweir // delete 257*cdf0e10cSrcweir public void removeByName( String Name ) throws com.sun.star.container.NoSuchElementException, com.sun.star.lang.WrappedTargetException 258*cdf0e10cSrcweir { 259*cdf0e10cSrcweir try 260*cdf0e10cSrcweir { 261*cdf0e10cSrcweir ScriptMetaData script = null; 262*cdf0e10cSrcweir if ( ( script = (ScriptMetaData)getByName( Name ) ) != null ) 263*cdf0e10cSrcweir { 264*cdf0e10cSrcweir // if ( script.hasSource() ) 265*cdf0e10cSrcweir { 266*cdf0e10cSrcweir if ( !script.removeSourceFile() ) 267*cdf0e10cSrcweir { 268*cdf0e10cSrcweir LogUtils.DEBUG("** Parcel.removeByName Failed to remove script " + Name ); 269*cdf0e10cSrcweir throw new com.sun.star.lang.WrappedTargetException("Failed to remove script " + Name ); 270*cdf0e10cSrcweir } 271*cdf0e10cSrcweir LogUtils.DEBUG("** Parcel.removeByName have removed script source file " + Name ); 272*cdf0e10cSrcweir } 273*cdf0e10cSrcweir m_descriptor.removeScriptEntry( script ); 274*cdf0e10cSrcweir writeParcelDescriptor(); 275*cdf0e10cSrcweir 276*cdf0e10cSrcweir } 277*cdf0e10cSrcweir else 278*cdf0e10cSrcweir { 279*cdf0e10cSrcweir throw new com.sun.star.container.NoSuchElementException( "No script named " + Name ); 280*cdf0e10cSrcweir } 281*cdf0e10cSrcweir 282*cdf0e10cSrcweir } 283*cdf0e10cSrcweir catch ( Exception e ) 284*cdf0e10cSrcweir { 285*cdf0e10cSrcweir LogUtils.DEBUG("** Parcel.removeByName Exception: " + e ); 286*cdf0e10cSrcweir throw new com.sun.star.lang.WrappedTargetException( e.toString() ); 287*cdf0e10cSrcweir } 288*cdf0e10cSrcweir 289*cdf0e10cSrcweir } 290*cdf0e10cSrcweir // rename parcel 291*cdf0e10cSrcweir public void rename( String name ) throws com.sun.star.lang.WrappedTargetException 292*cdf0e10cSrcweir { 293*cdf0e10cSrcweir this.name = name; 294*cdf0e10cSrcweir } 295*cdf0e10cSrcweir public ParcelContainer getParent() { return parent; } 296*cdf0e10cSrcweir /** 297*cdf0e10cSrcweir * Returns the path of this <tt>Parcel</tt> 298*cdf0e10cSrcweir * 299*cdf0e10cSrcweir * @return <tt>String</tt> path to parcel 300*cdf0e10cSrcweir */ 301*cdf0e10cSrcweir public String getPathToParcel() 302*cdf0e10cSrcweir { 303*cdf0e10cSrcweir String path = parent.getParcelContainerDir() + "/" + name; 304*cdf0e10cSrcweir return path; 305*cdf0e10cSrcweir } 306*cdf0e10cSrcweir 307*cdf0e10cSrcweir } 308*cdf0e10cSrcweir 309