/*
* Created on Oct 25, 2003
*
*/
package com.idega.block.media.business;
import java.io.File;
import java.io.IOException;
import java.net.FileNameMap;
import java.net.URLConnection;
import java.rmi.RemoteException;
import java.sql.SQLException;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import javax.ejb.CreateException;
import javax.ejb.EJBException;
import javax.ejb.FinderException;
import com.idega.block.media.data.MediaProperties;
import com.idega.block.media.presentation.MediaViewerWindow;
import com.idega.core.data.ICTreeNode;
import com.idega.core.file.data.ICFile;
import com.idega.data.IDOLookupException;
import com.idega.event.IWPageEventListener;
import com.idega.idegaweb.IWException;
import com.idega.presentation.IWContext;
import com.idega.presentation.PresentationObject;
import com.idega.presentation.Table;
import com.idega.presentation.text.Text;
import com.idega.presentation.ui.CheckBox;
import com.idega.presentation.ui.Form;
import com.idega.presentation.ui.HiddenInput;
import com.idega.presentation.ui.SubmitButton;
import com.idega.util.caching.Cache;
/**
* ZipTypeHandler handles zip files, decompresses them to the database, creates directory structure
* @author Aron Birkir aron@idega.is
* @version 1.0
*/
public class ZipTypeHandler extends FileTypeHandler implements IWPageEventListener {
/* (non-Javadoc)
* @see com.idega.block.media.business.FileTypeHandler#getPresentationObject(int, com.idega.presentation.IWContext)
*/
public PresentationObject getPresentationObject(int icFileId, IWContext iwc) {
try {
int id = -1;
Cache cache = FileTypeHandler.getCachedFileInfo(icFileId,iwc);
String filePath =cache.getRealPathToFile();
ICFile file = (ICFile) cache.getEntity();
ICTreeNode parent = file.getParentNode();
if(parent!=null) {
id = parent.getNodeID();
}
return getZipFileContent(filePath,new Integer(id));
}
catch (ZipException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
return null;
}
/* (non-Javadoc)
* @see com.idega.block.media.business.FileTypeHandler#getPresentationObject(com.idega.block.media.data.MediaProperties, com.idega.presentation.IWContext)
*/
public PresentationObject getPresentationObject(MediaProperties props, IWContext iwc) {
try {
int parentID = MediaBusiness.getMediaId(iwc);
return getZipFileContent(props.getRealPath(),new Integer(parentID));
}
catch (ZipException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
return null;
}
private PresentationObject getZipFileContent(String zipFilePath,Integer parentID) throws ZipException,IOException{
ZipFile zipFile = new ZipFile(new File(zipFilePath));
Form form = new Form(MediaViewerWindow.class);
FileNameMap fileNameMap = URLConnection.getFileNameMap();
Table table = new Table();
Text fileName = new Text("Filename");
fileName.setBold();
Text fileSize = new Text("Filesize");
fileSize.setBold();
Text fileContentType = new Text("Content type");
fileContentType.setBold();
table.add(fileName,1,1);
table.add(fileSize,2,1);
table.add(fileContentType,3,1);
int row = 2;
Enumeration entries = zipFile.entries();
String name,contentType;
while (entries.hasMoreElements()) {
ZipEntry entry = (ZipEntry) entries.nextElement();
name = entry.getName();
table.add(name,1,row);
table.add(String.valueOf(entry.getSize()),2,row);
contentType = fileNameMap.getContentTypeFor(name);
if(contentType!=null) {
table.add(contentType,3,row);
}
else {
table.add("unknown , please update you resources",3,row);
}
row++;
}
CheckBox createDirectoryStructure = new CheckBox("create_dirs","true");
createDirectoryStructure.setChecked(true);
SubmitButton uncompress = new SubmitButton("uncompress","Uncompress");
uncompress.setToolTip("Files will be inflated to chosen directory");
Table buttons = new Table();
buttons.add(new Text("Create directory structure"),1,1);
buttons.add(createDirectoryStructure,2,1);
buttons.add(uncompress,3,1);
form.add(Text.getBreak());
form.add(buttons);
form.add(table);
form.setEventListener(this.getClass());
form.add(new HiddenInput("zip_path",zipFilePath));
form.add(new HiddenInput("parent_folder",parentID.toString()));
return form;
}
/* (non-Javadoc)
* @see com.idega.event.IWPageEventListener#actionPerformed(com.idega.presentation.IWContext)
*/
public boolean actionPerformed(IWContext iwc) throws IWException {
boolean createDirectoryStructure = iwc.isParameterSet("create_dirs");
String zipFilePath = iwc.getParameter("zip_path");
Integer parentID = Integer.valueOf(iwc.getParameter("parent_folder"));
int id = parentID.intValue();
//System.out.println("Create directories "+createDirectoryStructure +" path: "+zipFilePath+" parent "+parentID);
try {
// if no error occur we want to view the parent directory content
if( iwc.getSessionAttribute( MediaConstants.MEDIA_PROPERTIES_IN_SESSION_PARAMETER_NAME )!=null) {
(( MediaProperties ) iwc.getSessionAttribute( MediaConstants.MEDIA_PROPERTIES_IN_SESSION_PARAMETER_NAME )).setId(id);
}
MediaBusiness.saveMediaIdToSession(iwc,id);
uncompressZipToDB(zipFilePath,createDirectoryStructure,parentID);
}
catch (ZipException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
catch (CreateException e) {
e.printStackTrace();
}
return false;
}
private void uncompressZipToDB(String zipFilePath,boolean createDirectories,Integer parentID)throws ZipException,IOException,CreateException{
ZipFile zipFile = new ZipFile(new File(zipFilePath));
Enumeration enumer = zipFile.entries();
Map folderMap = new Hashtable();
FileNameMap fileNameMap = URLConnection.getFileNameMap();
String file,folder;
while (enumer.hasMoreElements()) {
ZipEntry entry = (ZipEntry) enumer.nextElement();
String name = entry.getName();
int i = name.lastIndexOf("/");
if(i>0){
file = name.substring(i+1);
folder = "/"+ name.substring(0,i);
}
else{
file = name;
folder = null;
}
//System.out.println("folder: "+folder+" file: "+file);
int parentFolderID = parentID.intValue();
if(file.length()>0){
if(createDirectories && folder!=null ){
if(!folderMap.containsKey(folder)){
int parent = parentFolderID;
StringTokenizer tokener = new StringTokenizer(folder,"/");
String folderPath = "";
while(tokener.hasMoreTokens()){
String folderName = tokener.nextToken();
folderPath += "/"+folderName;
if(!folderMap.containsKey(folderPath)){
parent = createSubFolder(folderName,parent);
folderMap.put(folderPath,new Integer(parent));
}
else{
parent = ((Integer)folderMap.get(folderPath)).intValue();
}
}
parentFolderID = parent;
}
else{
parentFolderID = ((Integer) folderMap.get(folder)).intValue();
//System.out.println("map contains folder "+ folder +" id "+parentFolderID);
}
}
ICFile zfile = ((com.idega.core.file.data.ICFileHome)com.idega.data.IDOLookup.getHome(ICFile.class)).create();
zfile.setName(file);
zfile.setFileSize((int)entry.getSize());
zfile.setFileValue(zipFile.getInputStream(entry));
String mimeType = fileNameMap.getContentTypeFor(file);
if(mimeType == null) {
mimeType = "application/octet";
}
//System.out.println("Save file "+file+ " of type "+mimeType+" under folder "+parentFolderID);
zfile.setMimeType(mimeType);
zfile = MediaBusiness.saveMediaToDB(zfile, parentFolderID);
}
}
}
private int createSubFolder(String name, int parent){
try {
ICFile folder = MediaBusiness.createSubFolder(parent,name);
return Integer.valueOf(folder.getPrimaryKey().toString()).intValue();
}
catch (IDOLookupException e) {
e.printStackTrace();
}
catch (NumberFormatException e) {
e.printStackTrace();
}
catch (RemoteException e) {
e.printStackTrace();
}
catch (EJBException e) {
e.printStackTrace();
}
catch (FinderException e) {
e.printStackTrace();
}
catch (CreateException e) {
e.printStackTrace();
}
catch (SQLException e) {
e.printStackTrace();
}
return parent;
}
}