[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