/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/content/branches/sakai-2.8.1/content-types/src/java/org/sakaiproject/content/types/FolderType.java $
* $Id: FolderType.java 79978 2010-07-28 11:28:01Z david.horwitz@uct.ac.za $
***********************************************************************************
*
* Copyright (c) 2006, 2007, 2008 Sakai Foundation
*
* Licensed under the Educational Community License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.osedu.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
**********************************************************************************/
package org.sakaiproject.content.types;
import java.util.ArrayList;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.sakaiproject.authz.api.PermissionsHelper;
import org.sakaiproject.component.cover.ComponentManager;
import org.sakaiproject.component.cover.ServerConfigurationService;
import org.sakaiproject.content.api.ContentCollection;
import org.sakaiproject.content.api.ContentEntity;
import org.sakaiproject.content.api.ContentHostingService;
import org.sakaiproject.content.api.ExpandableResourceType;
import org.sakaiproject.content.api.InteractionAction;
import org.sakaiproject.content.api.ResourceToolAction;
import org.sakaiproject.content.api.ResourceType;
import org.sakaiproject.content.api.ServiceLevelAction;
import org.sakaiproject.content.api.ResourceToolAction.ActionType;
import org.sakaiproject.content.util.ZipContentUtil;
import org.sakaiproject.content.util.BaseInteractionAction;
import org.sakaiproject.content.util.BaseResourceType;
import org.sakaiproject.entity.api.Reference;
import org.sakaiproject.entity.api.ResourceProperties;
import org.sakaiproject.entity.cover.EntityManager;
import org.sakaiproject.site.cover.SiteService;
import org.sakaiproject.tool.api.ToolSession;
import org.sakaiproject.tool.cover.SessionManager;
import org.sakaiproject.user.api.UserDirectoryService;
import org.sakaiproject.util.Resource;
import org.sakaiproject.util.ResourceLoader;
public class FolderType extends BaseResourceType implements ExpandableResourceType
{
protected String typeId = ResourceType.TYPE_FOLDER;
protected String helperId = "sakai.resource.type.helper";
// private static final String RESOURCES_ZIP_ENABLE = "resources.zip.enable"; //sakai.properties hack
/** localized tool properties **/
private static final String DEFAULT_RESOURCECLASS = "org.sakaiproject.localization.util.TypeProperties";
private static final String DEFAULT_RESOURCEBUNDLE = "org.sakaiproject.localization.bundle.type.types";
private static final String RESOURCECLASS = "resource.class.type";
private static final String RESOURCEBUNDLE = "resource.bundle.type";
private String resourceClass = ServerConfigurationService.getString(RESOURCECLASS, DEFAULT_RESOURCECLASS);
private String resourceBundle = ServerConfigurationService.getString(RESOURCEBUNDLE, DEFAULT_RESOURCEBUNDLE);
private ResourceLoader rb = new Resource().getLoader(resourceClass, resourceBundle);
// private static ResourceLoader rb = new ResourceLoader("types");
protected EnumMap<ResourceToolAction.ActionType, List<ResourceToolAction>> actionMap = new EnumMap<ResourceToolAction.ActionType, List<ResourceToolAction>>(ResourceToolAction.ActionType.class);
protected Map<String, ResourceToolAction> actions = new HashMap<String, ResourceToolAction>();
protected UserDirectoryService userDirectoryService;
protected ContentHostingService contentService;
public FolderType()
{
this.userDirectoryService = (UserDirectoryService) ComponentManager.get("org.sakaiproject.user.api.UserDirectoryService");
//actions.put(ResourceToolAction.PASTE_MOVED, new FolderPasteMovedAction());
//actions.put(ResourceToolAction.PASTE_COPIED, new FolderPasteCopiedAction());
actions.put(ResourceToolAction.CREATE, new FolderCreateAction());
actions.put(ResourceToolAction.ACCESS_PROPERTIES, new FolderViewPropertiesAction());
actions.put(ResourceToolAction.REVISE_METADATA, new FolderPropertiesAction());
//actions.put(ResourceToolAction.DUPLICATE, new FolderDuplicateAction());
actions.put(ResourceToolAction.PASTE_COPIED, new FolderPasteCopyAction());
actions.put(ResourceToolAction.PASTE_MOVED, new FolderPasteMoveAction());
actions.put(ResourceToolAction.COPY, new FolderCopyAction());
actions.put(ResourceToolAction.MOVE, new FolderMoveAction());
actions.put(ResourceToolAction.DELETE, new FolderDeleteAction());
actions.put(ResourceToolAction.REORDER, new FolderReorderAction());
actions.put(ResourceToolAction.PERMISSIONS, new FolderPermissionsAction());
actions.put(ResourceToolAction.EXPAND, new FolderExpandAction());
actions.put(ResourceToolAction.COLLAPSE, new FolderCollapseAction());
// [WARN] Archive file handling compress/decompress feature contains bugs; exclude action item.
// Disable property setting masking problematic code per will of the Community.
// See Jira KNL-155/SAK-800 for more details.
/*
if (ServerConfigurationService.getBoolean(RESOURCES_ZIP_ENABLE,false)) {
actions.put(ResourceToolAction.COMPRESS_ZIP_FOLDER, new FolderCompressAction());
}
*/
// initialize actionMap with an empty List for each ActionType
for(ResourceToolAction.ActionType type : ResourceToolAction.ActionType.values())
{
actionMap.put(type, new ArrayList<ResourceToolAction>());
}
// for each action in actions, add a link in actionMap
Iterator<String> it = actions.keySet().iterator();
while(it.hasNext())
{
String id = it.next();
ResourceToolAction action = actions.get(id);
List<ResourceToolAction> list = actionMap.get(action.getActionType());
if(list == null)
{
list = new ArrayList<ResourceToolAction>();
actionMap.put(action.getActionType(), list);
}
list.add(action);
}
}
public class FolderPasteCopyAction implements ServiceLevelAction
{
public void cancelAction(Reference reference)
{
// no activity required
}
public void finalizeAction(Reference reference)
{
// no activity required
}
public void initializeAction(Reference reference)
{
// no activity required
}
public boolean isMultipleItemAction()
{
return false;
}
public boolean available(ContentEntity entity)
{
return true;
}
public ActionType getActionType()
{
return ActionType.PASTE_COPIED;
}
public String getId()
{
return ResourceToolAction.PASTE_COPIED;
}
public String getLabel()
{
return rb.getString("action.pastecopy");
}
public String getTypeId()
{
return typeId;
}
}
public class FolderPasteMoveAction implements ServiceLevelAction
{
public void cancelAction(Reference reference)
{
// no activity required
}
public void finalizeAction(Reference reference)
{
// no activity required
}
public void initializeAction(Reference reference)
{
// no activity required
}
public boolean isMultipleItemAction()
{
return false;
}
public boolean available(ContentEntity entity)
{
return true;
}
public ActionType getActionType()
{
return ActionType.PASTE_MOVED;
}
public String getId()
{
return ResourceToolAction.PASTE_MOVED;
}
public String getLabel()
{
return rb.getString("action.pastemove");
}
public String getTypeId()
{
return typeId;
}
}
public class FolderPermissionsAction implements InteractionAction
{
/* (non-Javadoc)
* @see org.sakaiproject.content.api.InteractionAction#cancelAction(org.sakaiproject.entity.api.Reference, java.lang.String)
*/
public void cancelAction(Reference reference, String initializationId)
{
// nothing to do
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.InteractionAction#finalizeAction(org.sakaiproject.entity.api.Reference, java.lang.String)
*/
public void finalizeAction(Reference reference, String initializationId)
{
// nothing to do
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.InteractionAction#getHelperId()
*/
public String getHelperId()
{
return "sakai.permissions.helper";
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.InteractionAction#getRequiredPropertyKeys()
*/
public List getRequiredPropertyKeys()
{
// TODO Auto-generated method stub
return null;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.InteractionAction#initializeAction(org.sakaiproject.entity.api.Reference)
*/
public String initializeAction(Reference reference)
{
ToolSession toolSession = SessionManager.getCurrentToolSession();
toolSession.setAttribute(PermissionsHelper.TARGET_REF, reference.getReference());
// use the folder's context (as a site) for roles
String siteRef = SiteService.siteReference(reference.getContext());
toolSession.setAttribute(PermissionsHelper.ROLES_REF, siteRef);
// ... with this description
String title = reference.getProperties().getProperty(ResourceProperties.PROP_DISPLAY_NAME);
String[] args = { title };
toolSession.setAttribute(PermissionsHelper.DESCRIPTION, rb.getFormattedMessage("title.permissions", args));
// ... showing only locks that are prpefixed with this
toolSession.setAttribute(PermissionsHelper.PREFIX, "content.");
return BaseInteractionAction.getInitializationId(reference.getReference(), this.getTypeId(), this.getId());
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#available(java.lang.String)
*/
public boolean available(ContentEntity entity)
{
boolean ok = true;
if(entity == null || ContentHostingService.ROOT_COLLECTIONS.contains(entity.getId()))
{
ok = false;
}
else if(entity.getId().startsWith(ContentHostingService.COLLECTION_DROPBOX))
{
ok = false;
}
else
{
ContentCollection parent = entity.getContainingCollection();
if(parent == null)
{
ok = false;
}
}
return ok;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#getActionType()
*/
public ActionType getActionType()
{
// TODO Auto-generated method stub
return ActionType.REVISE_PERMISSIONS;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#getId()
*/
public String getId()
{
// TODO Auto-generated method stub
return ResourceToolAction.PERMISSIONS;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#getLabel()
*/
public String getLabel()
{
// TODO Auto-generated method stub
return rb.getString("action.permissions");
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#getTypeId()
*/
public String getTypeId()
{
// TODO Auto-generated method stub
return typeId;
}
}
public class FolderReorderAction implements ServiceLevelAction
{
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ServiceLevelAction#cancelAction(org.sakaiproject.entity.api.Reference)
*/
public void cancelAction(Reference reference)
{
// nothing to do
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ServiceLevelAction#finalizeAction(org.sakaiproject.entity.api.Reference)
*/
public void finalizeAction(Reference reference)
{
// nothing to do
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ServiceLevelAction#initializeAction(org.sakaiproject.entity.api.Reference)
*/
public void initializeAction(Reference reference)
{
// nothing to do
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ServiceLevelAction#isMultipleItemAction()
*/
public boolean isMultipleItemAction()
{
return false;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#available(java.lang.String)
*/
public boolean available(ContentEntity entity)
{
boolean isAvailable = true;
if(entity != null && entity instanceof ContentCollection)
{
isAvailable = ((ContentCollection) entity).getMemberCount() > 1;
}
return isAvailable;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#getActionType()
*/
public ActionType getActionType()
{
return ActionType.REVISE_ORDER;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#getId()
*/
public String getId()
{
return ResourceToolAction.REORDER;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#getLabel()
*/
public String getLabel()
{
return rb.getString("action.reorder");
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#getTypeId()
*/
public String getTypeId()
{
return typeId;
}
}
public class FolderPasteMovedAction implements ServiceLevelAction
{
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#available(java.lang.String)
*/
public boolean available(ContentEntity entity)
{
return true;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#getActionType()
*/
public ActionType getActionType()
{
return ResourceToolAction.ActionType.PASTE_MOVED;
}
public String getId()
{
return ResourceToolAction.PASTE_MOVED;
}
public String getLabel()
{
return rb.getString("action.paste");
}
public boolean isMultipleItemAction()
{
return false;
}
public String getTypeId()
{
return typeId;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ServiceLevelAction#cancelAction(org.sakaiproject.entity.api.Reference)
*/
public void cancelAction(Reference reference)
{
// do nothing
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ServiceLevelAction#finalizeAction(org.sakaiproject.entity.api.Reference)
*/
public void finalizeAction(Reference reference)
{
// do nothing
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ServiceLevelAction#initializeAction(org.sakaiproject.entity.api.Reference)
*/
public void initializeAction(Reference reference)
{
// do nothing
}
}
public class FolderPasteCopiedAction implements ServiceLevelAction
{
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#available(java.lang.String)
*/
public boolean available(ContentEntity entity)
{
return true;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#getActionType()
*/
public ActionType getActionType()
{
return ResourceToolAction.ActionType.PASTE_COPIED;
}
public String getId()
{
return ResourceToolAction.PASTE_COPIED;
}
public String getLabel()
{
return rb.getString("action.paste");
}
public boolean isMultipleItemAction()
{
return false;
}
public String getTypeId()
{
return typeId;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ServiceLevelAction#cancelAction(org.sakaiproject.entity.api.Reference)
*/
public void cancelAction(Reference reference)
{
// do nothing
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ServiceLevelAction#finalizeAction(org.sakaiproject.entity.api.Reference)
*/
public void finalizeAction(Reference reference)
{
// do nothing
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ServiceLevelAction#initializeAction(org.sakaiproject.entity.api.Reference)
*/
public void initializeAction(Reference reference)
{
// do nothing
}
}
public class FolderCopyAction implements ServiceLevelAction
{
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#available(java.lang.String)
*/
public boolean available(ContentEntity entity)
{
boolean ok = true;
if(entity == null || ContentHostingService.ROOT_COLLECTIONS.contains(entity.getId()))
{
ok = false;
}
else
{
ContentCollection parent = entity.getContainingCollection();
if(parent == null)
{
ok = false;
}
}
return ok;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#getActionType()
*/
public ActionType getActionType()
{
return ResourceToolAction.ActionType.COPY;
}
public String getId()
{
return ResourceToolAction.COPY;
}
public String getLabel()
{
return rb.getString("action.copy");
}
public boolean isMultipleItemAction()
{
return true;
}
public String getTypeId()
{
return typeId;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ServiceLevelAction#cancelAction(org.sakaiproject.entity.api.Reference)
*/
public void cancelAction(Reference reference)
{
// do nothing
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ServiceLevelAction#finalizeAction(org.sakaiproject.entity.api.Reference)
*/
public void finalizeAction(Reference reference)
{
// do nothing
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ServiceLevelAction#initializeAction(org.sakaiproject.entity.api.Reference)
*/
public void initializeAction(Reference reference)
{
// do nothing
}
}
public class FolderCreateAction implements InteractionAction
{
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#available(java.lang.String)
*/
public boolean available(ContentEntity entity)
{
return true;
}
public void cancelAction(Reference reference, String initializationId)
{
// do nothing
}
public void finalizeAction(Reference reference, String initializationId)
{
// do nothing
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#getActionType()
*/
public ActionType getActionType()
{
return ResourceToolAction.ActionType.NEW_FOLDER;
}
public String getId()
{
return ResourceToolAction.CREATE;
}
public String getLabel()
{
return rb.getString("create.folder");
}
public String getTypeId()
{
return typeId;
}
public String getHelperId()
{
return helperId;
}
public List getRequiredPropertyKeys()
{
return null;
}
public String initializeAction(Reference reference)
{
return BaseInteractionAction.getInitializationId(reference.getReference(), this.getTypeId(), this.getId());
}
}
public class FolderDeleteAction implements ServiceLevelAction
{
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#available(java.lang.String)
*/
public boolean available(ContentEntity entity)
{
boolean ok = true;
if(entity == null || ContentHostingService.ROOT_COLLECTIONS.contains(entity.getId()))
{
ok = false;
}
else
{
ContentCollection parent = entity.getContainingCollection();
if(parent == null)
{
ok = false;
}
else
{
ContentCollection grandparent = parent.getContainingCollection();
if(grandparent != null && ContentHostingService.COLLECTION_DROPBOX.equals(grandparent.getId()))
{
Reference ref = EntityManager.newReference(entity.getReference());
if(ref != null)
{
String siteId = ref.getContext();
if(siteId != null)
{
if(contentService == null)
{
contentService = (ContentHostingService) ComponentManager.get(ContentHostingService.class);
}
String dropboxId = contentService.getDropboxCollection(siteId);
if(entity.getId().equals(dropboxId))
{
ok = false;
}
}
}
}
}
}
// remove member count as condition for deletion - SAK-11790
// if(ok && entity instanceof ContentCollection)
// {
// ok = (((ContentCollection) entity).getMemberCount() == 0);
// }
return ok;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#getActionType()
*/
public ActionType getActionType()
{
return ResourceToolAction.ActionType.DELETE;
}
public String getId()
{
return ResourceToolAction.DELETE;
}
public String getLabel()
{
return rb.getString("action.delete");
}
public boolean isMultipleItemAction()
{
return true;
}
public String getTypeId()
{
return typeId;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ServiceLevelAction#cancelAction(org.sakaiproject.entity.api.Reference)
*/
public void cancelAction(Reference reference)
{
// do nothing
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ServiceLevelAction#finalizeAction(org.sakaiproject.entity.api.Reference)
*/
public void finalizeAction(Reference reference)
{
// do nothing
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ServiceLevelAction#initializeAction(org.sakaiproject.entity.api.Reference)
*/
public void initializeAction(Reference reference)
{
// do nothing
}
}
public class FolderDuplicateAction implements ServiceLevelAction
{
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#available(java.lang.String)
*/
public boolean available(ContentEntity entity)
{
boolean ok = true;
if(entity == null || ContentHostingService.ROOT_COLLECTIONS.contains(entity.getId()))
{
ok = false;
}
else
{
ContentCollection parent = entity.getContainingCollection();
if(parent == null)
{
ok = false;
}
}
return ok;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#getActionType()
*/
public ActionType getActionType()
{
return ResourceToolAction.ActionType.DUPLICATE;
}
public String getId()
{
return ResourceToolAction.DUPLICATE;
}
public String getLabel()
{
return rb.getString("action.duplicate");
}
public boolean isMultipleItemAction()
{
return false;
}
public String getTypeId()
{
return typeId;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ServiceLevelAction#cancelAction(org.sakaiproject.entity.api.Reference)
*/
public void cancelAction(Reference reference)
{
// do nothing
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ServiceLevelAction#finalizeAction(org.sakaiproject.entity.api.Reference)
*/
public void finalizeAction(Reference reference)
{
// do nothing
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ServiceLevelAction#initializeAction(org.sakaiproject.entity.api.Reference)
*/
public void initializeAction(Reference reference)
{
// do nothing
}
}
public class FolderPropertiesAction implements ServiceLevelAction
{
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#available(java.lang.String)
*/
public boolean available(ContentEntity entity)
{
boolean ok = true;
// if(entity == null || ContentHostingService.ROOT_COLLECTIONS.contains(entity.getId()))
// {
// ok = false;
// }
// else if(entity.getId().startsWith(ContentHostingService.COLLECTION_DROPBOX))
// {
// ok = false;
// }
// else
// {
// ContentCollection parent = entity.getContainingCollection();
// if(parent == null || ContentHostingService.ROOT_COLLECTIONS.contains(parent.getId()))
// {
// ok = false;
// }
// }
return ok;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ServiceLevelAction#cancelAction(org.sakaiproject.entity.api.Reference)
*/
public void cancelAction(Reference reference)
{
// do nothing
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ServiceLevelAction#finalizeAction(org.sakaiproject.entity.api.Reference)
*/
public void finalizeAction(Reference reference)
{
// do nothing
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ServiceLevelAction#initializeAction(org.sakaiproject.entity.api.Reference)
*/
public void initializeAction(Reference reference)
{
// do nothing
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ServiceLevelAction#isMultipleItemAction()
*/
public boolean isMultipleItemAction()
{
return false;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#getActionType()
*/
public ActionType getActionType()
{
return ResourceToolAction.ActionType.REVISE_METADATA;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#getId()
*/
public String getId()
{
return ResourceToolAction.REVISE_METADATA;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#getLabel()
*/
public String getLabel()
{
return rb.getString("action.props");
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#getTypeId()
*/
public String getTypeId()
{
return typeId;
}
}
public class FolderViewPropertiesAction implements ServiceLevelAction
{
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#available(java.lang.String)
*/
public boolean available(ContentEntity entity)
{
return true;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ServiceLevelAction#cancelAction(org.sakaiproject.entity.api.Reference)
*/
public void cancelAction(Reference reference)
{
// do nothing
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ServiceLevelAction#finalizeAction(org.sakaiproject.entity.api.Reference)
*/
public void finalizeAction(Reference reference)
{
// do nothing
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ServiceLevelAction#initializeAction(org.sakaiproject.entity.api.Reference)
*/
public void initializeAction(Reference reference)
{
// do nothing
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ServiceLevelAction#isMultipleItemAction()
*/
public boolean isMultipleItemAction()
{
return false;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#getActionType()
*/
public ActionType getActionType()
{
return ResourceToolAction.ActionType.VIEW_METADATA;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#getId()
*/
public String getId()
{
return ResourceToolAction.ACCESS_PROPERTIES;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#getLabel()
*/
public String getLabel()
{
return rb.getString("action.access");
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#getTypeId()
*/
public String getTypeId()
{
return typeId;
}
}
public class FolderMoveAction implements ServiceLevelAction
{
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#available(java.lang.String)
*/
public boolean available(ContentEntity entity)
{
boolean ok = true;
if(entity == null || ContentHostingService.ROOT_COLLECTIONS.contains(entity.getId()))
{
ok = false;
}
else if(entity.getId().startsWith(ContentHostingService.COLLECTION_DROPBOX))
{
ok = false;
}
else
{
ContentCollection parent = entity.getContainingCollection();
if(parent == null)
{
ok = false;
}
}
return ok;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#getActionType()
*/
public ActionType getActionType()
{
return ResourceToolAction.ActionType.MOVE;
}
public String getId()
{
return ResourceToolAction.MOVE;
}
public String getLabel()
{
return rb.getString("action.move");
}
public boolean isMultipleItemAction()
{
return true;
}
public String getTypeId()
{
return typeId;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ServiceLevelAction#cancelAction(org.sakaiproject.entity.api.Reference)
*/
public void cancelAction(Reference reference)
{
// do nothing
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ServiceLevelAction#finalizeAction(org.sakaiproject.entity.api.Reference)
*/
public void finalizeAction(Reference reference)
{
// do nothing
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ServiceLevelAction#initializeAction(org.sakaiproject.entity.api.Reference)
*/
public void initializeAction(Reference reference)
{
// do nothing
}
}
public class FolderReviseAction implements InteractionAction
{
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#available(java.lang.String)
*/
public boolean available(ContentEntity entity)
{
return true;
}
public void cancelAction(Reference reference, String initializationId)
{
// do nothing
}
public void finalizeAction(Reference reference, String initializationId)
{
// do nothing
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#getActionType()
*/
public ActionType getActionType()
{
return ResourceToolAction.ActionType.REPLACE_CONTENT;
}
public String getId()
{
return ResourceToolAction.REVISE_CONTENT;
}
public String getLabel()
{
return rb.getString("action.revise");
}
public String getTypeId()
{
return typeId;
}
public String getHelperId()
{
return helperId;
}
public List getRequiredPropertyKeys()
{
return null;
}
public String initializeAction(Reference reference)
{
return BaseInteractionAction.getInitializationId(reference.getReference(), this.getTypeId(), this.getId());
}
}
public class FolderAccessAction implements InteractionAction
{
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#available(java.lang.String)
*/
public boolean available(ContentEntity entity)
{
return true;
}
public String initializeAction(Reference reference)
{
return BaseInteractionAction.getInitializationId(reference.getReference(), this.getTypeId(), this.getId());
}
public void cancelAction(Reference reference, String initializationId)
{
// do nothing
}
public void finalizeAction(Reference reference, String initializationId)
{
// do nothing
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceToolAction#getActionType()
*/
public ActionType getActionType()
{
return ResourceToolAction.ActionType.VIEW_CONTENT;
}
public String getId()
{
return ResourceToolAction.ACCESS_CONTENT;
}
public String getLabel()
{
return rb.getString("action.access");
}
public String getTypeId()
{
return typeId;
}
public String getHelperId()
{
return helperId;
}
public List getRequiredPropertyKeys()
{
return null;
}
}
public class FolderExpandAction implements ServiceLevelAction
{
public void cancelAction(Reference reference)
{
}
public void finalizeAction(Reference reference)
{
}
public void initializeAction(Reference reference)
{
}
public boolean isMultipleItemAction()
{
return false;
}
public boolean available(ContentEntity entity)
{
boolean isAvailable = (entity != null);
if(isAvailable && entity instanceof ContentCollection)
{
ContentCollection collection = (ContentCollection) entity;
int memberCount = collection.getMemberCount();
isAvailable = (memberCount > 0) && (memberCount < ResourceType.EXPANDABLE_FOLDER_SIZE_LIMIT);
}
return isAvailable;
}
public ActionType getActionType()
{
return ActionType.EXPAND_FOLDER;
}
public String getId()
{
return ResourceToolAction.EXPAND;
}
public String getLabel()
{
return rb.getString("expand.item");
}
public String getTypeId()
{
return typeId;
}
}
public class FolderCollapseAction implements ServiceLevelAction
{
public void cancelAction(Reference reference)
{
}
public void finalizeAction(Reference reference)
{
}
public void initializeAction(Reference reference)
{
}
public boolean isMultipleItemAction()
{
return false;
}
public boolean available(ContentEntity entity)
{
return true;
}
public ActionType getActionType()
{
return ActionType.COLLAPSE_FOLDER;
}
public String getId()
{
return ResourceToolAction.COLLAPSE;
}
public String getLabel()
{
return rb.getString("collapse.item");
}
public String getTypeId()
{
return typeId;
}
}
public class FolderCompressAction implements ServiceLevelAction {
private ZipContentUtil zipUtil = new ZipContentUtil();
public void cancelAction(Reference reference) {
// TODO Auto-generated method stub
}
public void finalizeAction(Reference reference) {
// TODO Auto-generated method stub
}
public void initializeAction(Reference reference) {
try {
zipUtil.compressFolder(reference);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
public boolean isMultipleItemAction() {
// TODO Auto-generated method stub
return false;
}
public boolean available(ContentEntity entity) {
return true;
}
public ActionType getActionType() {
return ResourceToolAction.ActionType.COMPRESS_ZIP_FOLDER;
}
public String getId() {
return ResourceToolAction.COMPRESS_ZIP_FOLDER;
}
public String getLabel() {
return rb.getString("action.compresszipfolder");
}
public String getTypeId() {
return typeId;
}
}
public ResourceToolAction getAction(String actionId)
{
return (ResourceToolAction) actions.get(actionId);
}
public String getIconLocation(ContentEntity entity, boolean expanded)
{
String iconLocation = "sakai/dir_openroot.gif";
if(entity.isCollection())
{
ContentCollection collection = (ContentCollection) entity;
int memberCount = collection.getMemberCount();
if(memberCount == 0)
{
iconLocation = "sakai/dir_closed.gif";
}
else if(memberCount > ResourceType.EXPANDABLE_FOLDER_SIZE_LIMIT)
{
iconLocation = "sakai/dir_unexpand.gif";
}
else if(expanded)
{
iconLocation = "sakai/dir_openminus.gif";
}
else
{
iconLocation = "sakai/dir_closedplus.gif";
}
}
return iconLocation;
}
public String getIconLocation(ContentEntity entity)
{
String iconLocation = "sakai/dir_openroot.gif";
if(entity != null && entity.isCollection())
{
ContentCollection collection = (ContentCollection) entity;
int memberCount = collection.getMemberCount();
if(memberCount == 0)
{
iconLocation = "sakai/dir_closed.gif";
}
else if(memberCount > ResourceType.EXPANDABLE_FOLDER_SIZE_LIMIT)
{
iconLocation = "sakai/dir_unexpand.gif";
}
}
return iconLocation;
}
public String getId()
{
return typeId;
}
public String getLabel()
{
return rb.getString("type.folder");
}
public String getLocalizedHoverText(ContentEntity entity, boolean expanded)
{
String hoverText = rb.getString("type.folder");
if(entity.isCollection())
{
ContentCollection collection = (ContentCollection) entity;
int memberCount = collection.getMemberCount();
if(memberCount == 0)
{
hoverText = rb.getString("type.folder");
}
else if(memberCount > ResourceType.EXPANDABLE_FOLDER_SIZE_LIMIT)
{
hoverText = rb.getString("list.toobig");
}
else if(expanded)
{
hoverText = rb.getString("sh.close");
}
else
{
hoverText = rb.getString("sh.open");
}
}
return hoverText;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceType#getLocalizedHoverText(org.sakaiproject.entity.api.Reference)
*/
public String getLocalizedHoverText(ContentEntity member)
{
return rb.getString("type.folder");
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceType#getActions(org.sakaiproject.content.api.ResourceType.ActionType)
*/
public List<ResourceToolAction> getActions(ActionType type)
{
List<ResourceToolAction> list = actionMap.get(type);
if(list == null)
{
list = new ArrayList<ResourceToolAction>();
actionMap.put(type, list);
}
return new ArrayList<ResourceToolAction>(list);
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceType#getActions(java.util.List)
*/
public List<ResourceToolAction> getActions(List<ActionType> types)
{
List<ResourceToolAction> list = new ArrayList<ResourceToolAction>();
if(types != null)
{
Iterator<ActionType> it = types.iterator();
while(it.hasNext())
{
ActionType type = it.next();
List<ResourceToolAction> sublist = actionMap.get(type);
if(sublist == null)
{
sublist = new ArrayList<ResourceToolAction>();
actionMap.put(type, sublist);
}
list.addAll(sublist);
}
}
return list;
}
public boolean hasRightsDialog()
{
return false;
}
public ServiceLevelAction getCollapseAction()
{
return (ServiceLevelAction) this.actions.get(ResourceToolAction.COLLAPSE);
}
public ServiceLevelAction getExpandAction()
{
return (ServiceLevelAction) this.actions.get(ResourceToolAction.EXPAND);
}
public boolean allowAddAction(ResourceToolAction action, ContentEntity entity)
{
// allow all add actions in regular folders
return true;
}
}