Hi all,
  in my eclipse-based application i've modelled model-view-presenter
as different classes leaving the wiring (View to Presenter and
Presenter-to-Model, and data-binding between model and view) to guice.
Now I've used Peaberry Eclipse extension in order to let guice create
and inject the View object and then pass it to the Eclipse framework.

Though, I also need that after Eclipse class the createPartControl()
method on the view, databinding code is run to wire the view to the
model (using Eclipse Databinding API). That is, I need post-processing
the object when such method is called.
I've resorted to write an interceptor to do this:

// In my module:
public class LoginMVPConfig extends AbstractModule {
        @Override protected void configure() {
                bindModel( ILoginPresentationModel.class )
                        .toView( ILoginView.class )
                        .build();
        }

        protected <T> DataBinder<T> bindModel( Class<T> modelType ) {
                return new DataBinder<T>( binder(), modelType );
        }
}

// Databinding DSL and glue-code
public class DataBinder<T> {
        private final Class<T> modelType;
        private final Binder binder;
        private List<Class<?>> viewTypes;

        public DataBinder( Binder binder, Class<T> modelType ) {
                this.binder = binder;
                this.modelType = modelType;
                this.viewTypes = new ArrayList<Class<?>>();
        }

        public DataBinder<T> toView( Class<?> viewType ) {
                viewTypes.add( viewType );
                return this;
        }

        /**
         * For each pair (model, view[i]) a method interceptor is created in
order to perform databinding when
         * a method annotated with {...@link PostConstruct} annotation is
executed.
         */
        public void build() {
                for (Class<?> viewType : viewTypes) {
                        DataBindingPostProcessor dataBinder = new 
DataBindingPostProcessor(
                                        binder.getProvider( modelType ) );
                        binder.bindInterceptor( only( viewType ), annotatedWith
( PostConstruct.class ), dataBinder );
                        binder.requestInjection( dataBinder );
                }
        }


public class DataBindingPostProcessor implements MethodInterceptor {
        private final Provider<?> modelProvider;

        @Inject
        private IDataBindingService dataBindingService;

        public DataBindingPostProcessor( Provider<?> modelProvider ) {
                super();
                this.modelProvider = modelProvider;
        }
        @Override public Object invoke( MethodInvocation methodInvocation )
throws Throwable {
                Object result = methodInvocation.proceed();
                Object theView = methodInvocation.getThis();
                dataBindingService.bind( theView, modelProvider.get() );
                return result;
        }
}

That is I'm creating an interceptor for each (view,model) pair: which
means that I'm going to have a lot of interceptors in my application!
Is there any alternative approach for solving my problem?

Hope I've been clear enough,
Mario

--

You received this message because you are subscribed to the Google Groups 
"google-guice" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-guice?hl=en.


Reply via email to