/* * Created on Jan 6, 2004 * */ package com.idega.idegaweb.presentation; import java.io.File; import java.io.FileFilter; import java.io.FileNotFoundException; import java.io.IOException; import java.text.DateFormat; import java.util.Arrays; import java.util.Iterator; import java.util.StringTokenizer; import java.util.Vector; import com.idega.core.file.business.FileIconSupplier; import com.idega.idegaweb.IWBundle; import com.idega.idegaweb.IWResourceBundle; import com.idega.presentation.Block; import com.idega.presentation.IWContext; import com.idega.presentation.Image; import com.idega.presentation.Table; import com.idega.presentation.text.DownloadLink; import com.idega.presentation.text.Link; import com.idega.presentation.text.Text; import com.idega.presentation.ui.CheckBox; import com.idega.presentation.ui.FileInput; import com.idega.presentation.ui.Form; import com.idega.presentation.ui.IFrame; import com.idega.presentation.ui.SubmitButton; import com.idega.presentation.ui.TextInput; import com.idega.util.FileUtil; /** * The <code>FileManager</code> class represents a file * manager resource files of the running webapplication. * @author aron * @version 1.0 */ public class FileManager extends Block { private boolean relativePath = false; private String folder = null; private String topLevelFolder = "/"; private String[] skipFiles = null; private String[] skipFolders = null; private String headerBackgroundColor = "#000000"; private String fileBackgroundColor = "#e8e8e8"; private String headerFontColor = "#ffffff"; private String textFontColor = "#124274"; private String boldFontColor = "#000000"; private String bundleIdentifier =null; private IWBundle iwb =null; private IWResourceBundle iwrb = null; private String currentFolder =null,currentFile =null; private java.util.List maintainParameterNames =null; private boolean filesDeletable = true; private boolean displayFilesInFrame = true; private FileIconSupplier iconSupplier =null; private static final String PRM_FOLDER = "iw_b_r_m_dir"; private static final String PRM_SUB_FOLDER ="iw_b_r_m_sdir"; private static final String PRM_FILE = "iw_b_r_m_fil"; private static final String PRM_DELFILE = "iw_b_r_m_rmfil"; private static final String PRM_CREATE_FOLDER ="iw_b_r_m_mkdir"; private static final String PRM_UPLOAD_FILE ="iw_b_r_m_upld"; private static final String PRM_VIEW_FILE ="iw_b_r_m_vwld"; public void main(IWContext iwc) { //debugParameters(iwc); this.iwb = getBundle(iwc); this.iwrb =getResourceBundle(iwc); if(iwc.isLoggedOn()){ this.iconSupplier =FileIconSupplier.getInstance(); // currentFolder = folder; if(null==this.currentFolder){ if(null!=this.folder){ if(this.relativePath == true){ String appURI = iwc.getIWMainApplication().getApplicationRealPath(); this.folder = appURI+this.folder; this.currentFolder = this.folder; // System.out.println("Path is relative to: "+appURI); this.relativePath = false; }else{ // System.out.println("Path is absolute"); this.currentFolder = this.folder; } } } /* else{ currentFolder = topLevelFolder; } */ if(iwc.isParameterSet(PRM_FOLDER)) { this.currentFolder = iwc.getParameter(PRM_FOLDER); } if(iwc.isParameterSet(PRM_FILE)) { this.currentFile = iwc.getParameter(PRM_FILE); } if(iwc.isParameterSet(PRM_SUB_FOLDER)) { this.currentFolder = this.folder+iwc.getParameter(PRM_SUB_FOLDER); } System.out.println("path:"+this.currentFolder); if(iwc.isMultipartFormData()){ if(processUpload(iwc)) { presentateFileView(iwc); } else { presentateUploadView(iwc); } } else if(iwc.isParameterSet(PRM_VIEW_FILE)){ presentateSelectedFile(iwc); } else if(iwc.isParameterSet("folder_name")){ if(processFolderCreation(iwc)) { presentateFileView(iwc); } else { presentateCreateNewFolderView(iwc); } } else if(iwc.isParameterSet(PRM_CREATE_FOLDER)){ presentateCreateNewFolderView(iwc); } else if(iwc.isParameterSet(PRM_UPLOAD_FILE)){ presentateUploadView(iwc); } else if(iwc.isParameterSet(PRM_DELFILE)){ processFileRemoval(iwc); presentateFileView(iwc); } else { presentateFileView(iwc); } } else{ add(this.iwrb.getLocalizedString("user_not_logged_on","No user is logged on")); } } public String getBundleIdentifier(){ if(this.bundleIdentifier==null) { return super.getBundleIdentifier(); } return this.bundleIdentifier; } private boolean processUpload(IWContext iwc){ iwc.getUploadedFile().getAbsolutePath(); boolean overwrite =iwc.isParameterSet("overwrite"); File uploadedFile = iwc.getUploadedFile().getAbsoluteFile(); try { File newFile = new File(this.currentFolder,uploadedFile.getName()); if(newFile.exists() && !overwrite){ getParentPage().setOnLoad("alert('"+this.iwrb.getLocalizedString("file_already_exists","File already exists !")+"')"); } else{ FileUtil.copyFile(uploadedFile,newFile); return true; } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return false; } private boolean processFolderCreation(IWContext iwc){ String newFolderName = iwc.getParameter("folder_name"); FileUtil.createFolder(new File(this.currentFolder,newFolderName).getAbsolutePath()); return true; } private boolean processFileRemoval(IWContext iwc){ if(this.currentFile!=null){ FileUtil.delete(this.currentFile); return true; } return false; } private void presentateSelectedFile(IWContext iwc){ Table table = new Table(); table.add(getHeaderTable(iwc,new File(this.currentFolder)),1,1); table.add(getHeaderText(this.iwrb.getLocalizedString("selected_file","Selected file")+" : "+new File(this.currentFile).getName()),1,2); table.setColor(1,2,this.headerBackgroundColor); if(this.displayFilesInFrame){ IFrame frame =new IFrame("fileview",600,600); frame.setSrc(getCurrentFileUrl(iwc,this.currentFile)); // frame.setSrc(currentFile); frame.setAsTransparent(true); frame.setBorder(0); table.add(frame,1,3); } add(table); } private String getCurrentFileUrl(IWContext iwc,String fileAbsPath){ // TODO fix x url String server = iwc.getServerURL().replace('\\','/'); String context = iwc.getIWMainApplication().getApplicationContextURI().replace('\\','/'); String appURI = iwc.getIWMainApplication().getApplicationRealPath().replace('\\','/'); //String appURI =iwc.getApplication().getApplicationContextURI(); //int index = currentFile.indexOf(appURI); /* System.out.println("curr file "+currentFile); System.out.println("appURI "+appURI); System.out.println("context "+context); System.out.println("server "+server); */ String url = fileAbsPath.substring(appURI.length()); if(context.endsWith("/")) { url = context+url; } else { url =context+"/"+url; } //url ="/"+url; url = server+url; // System.out.println("url "+url); return url; } /** * Creates a list of all files and folders in the current folder * @param iwc */ private void presentateFileView(IWContext iwc) { if(null==this.currentFolder){ add(this.iwrb.getLocalizedString("please_set_the_path_for_this_block","Please set the path for this block")); return; } Table fileTable = new Table(); int row = 1; fileTable.add(getHeaderText(this.iwrb.getLocalizedString("file","File")), 1, row); fileTable.add(getHeaderText(this.iwrb.getLocalizedString("size","Size")), 2, row); fileTable.add(getHeaderText(this.iwrb.getLocalizedString("date","Date")), 3, row); row++; // System.out.println("Path in present file "+currentFolder); File dir = new File(this.currentFolder); Table table = new Table(); table.setWidth(Table.HUNDRED_PERCENT); int resourcesLength = 0, foldersLength = 0; File[] folders = dir.listFiles(new FolderFilter(this.skipFolders)); if (folders != null) { Arrays.sort(folders); foldersLength = folders.length; } File[] resources = dir.listFiles(new ResourceFileFilter(this.skipFiles)); if (resources != null) { Arrays.sort(resources); resourcesLength = resources.length; } File[] files = new File[foldersLength + resourcesLength]; int numberOfFiles = files.length; if (folders != null) { System.arraycopy(folders, 0, files, 0, folders.length); } if (resources != null) { System.arraycopy(resources, 0, files, folders.length, resources.length); } File file; DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT,DateFormat.SHORT, iwc.getCurrentLocale()); if (!isTopLevel(dir)) { String dirPath = dir.getAbsolutePath().replace('\\','/'); fileTable.add(getFolderIcon(), 1, row); fileTable.add(getUpFolderLink((dirPath.substring(0, dirPath.lastIndexOf("/"))), iwc), 1, row); fileTable.setColor(1, row, this.fileBackgroundColor); fileTable.setColor(2, row, this.fileBackgroundColor); fileTable.setColor(3, row, this.fileBackgroundColor); if(this.filesDeletable){ fileTable.setColor(4, row, this.fileBackgroundColor); } row++; } for (int i = 0; i < files.length; i++) { file = files[i]; if (file.isDirectory()) { fileTable.add(getFolderIcon(), 1, row); fileTable.add(getFolderLink(file, iwc), 1, row); } else { fileTable.add(getFileIcon(file), 1, row); fileTable.add(getFileLink(file, iwc), 1, row); long length = file.length(); String bytes = " B"; if (length >= 1000) { length = length / 1000; bytes = " kB"; } fileTable.add(getText(String.valueOf(length) + bytes), 2, row); if(this.filesDeletable){ fileTable.add(getDeleteFileLink(file, iwc), 4, row); } } fileTable.setColor(1, row, this.fileBackgroundColor); fileTable.setColor(2, row, this.fileBackgroundColor); fileTable.setColor(3, row, this.fileBackgroundColor); if(this.filesDeletable){ fileTable.setColor(4, row, this.fileBackgroundColor); } fileTable.add(getText(df.format(new java.util.Date(file.lastModified()))), 3, row); row++; } fileTable.setNoWrap(); fileTable.setWidth(Table.HUNDRED_PERCENT); fileTable.setWidth(1, "50%"); fileTable.setWidth(2, "1%"); fileTable.setWidth(3, "1%"); if(this.filesDeletable){ fileTable.setWidth(4, "1%"); } fileTable.setColumnAlignment(3, Table.HORIZONTAL_ALIGN_RIGHT); if(this.filesDeletable){ fileTable.setColumnAlignment(4, Table.HORIZONTAL_ALIGN_RIGHT); } fileTable.setRowColor(1, "black"); fileTable.setCellspacing(2); fileTable.setNoWrap(); fileTable.setColumnAlignment(2, Table.HORIZONTAL_ALIGN_RIGHT); table.add(getHeaderTable(iwc, dir), 1, 1); table.setAlignment(1, 2, Table.HORIZONTAL_ALIGN_RIGHT); table.add(fileTable, 1, 2); table.add(getFooterTable(iwc, dir, numberOfFiles), 1, 3); add( table); } private Table getHeaderTable(IWContext iwc, File dir) { Table headerTable = new Table(); headerTable.setWidth(Table.HUNDRED_PERCENT); headerTable.setCellspacing(2); headerTable.add(getText(this.iwrb.getLocalizedString("current_folder","Current folder")+": "), 1, 1); String absolute = dir.getAbsolutePath().replace('\\','/'); String shortdir = absolute.substring(absolute.indexOf(this.topLevelFolder)+this.topLevelFolder.length()); /* System.out.println("absolute path: "+absolute); System.out.println("top level path: "+topLevelFolder); System.out.println("shortdir path: "+shortdir); */ if(shortdir.length()==0){ shortdir ="/"; headerTable.add(getSubFolderLink(shortdir,iwc), 1, 1); } else{ StringBuffer path = new StringBuffer("/"); StringTokenizer tokener = new StringTokenizer(shortdir,"/"); while(tokener.hasMoreTokens()){ path.append(tokener.nextToken()); headerTable.add("/"); headerTable.add(getSubFolderLink((path.toString()),iwc),1,1); path.append("/"); } } headerTable.add(getCreateFolderLink(dir, iwc), 3, 1); headerTable.add(Text.getNonBrakingSpace(),3,1); headerTable.add(getUploadLink(dir, iwc), 3, 1); headerTable.setAlignment(3, 1, Table.HORIZONTAL_ALIGN_RIGHT); return headerTable; } private Table getFooterTable(IWContext iwc, File dir, int numberOfFiles) { Table footerTable = new Table(3, 1); footerTable.setWidth(Table.HUNDRED_PERCENT); footerTable.add(getCreateFolderLink(dir, iwc), 1, 1); footerTable.add(Text.getNonBrakingSpace(),1,1); footerTable.add(getUploadLink(dir, iwc), 1, 1); footerTable.add( String.valueOf(numberOfFiles) +" "+getText(this.iwrb.getLocalizedString("files","Files")), 3, 1); footerTable.setAlignment(3, 1, Table.HORIZONTAL_ALIGN_RIGHT); footerTable.setCellspacing(2); return footerTable; } private void presentateUploadView(IWContext iwc) { Table table = new Table(2, 4); table.setWidth(Table.HUNDRED_PERCENT); table.setCellspacing(2); table.mergeCells(1, 1, 2, 1); table.add(getHeaderText(this.iwrb.getLocalizedString("upload_file","Upload file")+ ":"), 1, 1); table.setColor(1, 1, this.headerBackgroundColor); table.setAlignment(1, 1, Table.HORIZONTAL_ALIGN_LEFT); table.add(getBoldText(this.iwrb.getLocalizedString("file","File")+":"), 1, 2); FileInput fileInput = new FileInput(); table.add(fileInput, 2, 2); CheckBox overWriteCheck = new CheckBox("overwrite"); table.add(overWriteCheck, 2, 3); table.add(getText(this.iwrb.getLocalizedString("overwrite_file","Overwrite file with same name if exists")), 2, 3); SubmitButton createFolder = new SubmitButton(this.iwrb.getLocalizedString("upload" , "Upload") ); table.add(createFolder, 2, 4); Form form = new Form(); form.add(table); form.setMultiPart(); form.maintainParameter(PRM_FOLDER); form.maintainParameters(this.maintainParameterNames); add( form); } private void presentateCreateNewFolderView(IWContext iwc) { Table table = new Table(2, 4); table.setWidth(Table.HUNDRED_PERCENT); table.setCellspacing(2); table.mergeCells(1, 1, 2, 1); table.add(getHeaderText(this.iwrb.getLocalizedString("create_new_folder","Create new folder")+" :"), 1, 1); table.setColor(1, 1, this.headerBackgroundColor); table.setAlignment(1, 1, Table.HORIZONTAL_ALIGN_LEFT); table.add(getBoldText(this.iwrb.getLocalizedString("folder_name","Folder name")+":"), 1, 2); TextInput folderNameInput = new TextInput("folder_name"); folderNameInput.setLength(40); table.add(folderNameInput, 2, 2); SubmitButton createFolder = new SubmitButton(this.iwrb.getLocalizedString("create_folder","Create folder")); table.add(createFolder, 2, 3); Form form = new Form(); form.add(table); form.maintainParameter(PRM_FOLDER); form.maintainParameters(this.maintainParameterNames); add( form); } private boolean isTopLevel(File file) { String absPath = file.getAbsolutePath().replace('\\','/'); if(this.topLevelFolder!=null){ int toplevel = this.topLevelFolder.lastIndexOf("/"); String top =this.topLevelFolder.substring(toplevel); int indexOfTopLevel = absPath.indexOf(top); return absPath.lastIndexOf("/") == indexOfTopLevel; } return false; } private Image getFileIcon(File file) { return new Image(this.iconSupplier.getFileIconURLByFileName(file.getName())); //return iwb.getImage("shared/rugl.gif"); } private Image getFolderIcon() { return new Image(this.iconSupplier.getFolderIconURL()); //return iwb.getImage("shared/folder.gif"); } private Image getDeleteIcon() { return this.iwb.getImage("shared/delete.gif","delete"); } private Link getFolderLink(File file, IWContext iwc) { Link l = new Link(getText(file.getName())); l.addParameter(PRM_FOLDER, file.getAbsolutePath()); addMaintainedParameters(iwc,l); return l; } private Link getSubFolderLink(String subpath, IWContext iwc) { String name =subpath; int index =subpath.lastIndexOf("/"); if(index>-1 && subpath.length()>index+1 ){ name =subpath.substring(index+1); } Link l = new Link(getText(name)); l.addParameter(PRM_SUB_FOLDER, subpath); addMaintainedParameters(iwc,l); return l; } private Link getUpFolderLink(String path, IWContext iwc) { Text t = getText(".. ("+this.iwrb.getLocalizedString("up_one_level","Up one level")+")" ); Link l = new Link(t); l.addParameter(PRM_FOLDER, path); addMaintainedParameters(iwc,l); return l; } private Link getFileLink(File file, IWContext iwc) { //String url = file.getAbsolutePath().substring(folder.length()); //l.setURL(url); if(this.displayFilesInFrame){ Link l = new Link(getText(file.getName())); l.addParameter(PRM_VIEW_FILE,"true"); l.addParameter(PRM_FILE, file.getAbsolutePath()); l.addParameter(PRM_FOLDER,this.currentFolder); addMaintainedParameters(iwc,l); return l; } else{ DownloadLink l = new DownloadLink(file.getName()); l.setAbsoluteFilePath(file.getAbsolutePath()); /* Link l = new Link(file.getName(),iwc.getIWMainApplication().getMediaServletURI()); l.addParameter(MediaWritable.PRM_WRITABLE_CLASS,IWMainApplication.getEncryptedClassName(DownloadWriter.class)); l.addParameter(DownloadWriter.PRM_ABSOLUTE_FILE_PATH,file.getAbsolutePath()); */ /* Link l = new Link(getText(file.getName()),getCurrentFileUrl(iwc,file.getAbsolutePath())); l.setTarget(Link.TARGET_BLANK_WINDOW); */ return l; } } private Link getDeleteFileLink(File file, IWContext iwc) { Link l = new Link(getDeleteIcon()); l.addParameter(PRM_DELFILE,"true"); String msg =this.iwrb.getLocalizedString("do_you_want_to_remove_this_file","Do you really want to delete the file"); l.setOnClick("return confirm('"+msg+" \\'" + file.getName() + " \\'?');"); l.addParameter(PRM_FILE, file.getAbsolutePath()); addMaintainedParameters(iwc,l); return l; } /* * if (confirm(" " + msg)){ return true; }else{ return false; } */ private Link getUploadLink(File folder, IWContext iwc) { Link l = new Link(getText(this.iwrb.getLocalizedString("upload_file","Upload file"))); l.addParameter(PRM_UPLOAD_FILE,"true"); l.maintainParameter(PRM_FOLDER,iwc); addMaintainedParameters(iwc,l); return l; } private Link getCreateFolderLink(File parentfolder, IWContext iwc) { Link l = new Link(getText(this.iwrb.getLocalizedString("create_folder","Create folder"))); l.addParameter(PRM_CREATE_FOLDER,"true"); l.maintainParameter(PRM_FOLDER,iwc); addMaintainedParameters(iwc,l); return l; } private Text getHeaderText(String caption) { Text t = new Text(caption); t.setFontColor(this.headerFontColor); return t; } private Text getBoldText(String caption) { Text t = new Text(caption); t.setFontColor(this.boldFontColor); t.setBold(true); return t; } private Text getText(String caption) { Text t = new Text(caption); t.setFontColor(this.textFontColor); return t; } public void setBundleIdentifier(String identifier){ this.bundleIdentifier = identifier; } private void addMaintainedParameters(IWContext iwc,Link link){ if(this.maintainParameterNames!=null){ for (Iterator iter = this.maintainParameterNames.iterator(); iter.hasNext();) { String prm = (String) iter.next(); link.maintainParameter(prm,iwc); } } } /** * @return Returns the skipFiles. */ public String[] getSkipFiles() { return this.skipFiles; } /** * @param skipFiles The skipFiles to set. */ public void setSkipFiles(String[] skipFiles) { this.skipFiles = skipFiles; } /** * @return Returns the skipFolders. */ public String[] getSkipFolders() { return this.skipFolders; } /** * @param skipFolders The skipFolders to set. */ public void setSkipFolders(String[] skipFolders) { this.skipFolders = skipFolders; } /** * @return Returns the sTOPFOLDER. */ public String getSTOPFOLDER() { return this.topLevelFolder; } /** * @param stopfolder The sTOPFOLDER to set. */ public void setTopLevelBrowseFolder(String toplevel) { if(!toplevel.startsWith("/")) { this.topLevelFolder = "/"+toplevel; } else { this.topLevelFolder = toplevel; // System.out.println("Toplevel folder set to "+topLevelFolder); } } /** * @param boldFontColor The boldFontColor to set. */ public void setBoldFontColor(String boldFontColor) { this.boldFontColor = boldFontColor; } /** * @param fileBackgroundColor The fileBackgroundColor to set. */ public void setFileBackgroundColor(String fileBackgroundColor) { this.fileBackgroundColor = fileBackgroundColor; } /** * @param folder The folder to set. */ public void setStartingFolderRealPath(String folder) { this.relativePath = false; this.folder = folder; if(this.topLevelFolder.equalsIgnoreCase("/")){ setTopLevelBrowseFolder(folder); } // System.out.println("Path set to "+folder); } /** * @param folder The folder to set. */ public void setStartingFolderRelativePath(String folder) { this.relativePath = true; this.folder = folder; if(this.topLevelFolder.equalsIgnoreCase("/")){ setTopLevelBrowseFolder(folder); } // System.out.println("Path set to "+folder); } public void setFilesDeletable(boolean deletable){ this.filesDeletable = deletable; } /** * @param headerBackgroundColor The headerBackgroundColor to set. */ public void setHeaderBackgroundColor(String headerBackgroundColor) { this.headerBackgroundColor = headerBackgroundColor; } /** * @param headerFontColor The headerFontColor to set. */ public void setHeaderFontColor(String headerFontColor) { this.headerFontColor = headerFontColor; } /** * @param textFontColor The textFontColor to set. */ public void setTextFontColor(String textFontColor) { this.textFontColor = textFontColor; } /** * Adds a parameter name to be maintained from the request * @param prmName */ public void addMaintainedParameter(String prmName){ if(this.maintainParameterNames==null) { this.maintainParameterNames =new Vector(); } this.maintainParameterNames.add(prmName); } private class FolderFilter implements FileFilter { private String[] refuseFolders =null; public FolderFilter(String[] refuseFolders){ this.refuseFolders =refuseFolders; } /* * (non-Javadoc) * * @see java.io.FileFilter#accept(java.io.File) */ public boolean accept(File file) { if ((file.isDirectory())) { String name = file.getName(); if(this.refuseFolders!=null){ for (int i = 0; i < this.refuseFolders.length; i++) { int index = name.indexOf(this.refuseFolders[i]); if (index > -1) { return false; } } } return true; } return false; } } private class ResourceFileFilter implements FileFilter { private String[] refuseFiles =null; public ResourceFileFilter(String[] refuseFiles){ this.refuseFiles =refuseFiles; } /* * (non-Javadoc) * * @see java.io.FileFilter#accept(java.io.File) */ public boolean accept(File file) { if (!file.isDirectory()) { String name = file.getName(); if(this.refuseFiles!=null){ for (int i = 0; i < this.refuseFiles.length; i++) { int index = name.indexOf(this.refuseFiles[i]); if (index > -1) { return false; } } } return true; } return false; } } /** * @return Returns the displayFilesInFrame. */ public boolean isDisplayFilesInFrame() { return this.displayFilesInFrame; } /** * @param displayFilesInFrame The displayFilesInFrame to set. */ public void setDisplayFilesInFrame(boolean displayFilesInFrame) { this.displayFilesInFrame = displayFilesInFrame; } public void setDownloadFiles(boolean display){ this.displayFilesInFrame = !display; } }