ServiceAsync serviceAsync = GWT.create(ServiceAsync.class);
@Inject ServiceAsync serviceAsync;
/** * presenter'. <a href="http://www.gwtproject.org/articles/mvp-architecture.html"> * MVP Google</a> <a href="http://www.gwtproject.org/doc/latest/DevGuideMvpActivitiesAndPlaces.html"> * Activity Place</a>. MVP. , * View Presenter, (, * View). , callback' View, Presenter' * . * <p/> * <p/> * Use case Presenter': * <p/> * Presenter' - Presenter' * EventBus, Presenter' ( inject). , .. EventBus * Presenter'. Presenter' Activity. ({@link * BaseActivity ). */ public interface BasePresenter<V extends BasePresenter.View> { /** * {@link View} . View. * View Presenter , . , * View, View. {@link View}, {@link IsWidget}, * View View. * * @return View. */ @NotNull V getWidget(); /** * View Presenter'. , .. {@link #setPresenter(BasePresenter)} * Presenter' View Presenter' . */ public interface View<T extends BasePresenter> extends IsWidget { /** * View Presenter, View Presenter'. * set , Inject, .. 1) GIN - * View Presenter Presenter View. - * . 2) , View Presenter , .. View * Presenter, View, Presenter View, * . * * @param presenter Presenter View. */ void setPresenter(@NotNull T presenter); } }
/** * GWT RPC . - GWT RPC . - - * web.xml. GWT RPC Jetty * - Jetty, SyncProxy * Guice. */ private static final Map<Class<? extends BaseRemoteService>, Pair<Class<?>, String>> gwtRpcServlets = Collections .unmodifiableMap(new HashMap<Class<? extends BaseRemoteService>, Pair<Class<?>, String>>() { private static final long serialVersionUID = -2126682232601937926L; { put(StudentsServiceImpl.class, new Pair<Class<?>, String>(StudentsServiceAsync.class, "/GxtModule/students")); put(GroupsServiceImpl.class, new Pair<Class<?>, String>(GroupsServiceAsync.class, "/GxtModule/groups")); } });
for (Map.Entry<Class<? extends BaseRemoteService>, Pair<Class<?>, String>> entry : gwtRpcServlets .entrySet()) { // Cookie , SyncProxy , .. http . // (waitForInvocation = true). , - . gwtRpcAsyncInstances.put(entry.getValue().getA(), SyncProxy.newProxyInstance(entry.getValue().getA(), URL_TO_SERVER, entry.getValue().getB(), true)); }
private boolean isInstantiable(Class<?> clazz) { if (clazz.isPrimitive()) { return true; } if (clazz.isArray()) { return isInstantiable(clazz.getComponentType()); } // Serializable.class.isAssignableFrom(clazz) if (IsSerializable.class.isAssignableFrom(clazz) || Serializable.class.isAssignableFrom(clazz)) { return true; } return SerializabilityUtil.hasCustomFieldSerializer(clazz) != null; }
/** * Presenter', View. . */ private static final Map<Class<? extends BasePresenter>, Pair<Class<? extends BasePresenter>, Class<? extends BasePresenter.View>>> presenters = Collections.unmodifiableMap(new HashMap<Class<? extends BasePresenter>, Pair<Class<? extends BasePresenter>, Class<? extends BasePresenter.View>>>() { private static final long serialVersionUID = 3512350621073004110L; private <T extends BasePresenter> void addPresenter(Class<T> presenterInterface, Class<? extends T> implementPresenter, Class<? extends BasePresenter.View<T>> viewClass) { if (!presenterInterface.isInterface()) { throw new IllegalArgumentException("Should be interface " + presenterInterface.getName()); } if (implementPresenter.isInterface()) { throw new IllegalArgumentException("Should be class " + implementPresenter.getName()); } put(presenterInterface, new Pair<Class<? extends BasePresenter>, Class<? extends BasePresenter.View>>(implementPresenter, viewClass)); } { addPresenter(StudentPresenter.class, StudentPresenterImpl.class, StudentPresenter.View.class); addPresenter(StudentsListPresenter.class, StudentsListPresenterImpl.class, StudentsListPresenter.View.class); addPresenter(MainWindowPresenter.class, MainWindowPresenterImpl.class, MainWindowPresenter.View.class); } });
injector = Guice.createInjector(new AbstractModule() { @Override protected void configure() { // . for (Class gwtRpcAsyncClass : gwtRpcAsyncInstances.keySet()) { bind(gwtRpcAsyncClass).toInstance(getGwtRpc(gwtRpcAsyncClass)); } for (Map.Entry<Class<? extends BasePresenter>, Pair<Class<? extends BasePresenter>, Class<? extends BasePresenter.View>>> entry : presenters.entrySet()) { log.info("Bind View {}", entry.getValue().getB().getName()); bindMock(entry.getValue().getB()); log.info("Bind Presenter {} to implementation {} ", entry.getKey().getName(), entry.getValue().getA().getName()); bind(entry.getKey()).to((Class) entry.getValue().getA()).in(Singleton.class); } EventBus eventBus = new SimpleEventBus(); bind(EventBus.class).toInstance(eventBus); com.google.gwt.place.shared.PlaceController placeController = new com.google.gwt.place.shared.PlaceController( eventBus, new com.google.gwt.place.shared.PlaceController.Delegate() { // Delegate, , .. Delegate UI. }); bind(com.google.gwt.place.shared.PlaceController.class).toInstance(placeController); bind(ActivityMapper.class).to(ru.timreset.example.gxt.client.ActivityMapper.class).in(Singleton.class); bind(AcceptsOneWidget.class).to(ru.timreset.example.test.base.AcceptsOneWidget.class).in(Singleton.class); } /** * mock . * @param bindClass mock . */ private void bindMock(Class bindClass) { Object bindObject = Mockito.mock(bindClass); bind(bindClass).toInstance(bindObject); } }); ActivityManager activityManager = new ActivityManager(getInstance(ActivityMapper.class), injector.getInstance( EventBus.class)); activityManager.setDisplay(getInstance(AcceptsOneWidget.class)); final PlaceHistoryHandler historyHandler = new PlaceHistoryHandler( new PlaceHistoryMapper(), new PlaceHistoryHandler.Historian() { // Historian, , .. Historian UI . }); historyHandler.register(injector.getInstance(com.google.gwt.place.shared.PlaceController.class), injector.getInstance(EventBus.class), Place.NOWHERE); historyHandler.handleCurrentHistory();
/** * Presenter . // . */ public interface StudentPresenter extends BasePresenter<StudentPresenter.View> { /** * Presenter' . * * @param mode Presenter'. * @param studentId id . * @param eventBus EventBus. * @param onReady Callback Presenter'. */ void init(@NotNull Mode mode, @Nullable Integer studentId, @NotNull EventBus eventBus, @NotNull Command onReady); /** * . * * @param student . */ void saveStudent(Student student); /** * . * * @return true - , false - . */ boolean isEdit(); /** * . */ void onEditStudent(); /** * . * * @return . */ Mode getMode(); /** * . * * @return true - , false - . */ boolean isDirty(); /** * Presenter'. */ enum Mode { /** * . */ VIEW, /** * . */ EDIT, /** * . */ CREATE; } interface View extends BasePresenter.View<StudentPresenter> { /** * . * * @param student . */ void setStudent(Student student); /** * . * * @return true - , false - . */ boolean isDirty(); } }
public interface StudentPresenter extends BasePresenter<StudentPresenter.View> { void init(@NotNull Mode mode, @Nullable Integer studentId, @NotNull EventBus eventBus, @NotNull Command onReady); boolean isDirty(); enum Mode { VIEW, EDIT, CREATE; } /** * View Presenter'. */ interface ViewPresenter extends BasePresenter.ViewPresenter{ void saveStudent(Student student); boolean isEdit(); void onEditStudent(); Mode getMode(); } interface View extends BasePresenter.View<StudentPresenter.ViewPresenter> { void setStudent(Student student); boolean isDirty(); } }
/** * Place . * * @param newPlace Place. */ void goToWithAssert(Place newPlace) /** * , Place. ! Place {@link * Object#equals(Object)}. . * * @param expectedWhere (Place). */ void assertWhere(Place expectedWhere); /** * , View Presenter'. .. , * Presenter. * * @param presenter Presenter, View . */ void assertWhere(BasePresenter presenter);
@Test public void listStudent() { // Presenter . MainWindowPresenter mainWindowPresenter = getInstance(MainWindowPresenter.class); // Presenter . StudentsListPresenter studentsListPresenter = getInstance(StudentsListPresenter.class); // . mainWindowPresenter.goToStudentsList(); // , . assertWhere(studentsListPresenter); // . studentsListPresenter.getStudents(new PagingLoadConfigBean(0, 999), new ru.timreset.example.gxt.client.AsyncCallback<PagingLoadResult<Student>>() { @Override public void onSuccess(PagingLoadResult<Student> result) { //, . Assert.assertFalse(result.getData().isEmpty()); } }); }
@Test public void editTest() { // Presenter . MainWindowPresenter mainWindowPresenter = getInstance(MainWindowPresenter.class); // Presenter . StudentsListPresenter studentsListPresenter = getInstance(StudentsListPresenter.class); // Presenter . StudentPresenter studentPresenter = getInstance(StudentPresenter.class); // View . StudentPresenter.View studentView = getInstance(StudentPresenter.View.class); // mainWindowPresenter.goToStudentsList(); // , . Place View. assertWhere(StudentsListPlace.buildList()); assertWhere(studentsListPresenter); // . studentsListPresenter.onCreateStudent(); // . assertWhere(StudentPlace.buildCreate()); // . assertWhere(studentPresenter); // . Assert.assertEquals(StudentPresenter.Mode.CREATE, studentPresenter.getMode()); // ArgumentCaptor<Student> studentArgumentCaptor = ArgumentCaptor.forClass(Student.class); Mockito.verify(studentView).setStudent(studentArgumentCaptor.capture()); // . Student student = studentArgumentCaptor.getValue(); student.setName("TEST_NAME"); student.setSurname("TEST_SURNAME"); student.setPatronymic("TEST_PATRONYMIC"); student.setBirthday(new Date()); student.setStudentType(StudentType.ABSENTED); // studentPresenter.saveStudent(student); // . assertWhere(StudentsListPlace.buildList()); assertWhere(studentsListPresenter); // , . studentsListPresenter.getStudents(new PagingLoadConfigBean(0, 999), new ru.timreset.example.gxt.client.AsyncCallback<PagingLoadResult<Student>>() { @Override public void onSuccess(PagingLoadResult<Student> result) { Collection<Student> coll = Collections2.filter(result.getData(), new Predicate<Student>() { @Override public boolean apply(Student input) { return "TEST_NAME".equals(input.getName()); } }); //, . Assert.assertEquals(1, coll.size()); } }); }
Source: https://habr.com/ru/post/246285/
All Articles