/**********************************************************************************
* $URL: $
* $Id: $
***********************************************************************************
*
* 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.opensource.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.impl;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.content.api.ResourceToolAction;
import org.sakaiproject.content.api.ResourceToolActionPipe;
import org.sakaiproject.content.api.ResourceType;
import org.sakaiproject.content.api.ResourceTypeRegistry;
import org.sakaiproject.content.api.ServiceLevelAction;
import org.sakaiproject.content.api.SiteSpecificResourceType;
import org.sakaiproject.content.api.ResourceToolAction.ActionType;
import org.sakaiproject.javax.Filter;
/**
*
*
*/
public class ResourceTypeRegistryImpl implements ResourceTypeRegistry
{
/** Our logger. */
protected static final Log M_log = LogFactory.getLog(ResourceTypeRegistryImpl.class);
/** Map of ResourceType objects indexed by typeId */
protected Map<String, ResourceType> typeIndex = new HashMap<String, ResourceType>();
protected Map<String,Map<String,Boolean>> enabledTypesMap = new HashMap <String,Map<String,Boolean>>();
protected Map<String, ServiceLevelAction> multiItemActions = new HashMap<String, ServiceLevelAction>();
protected static final SortedSet<String> nativeTypes = new TreeSet<String>();
static
{
nativeTypes.add(ResourceType.TYPE_FOLDER);
nativeTypes.add(ResourceType.TYPE_TEXT);
nativeTypes.add(ResourceType.TYPE_UPLOAD);
nativeTypes.add(ResourceType.TYPE_URL);
nativeTypes.add(ResourceType.TYPE_HTML);
}
/**
* Final initialization, once all dependencies are set.
*/
public void init()
{
try
{
M_log.info("init()");
}
catch (Exception t)
{
}
}
/**
* Returns to uninitialized state.
*/
public void destroy()
{
M_log.info("destroy()");
}
/**
* @inheritDoc
*/
public ResourceType getType(String typeId)
{
return (ResourceType) typeIndex.get(typeId);
}
/**
* @inheritDoc
*/
public Collection getTypes()
{
List types = new ArrayList();
if(typeIndex != null)
{
types.addAll(typeIndex.values());
}
return types;
}
/**
* @inheritDoc
*/
public Collection getTypes(Filter filter)
{
List types = new ArrayList();
if(typeIndex != null)
{
Iterator it = typeIndex.values().iterator();
while(it.hasNext())
{
ResourceType type = (ResourceType) it.next();
if(filter.accept(type))
{
types.add(type);
}
}
}
return types;
}
/**
* @inheritDoc
*/
public void register(ResourceType type)
{
if(type == null || type.getId() == null)
{
return;
}
// System.out.println("----------> ResourceTypeRegistry.register(" + type.getId() + ", " + type.getLabel() + ")");
// List actions = type.getActions(null);
// Iterator it = actions.iterator();
// while(it.hasNext())
// {
// ResourceToolAction action = (ResourceToolAction) it.next();
// System.out.println(" > " + action.getId() + " ==> " + action.getLabel() );
//
// }
typeIndex.put(type.getId(), type);
for(ResourceToolAction action : type.getActions(Arrays.asList(ActionType.values())))
{
if(action instanceof ServiceLevelAction && ((ServiceLevelAction) action).isMultipleItemAction())
{
ResourceToolAction previouslyRegisteredAction = this.multiItemActions.get(action.getId());
if(previouslyRegisteredAction == null)
{
this.multiItemActions.put(action.getId(), (ServiceLevelAction) action);
}
else if(nativeTypes.contains(action.getTypeId()))
{
this.multiItemActions.put(action.getId(), (ServiceLevelAction) action);
}
}
}
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceTypeRegistry#newPipe(java.lang.String, org.sakaiproject.content.api.ResourceToolAction)
*/
public ResourceToolActionPipe newPipe(String initializationId, ResourceToolAction action)
{
ResourceToolActionPipe pipe = null;
switch(action.getActionType())
{
case NEW_UPLOAD:
pipe = new BasicMultiFileUploadPipe(initializationId, action);
break;
case NEW_FOLDER:
pipe = new BasicMultiFileUploadPipe(initializationId, action);
break;
case NEW_URLS:
pipe = new BasicMultiFileUploadPipe(initializationId, action);
break;
default:
pipe = new BasicResourceToolActionPipe(initializationId, action);
break;
}
return pipe;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceTypeRegistry#getAction(java.lang.String, java.lang.String)
*/
public ResourceToolAction getAction(String typeId, String actionId)
{
ResourceToolAction action = null;
ResourceType type = (ResourceType) typeIndex.get(typeId);
if(type != null)
{
action = type.getAction(actionId);
}
return action;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceTypeRegistry#mimetype2resourcetype(java.lang.String)
*/
public String mimetype2resourcetype(String contentType)
{
String typeId = ResourceType.TYPE_UPLOAD;
if(ResourceType.MIME_TYPE_HTML.equals(contentType))
{
typeId = ResourceType.TYPE_HTML;
}
else if(ResourceType.MIME_TYPE_TEXT.equals(contentType))
{
typeId = ResourceType.TYPE_TEXT;
}
else if(ResourceType.MIME_TYPE_URL.equals(contentType))
{
typeId = ResourceType.TYPE_URL;
}
else if(ResourceType.MIME_TYPE_METAOBJ.equals(contentType))
{
typeId = ResourceType.TYPE_METAOBJ;
}
else
{
// do nothing -- use ResourceType.TYPE_UPLOAD
typeId = ResourceType.TYPE_UPLOAD;
}
return typeId;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceTypeRegistry#getTypes(java.lang.String)
*/
public Collection<ResourceType> getTypes(String context)
{
List<ResourceType> typeDefs = new ArrayList<ResourceType>();
Map<String, Boolean> statusMap = getMapOfResourceTypesForContext(context);
for(ResourceType type : typeIndex.values())
{
if(statusMap.containsKey(type.getId()))
{
if(statusMap.get(type.getId()).booleanValue())
{
typeDefs.add(type);
}
}
else
{
typeDefs.add(type);
}
}
return typeDefs;
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceTypeRegistry#setResourceTypesForContext(java.lang.String, java.util.Map)
*/
public void setMapOfResourceTypesForContext(String context, Map<String, Boolean> enabled)
{
this.enabledTypesMap.put(context, new HashMap(enabled));
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceTypeRegistry#getResourceTypesForContext(java.lang.String)
*/
public Map<String, Boolean> getMapOfResourceTypesForContext(String context)
{
Map<String, Boolean> enabled = this.enabledTypesMap.get(context);
if(enabled == null)
{
enabled = new HashMap<String, Boolean>();
for(ResourceType type : this.typeIndex.values())
{
if(type instanceof SiteSpecificResourceType)
{
enabled.put(type.getId(), Boolean.valueOf(((SiteSpecificResourceType) type).isEnabledByDefault()));
}
}
return enabled;
}
return new HashMap<String, Boolean>(enabled);
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceTypeRegistry#getMultiItemActions()
*/
public Collection<ServiceLevelAction> getMultiItemActions()
{
return new ArrayList<ServiceLevelAction>(this.multiItemActions.values());
}
/* (non-Javadoc)
* @see org.sakaiproject.content.api.ResourceTypeRegistry#getMultiItemAction(java.lang.String)
*/
public ServiceLevelAction getMultiItemAction(String listActionId)
{
return this.multiItemActions.get(listActionId);
}
}