001 package mazegen.swing_client;
002
003 import javax.swing.*;
004 import java.awt.*;
005 import java.awt.event.*;
006
007 import java.io.IOException;
008 import java.rmi.RemoteException;
009
010 // proxy classes are located in the weblogic.jws.proxies package.
011 import weblogic.jws.proxies.*;
012
013 /**
014 * <p>This is an example of a web service client that uses the web wervice
015 * proxy generated by WebLogic Server. This example is a simple Swing
016 * client that exercises the MazeGenerator web service and displays mazes
017 * returned from the web service.</p>
018 *
019 * <p>See "MazeGenerator Sample" in the WebLogic Workshop documentation.</p>
020 *
021 * <p>This client accesses the web service via proxy classes found in
022 * SamplesApp/APP-INF/lib/MazeGenerator.jar. That JAR file is obtained by selecting
023 * the "Java Proxy" link on a web service's Test View Overview Page. If
024 * the web service is served from the local machine, the URL to the Overview
025 * Page is:
026 * http://localhost:7001/samples/proxy/mazegen/MazeGanerator.jws</p>
027 */
028 public class MazeGUIClient {
029 private int rows = 11;
030 private int cols = 26;
031
032 JTextArea textArea;
033
034 /*
035 * <p>Declare the proxy objects. There is a main proxy object with the
036 * same name as the web service but with "_Impl" appended, then
037 * protocol-specific proxie classes that contain the actual method
038 * stubs for the web service's operations.</p>
039 *
040 * <p>This web service supports SOAP over HTTP, so it
041 * has a proxy with the name <web service>SOAP.</p>
042 */
043 MazeGenerator_Impl proxy;
044 MazeGeneratorSoap soapProxy;
045
046 /**
047 * Utility function to create the Swing UI.
048 *
049 * Note that the anonymous ActionListener for generateButton
050 * invokes the proxy with the number of desired rows and columns
051 * and displays the response in textArea.
052 */
053 public Component createComponents() {
054 GridBagLayout gridbag = new GridBagLayout();
055 GridBagConstraints constraints = new GridBagConstraints();
056
057 /**********************************************************
058 * create input panel
059 */
060 final JLabel rowLabel = new JLabel("Rows: ");
061 final JTextField rowTextField = new JTextField(10);
062 rowTextField.setColumns(4);
063 rowTextField.setText("11");
064 rowTextField.addActionListener(new ActionListener() {
065 public void actionPerformed(ActionEvent e) {
066 String text = rowTextField.getText();
067 try
068 {
069 rows = Integer.parseInt(text);
070 }
071 catch (NumberFormatException ex)
072 {
073 // if the value isn't valid, default to 11
074 rows = 11;
075 rowTextField.setText("11");
076 }
077 }
078 });
079 rowTextField.addFocusListener(new FocusListener() {
080 public void focusGained(FocusEvent e) {
081 }
082 public void focusLost(FocusEvent e) {
083 String text = rowTextField.getText();
084 try
085 {
086 rows = Integer.parseInt(text);
087 }
088 catch (NumberFormatException ex)
089 {
090 // if the value isn't valid, default to 11
091 rows = 11;
092 rowTextField.setText("11");
093 }
094 }
095 });
096 final JLabel colLabel = new JLabel("Columns: ");
097 final JTextField colTextField = new JTextField(10);
098 colTextField.setColumns(4);
099 colTextField.setText("26");
100 colTextField.addActionListener(new ActionListener() {
101 public void actionPerformed(ActionEvent e) {
102 String text = colTextField.getText();
103 try
104 {
105 cols = Integer.parseInt(text);
106 }
107 catch (NumberFormatException ex)
108 {
109 // if the value isn't valid, default to 26
110 cols = 26;
111 colTextField.setText("26");
112 }
113 }
114 });
115 colTextField.addFocusListener(new FocusListener() {
116 public void focusGained(FocusEvent e) {
117 }
118 public void focusLost(FocusEvent e) {
119 String text = colTextField.getText();
120 try
121 {
122 cols = Integer.parseInt(text);
123 }
124 catch (NumberFormatException ex)
125 {
126 // if the value isn't valid, default to 26
127 cols = 26;
128 colTextField.setText("26");
129 }
130 }
131 });
132
133 JButton generateButton = new JButton("Generate Maze");
134 generateButton.setMnemonic(KeyEvent.VK_G);
135 generateButton.addActionListener(new ActionListener() {
136 public void actionPerformed(ActionEvent e) {
137 String mazeText;
138 try
139 {
140 /*
141 * Invoke the web service via the proxy. Call
142 * the web service's printRandomMaze method with
143 * the desired number of rows and columns. Display
144 * the String response in textArea.
145 */
146 mazeText = soapProxy.printRandomMaze(rows, cols);
147 textArea.setText(mazeText);
148 }
149 catch (RemoteException ex)
150 {
151 System.out.println("Error invoking service via proxy");
152 ex.printStackTrace();
153 }
154 }
155 });
156
157 constraints.fill = GridBagConstraints.NONE;
158 constraints.gridx = GridBagConstraints.RELATIVE;
159 constraints.gridy = 0;
160 gridbag.setConstraints(generateButton, constraints);
161
162 JPanel inputPanel = new JPanel();
163 inputPanel.setBorder(BorderFactory.createEmptyBorder(
164 5, //top
165 5, //left
166 5, //bottom
167 5) //right
168 );
169 inputPanel.setLayout(new GridLayout(1,0,5,0));
170 inputPanel.add(rowLabel);
171 inputPanel.add(rowTextField);
172 inputPanel.add(colLabel);
173 inputPanel.add(colTextField);
174 inputPanel.add(generateButton);
175
176 constraints.fill = GridBagConstraints.HORIZONTAL;
177 constraints.gridx = 0;
178 constraints.gridy = 0;
179 gridbag.setConstraints(inputPanel, constraints);
180
181 /**********************************************************
182 * create output panel
183 */
184 JPanel outputPanel = new JPanel();
185
186 textArea = new JTextArea(25, 80);
187 textArea.setFont(new Font("Courier", Font.PLAIN, 12));
188
189 outputPanel.add(textArea);
190
191 constraints.fill = GridBagConstraints.HORIZONTAL;
192 constraints.gridx = 0;
193 constraints.gridy = GridBagConstraints.RELATIVE;
194 gridbag.setConstraints(outputPanel, constraints);
195
196 /**********************************************************
197 * create main panel
198 */
199 JPanel mainPanel = new JPanel();
200 mainPanel.setBorder(BorderFactory.createEmptyBorder(
201 10, //top
202 10, //left
203 10, //bottom
204 10) //right
205 );
206 mainPanel.setLayout(gridbag);
207 mainPanel.add(inputPanel);
208 mainPanel.add(outputPanel);
209
210 return mainPanel;
211 }
212
213 /**
214 * Utility function to instantiate the proxy, then get the
215 * SOAP-specific proxy from the main proxy.
216 */
217 private void CreateProxy()
218 {
219 try
220 {
221 /*
222 * Construct the proxy.
223 *
224 * Note that there is an alternative constructor in which you can pass the URL of
225 * the target service's WSDL (which is typically the URL of the service with ?WSDL
226 * appended). That technique is used for "dynamic" proxies. The static WSDL is
227 * already built into the generated proxy and will be used if the no-argument
228 * proxy constructor is used (as below). Using the dynamic form causes an extra
229 * hit on the server for every web service request submitted.
230 */
231 proxy = new MazeGenerator_Impl();
232 soapProxy = proxy.getMazeGeneratorSoap();
233 }
234 catch (IOException ex)
235 {
236 System.out.println("Error creating proxy");
237 }
238 }
239
240 public static void main(String[] args) {
241 try {
242 UIManager.setLookAndFeel(
243 UIManager.getCrossPlatformLookAndFeelClassName());
244 } catch (Exception e) {}
245
246 // Create the top-level container
247 JFrame frame = new JFrame("MazeGUIClient");
248 MazeGUIClient app = new MazeGUIClient();
249
250 // Create the proxy
251 app.CreateProxy();
252
253 // Create the UI
254 Component contents = app.createComponents();
255 frame.getContentPane().add(contents, BorderLayout.CENTER);
256
257 /*
258 * Make the UI visible, then implicitly loop forever on
259 * user events until the program is terminated.
260 */
261 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
262 frame.pack();
263 frame.setVisible(true);
264 }
265 }
|