1 /****************************************************************
2 * Licensed to the Apache Software Foundation (ASF) under one *
3 * or more contributor license agreements. See the NOTICE file *
4 * distributed with this work for additional information *
5 * regarding copyright ownership. The ASF licenses this file *
6 * to you under the Apache License, Version 2.0 (the *
7 * "License"); you may not use this file except in compliance *
8 * with the License. You may obtain a copy of the License at *
9 * *
10 * http://www.apache.org/licenses/LICENSE-2.0 *
11 * *
12 * Unless required by applicable law or agreed to in writing, *
13 * software distributed under the License is distributed on an *
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
15 * KIND, either express or implied. See the License for the *
16 * specific language governing permissions and limitations *
17 * under the License. *
18 ****************************************************************/
19
20 package org.apache.james.mpt;
21
22 import java.io.Reader;
23 import java.io.StringReader;
24
25 /**
26 * Adds a user by executing a script at a port.
27 * The user name and password supplied will be substituted
28 * for the variables <code>${user}</code> and <code>${password}</code>.
29 */
30 public class ScriptedUserAdder implements UserAdder {
31
32 private static final String SCRIPT_NAME = "Add User Script";
33 private static final String PASSWORD_VARIABLE_NAME = "password";
34 private static final String USER_VARIABLE_NAME = "user";
35
36 private final String host;
37 private final int port;
38 private final String script;
39 private final Monitor monitor;
40
41 /**
42 * Constructs an adder without a script.
43 * Note that {@link #addUser(String, String)} will not be available
44 * @param host connect to this host
45 * @param port connect to this port
46 */
47 public ScriptedUserAdder(final String host, final int port)
48 {
49 this(host, port, (String) null);
50 }
51
52 public ScriptedUserAdder(final String host, final int port, final String script) {
53 this(host, port, script, new NullMonitor());
54 }
55
56 /**
57 * Note that {@link #addUser(String, String)} will not be available
58 * @param host connect to this host
59 * @param port connect to this port
60 * @param monitor not null
61 */
62 public ScriptedUserAdder(final String host, final int port, final Monitor monitor) {
63 this(host, port, null, monitor);
64 }
65
66 public ScriptedUserAdder(final String host, final int port, final String script, final Monitor monitor) {
67 this.host = host;
68 this.port = port;
69 this.script = script;
70 this.monitor = monitor;
71 }
72
73 /**
74 * Adds a user using the script read from the given input.
75 * @param user user name, not null
76 * @param password password to set, not null
77 * @throws Exception upon failure
78 * @throws NullPointerException when script has not been set
79 */
80 public void addUser(final String user, final String password) throws Exception {
81 final StringReader reader = new StringReader(script);
82 addUser(user, password, reader);
83 }
84
85 /**
86 * Adds a user using the script read from the given input.
87 * @param user user name, not null
88 * @param password password to set, not null
89 * @param reader reader for script, not null
90 * @throws Exception upon failure
91 */
92 public void addUser(final String user, final String password, final Reader reader) throws Exception {
93 final ProtocolSessionBuilder builder = new ProtocolSessionBuilder();
94 builder.setVariable(USER_VARIABLE_NAME, user);
95 builder.setVariable(PASSWORD_VARIABLE_NAME, password);
96
97 final Runner runner = new Runner();
98 builder.addProtocolLines(SCRIPT_NAME, reader, runner.getTestElements());
99 final ExternalSessionFactory factory = new ExternalSessionFactory(host, port, monitor, null);
100 runner.runSessions(factory);
101 }
102
103 /**
104 * Constructs a <code>String</code> with all attributes
105 * in name = value format.
106 *
107 * @return a <code>String</code> representation
108 * of this object.
109 */
110 public String toString()
111 {
112 final String TAB = " ";
113
114 String result = "ScriptedUserAdder ( "
115 + super.toString() + TAB
116 + "host = " + this.host + TAB
117 + "port = " + this.port + TAB
118 + "script = " + this.script + TAB
119 + "monitor = " + this.monitor + TAB
120 + " )";
121
122 return result;
123 }
124
125
126 }