package org.robobinding.binder; import org.robobinding.BindingContext; import org.robobinding.BindingContextFactory; import org.robobinding.BindingContextFactoryA; import org.robobinding.BindingContextFactoryB; import org.robobinding.presentationmodel.AbstractPresentationModelObject; import org.robobinding.presentationmodel.PresentationModelAdapter; import org.robobinding.presentationmodel.PresentationModelAdapterFactory; /** * @since 1.0 * @author Cheng Wei * */ public class BindingContextFactoryAdapters { private final PresentationModelAdapterFactory factory; private final PresentationModelObjectLoader loader; public BindingContextFactoryAdapters(PresentationModelAdapterFactory factory, PresentationModelObjectLoader loader) { this.factory = factory; this.loader = loader; } public BindingContextFactoryA adaptA(BindingContextFactory bindingContextFactory) { return new BindingContextFactoryAAdapter(factory, bindingContextFactory); } public BindingContextFactoryB adaptB(BindingContextFactory bindingContextFactory) { return new BindingContextFactoryBAdapter(loader, adaptA(bindingContextFactory)); } private static class BindingContextFactoryAAdapter implements BindingContextFactoryA { private final PresentationModelAdapterFactory factory; private final BindingContextFactory delegate; public BindingContextFactoryAAdapter(PresentationModelAdapterFactory factory, BindingContextFactory delegate) { this.factory = factory; this.delegate = delegate; } @Override public BindingContext create(AbstractPresentationModelObject presentationModel) { PresentationModelAdapter presentationModelAdapter = factory.create(presentationModel); return delegate.create(presentationModelAdapter); } } private static class BindingContextFactoryBAdapter implements BindingContextFactoryB { private final PresentationModelObjectLoader loader; private final BindingContextFactoryA delegate; public BindingContextFactoryBAdapter(PresentationModelObjectLoader loader, BindingContextFactoryA delegate) { this.loader = loader; this.delegate = delegate; } @Override public BindingContext create(Object presentationModel) { AbstractPresentationModelObject presentationModelObject = loader.load(presentationModel); return delegate.create(presentationModelObject); } } }