/** * */ package org.gcube.portlets.widgets.wsexplorer.server; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.gcube.common.homelibary.model.items.type.WorkspaceItemType; import org.gcube.common.homelibrary.home.exceptions.InternalErrorException; import org.gcube.common.homelibrary.home.workspace.WorkspaceFolder; import org.gcube.common.homelibrary.home.workspace.WorkspaceItem; import org.gcube.common.homelibrary.home.workspace.WorkspaceSharedFolder; import org.gcube.common.homelibrary.home.workspace.folder.FolderItem; import org.gcube.common.homelibrary.home.workspace.folder.items.ExternalFile; import org.gcube.portlets.widgets.wsexplorer.client.Util; import org.gcube.portlets.widgets.wsexplorer.client.WorkspaceExplorerConstants; import org.gcube.portlets.widgets.wsexplorer.shared.FilterCriteria; import org.gcube.portlets.widgets.wsexplorer.shared.Item; import org.gcube.portlets.widgets.wsexplorer.shared.ItemType; /** * The Class ItemBuilder. * * @author Federico De Faveri defaveri@isti.cnr.it * Modified by Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it */ public class ItemBuilder { /** * Purge empty folders. * * @param item the item * @return the item */ public static Item purgeEmptyFolders(Item item) { //for (Item child:item.getChildren()) purgeEmptyFolders(child); ONLY FIRST LEVEL List toRemoveList = new LinkedList(); for (Item child:item.getChildren()) { boolean toRemove = isAnEmptyFolder(child); if (toRemove) toRemoveList.add(child); } for (Item child:toRemoveList) item.removeChild(child); return item; } /** * Checks if is an empty folder. * * @param item the item * @return true, if is an empty folder */ protected static boolean isAnEmptyFolder(Item item) { return Util.isFolder(item.getType()) && item.getChildren().size() == 0; } /** * Gets the item. * * @param parent the parent * @param workspaceItem the workspace item * @param showableTypes the showable types * @param filterCriteria the filter criteria * @param loadChildren the load children * @return the item * @throws InternalErrorException the internal error exception */ public static Item getItem(Item parent, WorkspaceItem workspaceItem, List showableTypes, FilterCriteria filterCriteria, boolean loadChildren) throws InternalErrorException { ItemType type = getItemType(workspaceItem); if (!showableTypes.contains(type)) return null; if (!filterItem(type, workspaceItem, filterCriteria)) return null; // Added in date 26/06/2012 by Francesco Mangiacrapa // Item item = new Item(parent, workspaceItem.getId(), workspaceItem.getName(), type, workspaceItem.getPath()); String itemName = workspaceItem.getName(); if ( workspaceItem.getName().equals(WorkspaceExplorerConstants.SPECIAL_FOLDERS_LABEL)) { itemName = "My VRE Folders"; } Item item = new Item(parent, workspaceItem.getId(), itemName, type, workspaceItem.getPath(), workspaceItem.getOwner().getPortalLogin(), workspaceItem.isFolder()); item.setSharedFolder(workspaceItem.getType()==WorkspaceItemType.SHARED_FOLDER); /* // Add temporary item if(Util.isFolder(item.getType())){ empty = new Item(parent, UUID.randomUUID().toString(), "empty", ItemType.UNKNOWN_TYPE, ""); item.addChild(empty); }*/ if(loadChildren){ for (WorkspaceItem child: workspaceItem.getChildren()){ Item itemChild = getItem(item, child, showableTypes, filterCriteria, false); if (itemChild!=null){ // item.removeChild(empty); item.addChild(itemChild); } } } // // Remove the temporary item when we finish loading // if(Util.isFolder(item.getType())&& item.getChildren().size()>1) // item.removeChild(empty); return item; } /** * Gets the item type. * * @param item the item * @return the item type * @throws InternalErrorException the internal error exception */ protected static ItemType getItemType(WorkspaceItem item) throws InternalErrorException { switch(item.getType()) { case SHARED_FOLDER: case FOLDER:{ if (item.isRoot()) return ItemType.ROOT; return ItemType.FOLDER; } case FOLDER_ITEM: return getFolderItemType((FolderItem) item); default: return null; } } /** * Gets the folder item type. * * @param item the item * @return the folder item type */ protected static ItemType getFolderItemType(FolderItem item) { //System.out.println("getFolderItemType "+item.getFolderItemType().toString()); return ItemType.valueOf(item.getFolderItemType().toString()); } /** * Filter item. * * @param type the type * @param item the item * @param filterCriteria the filter criteria * @return true, if successful * @throws InternalErrorException the internal error exception */ protected static boolean filterItem(ItemType type, WorkspaceItem item, FilterCriteria filterCriteria) throws InternalErrorException { boolean mimeTypeCheck = checkAllowedMimeTypes(type, item, filterCriteria.getAllowedMimeTypes()); if (!mimeTypeCheck) return false; boolean propertiesCheck = checkProperties(item, filterCriteria.getRequiredProperties()); return propertiesCheck; } /** * Check allowed mime types. * * @param type the type * @param item the item * @param allowedMimeTypes the allowed mime types * @return true, if successful */ protected static boolean checkAllowedMimeTypes(ItemType type, WorkspaceItem item, List allowedMimeTypes) { if (allowedMimeTypes.size()==0) return true; if (type == ItemType.EXTERNAL_FILE || type == ItemType.EXTERNAL_IMAGE || type == ItemType.EXTERNAL_PDF_FILE) { ExternalFile externalFile = (ExternalFile)item; String mimeType = externalFile.getMimeType(); return allowedMimeTypes.contains(mimeType); } return true; } /** * Check properties. * * @param item the item * @param requestedProperties the requested properties * @return true, if successful * @throws InternalErrorException the internal error exception */ protected static boolean checkProperties(WorkspaceItem item, Map requestedProperties) throws InternalErrorException { if (requestedProperties.size()==0 || item.getType()!=WorkspaceItemType.FOLDER_ITEM) return true; Map itemProperties = item.getProperties().getProperties(); for (Entry requestProperty:requestedProperties.entrySet()) { String propertyValue = itemProperties.get(requestProperty.getKey()); if (propertyValue == null) return false; if (!propertyValue.equals(requestProperty.getValue())) return false; } return true; } /** * Builds the folder to breadcrumbs. * * @param wsFolder the ws folder * @param parent the parent * @return the item * @throws InternalErrorException the internal error exception */ protected static Item buildFolderToBreadcrumbs(WorkspaceFolder wsFolder, Item parent) throws InternalErrorException { String name = ""; //MANAGEMENT SHARED FOLDER NAME if(wsFolder.isShared() && wsFolder.getType().equals(WorkspaceItemType.SHARED_FOLDER)){ WorkspaceSharedFolder shared = (WorkspaceSharedFolder) wsFolder; name = shared.isVreFolder()?shared.getDisplayName():wsFolder.getName(); //MANAGEMENT SPECIAL FOLDER }else if(wsFolder.getName().compareTo(WorkspaceExplorerConstants.SPECIAL_FOLDERS_LABEL)==0 && wsFolder.getParent()!=null && wsFolder.getParent().isRoot()){ name = WorkspaceExplorerConstants.VRE_FOLDERS_LABEL; }else name = wsFolder.getName(); return new Item(null, wsFolder.getId(), name, ItemType.FOLDER, "", wsFolder.getOwner().getPortalLogin(), wsFolder.isFolder()); } }