workspace-explorer/src/main/java/org/gcube/portlets/widgets/wsexplorer/server/ItemBuilder.java

501 lines
14 KiB
Java

/**
*
*/
package org.gcube.portlets.widgets.wsexplorer.server;
import java.util.Calendar;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.gcube.common.storagehub.client.plugins.AbstractPlugin;
import org.gcube.common.storagehub.client.proxies.ItemManagerClient;
import org.gcube.common.storagehub.model.items.AbstractFileItem;
import org.gcube.common.storagehub.model.items.FolderItem;
import org.gcube.common.storagehub.model.items.Item;
import org.gcube.common.storagehub.model.items.SharedFolder;
import org.gcube.common.storagehub.model.items.VreFolder;
import org.gcube.portlets.widgets.wsexplorer.client.Util;
import org.gcube.portlets.widgets.wsexplorer.client.WorkspaceExplorerConstants;
import org.gcube.portlets.widgets.wsexplorer.server.stohub.Whorespace;
import org.gcube.portlets.widgets.wsexplorer.shared.FilterCriteria;
import org.gcube.portlets.widgets.wsexplorer.shared.ItemDTO;
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 logger = LoggerFactory.getLogger(ItemBuilder.class);
/**
* Purge empty folders.
*
* @param item the item
* @return the item
*/
public static ItemDTO purgeEmptyFolders(ItemDTO item)
{
//for (Item child:item.getChildren()) purgeEmptyFolders(child); ONLY FIRST LEVEL
List<ItemDTO> toRemoveList = new LinkedList<ItemDTO>();
for (ItemDTO child:item.getChildren()) {
boolean toRemove = isAnEmptyFolder(child);
if (toRemove) {
toRemoveList.add(child);
}
}
for (ItemDTO 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(ItemDTO item)
{
return Util.isFolder(item.getType()) && item.getChildren().size() == 0;
}
/**
* Gets the item.
*
* @param parent the parent
* @param workspaceItem the workspace item
* @param workspaceItemPath the workspace item path
* @param showableTypes the showable types
* @param filterCriteria the filter criteria
* @param loadChildren the load children
* @param loadGcubeProperties the load gcube properties
* @return the item
* @throws InternalErrorException the internal error exception
*/
public static ItemDTO getItem(ItemDTO parent, Item workspaceItem, String workspaceItemPath,
List<ItemType> showableTypes, FilterCriteria filterCriteria,
boolean loadChildren, boolean loadGcubeProperties) {
ItemType type = getItemType(workspaceItem);
if (!showableTypes.contains(type)) {
return null;
}
if (!filterItem(type, workspaceItem, filterCriteria)) {
return null;
}
// //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 = type.equals(ItemType.PRIVATE_FOLDER)?true:false;
boolean isSharedFolder = (type.equals(ItemType.SHARED_FOLDER) || type.equals(ItemType.VRE_FOLDER )) ? true : false;
String itemName = workspaceItem.getName();
if(isSharedFolder){
logger.info("Is shared folder: "+workspaceItem.getTitle());
SharedFolder shared = (SharedFolder) workspaceItem;
itemName = shared.isVreFolder()?shared.getDisplayName():workspaceItem.getTitle();
}
// _log.debug("Building Item for: "+itemName);
ItemDTO item = null;
try{
item = new ItemDTO(parent, workspaceItem.getId(), itemName, type, workspaceItemPath, UserUtil.getUserFullName(workspaceItem.getOwner()), toDate(workspaceItem.getCreationTime()), isFolder, false);
item.setSharedFolder(isSharedFolder);
if(loadGcubeProperties){
Map<String, String> itemProperties = getGcubePropertiesForItem(workspaceItem);
item.setGcubeProperties(itemProperties);
}
}catch(Exception e){
logger.error("Error on getting item: "+itemName+" with id: "+workspaceItem.getId()+", from HL, so skipping item");
return null;
}
if(loadChildren){
String itemId = item.getId();
ItemManagerClient client = AbstractPlugin.item().build();
List<? extends Item> theChildren = null;
theChildren = client.getChildren(itemId, Whorespace.ACCOUNTING_HL_NODE_NAME);
for (Item child : theChildren) {
String itemPath = workspaceItemPath+"/"+child.getName();
ItemDTO itemChild = getItem(item, child, itemPath, showableTypes, filterCriteria, false, loadGcubeProperties);
logger.trace("Item: "+child.getName() +" converted!!!");
if (itemChild!=null){
item.addChild(itemChild);
}
}
}
return item;
}
/**
* Gets the item.
*
* @param parent the parent
* @param workspaceItem the workspace item
* @param workspaceItemPath the workspace item path
* @param showableTypes the showable types
* @param filterCriteria the filter criteria
* @param loadChildren the load children
* @param loadGcubeProperties the load gcube properties
* @param startIdx the start idx
* @param limit the limit
* @return the item
* @throws InternalErrorException the internal error exception
*/
public static ItemDTO getItem(ItemDTO parent, Item workspaceItem, String workspaceItemPath,
List<ItemType> showableTypes, FilterCriteria filterCriteria,
boolean loadChildren, boolean loadGcubeProperties, int startIdx, int limit) {
ItemType type = getItemType(workspaceItem);
if (!showableTypes.contains(type)) {
return null;
}
if (!filterItem(type, workspaceItem, filterCriteria)) {
return null;
}
boolean isFolder = type.equals(ItemType.PRIVATE_FOLDER)?true:false;
boolean isSharedFolder = (type.equals(ItemType.SHARED_FOLDER) || type.equals(ItemType.VRE_FOLDER )) ? true : false;
String itemName = workspaceItem.getName();
if(isSharedFolder){
logger.info("Is shared folder: "+workspaceItem.getTitle());
SharedFolder shared = (SharedFolder) workspaceItem;
itemName = shared.isVreFolder()?shared.getDisplayName():workspaceItem.getTitle();
}
// _log.debug("Building Item for: "+itemName);
ItemDTO item = null;
try{
//THIS CALL IS VERY SLOW!!
// String storageID = null;
// if(workspaceItem instanceof FolderItem){
// storageID = workspaceItem.getStorageID();
// }
item = new ItemDTO(parent, workspaceItem.getId(), itemName, type, workspaceItemPath, UserUtil.getUserFullName(workspaceItem.getOwner()), toDate(workspaceItem.getCreationTime()), isFolder, false);
item.setSharedFolder(isSharedFolder);
if(loadGcubeProperties){
Map<String, String> itemProperties = getGcubePropertiesForItem(workspaceItem);
item.setGcubeProperties(itemProperties);
}
}catch(Exception e){
logger.error("Error on getting item: "+itemName+" with id: "+workspaceItem.getId()+", from HL, so skipping item");
return null;
}
if(loadChildren){
String itemId = item.getId();
ItemManagerClient client = AbstractPlugin.item().build();
List<? extends Item> theChildren = null;
theChildren = client.getChildren(itemId, Whorespace.ACCOUNTING_HL_NODE_NAME);
for (Item child : theChildren) {
String itemPath = workspaceItemPath+"/"+child.getName();
ItemDTO itemChild = getItem(item, child, itemPath, showableTypes, filterCriteria, false, loadGcubeProperties);
logger.trace("Item: "+child.getName() +" 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(Item item) {
if (item instanceof AbstractFileItem) {
return ItemType.EXTERNAL_FILE;
}
else if (item instanceof FolderItem) {
return getFolderItemType(item);
}
logger.warn("Item Type non found: ");
return ItemType.UNKNOWN_TYPE;
}
/**
* Gets the folder item type.
*
* @param item the item
* @return the folder item type
*/
protected static ItemType getFolderItemType(Item item){
if (item instanceof SharedFolder || item instanceof VreFolder) {
SharedFolder folder = (SharedFolder) item;
if (folder.isVreFolder())
return ItemType.VRE_FOLDER;
return ItemType.SHARED_FOLDER;
} else if (item instanceof FolderItem) {
return ItemType.PRIVATE_FOLDER;
}
logger.warn("Item Type non found: ");
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, Item item, FilterCriteria filterCriteria) {
if(filterCriteria==null) {
return true;
}
boolean mimeTypeCheck = checkAllowedMimeTypes(type, item, filterCriteria.getAllowedMimeTypes());
if (!mimeTypeCheck) {
return false;
}
boolean fileExtensionCheck = checkAllowedFileExtension(type, item, filterCriteria.getAllowedFileExtensions());
if(!fileExtensionCheck) {
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, Item item, List<String> allowedMimeTypes){
if (allowedMimeTypes==null || allowedMimeTypes.size()==0) {
return true;
}
if (type == ItemType.EXTERNAL_FILE) {
String mimeType = "unknown"; //TODO
return allowedMimeTypes.contains(mimeType);
}
return true;
}
/**
* Check allowed file extension.
*
* @param type the type
* @param item the item
* @param allowedFileExtension the allowed mime types
* @return true, if successful
*/
protected static boolean checkAllowedFileExtension(ItemType type, Item item, List<String> allowedFileExtension){
if (allowedFileExtension==null || allowedFileExtension.size()==0) {
return true;
}
try {
if (item instanceof FolderItem) {
String name = item.getName();
return checkFileExtension(name, allowedFileExtension);
}
return true;
} catch (Exception e) {
logger.error("checkAllowedFileExtension, InternalErrorException: ",e);
return false;
}
}
/**
* Check file extension.
*
* @param fileName the file name
* @param allowedFileExtension the allowed file extension
* @return true, if successful
*/
protected static boolean checkFileExtension(String fileName, List<String> allowedFileExtension){
if(fileName==null || fileName.isEmpty()) {
return false;
}
int dot = fileName.lastIndexOf(".");
if(dot>=0 && dot+1<=fileName.length()){
String ext = fileName.substring(dot+1, fileName.length());
logger.trace("Extension found: "+ext +" for: "+fileName);
// if(ext.isEmpty())
// return false;
for (String fe : allowedFileExtension) {
if(ext.compareTo(fe)==0) {
return true;
}
}
return false;
}
logger.trace("Extension not found for: "+fileName);
return false;
}
/**
* 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(Item item, Map<String, String> requestedProperties)
{
if (requestedProperties==null || requestedProperties.size()==0 || (item instanceof FolderItem)) {
return true;
}
Map<String, String> itemProperties = getGcubePropertiesForItem(item);
if(itemProperties==null)
return false;
for (Entry<String, String> requestProperty:requestedProperties.entrySet()) {
String propertyValue = itemProperties.get(requestProperty.getKey());
if (propertyValue == null) {
return false;
}
if (!propertyValue.equals(requestProperty.getValue())) {
return false;
}
}
return true;
}
/**
* Gets the gcube properties for item.
*
* @param item the item
* @return the gcube properties for item
* @throws InternalErrorException the internal error exception
*/
protected static Map<String,String> getGcubePropertiesForItem(Item item) {
return null;
//TODO: see how to return this later
// try {
// return item.getProperties().getProperties();
// }
// catch (InternalErrorException e) {
// logger.warn("An error occurred during get properties for item: "+item.getId()+", returning null");
// return null;
// }
}
/**
* Builds the folder to breadcrumbs.
*
* @param wsFolder the ws folder
* @param parent the parent
* @return the item
* @throws InternalErrorException the internal error exception
*/
public static ItemDTO buildFolderForBreadcrumbs(FolderItem wsFolder, ItemDTO parent){
String name = "";
boolean isSpecialFolder = false;
boolean isRoot = false;
if(wsFolder.getParentId() == null){ //IS ROOT
name = WorkspaceExplorerConstants.HOME_LABEL;
isRoot = true;
}else if(wsFolder.isShared()){ //MANAGEMENT SHARED FOLDER NAME
SharedFolder shared = (SharedFolder) wsFolder;
name = shared.isVreFolder()?shared.getDisplayName():shared.getTitle();
//MANAGEMENT SPECIAL FOLDER
}else if(isSpecialFolder(wsFolder)){
name = WorkspaceExplorerConstants.VRE_FOLDERS_LABEL;
isSpecialFolder = true;
}
else {
name = wsFolder.getName();
}
//BUILDS A SIMPLE ITEM FOR BREADCRUMB
String path = null; //wsFolder.getPath(); FORCED TO NULL BECAUSE IS SLOW CALL
ItemDTO item = new ItemDTO(null, wsFolder.getId(), name, ItemType.FOLDER, path, null, null, true, isRoot);
item.setSpecialFolder(isSpecialFolder);
logger.debug("breadcrumb returning: "+item);
return item;
}
/**
* Checks if is special folder.
*
* @param wsFolder the ws folder
* @return true, if is special folder
*/
public static boolean isSpecialFolder(FolderItem wsFolder){
return (wsFolder.getName().compareTo("MySpecialFolder") == 0);
}
/**
* To date.
*
* @param calendar the calendar
* @return the date
*/
public static Date toDate(Calendar calendar)
{
if (calendar == null) return null;
return calendar.getTime();
}
/*
public static void main(String[] args) {
List<String> allowedFileExtension = new ArrayList<String>();
allowedFileExtension.add("csv");
allowedFileExtension.add("");
String fileName = "t";
System.out.println(checkFileExtension(fileName, allowedFileExtension));
}*/
}