modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java | 36 +++++++++- 1 file changed, 34 insertions(+), 2 deletions(-)
New commits: commit dfb918f722cdc3606cba47b07d6f54129c3e4e27 Author: John Sanda jsanda@redhat.com Date: Thu Jul 7 12:39:46 2011 -0400
Fixing IO error when streaming drift files to the database
No longer using ZipUtil.walkZipFile because an IOException was getting thrown after reading the first entry, resulting in subsequent entries being skipped. DriftFileVisitor passed the ZipInputStream to Hibernate.createBlob, and either Hibernate, the JDBC driver, or something else is closing the stream which in turn causes the exception.
Now we unzip the content file into a temp directory and pass a FileInputStream to hibernate for each file in the directory. Once each file has been successfully stored, we delete the directory.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java index ae13557..1bbae02 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java @@ -24,6 +24,7 @@ import static javax.ejb.TransactionAttributeType.REQUIRES_NEW; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.File; +import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; @@ -262,9 +263,40 @@ public class DriftManagerBean implements DriftManagerLocal, DriftManagerRemote {
@Override public void storeFiles(File filesZip) throws Exception { + // No longer using ZipUtil.walkZipFile because an IOException was getting thrown + // after reading the first entry, resulting in subsequent entries being skipped. + // DriftFileVisitor passed the ZipInputStream to Hibernate.createBlob, and either + // Hibernate, the JDBC driver, or something else is closing the stream which in + // turn causes the exception. + // + // jsanda + + String zipFileName = filesZip.getName(); + File tmpDir = new File(System.getProperty("java.io.tmpdir")); + File dir = new File(tmpDir, zipFileName.substring(0, zipFileName.indexOf("."))); + dir.mkdir(); + + ZipUtil.unzipFile(filesZip, dir); + for (File file : dir.listFiles()) { + DriftFile driftFile = new DriftFile(file.getName()); + try { + driftManager.persistDriftFileData(driftFile, new FileInputStream(file)); + } catch (Exception e) { + LogFactory.getLog(getClass()).info("Skipping bad drift file", e); + } + } + + for (File file : dir.listFiles()) { + file.delete(); + } + boolean deleted = dir.delete(); + if (!deleted) { + LogFactory.getLog(getClass()).info("Unable to delete " + dir.getAbsolutePath() + ". This directory and " + + "its contents are no longer needed. It can be deleted."); + }
- DriftFileVisitor dfVisitor = new DriftFileVisitor(driftManager); - ZipUtil.walkZipFile(filesZip, dfVisitor); +// DriftFileVisitor dfVisitor = new DriftFileVisitor(driftManager); +// ZipUtil.walkZipFile(filesZip, dfVisitor);
}