Dan, good catch. There was a post about 2 weeks back that said soft
upgrade doesn't work for read-only databases (including database in a
JAR) It raises the error "ERROR 40XD1: Container was opened in read-only
mode." I reproduced the problem and analysed it a little. It seems
problem shows up in DD_Version.upgradeIfNeeded(). We seem to set a
property value and since the container is read-only, it throws the
error. If I avoid DD_Version.applySafeChanges(), since no changes can be
applied in read-only mode, I was able to boot the database.

The question is do you see any problems in supporting soft-upgrade for
read-only databases?

Satheesh

[EMAIL PROTECTED] wrote:

>Author: djd
>Date: Thu Aug 25 11:02:57 2005
>New Revision: 240111
>
>URL: http://svn.apache.org/viewcvs?rev=240111&view=rev
>Log:
>DERBY-540 Do not prepend database name for classpath databases with leading 
>slash.This causes
>databases to be not found when in jar files on the database. Correct the 
>lookup of resources
>in the class path storage factory to not use the methods that prepend the 
>current class name,
>instead use methods from ClassLoader directly. The leading slash was 
>incorrectly added to avoid
>the automatic package prepending performed by Class.getResource.
>Removed code that tried to optimise not using the thread context class loader, 
>simply have a
>fixed lookup for resources of thread context class loader followed by class 
>loader for Derby/system classloader.
>Add lang/dbjar.sql to test databases within a jar and within a jar on the 
>classpath and class loading from such databases.
>
>Added:
>    
> db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/dbjar.out
>    (with props)
>    
> db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/dbjar.jar
>    (with props)
>    
> db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/dbjar.sql
>    (with props)
>    
> db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/dbjarUtil.java
>    (with props)
>    
> db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/dbjar_app.properties
>    (with props)
>Modified:
>    db/derby/code/trunk/java/engine/org/apache/derby/impl/io/CPFile.java
>    
> db/derby/code/trunk/java/engine/org/apache/derby/impl/io/CPStorageFactory.java
>    
> db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbylang.runall
>    
> db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/copyfiles.ant
>
>Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/io/CPFile.java
>URL: 
>http://svn.apache.org/viewcvs/db/derby/code/trunk/java/engine/org/apache/derby/impl/io/CPFile.java?rev=240111&r1=240110&r2=240111&view=diff
>==============================================================================
>--- db/derby/code/trunk/java/engine/org/apache/derby/impl/io/CPFile.java 
>(original)
>+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/io/CPFile.java Thu 
>Aug 25 11:02:57 2005
>@@ -21,13 +21,9 @@
> package org.apache.derby.impl.io;
> 
> import org.apache.derby.io.StorageFile;
>-import org.apache.derby.io.StorageRandomAccessFile;
>-
>-import org.apache.derby.iapi.services.sanity.SanityManager;
> 
> import java.io.InputStream;
>-import java.io.OutputStream;
>-import java.io.IOException;
>+
> import java.io.FileNotFoundException;
> 
> /**
>@@ -38,9 +34,7 @@
> {
> 
>     private final CPStorageFactory storageFactory;
>-    private int actionCode;
>-    private static final int EXISTS_ACTION = 1;
>-
>+ 
>     CPFile( CPStorageFactory storageFactory, String path)
>     {
>         super( storageFactory, path);
>@@ -72,19 +66,24 @@
>      */
>     public boolean exists()
>     {
>-        if( storageFactory.useContextLoader)
>-        {
>-            ClassLoader cl = Thread.currentThread().getContextClassLoader();
>-            if( cl != null && cl.getResource( path) != null)
>-                return true;
>-        }
>-        if( getClass().getResource( path) != null)
>-        {
>-            if( storageFactory.useContextLoader)
>-                storageFactory.useContextLoader = false;
>-            return true;
>-        }
>-        return false;
>+      ClassLoader cl = Thread.currentThread().getContextClassLoader();
>+      if (cl != null)
>+              if (cl.getResource(path) != null)
>+                      return true;
>+      // don't assume the context class loader is tied
>+      // into the class loader that loaded this class.
>+      cl = getClass().getClassLoader();
>+              // Javadoc indicates implementations can use
>+              // null as a return from Class.getClassLoader()
>+              // to indicate the system/bootstrap classloader.
>+      if (cl != null)
>+      {
>+              return (cl.getResource(path) != null);
>+      }
>+      else
>+      {
>+              return ClassLoader.getSystemResource(path) != null;
>+      }
>     } // end of exists
> 
>     /**
>@@ -106,19 +105,29 @@
>      */
>     public InputStream getInputStream( ) throws FileNotFoundException
>     {
>-        InputStream is = null;
>-        if( storageFactory.useContextLoader)
>-        {
>-            ClassLoader cl = Thread.currentThread().getContextClassLoader();
>-            is = cl.getResourceAsStream( path);
>-            if( is != null)
>-                return is;
>-        }
>-        is = getClass().getResourceAsStream( path);
>-        if( is != null && storageFactory.useContextLoader)
>-            storageFactory.useContextLoader = false;
>-        if( is == null)
>-            throw new FileNotFoundException( "Not in class path: " + path);
>-        return is;
>+      //System.out.println("HERE FOR " + toString());
>+      InputStream is = null;
>+      ClassLoader cl = Thread.currentThread().getContextClassLoader();
>+      if (cl != null)
>+              is = cl.getResourceAsStream(path);
>+      
>+              // don't assume the context class loader is tied
>+      // into the class loader that loaded this class.
>+      if (is == null)
>+      {
>+              cl = getClass().getClassLoader();
>+              // Javadoc indicates implementations can use
>+              // null as a return from Class.getClassLoader()
>+              // to indicate the system/bootstrap classloader.
>+              if (cl != null)
>+                      is = cl.getResourceAsStream(path);
>+              else
>+                      is = ClassLoader.getSystemResourceAsStream(path);
>+      }
>+      
>+      if (is == null)
>+              throw new FileNotFoundException(toString());
>+      return is;
>+      
>     } // end of getInputStream
> }
>
>Modified: 
>db/derby/code/trunk/java/engine/org/apache/derby/impl/io/CPStorageFactory.java
>URL: 
>http://svn.apache.org/viewcvs/db/derby/code/trunk/java/engine/org/apache/derby/impl/io/CPStorageFactory.java?rev=240111&r1=240110&r2=240111&view=diff
>==============================================================================
>--- 
>db/derby/code/trunk/java/engine/org/apache/derby/impl/io/CPStorageFactory.java 
>(original)
>+++ 
>db/derby/code/trunk/java/engine/org/apache/derby/impl/io/CPStorageFactory.java 
>Thu Aug 25 11:02:57 2005
>@@ -38,45 +38,7 @@
>  */
> 
> public class CPStorageFactory extends BaseStorageFactory
>-{
>-    boolean useContextLoader = true;
>-    
>-    /**
>-     * Classes implementing the StorageFactory interface must have a null
>-     * constructor.  This method is called when the database is booted up to
>-     * initialize the class. It should perform all actions necessary to start 
>the
>-     * basic storage, such as creating a temporary file directory.
>-     *
>-     * The init method will be called once, before any other method is 
>called, and will not
>-     * be called again.
>-     *
>-     * @param home The name of the directory containing the database. It 
>comes from the system.home system property.
>-     *             It may be null. A storage factory may decide to ignore 
>this parameter. (For instance the classpath
>-     *             storage factory ignores it.
>-     * @param databaseName The name of the database (directory). All relative 
>pathnames are relative to this directory.
>-     *                     If null then the storage factory will only be used 
>to deal with the directory containing
>-     *                     the databases.
>-     * @param create If true then the database is being created.
>-     * @param tempDirName The name of the temporary file directory set in 
>properties. If null then a default
>-     *                    directory should be used. Each database should get 
>a separate temporary file
>-     *                    directory within this one to avoid collisions.
>-     * @param uniqueName A unique name that can be used to create the 
>temporary file directory for this database.
>-     *
>-     * @exception IOException on an error (unexpected).
>-     */
>-    public void init( String home, String databaseName, String tempDirName, 
>String uniqueName)
>-        throws IOException
>-    {
>-        // Prefix the database name with a '/' so that the class loader will 
>not use a Cloudscape
>-        // internal package.
>-        if( databaseName == null
>-            || ( databaseName.length() > 0
>-                 && (databaseName.charAt( 0) == '/' || databaseName.charAt( 
>0) == getSeparator())))
>-            super.init( home, databaseName, tempDirName, uniqueName);
>-        else
>-            super.init( home, "/" + databaseName, tempDirName, uniqueName);
>-    }
>-    
>+{   
>     /**
>      * Construct a persistent StorageFile from a path name.
>      *
>
>Added: 
>db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/dbjar.out
>URL: 
>http://svn.apache.org/viewcvs/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/dbjar.out?rev=240111&view=auto
>==============================================================================
>--- 
>db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/dbjar.out
> (added)
>+++ 
>db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/dbjar.out
> Thu Aug 25 11:02:57 2005
>@@ -0,0 +1,129 @@
>+ij> --
>+-- This tests database in a jar
>+-- and a jar in a database in a jar!
>+--
>+;
>+ij> connect 'jdbc:derby:db1;create=true' AS DB1;
>+ij(DB1)> create table t ( i int not null primary key, c char(20));
>+0 rows inserted/updated/deleted
>+ij(DB1)> insert into t values (1, 'hello');
>+1 row inserted/updated/deleted
>+ij(DB1)> insert into t values (2, 'goodbye');
>+1 row inserted/updated/deleted
>+ij(DB1)> create function APP.D2ME(VAL INT) RETURNS INT
>+LANGUAGE JAVA PARAMETER STYLE JAVA
>+NO SQL
>+EXTERNAL NAME 'InAJar.doubleMe';
>+0 rows inserted/updated/deleted
>+ij(DB1)> -- should not be found;
>+values APP.D2ME(2);
>+ERROR 42X51: The class 'InAJar' does not exist or is inaccessible. This can 
>happen if the class is not public.
>+ERROR XJ001: Java exception: 'InAJar: java.lang.ClassNotFoundException'.
>+ij(DB1)> CALL sqlj.install_jar('file:extin/dbjar.jar', 'APP.DMJ', 0);
>+0 rows inserted/updated/deleted
>+ij(DB1)> call 
>SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.database.classpath', 'APP.DMJ');
>+0 rows inserted/updated/deleted
>+ij(DB1)> -- check the class loading is working;
>+values APP.D2ME(2);
>+1          
>+-----------
>+4          
>+ij(DB1)> -- shutdown to allow jarring of database
>+disconnect;
>+ij> connect 'jdbc:derby:db1;shutdown=true';
>+ERROR 08006: Database 'db1' shutdown.
>+ij> -- jar up the database
>+set connection CONNECTION0;
>+ij> create procedure CREATEARCHIVE(jarName VARCHAR(20), path VARCHAR(20), 
>dbName VARCHAR(20))
>+LANGUAGE JAVA PARAMETER STYLE JAVA
>+NO SQL
>+EXTERNAL NAME 
>'org.apache.derbyTesting.functionTests.tests.lang.dbjarUtil.createArchive';
>+0 rows inserted/updated/deleted
>+ij> call CREATEARCHIVE('ina.jar', 'db1', 'db7');
>+0 rows inserted/updated/deleted
>+ij> -- reconnect back to db1 to modify table to ensure we are not seeing db1 
>unjarred
>+connect 'jdbc:derby:db1' AS DB1;
>+ij(DB1)> insert into t values (4, 'directory version');
>+1 row inserted/updated/deleted
>+ij(DB1)> disconnect;
>+ij> connect 'jdbc:derby:jar:(ina.jar)db7' AS DB7;
>+ij(DB7)> select * from t;
>+I          |C                   
>+--------------------------------
>+1          |hello               
>+2          |goodbye             
>+ij(DB7)> insert into t values(3, 'is read only');
>+ERROR 25502: An SQL data change is not permitted for a read-only connection, 
>user or database.
>+ij(DB7)> values APP.D2ME(2);
>+1          
>+-----------
>+4          
>+ij(DB7)> autocommit off;
>+ij(DB7)> select * from t WITH RR;
>+I          |C                   
>+--------------------------------
>+1          |hello               
>+2          |goodbye             
>+ij(DB7)> select TYPE, MODE, TABLENAME from new 
>org.apache.derby.diag.LockTable() AS L ORDER BY 1,2,3;
>+TYPE |MODE|TABLENAME                                                          
>                                                             
>+-------------------------------------------------------------------------------------------------------------------------------------------
>+TABLE|S   |T                                                                  
>                                                             
>+ij(DB7)> disconnect;
>+ij> -- connect to database in jar file via classpath
>+-- should fail as it is not on the classpath yet.
>+connect 'jdbc:derby:classpath:db7' AS DB7CLF;
>+ERROR XJ004: Database 'classpath:db7' not found.
>+ij> -- create a class loader for this current thread
>+set connection CONNECTION0;
>+ij> create procedure setDBContextClassLoader(JARNAME VARCHAR(20))
>+LANGUAGE JAVA PARAMETER STYLE JAVA
>+NO SQL
>+EXTERNAL NAME 
>'org.apache.derbyTesting.functionTests.tests.lang.dbjarUtil.setDBContextClassLoader';
>+0 rows inserted/updated/deleted
>+ij> call setDBContextClassLoader('ina.jar');
>+0 rows inserted/updated/deleted
>+ij> connect 'jdbc:derby:classpath:db7' AS DB7CL;
>+ij(DB7CL)> select * from t;
>+I          |C                   
>+--------------------------------
>+1          |hello               
>+2          |goodbye             
>+ij(DB7CL)> insert into t values(3, 'is read only');
>+ERROR 25502: An SQL data change is not permitted for a read-only connection, 
>user or database.
>+ij(DB7CL)> values APP.D2ME(2);
>+1          
>+-----------
>+4          
>+ij(DB7CL)> autocommit off;
>+ij(DB7CL)> select * from t WITH RR;
>+I          |C                   
>+--------------------------------
>+1          |hello               
>+2          |goodbye             
>+ij(DB7CL)> select TYPE, MODE, TABLENAME from new 
>org.apache.derby.diag.LockTable() AS L ORDER BY 1,2,3;
>+TYPE |MODE|TABLENAME                                                          
>                                                             
>+-------------------------------------------------------------------------------------------------------------------------------------------
>+TABLE|S   |T                                                                  
>                                                             
>+ij(DB7CL)> disconnect;
>+ij> -- Beetle 5171.  Don't crash if the contextClassLoader is null
>+set connection CONNECTION0;
>+ij> create procedure setNullContextClassLoader()
>+LANGUAGE JAVA PARAMETER STYLE JAVA
>+NO SQL
>+EXTERNAL NAME 
>'org.apache.derbyTesting.functionTests.tests.lang.dbjarUtil.setNullContextClassLoader';
>+0 rows inserted/updated/deleted
>+ij> call setNullContextClassLoader();
>+0 rows inserted/updated/deleted
>+ij> create table t2 (i int);
>+0 rows inserted/updated/deleted
>+ij> insert into t2 values(1);
>+1 row inserted/updated/deleted
>+ij> insert into t2 values(2);
>+1 row inserted/updated/deleted
>+ij> select count(*) from t2;
>+1          
>+-----------
>+2          
>+ij> drop table t2;
>+0 rows inserted/updated/deleted
>+ij> 
>
>Propchange: 
>db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/dbjar.out
>------------------------------------------------------------------------------
>    svn:eol-style = native
>
>Modified: 
>db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbylang.runall
>URL: 
>http://svn.apache.org/viewcvs/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbylang.runall?rev=240111&r1=240110&r2=240111&view=diff
>==============================================================================
>--- 
>db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbylang.runall
> (original)
>+++ 
>db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbylang.runall
> Thu Aug 25 11:02:57 2005
>@@ -39,6 +39,7 @@
> lang/datetime.sql
> lang/db2Compatibility.sql
> lang/dbManagerLimits.java
>+lang/dbjar.sql
> lang/dcl.sql
> lang/ddlTableLockMode.sql
> lang/deadlockMode.java
>
>Modified: 
>db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/copyfiles.ant
>URL: 
>http://svn.apache.org/viewcvs/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/copyfiles.ant?rev=240111&r1=240110&r2=240111&view=diff
>==============================================================================
>--- 
>db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/copyfiles.ant
> (original)
>+++ 
>db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/copyfiles.ant
> Thu Aug 25 11:02:57 2005
>@@ -49,6 +49,9 @@
> datetime.sql
> db2Compatibility.sql
> dbManagerLimits_app.properties
>+dbjar.jar
>+dbjar.sql
>+dbjar_app.properties
> dcl.sql
> dcl_app.properties
> dcl_emc1.jar
>
>Added: 
>db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/dbjar.jar
>URL: 
>http://svn.apache.org/viewcvs/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/dbjar.jar?rev=240111&view=auto
>==============================================================================
>Binary file - no diff available.
>
>Propchange: 
>db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/dbjar.jar
>------------------------------------------------------------------------------
>    svn:mime-type = application/octet-stream
>
>Added: 
>db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/dbjar.sql
>URL: 
>http://svn.apache.org/viewcvs/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/dbjar.sql?rev=240111&view=auto
>==============================================================================
>--- 
>db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/dbjar.sql
> (added)
>+++ 
>db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/dbjar.sql
> Thu Aug 25 11:02:57 2005
>@@ -0,0 +1,90 @@
>+--
>+-- This tests database in a jar
>+-- and a jar in a database in a jar!
>+--
>+;
>+
>+connect 'jdbc:derby:db1;create=true' AS DB1;
>+create table t ( i int not null primary key, c char(20));
>+insert into t values (1, 'hello');
>+insert into t values (2, 'goodbye');
>+
>+create function APP.D2ME(VAL INT) RETURNS INT
>+LANGUAGE JAVA PARAMETER STYLE JAVA
>+NO SQL
>+EXTERNAL NAME 'InAJar.doubleMe';
>+
>+-- should not be found;
>+values APP.D2ME(2);
>+
>+CALL sqlj.install_jar('file:extin/dbjar.jar', 'APP.DMJ', 0);
>+call SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.database.classpath', 
>'APP.DMJ');
>+
>+-- check the class loading is working;
>+values APP.D2ME(2);
>+
>+-- shutdown to allow jarring of database
>+disconnect;
>+connect 'jdbc:derby:db1;shutdown=true';
>+
>+
>+-- jar up the database
>+set connection CONNECTION0;
>+create procedure CREATEARCHIVE(jarName VARCHAR(20), path VARCHAR(20), dbName 
>VARCHAR(20))
>+LANGUAGE JAVA PARAMETER STYLE JAVA
>+NO SQL
>+EXTERNAL NAME 
>'org.apache.derbyTesting.functionTests.tests.lang.dbjarUtil.createArchive';
>+
>+call CREATEARCHIVE('ina.jar', 'db1', 'db7');
>+
>+-- reconnect back to db1 to modify table to ensure we are not seeing db1 
>unjarred
>+connect 'jdbc:derby:db1' AS DB1;
>+insert into t values (4, 'directory version');
>+disconnect;
>+
>+connect 'jdbc:derby:jar:(ina.jar)db7' AS DB7;
>+select * from t;
>+insert into t values(3, 'is read only');
>+values APP.D2ME(2);
>+
>+autocommit off;
>+select * from t WITH RR;
>+select TYPE, MODE, TABLENAME from new org.apache.derby.diag.LockTable() AS L 
>ORDER BY 1,2,3;
>+disconnect;
>+
>+-- connect to database in jar file via classpath
>+-- should fail as it is not on the classpath yet.
>+connect 'jdbc:derby:classpath:db7' AS DB7CLF;
>+
>+-- create a class loader for this current thread
>+set connection CONNECTION0;
>+create procedure setDBContextClassLoader(JARNAME VARCHAR(20))
>+LANGUAGE JAVA PARAMETER STYLE JAVA
>+NO SQL
>+EXTERNAL NAME 
>'org.apache.derbyTesting.functionTests.tests.lang.dbjarUtil.setDBContextClassLoader';
>+
>+call setDBContextClassLoader('ina.jar');
>+
>+connect 'jdbc:derby:classpath:db7' AS DB7CL;
>+select * from t;
>+insert into t values(3, 'is read only');
>+values APP.D2ME(2);
>+autocommit off;
>+select * from t WITH RR;
>+select TYPE, MODE, TABLENAME from new org.apache.derby.diag.LockTable() AS L 
>ORDER BY 1,2,3;
>+disconnect;
>+
>+-- Beetle 5171.  Don't crash if the contextClassLoader is null
>+set connection CONNECTION0;
>+create procedure setNullContextClassLoader()
>+LANGUAGE JAVA PARAMETER STYLE JAVA
>+NO SQL
>+EXTERNAL NAME 
>'org.apache.derbyTesting.functionTests.tests.lang.dbjarUtil.setNullContextClassLoader';
>+
>+call setNullContextClassLoader();
>+
>+create table t2 (i int);
>+insert into t2 values(1);
>+insert into t2 values(2);
>+select count(*) from t2;
>+drop table t2;
>
>Propchange: 
>db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/dbjar.sql
>------------------------------------------------------------------------------
>    svn:eol-style = native
>
>Added: 
>db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/dbjarUtil.java
>URL: 
>http://svn.apache.org/viewcvs/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/dbjarUtil.java?rev=240111&view=auto
>==============================================================================
>--- 
>db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/dbjarUtil.java
> (added)
>+++ 
>db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/dbjarUtil.java
> Thu Aug 25 11:02:57 2005
>@@ -0,0 +1,135 @@
>+/*
>+
>+Derby - Class org.apache.derbyTesting.functionTests.tests.lang.cursor
>+
>+Copyright 1999, 2005 The Apache Software Foundation or its licensors, as 
>applicable.
>+
>+Licensed 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 org.apache.derbyTesting.functionTests.tests.lang;
>+
>+import java.io.BufferedInputStream;
>+import java.io.File;
>+import java.io.FileInputStream;
>+import java.io.FileOutputStream;
>+import java.io.IOException;
>+import java.net.MalformedURLException;
>+import java.net.URL;
>+import java.net.URLClassLoader;
>+import java.util.zip.ZipEntry;
>+import java.util.zip.ZipOutputStream;
>+
>+/**
>+      Simple program to archive a database up in a jar file
>+      within the test harness.
>+*/
>+
>+public class dbjarUtil
>+{
>+      /**
>+              jarname - jarname to use
>+              path - path to database
>+              dbname - database name in archive
>+      */
>+      public static void createArchive(String jarName, String path, String 
>dbName) throws Exception {
>+
>+              String root = System.getProperty("derby.system.home", 
>System.getProperty("user.dir"));
>+
>+              // get list of files
>+              File top = new File(root, path);
>+
>+              if (!top.isDirectory())
>+                      throw new Exception(top.toString() + " is not a 
>directory");
>+
>+              // jar file paths in the JDB CURL are relative to the root
>+              // derby.system.home or user.dir, so need to create the jar 
>there.
>+              ZipOutputStream zos = new ZipOutputStream(new 
>FileOutputStream(new File(root, jarName))); 
>+
>+              addEntries(zos, top, dbName, top.getPath().length());
>+              
>+              zos.close(); 
>+      }
>+
>+
>+      static void addEntries(ZipOutputStream zos, File dir, String dbName, 
>int old) throws Exception {
>+
>+              String[] list = dir.list();
>+
>+              for (int i = 0; i < list.length; i++) {
>+
>+                      File f = new File(dir, list[i]);
>+                      if (f.isDirectory()) {
>+                              addEntries(zos, f, dbName, old);
>+                      } else {
>+                              addFile(zos, f, dbName, old);
>+                      }
>+
>+              }
>+      }
>+
>+
>+
>+
>+    static void addFile(
>+        ZipOutputStream zos, 
>+        File f, String dbName, int old) throws IOException
>+    {
>+
>+              String s = f.getPath().replace(File.separatorChar, '/');
>+
>+              s = s.substring(old);
>+
>+              s = dbName.concat(s);
>+
>+              // jar has forward slashes!
>+        ZipEntry ze= new ZipEntry(s); 
>+        ze.setTime(f.lastModified()); 
>+
>+        zos.putNextEntry(ze); 
>+
>+              byte[] byte8= new byte[1024]; 
>+        BufferedInputStream bufferedInputStream10= new 
>BufferedInputStream((new FileInputStream(f))); 
>+        while (true)
>+        {
>+            int int9= bufferedInputStream10.read(byte8, 0, byte8.length); 
>+            if (int9 == -1)
>+            {
>+                break;
>+            }
>+            zos.write(byte8, 0, int9); 
>+        }
>+
>+        bufferedInputStream10.close(); 
>+        zos.closeEntry(); 
>+    }
>+  
>+    public static void setDBContextClassLoader(String jarName) throws 
>MalformedURLException
>+    {
>+              String root = System.getProperty("derby.system.home", 
>System.getProperty("user.dir"));
>+
>+              File jar = new File(root, jarName);
>+              
>+              URLClassLoader cl = new URLClassLoader(new URL[] {jar.toURL()});
>+      java.lang.Thread.currentThread().setContextClassLoader(cl);
>+   
>+    }
>+
>+    public static void setNullContextClassLoader()
>+    {
>+      java.lang.Thread.currentThread().setContextClassLoader(null);
>+    }
>+
>+}
>+
>
>Propchange: 
>db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/dbjarUtil.java
>------------------------------------------------------------------------------
>    svn:eol-style = native
>
>Added: 
>db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/dbjar_app.properties
>URL: 
>http://svn.apache.org/viewcvs/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/dbjar_app.properties?rev=240111&view=auto
>==============================================================================
>--- 
>db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/dbjar_app.properties
> (added)
>+++ 
>db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/dbjar_app.properties
> Thu Aug 25 11:02:57 2005
>@@ -0,0 +1,3 @@
>+supportfiles=tests/lang/dbjar.jar
>+usedefaults=true
>+useextdirs=true
>
>Propchange: 
>db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/dbjar_app.properties
>------------------------------------------------------------------------------
>    svn:eol-style = native
>
>
>
>
>  
>

Reply via email to