View Javadoc

    1   /* Copyright 2004, 2005 Acegi Technology Pty Limited
    2    *
    3    * Licensed under the Apache License, Version 2.0 (the "License");
    4    * you may not use this file except in compliance with the License.
    5    * You may obtain a copy of the License at
    6    *
    7    *     http://www.apache.org/licenses/LICENSE-2.0
    8    *
    9    * Unless required by applicable law or agreed to in writing, software
    10   * distributed under the License is distributed on an "AS IS" BASIS,
    11   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12   * See the License for the specific language governing permissions and
    13   * limitations under the License.
    14   */
    15
    16  package sample.contact;
    17
    18  import org.acegisecurity.Authentication;
    19  import org.acegisecurity.context.SecurityContextHolder;
    20  import org.acegisecurity.context.SecurityContextImpl;
    21  import org.acegisecurity.providers.UsernamePasswordAuthenticationToken;
    22
    23  import org.springframework.beans.factory.ListableBeanFactory;
    24
    25  import org.springframework.context.support.FileSystemXmlApplicationContext;
    26
    27  import org.springframework.util.StopWatch;
    28
    29  import java.lang.reflect.InvocationTargetException;
    30  import java.lang.reflect.Method;
    31
    32  import java.util.Iterator;
    33  import java.util.List;
    34  import java.util.Map;
    35
    36
    37  /***
    38   * Demonstrates accessing the {@link ContactManager} via remoting protocols.
    39   *
    40   * <P>
    41   * Based on Spring's JPetStore sample, written by Juergen Hoeller.
    42   * </p>
    43   *
    44   * @author Ben Alex
    45   */
    46  public class ClientApplication {
    47      //~ Instance fields ========================================================
    48
    49      private final ListableBeanFactory beanFactory;
    50
    51      //~ Constructors ===========================================================
    52
    53      public ClientApplication(ListableBeanFactory beanFactory) {
    54          this.beanFactory = beanFactory;
    55      }
    56
    57      //~ Methods ================================================================
    58
    59      public void invokeContactManager(Authentication authentication,
    60          int nrOfCalls) {
    61          StopWatch stopWatch = new StopWatch(nrOfCalls
    62                  + " ContactManager call(s)");
    63          Map contactServices = this.beanFactory.getBeansOfType(ContactManager.class,
    64                  true, true);
    65
    66          SecurityContextHolder.getContext().setAuthentication(authentication);
    67
    68          for (Iterator it = contactServices.keySet().iterator(); it.hasNext();) {
    69              String beanName = (String) it.next();
    70
    71              Object object = this.beanFactory.getBean("&" + beanName);
    72
    73              try {
    74                  System.out.println(
    75                      "Trying to find setUsername(String) method on: "
    76                      + object.getClass().getName());
    77
    78                  Method method = object.getClass().getMethod("setUsername",
    79                          new Class[] {String.class});
    80                  System.out.println("Found; Trying to setUsername(String) to "
    81                      + authentication.getPrincipal());
    82                  method.invoke(object,
    83                      new Object[] {authentication.getPrincipal()});
    84              } catch (NoSuchMethodException ignored) {
    85                  System.out.println(
    86                      "This client proxy factory does not have a setUsername(String) method");
    87              } catch (IllegalAccessException ignored) {
    88                  ignored.printStackTrace();
    89              } catch (InvocationTargetException ignored) {
    90                  ignored.printStackTrace();
    91              }
    92
    93              try {
    94                  System.out.println(
    95                      "Trying to find setPassword(String) method on: "
    96                      + object.getClass().getName());
    97
    98                  Method method = object.getClass().getMethod("setPassword",
    99                          new Class[] {String.class});
    100                 method.invoke(object,
    101                     new Object[] {authentication.getCredentials()});
    102                 System.out.println("Found; Trying to setPassword(String) to "
    103                     + authentication.getCredentials());
    104             } catch (NoSuchMethodException ignored) {
    105                 System.out.println(
    106                     "This client proxy factory does not have a setPassword(String) method");
    107             } catch (IllegalAccessException ignored) {}
    108             catch (InvocationTargetException ignored) {}
    109
    110             ContactManager remoteContactManager = (ContactManager) contactServices
    111                 .get(beanName);
    112             System.out.println("Calling ContactManager '" + beanName + "'");
    113
    114             stopWatch.start(beanName);
    115
    116             List contacts = null;
    117
    118             for (int i = 0; i < nrOfCalls; i++) {
    119                 contacts = remoteContactManager.getAll();
    120             }
    121
    122             stopWatch.stop();
    123
    124             if (contacts.size() != 0) {
    125                 Iterator listIterator = contacts.iterator();
    126
    127                 while (listIterator.hasNext()) {
    128                     Contact contact = (Contact) listIterator.next();
    129                     System.out.println("Contact: " + contact.toString());
    130                 }
    131             } else {
    132                 System.out.println(
    133                     "No contacts found which this user has permission to");
    134             }
    135
    136             System.out.println();
    137             System.out.println(stopWatch.prettyPrint());
    138         }
    139
    140         SecurityContextHolder.setContext(new SecurityContextImpl());
    141     }
    142
    143     public static void main(String[] args) {
    144         String username = System.getProperty("username", "");
    145         String password = System.getProperty("password", "");
    146         String nrOfCallsString = System.getProperty("nrOfCalls", "");
    147
    148         if ("".equals(username) || "".equals(password)) {
    149             System.out.println(
    150                 "You need to specify the user ID to use, the password to use, and optionally a number of calls "
    151                 + "using the username, password, and nrOfCalls system properties respectively. eg for user marissa, "
    152                 + "use: -Dusername=marissa -Dpassword=koala' for a single call per service and "
    153                 + "use: -Dusername=marissa -Dpassword=koala -DnrOfCalls=10 for ten calls per service.");
    154             System.exit(-1);
    155         } else {
    156             int nrOfCalls = 1;
    157
    158             if (!"".equals(nrOfCallsString)) {
    159                 nrOfCalls = Integer.parseInt(nrOfCallsString);
    160             }
    161
    162             ListableBeanFactory beanFactory = new FileSystemXmlApplicationContext(
    163                     "clientContext.xml");
    164             ClientApplication client = new ClientApplication(beanFactory);
    165
    166             client.invokeContactManager(new UsernamePasswordAuthenticationToken(
    167                     username, password), nrOfCalls);
    168             System.exit(0);
    169         }
    170     }
    171 }