Java tutorial
/* * License information at https://github.com/Caltech-IPAC/firefly/blob/master/License.txt */ package edu.caltech.ipac.firefly.core; import com.google.gwt.core.client.GWT; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.http.client.URL; import com.google.gwt.user.client.History; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import edu.caltech.ipac.firefly.core.layout.LayoutManager; import edu.caltech.ipac.firefly.core.layout.Region; import edu.caltech.ipac.firefly.data.Request; import edu.caltech.ipac.firefly.data.SearchInfo; import edu.caltech.ipac.firefly.data.Status; import edu.caltech.ipac.firefly.rpc.UserServices; import edu.caltech.ipac.firefly.ui.StatefulWidget; import edu.caltech.ipac.firefly.util.event.Name; import edu.caltech.ipac.firefly.util.event.WebEvent; import edu.caltech.ipac.firefly.util.event.WebEventManager; import edu.caltech.ipac.util.StringUtils; import java.util.LinkedHashMap; import java.util.List; /** * Base implementation of RequestHandler. This implementation depends on the Request object. * The parameter portion of the url will be parsed into a Request object using the Request.parse(String) * method. * * <code> * gwt_app_url#string_serialized_request * * string_serialized_request is the string representation of the Request object. Request.parse(String) will instantiate it. * </code> */ public class DefaultRequestHandler implements RequestHandler { private LinkedHashMap<String, StateWidgetEntry> statefulComponents = new LinkedHashMap<String, StateWidgetEntry>(); protected Request currentRequest; protected Request currentSearchRequest; private boolean doRecordHistory = true; public void setDoRecordHistory(boolean doRecordHistory) { this.doRecordHistory = doRecordHistory; } public void onValueChange(ValueChangeEvent<String> str) { String token = str.getValue(); processToken(token); } public void processToken(String token) { if (token != null) { Request req = parse(URL.decodePathSegment(token)); if (req == null) { Application.getInstance().goHome(); } else { if (currentSearchRequest != null && currentSearchRequest.equals(req)) { Application.getInstance().getToolBar().getDropdown().close(); currentRequest = req; onRequestSuccess(req, false); } else if (currentRequest == null || !currentRequest.equals(req)) { processRequest(req, false); } } } } public void processRequest(Request req) { processRequest(req, true); } public Request parse(String str) { if (str != null && str.length() > 0) { Request req = Request.parse(str); if (req.getCmdName() != null) { return req; } } return null; } public SearchDescResolver getSearchDescResolver() { Application app = Application.getInstance(); return app.getWidgetFactory().createSearchDescResolver(app.getAppName()); } //==================================================================== // Page state / tagging related //==================================================================== class StateWidgetEntry { Context context; StatefulWidget swidget; StateWidgetEntry(Context context, StatefulWidget swidget) { this.context = context; this.swidget = swidget; } } public void registerComponent(String name, Context context, StatefulWidget b) { statefulComponents.put(name, new StateWidgetEntry(context, b)); } public void registerComponent(String name, StatefulWidget b) { registerComponent(name, Context.PAGE, b); } public String getStateInfo(Context context) { boolean isSearchContext = context == Context.INCL_SEARCH; Request req = isSearchContext && currentSearchRequest != null ? currentSearchRequest : new Request(""); for (StateWidgetEntry b : statefulComponents.values()) { if (b.context == Context.PAGE || (isSearchContext && (b.context == Context.INCL_SEARCH))) { if (b.swidget.isActive()) { try { b.swidget.recordCurrentState(req); } catch (Exception e) { GWT.log("error retrieving state info", e); } } } } return req.toString(); } public Request getCurrentRequest() { return currentRequest; } public Request getCurrentSearchRequest() { return currentSearchRequest; } public void moveToRequestState(Request req) { boolean isSearchContext = currentSearchRequest != null; for (StateWidgetEntry b : statefulComponents.values()) { if (isSearchContext || b.context == Context.PAGE) { if (b.swidget.isActive()) { AsyncCallback acb = new AsyncCallback() { public void onFailure(Throwable caught) { } public void onSuccess(Object result) { } }; b.swidget.moveToRequestState(req, acb); } } } } //==================================================================== // //==================================================================== protected void processRequest(final Request req, final boolean createHistory) { if (req == null) return; currentRequest = req; if (req.isSearchResult()) { currentSearchRequest = req; WebEventManager.getAppEvManager().fireEvent(new WebEvent<Request>(this, Name.SEARCH_RESULT_START, req)); } final GeneralCommand cmd = Application.getInstance().getCommand(req.getCmdName()); final Request cReq = (Request) req.cloneRequest(); if (cmd == null) { handleCmdNotFound(cReq, createHistory); } else { if (cmd instanceof RequestCmd) { processRequestCmd((RequestCmd) cmd, cReq, createHistory); } else { cmd.execute(); } } } protected void processRequestCmd(final RequestCmd cmd, final Request req, final boolean createHistory) { BaseCallback<String> callback = new BaseCallback<String>() { public void doFinally() { onRequestSuccess(req, createHistory); if (req.isSearchResult()) { moveToRequestState(req); } } public void doSuccess(String result) { req.setStatus(new Status(0, result)); layout(cmd); } }; cmd.execute(req, callback); // layout(cmd); // called here.. WebEventManager.getAppEvManager() .fireEvent(new WebEvent<String>(this, Name.REQUEST_COMMAND_LAYOUT, cmd.getName())); } protected void handleCmdNotFound(Request req, final boolean createHistory) { // instead of throwing exception, just go home Application.getInstance().goHome(); //throw new NullPointerException("Unable to resolve command name:" + req.getCmdName()); } protected void onRequestSuccess(Request req, boolean createHistory) { if (req.isBookmarkable()) { Window.setTitle(getWindowTitle(req.getShortDesc())); Window.setStatus(""); if (createHistory) { History.newItem(req.toString(), false); } } Application app = Application.getInstance(); if (req.isSearchResult()) { String desc = getSearchDescResolver().getTitle(req) + ": " + getSearchDescResolver().getDesc(req); if (createHistory && doRecordHistory) { UserServices.App.getInstance().addSearchHistory(req.toString(), desc, false, new BaseCallback<SearchInfo>() { public void doSuccess(SearchInfo result) { } }); } WebEventManager.getAppEvManager().fireEvent(new WebEvent<Request>(this, Name.SEARCH_RESULT_END, req)); } if (req.isDrilldownRoot()) { if (app.getDrillDownItems().size() > 0) { app.getDrillDownItems().clear(); } app.getDrillDownItems().addLast(req); } else if (req.isDrilldown()) { List<Request> l = app.getDrillDownItems().getList(); if (l.contains(req)) { int idx = l.indexOf(req); app.getDrillDownItems().removeRange(idx + 1, l.size()); } else { app.getDrillDownItems().addLast(req); } } else { // for now, leave as-is //app.getDrillDownItems().clear(); } } private String getWindowTitle(String reqDesc) { String windowTitle = ""; String appName = Application.getInstance().getAppDesc(); if (!StringUtils.isEmpty(appName)) { windowTitle = appName; } if (!StringUtils.isEmpty(reqDesc)) { if (!StringUtils.isEmpty(windowTitle)) { windowTitle += " - "; } windowTitle += reqDesc; } return windowTitle; } protected void layout(RequestCmd cmd) { LayoutManager lm = Application.getInstance().getLayoutManager(); for (Region r : lm.getRegions()) { if (cmd.isRegistered(r.getId())) { r.setDisplay(cmd.getView(r.getId())); } } } }