/**
* ****************************************************************************
* Copyright (C) 2009, 2013 BonitaSoft S.A.
* BonitaSoft is a trademark of BonitaSoft SA.
* This software file is BONITASOFT CONFIDENTIAL. Not For Distribution.
* For commercial licensing information, contact:
* BonitaSoft, 32 rue Gustave Eiffel – 38000 Grenoble
* or BonitaSoft US, 51 Federal Street, Suite 305, San Francisco, CA 94107
* *****************************************************************************
*/
package org.bonitasoft.web.rest.server;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.bonitasoft.web.rest.server.api.bdm.BusinessDataFindByIdsResource;
import org.bonitasoft.web.rest.server.api.bdm.BusinessDataFindByIdsResourceFinder;
import org.bonitasoft.web.rest.server.api.bdm.BusinessDataQueryResource;
import org.bonitasoft.web.rest.server.api.bdm.BusinessDataQueryResourceFinder;
import org.bonitasoft.web.rest.server.api.bdm.BusinessDataReferenceResource;
import org.bonitasoft.web.rest.server.api.bdm.BusinessDataReferenceResourceFinder;
import org.bonitasoft.web.rest.server.api.bdm.BusinessDataReferencesResource;
import org.bonitasoft.web.rest.server.api.bdm.BusinessDataReferencesResourceFinder;
import org.bonitasoft.web.rest.server.api.bdm.BusinessDataResource;
import org.bonitasoft.web.rest.server.api.bdm.BusinessDataResourceFinder;
import org.bonitasoft.web.rest.server.api.bpm.cases.ArchivedCaseContextResource;
import org.bonitasoft.web.rest.server.api.bpm.cases.ArchivedCaseContextResourceFinder;
import org.bonitasoft.web.rest.server.api.bpm.cases.CaseContextResource;
import org.bonitasoft.web.rest.server.api.bpm.cases.CaseContextResourceFinder;
import org.bonitasoft.web.rest.server.api.bpm.cases.CaseInfoResource;
import org.bonitasoft.web.rest.server.api.bpm.cases.CaseInfoResourceFinder;
import org.bonitasoft.web.rest.server.api.bpm.flownode.ActivityVariableResource;
import org.bonitasoft.web.rest.server.api.bpm.flownode.ActivityVariableResourceFinder;
import org.bonitasoft.web.rest.server.api.bpm.flownode.TimerEventTriggerResource;
import org.bonitasoft.web.rest.server.api.bpm.flownode.TimerEventTriggerResourceFinder;
import org.bonitasoft.web.rest.server.api.bpm.flownode.UserTaskContextResource;
import org.bonitasoft.web.rest.server.api.bpm.flownode.UserTaskContextResourceFinder;
import org.bonitasoft.web.rest.server.api.bpm.flownode.UserTaskContractResource;
import org.bonitasoft.web.rest.server.api.bpm.flownode.UserTaskContractResourceFinder;
import org.bonitasoft.web.rest.server.api.bpm.flownode.UserTaskExecutionResource;
import org.bonitasoft.web.rest.server.api.bpm.flownode.UserTaskExecutionResourceFinder;
import org.bonitasoft.web.rest.server.api.bpm.flownode.archive.ArchivedUserTaskContextResource;
import org.bonitasoft.web.rest.server.api.bpm.flownode.archive.ArchivedUserTaskContextResourceFinder;
import org.bonitasoft.web.rest.server.api.bpm.process.ProcessContractResource;
import org.bonitasoft.web.rest.server.api.bpm.process.ProcessContractResourceFinder;
import org.bonitasoft.web.rest.server.api.bpm.process.ProcessDefinitionDesignResource;
import org.bonitasoft.web.rest.server.api.bpm.process.ProcessDefinitionDesignResourceFinder;
import org.bonitasoft.web.rest.server.api.bpm.process.ProcessInstantiationResource;
import org.bonitasoft.web.rest.server.api.bpm.process.ProcessInstantiationResourceFinder;
import org.bonitasoft.web.rest.server.api.form.FormMappingResource;
import org.bonitasoft.web.rest.server.api.form.FormMappingResourceFinder;
import org.bonitasoft.web.rest.server.api.system.I18nTanslationResource;
import org.bonitasoft.web.rest.server.api.system.I18nTanslationResourceFinder;
import org.restlet.resource.Finder;
import org.restlet.resource.ServerResource;
public class FinderFactory {
protected Map<Class<? extends ServerResource>, ResourceFinder> finders;
List<ResourceFinder> resourceFinders = new ArrayList<>();
public FinderFactory() {
finders = getDefaultFinders();
createResourceFinderList(finders);
}
public FinderFactory(final Map<Class<? extends ServerResource>, ResourceFinder> finders) {
this.finders = finders;
createResourceFinderList(finders);
}
private void createResourceFinderList(final Map<Class<? extends ServerResource>, ResourceFinder> finders) {
for (final Map.Entry<Class<? extends ServerResource>, ResourceFinder> classFinderEntry : finders.entrySet()) {
final ResourceFinder resourceFinder = classFinderEntry.getValue();
resourceFinders.add(resourceFinder);
resourceFinder.setFinderFactory(this);
}
}
protected Map<Class<? extends ServerResource>, ResourceFinder> getDefaultFinders() {
final Map<Class<? extends ServerResource>, ResourceFinder> finders = new HashMap<>();
finders.put(ActivityVariableResource.class, new ActivityVariableResourceFinder());
finders.put(TimerEventTriggerResource.class, new TimerEventTriggerResourceFinder());
finders.put(CaseInfoResource.class, new CaseInfoResourceFinder());
finders.put(CaseContextResource.class, new CaseContextResourceFinder());
finders.put(ArchivedCaseContextResource.class, new ArchivedCaseContextResourceFinder());
finders.put(BusinessDataResource.class, new BusinessDataResourceFinder());
finders.put(BusinessDataReferenceResource.class, new BusinessDataReferenceResourceFinder());
finders.put(BusinessDataFindByIdsResource.class, new BusinessDataFindByIdsResourceFinder());
finders.put(BusinessDataReferencesResource.class, new BusinessDataReferencesResourceFinder());
finders.put(BusinessDataQueryResource.class, new BusinessDataQueryResourceFinder());
finders.put(FormMappingResource.class, new FormMappingResourceFinder());
finders.put(UserTaskContractResource.class, new UserTaskContractResourceFinder());
finders.put(UserTaskExecutionResource.class, new UserTaskExecutionResourceFinder());
finders.put(UserTaskContextResource.class, new UserTaskContextResourceFinder());
finders.put(ArchivedUserTaskContextResource.class, new ArchivedUserTaskContextResourceFinder());
finders.put(ProcessContractResource.class, new ProcessContractResourceFinder());
finders.put(ProcessDefinitionDesignResource.class, new ProcessDefinitionDesignResourceFinder());
finders.put(ProcessInstantiationResource.class, new ProcessInstantiationResourceFinder());
finders.put(I18nTanslationResource.class, new I18nTanslationResourceFinder());
return finders;
}
public Finder create(final Class<? extends ServerResource> clazz) {
final Finder finder = finders.get(clazz);
if (finder == null) {
throw new RuntimeException("Finder unimplemented for class " + clazz);
}
return finder;
}
public Finder createExtensionResource() {
return new ApiExtensionResourceFinder();
}
public ResourceFinder getResourceFinderFor(final Serializable object) {
for (final ResourceFinder resourceFinder : resourceFinders) {
if (resourceFinder.handlesResource(object)) {
return resourceFinder;
}
}
return null;
}
public Serializable getContextResultElement(final Serializable object) {
final ResourceFinder resourceFinderFor = getResourceFinderFor(object);
if (resourceFinderFor != null) {
return resourceFinderFor.toClientObject(object);
}
return object;
}
}