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    }