/** * */ 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; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * The Class ItemBuilder. * * @author Federico De Faveri defaveri@isti.cnr.it * Modified by Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it */ public class ItemBuilder { public static final Logger _log = LoggerFactory.getLogger(ItemBuilder.class); /** * 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; String itemName = workspaceItem.getName(); _log.info("Building Item for: "+itemName); // //TODO ADD CONTROL ON THE PATH WHEN WILL BE MORE FAST // if (itemName.equals(WorkspaceExplorerConstants.SPECIAL_FOLDERS_LABEL)) // itemName = WorkspaceExplorerConstants.VRE_FOLDERS_LABEL; boolean isFolder = false; if(type.equals(ItemType.FOLDER)) isFolder = true; //TODO ADD GET PATH WHEN WILL BE MORE FAST Item item = new Item(parent, workspaceItem.getId(), itemName, type, "", UserUtil.getUserFullName(workspaceItem.getOwner().getPortalLogin()), isFolder, false); item.setSharedFolder(workspaceItem.getType().equals(WorkspaceItemType.SHARED_FOLDER)); if(loadChildren){ for (WorkspaceItem child: workspaceItem.getChildren()){ _log.info("Converting child item: "+itemName); Item itemChild = getItem(item, child, showableTypes, filterCriteria, false); _log.info("Item: "+itemName +" converted!!!"); if (itemChild!=null){ item.addChild(itemChild); } } } 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){ try{ return ItemType.valueOf(item.getFolderItemType().toString()); }catch (Exception e) { _log.error("Item Type non found: ",e); return ItemType.UNKNOWN_TYPE; } } /** * 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 buildFolderForBreadcrumbs(WorkspaceFolder wsFolder, Item parent) throws InternalErrorException { String name = ""; boolean isSpecialFolder = false; boolean isRoot = false; if(wsFolder.isRoot()){ //IS ROOT name = WorkspaceExplorerConstants.HOME_LABEL; isRoot = true; }else if(wsFolder.isShared() && wsFolder.getType().equals(WorkspaceItemType.SHARED_FOLDER)){ //MANAGEMENT SHARED FOLDER NAME WorkspaceSharedFolder shared = (WorkspaceSharedFolder) wsFolder; name = shared.isVreFolder()?shared.getDisplayName():wsFolder.getName(); //MANAGEMENT SPECIAL FOLDER }else if(isSpecialFolder(wsFolder)){ name = WorkspaceExplorerConstants.VRE_FOLDERS_LABEL; isSpecialFolder = true; }else name = wsFolder.getName(); //BUILDS A SIMPLE ITEM FOR BREADCRUMB Item item = new Item(null, wsFolder.getId(), name, ItemType.FOLDER, "", null, true, isRoot); item.setSpecialFolder(isSpecialFolder); _log.debug("breadcrumb returning: "+item); return item; } public static boolean isSpecialFolder(WorkspaceFolder wsFolder){ try { return (wsFolder.getName().compareTo(WorkspaceExplorerConstants.SPECIAL_FOLDERS_NAME)==0 && wsFolder.getParent()!=null && wsFolder.getParent().isRoot()); } catch (InternalErrorException e) { _log.warn("isSpecialFolder exception, returning false"); return false; } } }