KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > izforge > izpack > installer > WebAccessor


1 /*
2  * IzPack - Copyright 2001-2007 Julien Ponge, All Rights Reserved.
3  *
4  * http://www.izforge.com/izpack/
5  * http://developer.berlios.de/projects/izpack/
6  *
7  * Copyright 2002 Johannes Lehtinen
8  *
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  * http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  */

21
22 package com.izforge.izpack.installer;
23
24 import java.awt.BorderLayout JavaDoc;
25 import java.awt.Component JavaDoc;
26 import java.awt.Cursor JavaDoc;
27 import java.awt.GridLayout JavaDoc;
28 import java.awt.Toolkit JavaDoc;
29 import java.io.InputStream JavaDoc;
30 import java.net.Authenticator JavaDoc;
31 import java.net.ConnectException JavaDoc;
32 import java.net.InetAddress JavaDoc;
33 import java.net.PasswordAuthentication JavaDoc;
34 import java.net.URL JavaDoc;
35 import java.net.URLConnection JavaDoc;
36 import java.util.Locale JavaDoc;
37
38 import javax.swing.JDialog JavaDoc;
39 import javax.swing.JLabel JavaDoc;
40 import javax.swing.JOptionPane JavaDoc;
41 import javax.swing.JPanel JavaDoc;
42 import javax.swing.JPasswordField JavaDoc;
43 import javax.swing.JTextField JavaDoc;
44 import javax.swing.UIManager JavaDoc;
45 import javax.swing.JProgressBar JavaDoc;
46
47 /**
48  * Dialogs for password authentication and firewall specification, when needed, during web
49  * installation.
50  *
51  * @author Chadwick McHenry
52  * @version 1.0
53  */

