[jboss-cvs] jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/importers ...
Christian Bauer
christian at hibernate.org
Tue Aug 28 20:29:22 EDT 2007
User: cbauer
Date: 07/08/28 20:29:22
Modified: examples/wiki/src/main/org/jboss/seam/wiki/core/importers
ZipImporter.java
Log:
First attempt at bloxsom importer
Revision Changes Path
1.2 +128 -64 jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/importers/ZipImporter.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: ZipImporter.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/importers/ZipImporter.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- ZipImporter.java 27 Aug 2007 22:22:29 -0000 1.1
+++ ZipImporter.java 29 Aug 2007 00:29:22 -0000 1.2
@@ -7,22 +7,28 @@
import org.jboss.seam.wiki.core.importers.annotations.FileImporter;
import org.jboss.seam.wiki.core.model.File;
import org.jboss.seam.wiki.core.model.ImageMetaInfo;
+import org.jboss.seam.wiki.core.model.Node;
import org.jboss.seam.wiki.core.dao.NodeDAO;
import org.jboss.seam.wiki.core.ui.FileMetaMap;
import org.jboss.seam.wiki.util.WikiUtil;
import org.jboss.seam.log.Log;
+import org.jboss.seam.core.Validators;
+import org.hibernate.validator.ClassValidator;
+import org.hibernate.validator.InvalidValue;
import javax.persistence.EntityManager;
import javax.faces.application.FacesMessage;
import javax.swing.*;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
import java.util.Date;
import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
import java.io.*;
import net.sf.jmimemagic.Magic;
-import net.sf.jmimemagic.MagicMatchNotFoundException;
@Name("zipImporter")
@FileImporter(
@@ -36,14 +42,16 @@
Log log;
@In
- NodeDAO nodeDAO;
+ protected NodeDAO nodeDAO;
@In
- Map<String, FileMetaMap.FileMetaInfo> fileMetaMap;
+ protected Map<String, FileMetaMap.FileMetaInfo> fileMetaMap;
public boolean handleImport(EntityManager em, File zipFile) {
if (zipFile.getData().length == 0) return true;
+ SortedMap<Date, Node> newNodes = new TreeMap<Date, Node>();
+
ByteArrayInputStream byteStream = null;
ZipInputStream zipInputStream = null;
try {
@@ -54,61 +62,139 @@
ZipEntry ze;
ByteArrayOutputStream baos;
byte[] buffer = new byte[bufferSize];
- byte[] uncommpressedBytes;
+ byte[] uncompressedBytes;
int bytesRead;
while ((ze = zipInputStream.getNextEntry()) != null) {
log.debug("extracting zip entry: " + ze.getName());
- File wikiFile = new File();
- wikiFile.setFilename(ze.getName());
+ if (ze.getName().contains("/") && !handleDirectory(em, zipFile, ze)) continue;
- wikiFile.setName(wikiFile.getFilenameWithoutExtension());
- wikiFile.setWikiname(WikiUtil.convertToWikiName(wikiFile.getName()));
- wikiFile.setAreaNumber(zipFile.getAreaNumber());
- wikiFile.setCreatedBy(zipFile.getCreatedBy());
- wikiFile.setLastModifiedBy(wikiFile.getCreatedBy());
- wikiFile.setCreatedOn(new Date(ze.getTime()));
- wikiFile.setLastModifiedOn(new Date());
- wikiFile.setReadAccessLevel(zipFile.getReadAccessLevel());
- wikiFile.setWriteAccessLevel(zipFile.getWriteAccessLevel());
+ if (!continueUncompressing(em, zipFile, ze)) continue;
+
+ baos = new ByteArrayOutputStream();
+ while ((bytesRead = zipInputStream.read(buffer, 0, bufferSize)) > 0) {
+ baos.write(buffer, 0, bytesRead);
+ }
+ baos.close();
+ uncompressedBytes = baos.toByteArray();
+
+ Node newNode = createNewNode(em, zipFile, ze, uncompressedBytes);
+ if (newNode != null) {
+ newNodes.put(newNode.getCreatedOn(), newNode);
+ }
+
+ zipInputStream.closeEntry();
+ }
+
+ } catch (Exception ex) {
+ throw new RuntimeException(ex);
+ } finally {
+ try {
+ if (zipInputStream != null) zipInputStream.close();
+ if (byteStream != null) byteStream.close();
+ } catch (Exception e) {
+ e.printStackTrace(System.err);
+ }
+ }
- if ( !nodeDAO.isUniqueWikiname(zipFile.getAreaNumber(), wikiFile.getWikiname()) ) {
+ int i = 0;
+ for (Map.Entry<Date, Node> entry : newNodes.entrySet()) {
+ log.debug("validating new node");
+
+ ClassValidator validator = Validators.instance().getValidator(entry.getValue().getClass());
+ InvalidValue[] invalidValues = validator.getInvalidValues(entry.getValue());
+ if (invalidValues != null && invalidValues.length > 0) {
+ log.debug("new node is invalid: " + entry.getValue());
+ for (InvalidValue invalidValue : invalidValues) {
getFacesMessages().addFromResourceBundleOrDefault(
FacesMessage.SEVERITY_ERROR,
- "duplicateImportedName",
- "Skipping file '" + ze.getName() + "', name is already used in this area..."
+ "invalidImportedDocumentName",
+ "Skipping entry '" + entry.getValue().getName() + "', invalid: " + invalidValue.getMessage()
);
+ }
continue;
}
- if (ze.getName().contains("/")) {
+ log.debug("persisting newly imported node: " + entry.getValue());
+ zipFile.getParent().addChild(entry.getValue());
+ em.persist(entry.getValue());
+ getFacesMessages().addFromResourceBundleOrDefault(
+ FacesMessage.SEVERITY_INFO,
+ "importedFile",
+ "Created file '" + entry.getValue().getName() + "' in current directory"
+ );
+
+ // Batch the work (we can't clear because of nested set updates, unfortunately)
+ i++;
+ if (i==100) {
+ em.flush();
+ i = 0;
+ }
+
+ }
+
+ return true;
+ }
+
+ protected boolean handleDirectory(EntityManager em, File zipFile, ZipEntry zipEntry) {
+ log.debug("skipping directory: " + zipEntry.getName());
getFacesMessages().addFromResourceBundleOrDefault(
FacesMessage.SEVERITY_ERROR,
"notImportingDirectory",
- "Skipping directory '" + ze.getName() + "', importing not supported..."
+ "Skipping directory '" + zipEntry.getName() + "', importing not supported..."
);
- continue;
+ return false; // Not supported
}
- baos = new ByteArrayOutputStream();
- while ((bytesRead = zipInputStream.read(buffer, 0, bufferSize)) > 0) {
- baos.write(buffer, 0, bytesRead);
+
+ protected boolean continueUncompressing(EntityManager em, File zipFile, ZipEntry zipEntry) {
+ return validateNewWikiname(zipFile, WikiUtil.convertToWikiName(zipEntry.getName()));
}
- baos.close();
- uncommpressedBytes = baos.toByteArray();
- log.debug("detecting mime type of zip entry: " + ze.getName());
+ protected boolean validateNewWikiname(File zipFile, String newWikiname) {
+ log.debug("validating wiki name of new file: " + newWikiname);
+ if (nodeDAO.isUniqueWikiname(zipFile.getAreaNumber(), newWikiname) ) {
+ log.debug("new name is unique and valid");
+ return true;
+ } else {
+ log.debug("new name is not unique and invalid");
+ getFacesMessages().addFromResourceBundleOrDefault(
+ FacesMessage.SEVERITY_ERROR,
+ "duplicateImportedName",
+ "Skipping file '" + newWikiname + "', name is already used in this area..."
+ );
+ return false;
+ }
+ }
+
+ protected Node createNewNode(EntityManager em, File zipFile, ZipEntry zipEntry, byte[] uncompressedBytes) {
+ log.debug("creating new file from zip entry: " + zipEntry.getName());
+
+ File wikiFile = new File();
+ wikiFile.setFilename(zipEntry.getName());
+ wikiFile.setName(zipEntry.getName());
+ wikiFile.setWikiname(WikiUtil.convertToWikiName(wikiFile.getName()));
+
+ wikiFile.setAreaNumber(zipFile.getAreaNumber());
+ wikiFile.setCreatedBy(zipFile.getCreatedBy());
+ wikiFile.setLastModifiedBy(wikiFile.getCreatedBy());
+ wikiFile.setCreatedOn(new Date(zipEntry.getTime()));
+ wikiFile.setLastModifiedOn(new Date());
+ wikiFile.setReadAccessLevel(zipFile.getReadAccessLevel());
+ wikiFile.setWriteAccessLevel(zipFile.getWriteAccessLevel());
+
+ log.debug("detecting mime type of zip entry: " + zipEntry.getName());
String mimeType;
try {
- mimeType = Magic.getMagicMatch(uncommpressedBytes).getMimeType();
- } catch (MagicMatchNotFoundException ex) {
- mimeType = "application/octet-stream"; // Default to binary
+ mimeType = Magic.getMagicMatch(uncompressedBytes).getMimeType();
+ log.debug("mime type of zip entry is: " + mimeType);
+ } catch (Exception ex) {
+ log.debug("could not detect mime type, defaulting to binary");
+ mimeType = "application/octet-stream";
}
-
- log.debug("creating new file data from zip entry: " + ze.getName());
wikiFile.setContentType(mimeType);
- wikiFile.setData(uncommpressedBytes);
- wikiFile.setFilesize(uncommpressedBytes.length);
+ wikiFile.setData(uncompressedBytes);
+ wikiFile.setFilesize(uncompressedBytes.length);
// TODO: Make this generic, duplicated here and in FileHome
if (fileMetaMap.get(wikiFile.getContentType()) != null &&
@@ -121,30 +207,8 @@
wikiFile.getImageMetaInfo().setSizeY(imageSizeY);
}
- zipFile.getParent().addChild(wikiFile);
- em.persist(wikiFile);
-
- getFacesMessages().addFromResourceBundleOrDefault(
- FacesMessage.SEVERITY_INFO,
- "importedFile",
- "Created file '" + ze.getName() + "' in current directory"
- );
-
- zipInputStream.closeEntry();
+ return wikiFile;
}
- } catch (Exception ex) {
- throw new RuntimeException(ex);
- } finally {
- try {
- if (zipInputStream != null) zipInputStream.close();
- if (byteStream != null) byteStream.close();
- } catch (Exception e) {
- e.printStackTrace(System.err);
- }
- }
-
- return true;
- }
}
More information about the jboss-cvs-commits
mailing list