package com.acme.gwt.attic; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Map; import java.util.TreeMap; import java.util.logging.Logger; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.Element; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.logical.shared.SelectionEvent; import com.google.gwt.event.logical.shared.SelectionHandler; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.rpc.client.RpcService; import com.google.gwt.user.client.Cookies; import com.google.gwt.user.client.History; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.Panel; import com.google.gwt.user.client.ui.PasswordTextBox; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.StackPanel; import com.google.gwt.user.client.ui.TabPanel; import com.google.gwt.user.client.ui.TextBox; import static com.acme.gwt.attic.PartnerLogin.ModelProvider.App; /** * Entry point classes define <code>onModuleLoad()</code> */ public class PartnerLogin implements EntryPoint { /** * This is the entry point method. */ public void onModuleLoad() { System.err.println("host base " + GWT.getHostPageBaseURL()); System.err.println("module base " + GWT.getModuleBaseURL()); System.err.println("module name " + GWT.getModuleName()); System.err.println("module strong name " + GWT.getPermutationStrongName()); String sessionID = Cookies.getCookie("sid"); if (sessionID != null) { System.err.println("sid found: " + sessionID); proceed(sessionID); } else { System.err.println("displaying login"); displayLoginBox(); } } @RemoteServiceRelativePath("AuthProvider") public interface AuthProvider extends RpcService { boolean isSessionAdmin(String sid); List<String> getRoles(String kioskId); String getSessionId(String text, String text1) throws Exception; /** * Utility/Convenience class. * Use AuthProvider.App.getInstance() to access static instance of AuthProviderAsync */ public static class App { private static final AuthProviderAsync ourInstance = (AuthProviderAsync) GWT .create(AuthProvider.class); public static AuthProviderAsync getInstance() { return ourInstance; } } } public interface AuthProviderAsync { void getRoles(String kioskId, AsyncCallback<List<String>> async); void getSessionId(String text, String text1, AsyncCallback<String> async) throws Exception; void isSessionAdmin(String sid, AsyncCallback<Boolean> async); } /** * <html> * <body> * <div id="loginDiv"> * <p></p>username<input id="username" name="username"></input> * <p/> * <p></p>password:<input type="password" id="password" name="password"></input><br/><button type="button" id="loginButton" name="loginButton">login</button> * </div> * <script type="text/javascript" language="javascript" src="PartnerLogin/PartnerLogin.nocache.js"></script> * </body> * </html> */ private void displayLoginBox() { System.err.println("div set visible"); final com.google.gwt.dom.client.Element usernameElement = Document .get().getElementById("username"); System.err.println("got username element"); final TextBox partnerTextBox = TextBox.wrap(usernameElement); System.err.println("wrapped username"); final Element passElement = Document.get().getElementById("pass"); System.err.println("got pass element"); final PasswordTextBox passwordTextBox = PasswordTextBox .wrap(passElement); System.err.println("wrapped password"); final Element elementById = Document.get() .getElementById("loginButton"); System.err.println("got button element"); final Button loginButton = Button.wrap(elementById); System.err.println("button wrapped"); RootPanel.get("loginDiv").setVisible(true); loginButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { System.err.println("button clicked"); try { AuthProvider.App.getInstance().getSessionId( partnerTextBox.getText(), passwordTextBox.getText(), new AsyncCallback<String>() { @Override public void onFailure(Throwable caught) { System.err.println("failure in button"); dumpError(caught, RootPanel.get()); } @Override public void onSuccess(String result) { System.err.println("success in button"); String sessionID = result; final long DURATION = 1000 * 60 * 60 * 24 * 14; //duration remembering login. 2 weeks in this example. Date expires = new Date(System .currentTimeMillis() + DURATION); Cookies.setCookie("sid", sessionID, expires, null, "/", false); Window.Location.reload(); } }); } catch (Exception e) { dumpError(e, RootPanel.get()); } } }); System.err.println("button handler added"); } private void proceed(String sessionID) { System.err.println("proceeding"); RootPanel.get("loginDiv").setVisible(false); final TabPanel mainTabs = new TabPanel(); mainTabs.setAnimationEnabled(true); RootPanel.get().add(mainTabs); final String[] tabNames = {"Kiosk", "MerchantGateway", "ProductModel", "Contact", "Charge", "Rental", "Adam", "Slot", "SlotEvent"}; for (String tabTitle : tabNames) { addEditorPanel(tabTitle, mainTabs, sessionID); } mainTabs.addSelectionHandler(new SelectionHandler<Integer>() { @Override public void onSelection( SelectionEvent<Integer> integerSelectionEvent) { History.newItem(tabNames[integerSelectionEvent .getSelectedItem()]); } }); History.addValueChangeHandler(new ValueChangeHandler<String>() { @Override public void onValueChange( ValueChangeEvent<String> stringValueChangeEvent) { System.err.println("firing history change"); } }); } static final int ORIGVALUE = 0; static final int TEXTBOXVALUE = 1; static final int CHANGEDVALUE = 2; private static void addEditorPanel(final String tabTitle, TabPanel mainTabs, final String sid) { final Panel flowPanel = new FlowPanel(); flowPanel.add(new Label("Please Enter " + tabTitle + " Id")); mainTabs.add(flowPanel, tabTitle); mainTabs.selectTab(0); final TextBox idBox = new TextBox(); flowPanel.add(idBox); idBox.addValueChangeHandler(new ValueChangeHandler<String>() { @Override public void onValueChange( ValueChangeEvent<String> stringValueChangeEvent) { try { final String oid = idBox.getText(); final String className = "laptopsanytime.model." + tabTitle; renderDrillDown(oid, className, sid, flowPanel/*, tabTitle*/); } catch (Exception e) { Logger.getAnonymousLogger().warning( Arrays.toString(e.getStackTrace())); //To // change body of catch statement use File | Settings | File Templates. } } }); History.newItem("0"); } @RemoteServiceRelativePath("ModelProvider") interface ModelProvider extends RpcService { Map<String, String> find(String classname, String id, String sid); boolean merge(String tabTitle, String id, Map<String, String> updateMap, String sid); /** * Utility/Convenience class. * Use ModelProvider.App.getInstance() to access static instance of ModelProviderAsync */ public static class App { private static final ModelProviderAsync ourInstance = (ModelProviderAsync) GWT .create(ModelProvider.class); public static ModelProviderAsync getInstance() { return ourInstance; } } } public interface ModelProviderAsync { // void find(Class c, String id, AsyncCallback<Map<String, String>> async); void find(String classname, String id, String sid, AsyncCallback<Map<String, String>> async); void merge(String tabTitle, String id, Map<String, String> updateMap, String sid, AsyncCallback<Boolean> async); } static void renderDrillDown(final String oid, final String className, final String sid, final Panel flowPanel/*, final String tabTitle*/) { final StackPanel panel; panel = new StackPanel(); flowPanel.clear(); flowPanel.add(panel); App.getInstance().find(className, oid, sid, new AsyncCallback<Map<String, String>>() { @Override public void onFailure(Throwable caught) { dumpError(caught, panel); } @Override public void onSuccess(Map<String, String> origMap) { History.newItem(className + "/" + oid); System.err.println(Arrays.toString(new Object[]{oid, className, sid, flowPanel.toString()})); final Panel fieldPanel = new FlowPanel(); final Panel listPanel = new FlowPanel(); panel.add(fieldPanel, "Fields"); panel.add(listPanel, "Links"); final Map<String, Object[]> map = new TreeMap<String, Object[]>(); for (Map.Entry<String, String> entry : origMap .entrySet()) { String s = entry.getKey(); String val = entry.getValue(); if (s.startsWith("@")) { render12m(s, val, listPanel, flowPanel, sid); } else if (s.startsWith("+")) { render121(s, val, listPanel, flowPanel, sid); } else { if (!s.equals("id")) { renderBasic(map, s, val, fieldPanel); } } } renderResetButton(map, flowPanel); renderDoneButton(map, flowPanel, className, oid, sid); History.fireCurrentHistoryState(); } }); } private static void renderDoneButton(final Map<String, Object[]> map, final Panel flowPanel, final String tabTitle, final String oid, final String sid) { final Button doneButton = new Button("done"); flowPanel.add(doneButton); doneButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { final Map<String, String> updateMap = new TreeMap<String, String>(); for (Map.Entry<String, Object[]> entry : map.entrySet()) { final Object[] value = entry.getValue(); if (null != value[CHANGEDVALUE]) { updateMap.put(entry.getKey(), (String) value[CHANGEDVALUE]); } } if (!updateMap.isEmpty()) App.getInstance().merge(tabTitle, oid, updateMap, sid, new AsyncCallback<Boolean>() { @Override public void onFailure(Throwable caught) { dumpError(caught, flowPanel); } @Override public void onSuccess(Boolean result) { flowPanel.clear(); flowPanel .add(new Label( "value updated, please reload yoru browser to re-edit this tab.")); } }); } }); } private static void renderResetButton(final Map<String, Object[]> map, Panel flowPanel) { Button rollbackButton1 = new Button("reset"); rollbackButton1.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { for (Map.Entry<String, Object[]> stringEntry : map.entrySet()) { stringEntry.getValue()[CHANGEDVALUE] = null; ((TextBox) stringEntry.getValue()[TEXTBOXVALUE]) .setText(((String) stringEntry.getValue()[ORIGVALUE])); } } }); Button rollbackButton = rollbackButton1; flowPanel.add(rollbackButton); } private static void renderBasic(Map<String, Object[]> map, String s, String val, Panel flowPanel) { final TextBox box = new TextBox(); box.setText(val); box.setTitle(s); final Object[] edit = {val, box, null}; map.put(s, edit); box.addValueChangeHandler(new ValueChangeHandler<String>() { @Override public void onValueChange( ValueChangeEvent<String> stringValueChangeEvent) { edit[CHANGEDVALUE] = box.getText(); } }); flowPanel.add(new Label(s)); flowPanel.add(box); } private static void render12m(final String s, String val, Panel flowPanel, final Panel origPanel, final String sid) { final String[] keys = s.split("@"); flowPanel.add(new Label(keys[1])); final ListBox listBox = new ListBox(); flowPanel.add(listBox); final String s1 = val.substring(1, val.length() - 1).trim(); if (!s1.isEmpty()) { for (String string : s1.split(",")) { listBox.addItem(keys[2] + ":" + string, string); } } listBox.setVisibleItemCount(Math.min(10, listBox.getItemCount())); listBox.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { final int index = listBox.getSelectedIndex(); final String[] strings = listBox.getItemText(index).split(":"); final String oid = strings[1]; final String className = strings[0]; subRenderDrillDown(oid, className, origPanel, sid); } }); } private static void subRenderDrillDown(String oid, String className, Panel origPanel, String sid) { origPanel.add(new Label(className + " : " + oid)); final FlowPanel panel = new FlowPanel(); origPanel.add(panel); PartnerLogin .renderDrillDown(oid, className, sid, panel/*,className */); } private static void render121(final String s, final String val, Panel flowPanel, final Panel origPanel, final String sid) { final String[] keys = s.split("[+]"); final Button linkTo = new Button(keys[1] + ":" + keys[2] + "->" + val); flowPanel.add(linkTo); linkTo.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { String oid = val; String className = keys[2]; subRenderDrillDown(oid, className, origPanel, sid); } }); } private static void dumpError(Throwable caught, Panel flowPanel) { flowPanel.add(new HTML(caught.getMessage())); } }