[jboss-cvs] jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/upload/importers ...
Christian Bauer
christian at hibernate.org
Tue Dec 18 23:29:23 EST 2007
User: cbauer
Date: 07/12/18 23:29:23
Added: examples/wiki/src/main/org/jboss/seam/wiki/core/upload/importers
ZipImporter.java
Log:
Major rewrite of the most of the application
Revision Changes Path
1.1 date: 2007/12/19 04:29:23; author: cbauer; state: Exp;jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/upload/importers/ZipImporter.java
Index: ZipImporter.java
===================================================================
package org.jboss.seam.wiki.core.upload.importers;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.log.Log;
import org.jboss.seam.wiki.core.dao.WikiNodeDAO;
import org.jboss.seam.wiki.core.upload.importers.annotations.UploadImporter;
import org.jboss.seam.wiki.core.upload.importers.metamodel.AbstractImporter;
import org.jboss.seam.wiki.core.upload.UploadType;
import org.jboss.seam.wiki.core.model.WikiUpload;
import org.jboss.seam.wiki.core.model.WikiNode;
import org.jboss.seam.wiki.util.WikiUtil;
import org.jboss.seam.core.Validators;
import org.hibernate.validator.InvalidValue;
import org.hibernate.validator.ClassValidator;
import javax.faces.application.FacesMessage;
import javax.persistence.EntityManager;
import java.util.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.BufferedInputStream;
import net.sf.jmimemagic.Magic;
@Name("zipImporter")
@UploadImporter(
handledMimeTypes = {"application/zip", "application/java-archive"},
handledExtensions = {"zip", "jar"},
description = "Extract archive as individual files"
)
public class ZipImporter extends AbstractImporter {
@Logger
Log log;
@In
protected WikiNodeDAO wikiNodeDAO;
@In
protected Map<String, UploadType> uploadTypes;
public boolean handleImport(EntityManager em, WikiUpload zipFile) {
if (zipFile.getData().length == 0) return true;
Map<String, Object> newObjects = new HashMap<String, Object>();
ByteArrayInputStream byteStream = null;
ZipInputStream zipInputStream = null;
try {
byteStream = new ByteArrayInputStream(zipFile.getData());
zipInputStream = new ZipInputStream(new BufferedInputStream(byteStream));
int bufferSize = 1024;
ZipEntry ze;
ByteArrayOutputStream baos;
byte[] buffer = new byte[bufferSize];
byte[] uncompressedBytes;
int bytesRead;
while ((ze = zipInputStream.getNextEntry()) != null) {
log.debug("extracting zip entry: " + ze.getName());
if (ze.getName().contains("/") && !handleDirectory(em, zipFile, ze)) continue;
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();
Object newObject = createNewObject(em, zipFile, ze, uncompressedBytes);
if (newObject != null) {
newObjects.put(ze.getName(), newObject);
}
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);
}
}
// By default append them to the
persistNewNodesSorted(
em,
zipFile,
newObjects,
new Comparator() {
public int compare(Object o, Object o1) {
if ( !(o instanceof WikiNode) && !(o1 instanceof WikiNode) ) return 0;
return ((WikiNode)o).getWikiname().compareTo( ((WikiNode)o1).getWikiname() );
}
}
);
return true;
}
protected boolean handleDirectory(EntityManager em, WikiUpload zipFile, ZipEntry zipEntry) {
log.debug("skipping directory: " + zipEntry.getName());
getFacesMessages().addFromResourceBundleOrDefault(
FacesMessage.SEVERITY_ERROR,
"lacewiki.msg.ImportSkippingDirectory",
"Skipping directory '{0}', importing not supported...",
zipEntry.getName()
);
return false; // Not supported
}
protected boolean continueUncompressing(EntityManager em, WikiUpload zipFile, ZipEntry zipEntry) {
return validateNewWikiname(zipFile, WikiUtil.convertToWikiName(zipEntry.getName()));
}
protected boolean validateNewWikiname(WikiUpload zipFile, String newWikiname) {
log.debug("validating wiki name of new file: " + newWikiname);
if (wikiNodeDAO.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,
"lacewiki.msg.ImportDuplicateName",
"Skipping file '{0}', name is already used in this area...",
newWikiname
);
return false;
}
}
protected Object createNewObject(EntityManager em, WikiUpload zipFile, ZipEntry zipEntry, byte[] uncompressedBytes) {
log.debug("creating new file from zip entry: " + zipEntry.getName());
WikiUpload wikiUpload = new WikiUpload();
wikiUpload.setFilename(zipEntry.getName());
wikiUpload.setName(zipEntry.getName());
wikiUpload.setWikiname(WikiUtil.convertToWikiName(wikiUpload.getName()));
wikiUpload.setAreaNumber(zipFile.getAreaNumber());
wikiUpload.setCreatedBy(zipFile.getCreatedBy());
wikiUpload.setLastModifiedBy(wikiUpload.getCreatedBy());
wikiUpload.setCreatedOn(new Date(zipEntry.getTime()));
wikiUpload.setLastModifiedOn(new Date());
wikiUpload.setReadAccessLevel(zipFile.getReadAccessLevel());
wikiUpload.setWriteAccessLevel(zipFile.getWriteAccessLevel());
log.debug("detecting mime type of zip entry: " + zipEntry.getName());
String mimeType;
try {
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";
}
wikiUpload.setContentType(mimeType);
wikiUpload.setData(uncompressedBytes);
wikiUpload.setFilesize(uncompressedBytes.length);
// TODO: Make this generic, duplicated here and in uploadHome
/* TODO: fixme
if (fileMetaMap.get(wikiUpload.getContentType()) != null &&
fileMetaMap.get(wikiUpload.getContentType()).image) {
throw new RuntimeException("TODO: Images not supported");
wikiUpload.setImageMetaInfo(new ImageMetaInfo());
ImageIcon icon = new ImageIcon(wikiUpload.getData());
int imageSizeX = icon.getImage().getWidth(null);
int imageSizeY = icon.getImage().getHeight(null);
wikiUpload.getImageMetaInfo().setSizeX(imageSizeX);
wikiUpload.getImageMetaInfo().setSizeY(imageSizeY);
}
*/
return wikiUpload;
}
protected void persistNewNodesSorted(EntityManager em, WikiUpload zipFile, Map<String, Object> newObjects, Comparator comparator) {
List<WikiNode> newNodes = new ArrayList<WikiNode>();
for (Object newObject : newObjects.values()) {
if (newObject instanceof WikiNode) {
newNodes.add((WikiNode)newObject);
}
}
Collections.sort(newNodes, comparator);
int i = 0;
for (WikiNode newNode : newNodes) {
log.debug("validating new node");
ClassValidator validator = Validators.instance().getValidator(newNode.getClass());
InvalidValue[] invalidValues = validator.getInvalidValues(newNode);
if (invalidValues != null && invalidValues.length > 0) {
log.debug("new node is invalid: " + newNode);
for (InvalidValue invalidValue : invalidValues) {
getFacesMessages().addFromResourceBundleOrDefault(
FacesMessage.SEVERITY_ERROR,
"lacewiki.msg.ImportInvalidNode",
"Skipping entry '{0}', invalid: {1}",
newNode.getName(),
invalidValue.getMessage()
);
}
continue;
}
log.debug("persisting newly imported node: " + newNode);
newNode.setParent(zipFile.getParent());
em.persist(newNode);
getFacesMessages().addFromResourceBundleOrDefault(
FacesMessage.SEVERITY_INFO,
"lacewiki.msg.ImportOk",
"Created file '{0}' in current directory.",
newNode.getName()
);
// Batch the work (we can't clear because of nested set updates, unfortunately)
i++;
if (i==100) {
em.flush();
i = 0;
}
}
}
}
More information about the jboss-cvs-commits
mailing list