package org.atomhopper.abdera;
import org.apache.abdera.model.Workspace;
import org.apache.abdera.parser.stax.FOMWorkspace;
import org.apache.abdera.protocol.server.CollectionInfo;
import org.apache.abdera.protocol.server.RequestContext;
import org.apache.abdera.protocol.server.WorkspaceInfo;
import org.apache.commons.lang.StringUtils;
import org.atomhopper.config.v1_0.WorkspaceConfiguration;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class WorkspaceHandler implements WorkspaceInfo {
private final Map<String, TargetAwareAbstractCollectionAdapter> collectionAdapterMap;
private final WorkspaceConfiguration myConfig;
public WorkspaceHandler(WorkspaceConfiguration myConfig) {
this.myConfig = myConfig;
this.collectionAdapterMap = new HashMap<String, TargetAwareAbstractCollectionAdapter>();
}
public void addCollectionAdapter(String collectionId, TargetAwareAbstractCollectionAdapter adapter) {
collectionAdapterMap.put(collectionId, adapter);
}
public TargetAwareAbstractCollectionAdapter getAnsweringAdapter(RequestContext rc) {
final String feedSpec = rc.getTarget().getParameter(TargetResolverField.FEED.toString());
TargetAwareAbstractCollectionAdapter collectionAdapter = null;
if(!StringUtils.isBlank(feedSpec)) {
final String adapterKey = new StringBuilder().append("/")
.append(rc.getTarget().getParameter(TargetResolverField.WORKSPACE.toString()))
.append("/")
.append(feedSpec).toString();
if(myConfig.isEnableRegexFeeds()) {
Set<Entry<String, TargetAwareAbstractCollectionAdapter>> adapterEntries = collectionAdapterMap.entrySet();
for(Entry<String, TargetAwareAbstractCollectionAdapter> adapterEntry : adapterEntries) {
if(adapterKey.matches(adapterEntry.getKey())) {
collectionAdapter = adapterEntry.getValue();
break;
}
}
}
else{
collectionAdapter = collectionAdapterMap.get(adapterKey);
}
}
return collectionAdapter;
}
@Override
public Workspace asWorkspaceElement(RequestContext rc) {
return new FOMWorkspace(myConfig.getTitle());
}
@Override
public Collection<CollectionInfo> getCollections(RequestContext rc) {
return (Collection) Collections.unmodifiableCollection(collectionAdapterMap.values());
}
@Override
public String getTitle(RequestContext rc) {
return myConfig.getTitle();
}
}