/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.openjpa.trader.client; import java.util.List; import org.apache.openjpa.trader.client.ui.MessageBox; import org.apache.openjpa.trader.client.ui.ProgressMonitor; import org.apache.openjpa.trader.domain.Stock; import org.apache.openjpa.trader.domain.Trader; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.PopupPanel; import com.google.gwt.user.client.ui.TextBox; /** * A dialog box for login a Trader. Once the trader's name is entered, this widget calls the server * to start a session for the trader, gets all the tradable Stocks and passes that initialization data * to the {@link OpenTrader main application} to {@link OpenTrader#init(Trader, List) initialize}. * * <br> * CSS styles used * <LI> login : for the main dialog box * <LI> login-caption: for the caption * * * @author Pinaki Poddar * */ public class LoginDialog extends PopupPanel { private Trader trader; private String serverURI; private final OpenTrader session; public LoginDialog(final OpenTrader session) { super(false, true); setAnimationEnabled(true); this.session = session; final FlexTable table = new FlexTable(); final HTML header = new HTML("  Welcome to OpenTrader  "); final Label label = new Label("Please enter name:"); DOM.setStyleAttribute(label.getElement(), "textAlign", "right"); final TextBox traderName = new TextBox(); traderName.setText("OpenTrader"); final Button enter = new Button("Enter"); addStyleName("login"); table.addStyleName("login"); label.addStyleName("login"); header.addStyleName("login-caption"); table.setWidget(0, 0, header); table.setWidget(2, 0, label); table.setWidget(2, 1, traderName); table.setWidget(4, 1, enter); table.getFlexCellFormatter().setColSpan(0, 0, 2); enter.setEnabled(true); traderName.setFocus(true); enter.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { if (traderName.getText().trim().length() == 0) { MessageBox.alert("Trader's name must not be empty."); return; } hide(); ProgressMonitor.showProgress("Connecting to OpenTrader Server..."); session.getService().login(traderName.getText(), new LoginCallback()); } }); setWidget(table); } /** * --------------------------------------------------------------------------------- * Asynchronous RPC service callbacks * --------------------------------------------------------------------------------- */ /** * Logs in a [@link Trader} and then invokes another RPC service to get the list of tradable stocks. * This pattern of calling one RPC from another addresses sequential execution of asynchronous * callbacks. This pattern is necessary when the second RPC depends in some way to the result of * the first RPC. * */ class LoginCallback implements AsyncCallback<Trader> { public void onFailure(Throwable caught) { ProgressMonitor.stop(); session.handleError(caught); } public void onSuccess(Trader result) { trader = result; session.getService().getServiceURI(new GetServerURI()); } } /** * Initializes the server URI. * */ public class GetServerURI implements AsyncCallback<String> { public void onFailure(Throwable caught) { session.handleError(caught); } public void onSuccess(String uri) { serverURI = uri; session.getService().getStocks(new InitializeStocks()); } } /** * Initializes the tradable stocks followed by the main application. * */ public class InitializeStocks implements AsyncCallback<List<Stock>> { public void onFailure(Throwable caught) { session.handleError(caught); } public void onSuccess(List<Stock> stocks) { ProgressMonitor.stop(); session.init(trader, serverURI, stocks); } } }