54 public class WebAccessor
55 {
56
57     private Thread JavaDoc openerThread = null;
58
59     private InputStream JavaDoc iStream = null;
60
61     private Exception JavaDoc exception = null;
62
63     private Object JavaDoc soloCancelOption = null;
64
65     private Component JavaDoc parent = null;
66
67     private JDialog JavaDoc dialog = null;
68
69     private boolean tryProxy = false;
70
71     private JPanel JavaDoc passwordPanel = null;
72
73     private JLabel JavaDoc promptLabel;
74
75     private JTextField JavaDoc nameField;
76
77     private JPasswordField JavaDoc passField;
78
79     private JPanel JavaDoc proxyPanel = null;
80
81     private JLabel JavaDoc errorLabel;
82
83     private JTextField JavaDoc hostField;
84
85     private JTextField JavaDoc portField;
86
87     /**
88      * Not yet Implemented: placeholder for headless installs.
89      *
90      * @throws UnsupportedOperationException
91      */

92     public WebAccessor()
93     {
94         // the class should probably be rearranged to do this.
95
throw new UnsupportedOperationException JavaDoc();
96     }
97
98     /**
99      * Create a WebAccessor that prompts for proxies and passwords using a JDialog.
100      *
101      * @param parent determines the frame in which the dialog is displayed; if the parentComponent
102      * has no Frame, a default Frame is used
103      */

104     public WebAccessor(Component JavaDoc parent)
105     {
106         this.parent = parent;
107         Locale JavaDoc l = null;
108         if (parent != null) parent.getLocale();
109         soloCancelOption = UIManager.get("OptionPane.cancelButtonText", l);// TODO:
110
// i18n?
111
Authenticator.setDefault(new MyDialogAuthenticator());
112     }
113
114     /**
115      * Opens a URL connection and returns it's InputStream for the specified URL.
116      *
117      * @param url the url to open the stream to.
118      * @return an input stream ready to read, or null on failure
119      */

120     public InputStream JavaDoc openInputStream(URL JavaDoc url)
121     {
122         // TODO: i18n everything
123
Object JavaDoc[] options = { soloCancelOption};
124         
125         JProgressBar JavaDoc progressBar = new JProgressBar JavaDoc(1, 100);
126         progressBar.setIndeterminate(true);
127         Object JavaDoc[] contents = { "Connecting to the Internet", progressBar };
128         JOptionPane JavaDoc pane = new JOptionPane JavaDoc(contents,
129                         JOptionPane.INFORMATION_MESSAGE,
130                         JOptionPane.DEFAULT_OPTION, null, options,
131                 options[0]);
132         dialog = pane.createDialog(parent, "Accessing Install Files");
133         pane.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
134
135         Object JavaDoc value = null;
136         OPEN_URL: while (true)
137         {
138             startOpening(url); // this starts a thread that may dismiss the
139
// dialog before user
140
dialog.setVisible(true);
141             value = pane.getValue();
142
143             // dialog closed or canceled (by widget)
144
if (value == null || value == soloCancelOption)
145             {
146                 try
147                 {
148                     openerThread.interrupt();// stop the connection
149
}
150                 catch (Exception JavaDoc e)
151                 {}
152                 iStream = null; // even if connection was made just after cancel
153
break;
154             }
155
156             // dialog closed by thread so either a connection error or success!
157
else if (value == JOptionPane.UNINITIALIZED_VALUE)
158             {
159                 // success!
160
if (iStream != null) break;
161
162                 // System.err.println(exception);
163

164                 // an exception we don't expect setting a proxy to fix
165
if (!tryProxy) break;
166
167                 // else (exception != null)
168
// show proxy dialog until valid values or cancel
169
JPanel JavaDoc panel = getProxyPanel();
170                 errorLabel.setText("Unable to connect: " + exception.getMessage());
171                 while (true)
172                 {
173                     int result = JOptionPane.showConfirmDialog(parent, panel,
174                             "Proxy Configuration", JOptionPane.OK_CANCEL_OPTION,
175                             JOptionPane.QUESTION_MESSAGE);
176                     if (result != JOptionPane.OK_OPTION) // canceled
177
break OPEN_URL;
178
179                     String JavaDoc host = null;
180                     String JavaDoc port = null;
181
182                     try
183                     {
184                         InetAddress JavaDoc addr = InetAddress.getByName(hostField.getText());
185                         host = addr.getHostName();
186                     }
187                     catch (Exception JavaDoc x)
188                     {
189                         errorLabel.setText("Unable to resolve Host");
190                         Toolkit.getDefaultToolkit().beep();
191                     }
192
193                     try
194                     {
195                         if (host != null) port = Integer.valueOf(portField.getText()).toString();
196                     }
197                     catch (NumberFormatException JavaDoc x)
198                     {
199                         errorLabel.setText("Invalid Port");
200                         Toolkit.getDefaultToolkit().beep();
201                     }
202
203                     if (host != null && port != null)
204                     {
205                         // System.err.println ("Setting http proxy: "+ host
206
// +":"+ port);
207
System.getProperties().put("proxySet", "true");
208                         System.getProperties().put("proxyHost", host);
209                         System.getProperties().put("proxyPort", port);
210                         break;
211                     }
212                 }
213             }
214         }
215         return iStream;
216     }
217
218     private void startOpening(final URL JavaDoc url)
219     {
220         openerThread = new Thread JavaDoc() {
221
222             public void run()
223             {
224                 iStream = null;
225                 try
226                 {
227                     tryProxy = false;
228                     URLConnection JavaDoc connection = url.openConnection();
229                     iStream = connection.getInputStream(); // just to make
230
// connection
231

232                 }
233                 catch (ConnectException JavaDoc x)
234                 { // could be an incorrect proxy
235
tryProxy = true;
236                     exception = x;
237
238                 }
239                 catch (Exception JavaDoc x)
240                 {
241                     // Exceptions that get here are considered cancels or
242
// missing
243
// pages, eg 401 if user finally cancels auth
244
exception = x;
245
246                 }
247                 finally
248                 {
249                     // if dialog is in use, allow it to become visible /before/
250
// closing
251
// it, else on /fast/ connectinos, it may open later and
252
// hang!
253
if (dialog != null)
254                     {
255                         Thread.yield();
256                         dialog.setVisible(false);
257                     }
258                 }
259             }
260         };
261         openerThread.start();
262     }
263
264     /**
265      * Only to be called after an initial error has indicated a connection problem
266      */

267     private JPanel JavaDoc getProxyPanel()
268     {
269         if (proxyPanel == null)
270         {
271             proxyPanel = new JPanel JavaDoc(new BorderLayout JavaDoc(5, 5));
272
273             errorLabel = new JLabel JavaDoc();
274
275             JPanel JavaDoc fields = new JPanel JavaDoc(new GridLayout JavaDoc(2, 2));
276             String JavaDoc h = (String JavaDoc) System.getProperties().get("proxyHost");
277             String JavaDoc p = (String JavaDoc) System.getProperties().get("proxyPort");
278             hostField = new JTextField JavaDoc(h != null ? h : "");
279             portField = new JTextField JavaDoc(p != null ? p : "");
280             JLabel JavaDoc host = new JLabel JavaDoc("Host: "); // TODO: i18n
281
JLabel JavaDoc port = new JLabel JavaDoc("Port: "); // TODO: i18n
282
fields.add(host);
283             fields.add(hostField);
284             fields.add(port);
285             fields.add(portField);
286
287             JLabel JavaDoc exampleLabel = new JLabel JavaDoc("e.g. host=\"gatekeeper.example.com\" port=\"80\"");
288
289             proxyPanel.add(errorLabel, BorderLayout.NORTH);
290             proxyPanel.add(fields, BorderLayout.CENTER);
291             proxyPanel.add(exampleLabel, BorderLayout.SOUTH);
292         }
293         proxyPanel.validate();
294
295         return proxyPanel;
296     }
297
298     private JPanel JavaDoc getPasswordPanel()
299     {
300         if (passwordPanel == null)
301         {
302             passwordPanel = new JPanel JavaDoc(new BorderLayout JavaDoc(5, 5));
303
304             promptLabel = new JLabel JavaDoc();
305
306             JPanel JavaDoc fields = new JPanel JavaDoc(new GridLayout JavaDoc(2, 2));
307             nameField = new JTextField JavaDoc();
308             passField = new JPasswordField JavaDoc();
309             JLabel JavaDoc name = new JLabel JavaDoc("Name: "); // TODO: i18n
310
JLabel JavaDoc pass = new JLabel JavaDoc("Password: "); // TODO: i18n
311
fields.add(name);
312             fields.add(nameField);
313             fields.add(pass);
314             fields.add(passField);
315
316             passwordPanel.add(promptLabel, BorderLayout.NORTH);
317             passwordPanel.add(fields, BorderLayout.CENTER);
318         }
319         passField.setText("");
320
321         return passwordPanel;
322     }
323
324     /**
325      * Authenticates via dialog when needed.
326      */

327     private class MyDialogAuthenticator extends Authenticator JavaDoc
328     {
329
330         public PasswordAuthentication JavaDoc getPasswordAuthentication()
331         {
332             // TODO: i18n
333
JPanel JavaDoc p = getPasswordPanel();
334             String JavaDoc prompt = getRequestingPrompt();
335             InetAddress JavaDoc addr = getRequestingSite();
336             if (addr != null) prompt += " (" + addr.getHostName() + ")";
337             promptLabel.setText(prompt);
338             int result = JOptionPane.showConfirmDialog(parent, p, "Enter Password",
339                     JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
340             if (result != JOptionPane.OK_OPTION) return null;
341
342             return new PasswordAuthentication JavaDoc(nameField.getText(), passField.getPassword());
343         }
344     }
345 }
346
Popular Tags