Uploaded image for project: 'Derby'
  1. Derby
  2. DERBY-2630

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

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Open
    • Major
    • Resolution: Unresolved
    • 10.2.1.6
    • None
    • JDBC
    • Windows XP Professional, JDK 1.5
    • Low
    • Repro attached
    • 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.

      Attachments

        Activity

          People

            Unassigned Unassigned
            schnandr Andreas Schneider
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated: