package org.activityinfo.legacy.shared.adapter; import com.google.common.base.Function; import org.activityinfo.core.client.NotFoundException; import org.activityinfo.legacy.shared.command.GetFormClass; import org.activityinfo.legacy.shared.command.result.FormClassResult; import org.activityinfo.model.resource.ResourceId; import org.activityinfo.core.shared.application.ApplicationClassProvider; import org.activityinfo.model.form.FormClass; import org.activityinfo.promise.Promise; import org.activityinfo.legacy.client.Dispatcher; import org.activityinfo.legacy.shared.command.GetSchema; import static org.activityinfo.model.legacy.CuidAdapter.*; public class ClassProvider implements Function<ResourceId, Promise<FormClass>> { private final Dispatcher dispatcher; private final ApplicationClassProvider systemClassProvider = new ApplicationClassProvider(); public ClassProvider(Dispatcher dispatcher) { this.dispatcher = dispatcher; } @Override public Promise<FormClass> apply(ResourceId classId) { switch (classId.getDomain()) { case ACTIVITY_DOMAIN: return dispatcher.execute(new GetFormClass(classId)).then(new Function<FormClassResult, FormClass>() { @Override public FormClass apply(FormClassResult input) { return input.getFormClass(); } }); case PARTNER_FORM_CLASS_DOMAIN: return Promise.resolved(PartnerClassAdapter.create(getLegacyIdFromCuid(classId))); case PROJECT_CLASS_DOMAIN: return Promise.resolved(BuiltinFormClasses.projectFormClass(getLegacyIdFromCuid(classId))); case ADMIN_LEVEL_DOMAIN: return dispatcher.execute(new GetSchema()) .then(new AdminLevelClassAdapter(getLegacyIdFromCuid(classId))); case LOCATION_TYPE_DOMAIN: return dispatcher.execute(new GetSchema()).then(new LocationClassAdapter(getLegacyIdFromCuid(classId))); // this is just spike: not exactly sure how to deal with application/system-level classes properties // etc. The 'domains' that we're using for the legacy objects aren't really the same thing -- the whole // point // is that a location_type form class isn't treated specially by the application, while we are going // to have a small number of *different* form classes that ARE treated specially... case '_': return Promise.resolved(systemClassProvider.get(classId)); default: return Promise.rejected(new NotFoundException(classId)); } } }