001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package org.apache.geronimo.samples.daytrader.soap; 018 019 import org.apache.geronimo.samples.daytrader.*; 020 021 import java.util.*; 022 import java.net.*; 023 import javax.xml.rpc.*; 024 import javax.naming.*; 025 import javax.xml.namespace.*; 026 027 import java.rmi.RemoteException; 028 import java.math.BigDecimal; 029 import javax.ejb.FinderException; 030 031 import org.apache.geronimo.samples.daytrader.util.*; 032 033 public class TradeWebSoapProxy implements org.apache.geronimo.samples.daytrader.TradeServices { 034 035 private static String servicePort; 036 private static org.apache.geronimo.samples.daytrader.client.ws.TradeWSServices trade; 037 private static final String jndiName = "java:comp/env/service/Trade"; 038 039 public TradeWebSoapProxy() { 040 if (trade == null) { 041 trade = getTrade(); 042 } 043 } 044 045 public static org.apache.geronimo.samples.daytrader.client.ws.TradeWSServices getTrade() { 046 try { 047 trade = getPortFromFactory(); 048 ((Stub)trade)._setProperty("javax.xml.rpc.service.endpoint.address", TradeConfig.getSoapURL()); 049 } 050 catch (Exception e) { 051 System.out.println("problem getting trade port " + e); 052 e.printStackTrace(); 053 } 054 return trade; 055 } 056 057 private static org.apache.geronimo.samples.daytrader.client.ws.TradeWSServices getPortFromFactory() throws ServiceException, MalformedURLException { 058 if (Log.doTrace()) { 059 Log.traceEnter("TradeWebSoapProxt.getPortFromFactory()"); 060 } 061 // JSR 109 lookup 062 try { 063 InitialContext context = new InitialContext(); 064 if (Log.doTrace()) { 065 Log.trace("attempting JSR109 lookup with jndi of " + jndiName); 066 } 067 org.apache.geronimo.samples.daytrader.client.ws.Trade tradeService1 = (org.apache.geronimo.samples.daytrader.client.ws.Trade)context.lookup(jndiName); 068 return tradeService1.getTradeWSServices(); 069 } 070 catch (Exception e) { 071 Log.error(e, "JSR 109 lookup failed .. defaulting to JSR 101"); 072 } 073 074 // JSR 101 lookup 075 if (Log.doTrace()) { 076 Log.trace("attempting JSR101 lookup with url of " + TradeConfig.getSoapURL()); 077 } 078 URL wsdlLoc = new URL(TradeConfig.getSoapURL()); 079 QName serviceName = new QName("http://daytrader.samples.geronimo.apache.org", "Trade"); 080 Service tService = ServiceFactory.newInstance().createService(wsdlLoc, serviceName); 081 QName portName = new QName("http://daytrader.samples.geronimo.apache.org", "TradeWSServices"); 082 return (org.apache.geronimo.samples.daytrader.client.ws.TradeWSServices)tService.getPort(portName, org.apache.geronimo.samples.daytrader.client.ws.TradeWSServices.class); 083 } 084 085 public static void updateServicePort() { 086 // reconstruct Trade as service port has changed 087 trade = getTrade(); 088 } 089 090 /* (non-Javadoc) 091 * @see org.apache.geronimo.samples.daytrader.TradeServices#buy(java.lang.String, java.lang.String, double, int) 092 */ 093 public org.apache.geronimo.samples.daytrader.OrderDataBean buy(String userID, String symbol, double quantity, int orderProcessingMode) throws Exception, RemoteException { 094 return convertOrderDataBean(getTrade().buy(userID, symbol, quantity, orderProcessingMode)); 095 } 096 097 /* (non-Javadoc) 098 * @see org.apache.geronimo.samples.daytrader.TradeServices#cancelOrder(java.lang.Integer, boolean) 099 */ 100 public void cancelOrder(Integer orderID, boolean twoPhase) throws Exception, RemoteException { 101 getTrade().cancelOrder(orderID, twoPhase); 102 } 103 104 /* (non-Javadoc) 105 * @see org.apache.geronimo.samples.daytrader.TradeServices#completeOrder(java.lang.Integer, boolean) 106 */ 107 public OrderDataBean completeOrder(Integer orderID, boolean twoPhase) throws Exception, RemoteException { 108 return convertOrderDataBean(getTrade().completeOrder(orderID, twoPhase)); 109 } 110 111 /* (non-Javadoc) 112 * @see org.apache.geronimo.samples.daytrader.TradeServices#createQuote(java.lang.String, java.lang.String, java.math.BigDecimal) 113 */ 114 public QuoteDataBean createQuote(String symbol, String companyName, BigDecimal price) throws Exception, RemoteException { 115 return convertQuoteDataBean(getTrade().createQuote(symbol, companyName, price)); 116 } 117 118 /* (non-Javadoc) 119 * @see org.apache.geronimo.samples.daytrader.TradeServices#getAccountData(java.lang.String) 120 */ 121 public AccountDataBean getAccountData(String userID) throws FinderException, RemoteException { 122 return convertAccountDataBean(getTrade().getAccountData(userID)); 123 } 124 125 /* (non-Javadoc) 126 * @see org.apache.geronimo.samples.daytrader.TradeServices#getAccountProfileData(java.lang.String) 127 */ 128 public AccountProfileDataBean getAccountProfileData(String userID) throws Exception, RemoteException { 129 return convertAccountProfileDataBean(getTrade().getAccountProfileData(userID)); 130 } 131 132 /* (non-Javadoc) 133 * @see org.apache.geronimo.samples.daytrader.TradeServices#getAllQuotes() 134 */ 135 public Collection getAllQuotes() throws Exception, RemoteException { 136 return convertQuoteDataBeanWSArrayToCollectionBase(getTrade().getAllQuotes()); 137 } 138 139 /* (non-Javadoc) 140 * @see org.apache.geronimo.samples.daytrader.TradeServices#getClosedOrders(java.lang.String) 141 */ 142 public Collection getClosedOrders(String userID) throws Exception, RemoteException { 143 Object[] orders = getTrade().getClosedOrders(userID); 144 ArrayList ordersRet = new ArrayList(); 145 if (orders.length == 0) { 146 return ordersRet; 147 } 148 for (int ii = 0; ii < orders.length; ii++) { 149 ordersRet.add(convertOrderDataBean((org.apache.geronimo.samples.daytrader.client.ws.OrderDataBean)orders[ii])); 150 } 151 return ordersRet; 152 } 153 154 /* (non-Javadoc) 155 * @see org.apache.geronimo.samples.daytrader.TradeServices#getHolding(java.lang.Integer) 156 */ 157 public HoldingDataBean getHolding(Integer holdingID) throws Exception, RemoteException { 158 return convertHoldingDataBean(getTrade().getHolding(holdingID)); 159 } 160 161 /* (non-Javadoc) 162 * @see org.apache.geronimo.samples.daytrader.TradeServices#getHoldings(java.lang.String) 163 */ 164 public Collection getHoldings(String userID) throws Exception, RemoteException { 165 Object[] holdings = getTrade().getHoldings(userID); 166 ArrayList holdingsRet = new ArrayList(); 167 if (holdings.length == 0) { 168 return holdingsRet; 169 } 170 171 for (int ii = 0; ii < holdings.length; ii++) { 172 holdingsRet.add(convertHoldingDataBean((org.apache.geronimo.samples.daytrader.client.ws.HoldingDataBean)holdings[ii])); 173 } 174 return holdingsRet; 175 } 176 177 /* (non-Javadoc) 178 * @see org.apache.geronimo.samples.daytrader.TradeServices#getMarketSummary() 179 */ 180 public MarketSummaryDataBean getMarketSummary() throws Exception, RemoteException { 181 return convertMarketSummaryDataBean(getTrade().getMarketSummary()); 182 } 183 184 /* (non-Javadoc) 185 * @see org.apache.geronimo.samples.daytrader.TradeServices#getOrders(java.lang.String) 186 */ 187 public Collection getOrders(String userID) throws Exception, RemoteException { 188 Object[] orders = getTrade().getOrders(userID); 189 ArrayList ordersRet = new ArrayList(); 190 if (orders.length == 0) { 191 return ordersRet; 192 } 193 for (int ii = 0; ii < orders.length; ii++) { 194 ordersRet.add(convertOrderDataBean((org.apache.geronimo.samples.daytrader.client.ws.OrderDataBean)orders[ii])); 195 } 196 return ordersRet; 197 } 198 199 /* (non-Javadoc) 200 * @see org.apache.geronimo.samples.daytrader.TradeServices#getQuote(java.lang.String) 201 */ 202 public QuoteDataBean getQuote(String symbol) throws Exception, RemoteException { 203 return convertQuoteDataBean(getTrade().getQuote(symbol)); 204 } 205 206 /* (non-Javadoc) 207 * @see org.apache.geronimo.samples.daytrader.TradeServices#login(java.lang.String, java.lang.String) 208 */ 209 public AccountDataBean login(String userID, String password) throws Exception, RemoteException { 210 return convertAccountDataBean(getTrade().login(userID, password)); 211 } 212 213 /* (non-Javadoc) 214 * @see org.apache.geronimo.samples.daytrader.TradeServices#logout(java.lang.String) 215 */ 216 public void logout(String userID) throws Exception, RemoteException { 217 getTrade().logout(userID); 218 } 219 220 /* (non-Javadoc) 221 * @see org.apache.geronimo.samples.daytrader.TradeServices#orderCompleted(java.lang.String, java.lang.Integer) 222 */ 223 public void orderCompleted(String userID, Integer orderID) throws Exception, RemoteException { 224 getTrade().orderCompleted(userID, orderID); 225 } 226 227 /* (non-Javadoc) 228 * @see org.apache.geronimo.samples.daytrader.TradeServices#queueOrder(java.lang.Integer, boolean) 229 */ 230 public void queueOrder(Integer orderID, boolean twoPhase) throws Exception, RemoteException { 231 getTrade().queueOrder(orderID, twoPhase); 232 } 233 234 /* (non-Javadoc) 235 * @see org.apache.geronimo.samples.daytrader.TradeServices#register(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.math.BigDecimal) 236 */ 237 public AccountDataBean register(String userID, String password, String fullname, String address, String email, String creditcard, BigDecimal openBalance) throws Exception, RemoteException { 238 return convertAccountDataBean(getTrade().register(userID, password, fullname, address, email, creditcard, openBalance)); 239 } 240 241 /* (non-Javadoc) 242 * @see org.apache.geronimo.samples.daytrader.TradeServices#resetTrade(boolean) 243 */ 244 public RunStatsDataBean resetTrade(boolean deleteAll) throws Exception, RemoteException { 245 return convertRunStatsDataBean(getTrade().resetTrade(deleteAll)); 246 } 247 248 /* (non-Javadoc) 249 * @see org.apache.geronimo.samples.daytrader.TradeServices#sell(java.lang.String, java.lang.Integer, int) 250 */ 251 public OrderDataBean sell(String userID, Integer holdingID, int orderProcessingMode) throws Exception, RemoteException { 252 return convertOrderDataBean(getTrade().sell(userID, holdingID, orderProcessingMode)); 253 } 254 255 /* (non-Javadoc) 256 * @see org.apache.geronimo.samples.daytrader.TradeServices#updateAccountProfile(org.apache.geronimo.samples.daytrader.AccountProfileDataBean) 257 */ 258 public AccountProfileDataBean updateAccountProfile(AccountProfileDataBean profileData) throws Exception, RemoteException { 259 return convertAccountProfileDataBean(getTrade().updateAccountProfile(convertAccountProfileDataBeanToWS(profileData))); 260 } 261 262 /* (non-Javadoc) 263 * @see org.apache.geronimo.samples.daytrader.TradeServices#updateQuotePriceVolume(java.lang.String, java.math.BigDecimal, double) 264 */ 265 public QuoteDataBean updateQuotePriceVolume(String symbol, BigDecimal newPrice, double sharesTraded) throws Exception, RemoteException { 266 return convertQuoteDataBean(getTrade().updateQuotePriceVolume(symbol, newPrice, sharesTraded)); 267 } 268 269 private org.apache.geronimo.samples.daytrader.OrderDataBean convertOrderDataBean(org.apache.geronimo.samples.daytrader.client.ws.OrderDataBean bean) { 270 return new org.apache.geronimo.samples.daytrader.OrderDataBean( 271 bean.getOrderID(), 272 bean.getOrderType(), 273 bean.getOrderStatus(), 274 bean.getOpenDate() != null ? bean.getOpenDate().getTime() : null, 275 bean.getCompletionDate() != null ? bean.getCompletionDate().getTime() : null, 276 bean.getQuantity(), 277 bean.getPrice(), 278 bean.getOrderFee(), 279 bean.getSymbol()); 280 } 281 282 private org.apache.geronimo.samples.daytrader.QuoteDataBean convertQuoteDataBean(org.apache.geronimo.samples.daytrader.client.ws.QuoteDataBean bean) { 283 return new org.apache.geronimo.samples.daytrader.QuoteDataBean( 284 bean.getSymbol(), 285 bean.getCompanyName(), 286 bean.getVolume(), 287 bean.getPrice(), 288 bean.getOpen(), 289 bean.getLow(), 290 bean.getHigh(), 291 bean.getChange()); 292 } 293 294 private Collection convertQuoteDataBeanWSArrayToCollectionBase(Object[] quotes) { 295 ArrayList quotesRet = new ArrayList(); 296 if (quotes.length == 0) { 297 return quotesRet; 298 } 299 for (int ii = 0; ii < quotes.length; ii++) { 300 quotesRet.add(convertQuoteDataBean((org.apache.geronimo.samples.daytrader.client.ws.QuoteDataBean)quotes[ii])); 301 } 302 return quotesRet; 303 } 304 305 private org.apache.geronimo.samples.daytrader.HoldingDataBean convertHoldingDataBean(org.apache.geronimo.samples.daytrader.client.ws.HoldingDataBean bean) { 306 return new org.apache.geronimo.samples.daytrader.HoldingDataBean( 307 bean.getHoldingID(), 308 bean.getQuantity(), 309 bean.getPurchasePrice(), 310 bean.getPurchaseDate().getTime(), 311 bean.getQuoteID()); 312 } 313 314 private org.apache.geronimo.samples.daytrader.AccountDataBean convertAccountDataBean(org.apache.geronimo.samples.daytrader.client.ws.AccountDataBean bean) { 315 return new org.apache.geronimo.samples.daytrader.AccountDataBean( 316 bean.getAccountID(), 317 bean.getLoginCount(), 318 bean.getLogoutCount(), 319 bean.getLastLogin().getTime(), 320 bean.getCreationDate().getTime(), 321 bean.getBalance(), 322 bean.getOpenBalance(), 323 bean.getProfileID()); 324 } 325 326 private org.apache.geronimo.samples.daytrader.AccountProfileDataBean convertAccountProfileDataBean(org.apache.geronimo.samples.daytrader.client.ws.AccountProfileDataBean bean) { 327 return new org.apache.geronimo.samples.daytrader.AccountProfileDataBean( 328 bean.getUserID(), 329 bean.getPassword(), 330 bean.getFullName(), 331 bean.getAddress(), 332 bean.getEmail(), 333 bean.getCreditCard()); 334 } 335 336 private org.apache.geronimo.samples.daytrader.client.ws.AccountProfileDataBean convertAccountProfileDataBeanToWS(org.apache.geronimo.samples.daytrader.AccountProfileDataBean bean) { 337 org.apache.geronimo.samples.daytrader.client.ws.AccountProfileDataBean beanRet = new org.apache.geronimo.samples.daytrader.client.ws.AccountProfileDataBean(); 338 beanRet.setUserID(bean.getUserID()); 339 beanRet.setPassword(bean.getPassword()); 340 beanRet.setFullName(bean.getFullName()); 341 beanRet.setAddress(bean.getAddress()); 342 beanRet.setEmail(bean.getEmail()); 343 beanRet.setCreditCard(bean.getCreditCard()); 344 return beanRet; 345 } 346 347 private org.apache.geronimo.samples.daytrader.MarketSummaryDataBean convertMarketSummaryDataBean(org.apache.geronimo.samples.daytrader.client.ws.MarketSummaryDataBeanWS bean) { 348 org.apache.geronimo.samples.daytrader.MarketSummaryDataBean retBean = new org.apache.geronimo.samples.daytrader.MarketSummaryDataBean(); 349 retBean.setTopGainers(convertQuoteDataBeanWSArrayToCollectionBase(bean.getTopGainers())); 350 retBean.setTopLosers(convertQuoteDataBeanWSArrayToCollectionBase(bean.getTopLosers())); 351 retBean.setTSIA(bean.getTSIA()); 352 retBean.setOpenTSIA(bean.getOpenTSIA()); 353 retBean.setVolume(bean.getVolume()); 354 // can't use contructor of MSBean as it sets this to the current time 355 retBean.setSummaryDate(bean.getSummaryDate().getTime()); 356 return retBean; 357 } 358 359 private org.apache.geronimo.samples.daytrader.RunStatsDataBean convertRunStatsDataBean(org.apache.geronimo.samples.daytrader.client.ws.RunStatsDataBean bean) { 360 org.apache.geronimo.samples.daytrader.RunStatsDataBean beanRet = new org.apache.geronimo.samples.daytrader.RunStatsDataBean(); 361 beanRet.setTradeUserCount(bean.getTradeUserCount()); 362 beanRet.setNewUserCount(bean.getNewUserCount()); 363 beanRet.setSumLoginCount(bean.getSumLoginCount()); 364 beanRet.setSumLogoutCount(bean.getSumLogoutCount()); 365 beanRet.setHoldingCount(bean.getHoldingCount()); 366 beanRet.setOrderCount(bean.getOrderCount()); 367 beanRet.setBuyOrderCount(bean.getBuyOrderCount()); 368 beanRet.setSellOrderCount(bean.getSellOrderCount()); 369 beanRet.setCancelledOrderCount(bean.getCancelledOrderCount()); 370 beanRet.setOpenOrderCount(bean.getOpenOrderCount()); 371 beanRet.setDeletedOrderCount(bean.getDeletedOrderCount()); 372 return beanRet; 373 } 374 }