[jboss-cvs] jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/importers ...
Christian Bauer
christian at hibernate.org
Mon Aug 27 18:22:29 EDT 2007
User: cbauer
Date: 07/08/27 18:22:29
Added: examples/wiki/src/main/org/jboss/seam/wiki/core/importers
ZipImporter.java
Log:
New file importer infrastructure plus first Zip/Jar file importer
Revision Changes Path
1.1 date: 2007/08/27 22:22:29; author: cbauer; state: Exp;jboss-seam/examples/wiki/src/main/org/jboss/seam/wiki/core/importers/ZipImporter.java
Index: ZipImporter.java
===================================================================
package org.jboss.seam.wiki.core.importers;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.In;
import org.jboss.seam.wiki.core.importers.metamodel.AbstractImporter;
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.dao.NodeDAO;
import org.jboss.seam.wiki.core.ui.FileMetaMap;
import org.jboss.seam.wiki.util.WikiUtil;
import org.jboss.seam.log.Log;
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.Date;
import java.util.Map;
import java.io.*;
import net.sf.jmimemagic.Magic;
import net.sf.jmimemagic.MagicMatchNotFoundException;
@Name("zipImporter")
@FileImporter(
handledMimeTypes = {"application/zip", "application/java-archive"},
handledExtensions = {"zip", "jar"},
description = "Extract archive as individual files"
)
public class ZipImporter extends AbstractImporter {
@Logger
Log log;
@In
NodeDAO nodeDAO;
@In
Map<String, FileMetaMap.FileMetaInfo> fileMetaMap;
public boolean handleImport(EntityManager em, File zipFile) {
if (zipFile.getData().length == 0) return true;
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[] uncommpressedBytes;
int bytesRead;
while ((ze = zipInputStream.getNextEntry()) != null) {
log.debug("extracting zip entry: " + ze.getName());
File wikiFile = new File();
wikiFile.setFilename(ze.getName());
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 ( !nodeDAO.isUniqueWikiname(zipFile.getAreaNumber(), wikiFile.getWikiname()) ) {
getFacesMessages().addFromResourceBundleOrDefault(
FacesMessage.SEVERITY_ERROR,
"duplicateImportedName",
"Skipping file '" + ze.getName() + "', name is already used in this area..."
);
continue;
}
if (ze.getName().contains("/")) {
getFacesMessages().addFromResourceBundleOrDefault(
FacesMessage.SEVERITY_ERROR,
"notImportingDirectory",
"Skipping directory '" + ze.getName() + "', importing not supported..."
);
continue;
}
baos = new ByteArrayOutputStream();
while ((bytesRead = zipInputStream.read(buffer, 0, bufferSize)) > 0) {
baos.write(buffer, 0, bytesRead);
}
baos.close();
uncommpressedBytes = baos.toByteArray();
log.debug("detecting mime type of zip entry: " + ze.getName());
String mimeType;
try {
mimeType = Magic.getMagicMatch(uncommpressedBytes).getMimeType();
} catch (MagicMatchNotFoundException ex) {
mimeType = "application/octet-stream"; // Default to binary
}
log.debug("creating new file data from zip entry: " + ze.getName());
wikiFile.setContentType(mimeType);
wikiFile.setData(uncommpressedBytes);
wikiFile.setFilesize(uncommpressedBytes.length);
// TODO: Make this generic, duplicated here and in FileHome
if (fileMetaMap.get(wikiFile.getContentType()) != null &&
fileMetaMap.get(wikiFile.getContentType()).image) {
wikiFile.setImageMetaInfo(new ImageMetaInfo());
ImageIcon icon = new ImageIcon(wikiFile.getData());
int imageSizeX = icon.getImage().getWidth(null);
int imageSizeY = icon.getImage().getHeight(null);
wikiFile.getImageMetaInfo().setSizeX(imageSizeX);
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();
}
} 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