Derby
  1. Derby
  2. DERBY-2630

Accessing DB inside jar file fails when the jar was created by JarOutputStream

    Details

    • Type: Bug Bug
    • Status: Open
    • Priority: Major Major
    • Resolution: Unresolved
    • Affects Version/s: 10.2.1.6
    • Fix Version/s: None
    • Component/s: JDBC
    • Environment:
      Windows XP Professional, JDK 1.5
    • Urgency:
      Low
    • Issue & fix info:
      Repro attached
    • Bug behavior facts:
      Seen in production

      Description

      I have tried a pack a db as jar file. When I create it with jar.exe everything is working fine. When i use a JarOutputStream to pack the DB I get the Exception

      java.sql.SQLException: Database 'jar:(D:/p1.jar)p1' not found.
      at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
      at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
      at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
      at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
      at org.apache.derby.impl.jdbc.EmbedConnection.newSQLException(Unknown Source)
      at org.apache.derby.impl.jdbc.EmbedConnection.<init>(Unknown Source)
      at org.apache.derby.impl.jdbc.EmbedConnection30.<init>(Unknown Source)
      at org.apache.derby.jdbc.Driver30.getNewEmbedConnection(Unknown Source)
      at org.apache.derby.jdbc.InternalDriver.connect(Unknown Source)
      at org.apache.derby.jdbc.AutoloadedDriver.connect(Unknown Source)

      Here the code I use to get the connection.

      -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
      Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
      Properties props = new Properties();
      props.put("user", "JUDOCU");
      props.put("password", "");
      Connection con = DriverManager.getConnection("jdbc:derby:jar:(D:/p1.jar)p1", props);
      con.close();
      -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

      Here the code I use to generate the jar file.

      -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

      public class SWUzipUtility {

      /** Trace */
      private static Trace trace = TraceManager.getInstance().getTrace(
      SWUzipUtility.class);

      private ZipOutputStream cpZipOutputStream = null;

      private String[] strSource;

      private String strTarget;

      private long size = 0;

      private int numOfFiles = 0;

      private FileFilter filter;

      public SWUzipUtility(String[] source, String target)

      { this(source, target, null); }

      public SWUzipUtility(String[] source, String target, FileFilter filter)

      { super(); this.strSource = source; this.strTarget = target; this.filter = filter; }

      public void zip()

      { zip(false); }

      protected ZipOutputStream createOutputStream(FileOutputStream fos)

      { return new ZipOutputStream(fos); }

      public void zip(boolean append) {

      try {
      for (int i = 0; i < this.strSource.length; i++) {
      File cpFile = new File(this.strSource[i]);
      if (!cpFile.isFile() && !cpFile.isDirectory())

      { trace.error("Source file/directory Not Found!"); return; }

      }

      FileOutputStream fos = new FileOutputStream(strTarget, append);
      cpZipOutputStream = createOutputStream(fos);
      cpZipOutputStream.setLevel(9);

      for (int i = 0; i < this.strSource.length; i++)

      { File cpFile = new File(this.strSource[i]); zipFiles(this.strSource[i], cpFile); }

      cpZipOutputStream.finish();
      cpZipOutputStream.close();

      trace.info("Finished creating zip file " + strTarget + " from source "
      + strSource);
      trace.info("Total of " + numOfFiles + " files are Zipped");
      trace.info("Total of " + size + " bytes are Zipped");
      } catch (Exception e)

      { e.printStackTrace(); trace.error(e.getMessage(), e); }

      }

      private void zipFiles(String source, File cpFile) {

      int byteCount;
      final int DATA_BLOCK_SIZE = 2048;
      FileInputStream cpFileInputStream;

      if (cpFile.isDirectory()) {
      if (cpFile.getName().equalsIgnoreCase(".metadata"))

      { //if directory name is .metadata, skip it. return; }

      File[] fList = cpFile.listFiles();
      for (int i = 0; i < fList.length; i++)

      { zipFiles(source, fList[i]); }

      }

      else {
      try {
      if (cpFile.getAbsolutePath().equalsIgnoreCase(strTarget))

      { return; }

      if (this.filter != null && this.filter.accept(cpFile) == false)

      { trace.info("Cancel file " + cpFile + " because of filter."); return; }

      trace.info("Zipping " + cpFile);

      size += cpFile.length();
      //String strAbsPath = cpFile.getAbsolutePath();
      setNumOfFiles(numOfFiles + 1);
      String strAbsPath = cpFile.getPath();
      String strZipEntryName = strAbsPath.substring(source
      .lastIndexOf(File.separator) + 1, strAbsPath.length());

      cpFileInputStream = new FileInputStream(cpFile);
      ZipEntry cpZipEntry = new ZipEntry(strZipEntryName);
      cpZipOutputStream.putNextEntry(cpZipEntry);

      byte[] b = new byte[DATA_BLOCK_SIZE];
      while ((byteCount = cpFileInputStream.read(b, 0, DATA_BLOCK_SIZE)) != -1)

      { cpZipOutputStream.write(b, 0, byteCount); }

      cpZipOutputStream.closeEntry();
      } catch (Exception e)

      { e.printStackTrace(); trace.error(e.getMessage(), e); }

      }
      }

      public void addPropertyChangeListener(PropertyChangeListener listener)

      { propChangeSupport.addPropertyChangeListener(listener); }

      public void addPropertyChangeListener(String propertyName,
      PropertyChangeListener listener)

      { propChangeSupport.addPropertyChangeListener(propertyName, listener); }

      public void removePropertyChangeListener(PropertyChangeListener listener)

      { propChangeSupport.removePropertyChangeListener(listener); }

      public void removePropertyChangeListener(String propertyName,
      PropertyChangeListener listener)

      { propChangeSupport.removePropertyChangeListener(propertyName, listener); }

      public int getNumOfFiles()

      { return numOfFiles; }

      protected void setNumOfFiles(int numOfFiles)

      { int oldValue = this.numOfFiles; this.numOfFiles = numOfFiles; this.propChangeSupport.firePropertyChange("numOfFiles", oldValue, this.numOfFiles); }

      public class SWUjarUtility extends SWUzipUtility {

      public SWUjarUtility(String[] source, String target, FileFilter filter)

      { super(source, target, filter); }

      public SWUjarUtility(String[] source, String target)

      { super(source, target); }

      @Override
      protected ZipOutputStream createOutputStream(FileOutputStream fos) {

      try

      { return new JarOutputStream(fos); }

      catch (IOException e) {
      }
      return null;
      }
      }
      -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

      When I open the two generated jar files with Winzip they are lokking identical.

        Activity

        Hide
        Andreas Schneider added a comment -

        I have debugged a little bit and it seems, that I get an

        java.security.PrivilegedActionException: java.io.FileNotFoundException: p1/service.properties

        in StorageFactoryService.getServiceProperties(...)

        Show
        Andreas Schneider added a comment - I have debugged a little bit and it seems, that I get an java.security.PrivilegedActionException: java.io.FileNotFoundException: p1/service.properties in StorageFactoryService.getServiceProperties(...)
        Hide
        Kathey Marsden added a comment -

        Unchecking patch available. There does not appear to be a patch attached to this issue.

        Show
        Kathey Marsden added a comment - Unchecking patch available. There does not appear to be a patch attached to this issue.

          People

          • Assignee:
            Unassigned
            Reporter:
            Andreas Schneider
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:

              Development