1: /*
2: * This is a demonstration JDBC applet connecting to a selected ODBC
3: * data source via the Easysoft JDBC-ODBC Bridge and displaying the
4: * result of a query.
5: *
6: * The method doTask() can be overwritten in subclasses to cary out
7: * other JDBC tasks given an open connection to the selected database.
8: *
9: * A APPLET tag shown below can be used to launch the applet
10: *
11: * <APPLET CODE = "OutputApplet" ARCHIVE ="../jars/EJOB.jar,../jars/qdemo.jar">
12: * <PARAM NAME = "jdbcUrl" VALUE = "jdbc:easysoft:" />
13: * <PARAM NAME = "query" VALUE = "tables" />
14: * </APPLET>
15: *
16: */
17:
18: import javax.swing.JApplet;
19: import javax.swing.JButton;
20:
21: import java.sql.*;
22: import java.net.*;
23: import java.util.*;
24: import javax.swing.*;
25: import java.awt.*;
26: import java.awt.event.*;
27:
28: public class QueryApplet extends JApplet implements Runnable
29: {
30: private Thread worker;
31: private JTextArea textA=null;
32: private JTextArea textR=null;
33: private String message = "Initializing";
34: private JTextArea displayText;
35: private JLabel urlLabel;
36: private JTextField urlText;
37: private JLabel userLabel;
38: private JTextField userText;
39: private JLabel pwdLabel;
40: private JPasswordField pwdText;
41: private JButton connectButton;
42: private JFrame frame;
43: private String jdbcUrl = "";
44: private JScrollPane scrollableTextA;
45: private JScrollPane scrollableTextR;
46:
47: /*
48: * JDBC url to use to connect to. This can be overridden in the
49: * applet parameter: jdbcUrl
50: */
51:
52: public String url = "jdbc:easysoft:";
53:
54: /*
55: * query to run:
56: * JOB runs DatabaseMetaData.getTables() when query="tables"
57: * This can be overridden in the applet parameter: query
58: */
59:
60: public String query = "tables";
61:
62: public synchronized void start()
63: {
64: // Every time "start" is called we create a worker thread to
65: // re-evaluate the database query.
66: if (worker == null)
67: {
68: message = "Connecting to database";
69: worker = new Thread(this);
70: worker.start();
71: }
72: }
73:
74: public void init ()
75: {
76: // Get query parameter
77: String queryParameter = "";
78: try
79: {
80: queryParameter = getParameter("query");
81: }
82: catch (Exception e)
83: { // quietly ignore this if not running in browser
84: }
85:
86: if (queryParameter!=null && !queryParameter.equals(""))
87: {
88: query=queryParameter;
89: }
90:
91: // Getting the parameter for jdbcUrl from the calling html file
92: // This enables retargeting of the applet
93:
94: try
95: {
96: jdbcUrl = getParameter("jdbcUrl");
97: }
98: catch (Exception e)
99: { // quetly ignore this if not running in browser
100: }
101:
102: if (jdbcUrl!=null && !jdbcUrl.equals(""))
103: {
104: url = jdbcUrl;
105: }
106:
107: JPanel app = new JPanel(); // holds the prompt labels
108: app.setLayout(new BorderLayout(5,5)); // overall layout is a NSEWC one
109:
110: if (textA==null)
111: {
112: textA = new JTextArea(message);
113: textA.setRows( 2 );
114: textA.setEditable( false );
115: scrollableTextA = new JScrollPane( textA );
116: app.add ( scrollableTextA, BorderLayout.NORTH );
117: }
118:
119: if (textR==null)
120: {
121: textR = new JTextArea("");
122: textR.setEditable( false );
123: scrollableTextR = new JScrollPane( textR );
124: app.add ( scrollableTextR, BorderLayout.CENTER );
125: }
126: getContentPane().add(app);
127: }
128:
129: /*
130: * The "run" method is called from the worker thread. Notice that
131: * because this method is doing potentially slow databases accesses
132: * we avoid making it a synchronized method.
133: */
134:
135: public void run()
136: {
137: textA.setText( "Getting logon information" );
138:
139: try
140: {
141: displayText = new JTextArea(6,40);
142:
143: frame = new JFrame( "Result Set" );
144: frame.setSize( 450, 125 );
145:
146: // create the components for the applet
147: urlLabel = new JLabel ("URL:");
148:
149: urlText = new JTextField(jdbcUrl);
150: urlText.setFont(new java.awt.Font("dialog", 1, 12));
151: urlText.setEditable( false );
152:
153: userLabel = new JLabel("Logon User:");
154:
155: userText = new JTextField( "" );
156: userText.setFont(new java.awt.Font("dialog", 1, 12));
157:
158: pwdLabel = new JLabel("Login PWD:");
159:
160: pwdText = new JPasswordField( "" );
161: pwdText.setFont(new java.awt.Font("dialog", 1, 12));
162:
163: connectButton = new JButton("Connect");
164:
165: connectButton.addActionListener(new ActionListener() {
166: public void actionPerformed(ActionEvent e)
167: {
168: buttonConnect();
169: }});
170:
171: // overall layout is 3 panels - top, center and bottom
172:
173: JPanel center = new JPanel(); // center part of applet
174:
175: getContentPane().setLayout(new BorderLayout(5,5)); // overall layout is a NSEWC one
176:
177: // set the top panel - consists of three more horizontally arranged panels
178:
179: center.setLayout(new BorderLayout(5, 5)); // give it distinct center
180:
181: JPanel topLeft = new JPanel(); // holds the prompt labels
182: JPanel topCenter = new JPanel(); // holds the text fields
183: JPanel topRight = new JPanel(); // holds the buttons
184:
185: center.add ( topLeft, BorderLayout.WEST );
186: center.add ( topCenter, BorderLayout.CENTER );
187: center.add ( topRight, BorderLayout.EAST );
188:
189: // Each of the top panels has a 3 rows x 1 col grid (2 for right panel)
190:
191: topLeft.setLayout(new GridLayout (3,1,5,5));
192: topCenter.setLayout(new GridLayout (3,1,5,5));
193: topRight.setLayout(new GridLayout (3,1,5,5));
194:
195: // finally - add all the top components
196: topLeft.add(urlLabel);
197: topLeft.add(userLabel);
198: topLeft.add(pwdLabel);
199:
200: topCenter.add(urlText);
201: topCenter.add(userText);
202: topCenter.add(pwdText);
203:
204: topRight.add(connectButton);
205:
206: frame.getContentPane().add( center );
207: frame.setVisible( true );
208: }
209: catch (Exception ex)
210: {
211: ex.printStackTrace();
212: }
213: }
214:
215: public Connection getJOBConnection() throws SQLException
216: {
217: // Load the driver
218:
219: try
220: {
221: Class.forName("easysoft.sql.jobDriver").newInstance();
222: }
223: catch(Exception ex)
224: {
225: throw new SQLException("Can't find Database driver class: " + ex);
226: }
227:
228: // Now establish connection with via the Driver manager
229: java.util.Properties p = new java.util.Properties();
230:
231: String u = userText.getText();
232: if ( u != null )
233: {
234: p.put( "logonuser", u );
235: }
236:
237: String s = new String( pwdText.getPassword());
238: if ( s != null )
239: {
240: p.put( "logonpassword", s );
241: }
242:
243: textA.setText( "Connecting" );
244:
245: Connection con = DriverManager.getConnection(url, p);
246: return con;
247: }
248:
249: /*
250: * In subclasses this method can be overwritten to execute different
251: * db tasks then this given an open connection to the JDBC data source
252: * specified in the applet tag
253: */
254:
255: public void doTask(Connection con) throws SQLException
256: {
257: // Create a statement Object
258: Statement stmt = con.createStatement();
259: // Execute a query returning a result set
260: ResultSet rs = stmt.executeQuery(query);
261: // Get the metadata for the result set
262: ResultSetMetaData rsmd = rs.getMetaData();
263: // Find out the number of columns in the resultset
264: int columnCount = rsmd.getColumnCount();
265: //StringBuffer data = new StringBuffer();
266: String data = "";
267: String rowData ="";
268: // While there are rows in the result set
269: while (rs.next())
270: {
271: rowData = "";
272: // get the data for each column in a row and
273: // construct a string of comma separated column values
274: for (int i = 1; i<= columnCount; i++)
275: {
276: rowData = rowData + rs.getString(i) + ", ";
277: }
278: data = data + rowData + "\n";
279: }
280:
281: // Update result set text area
282: textR.setText(data);
283: // Close result set to release database resources
284: rs.close();
285: // Close Statement to release database resources
286: stmt.close();
287: //Close Connection to release database resources
288: con.close();
289: textA.setText("Run complete");
290: }
291:
292: /*
293: * This private method is used to record an error message for
294: * later display.
295: */
296:
297: synchronized void setError(String mess)
298: {
299: textA.setText(mess);
300: worker = null;
301: // And ask AWT to repaint this applet.
302: repaint();
303: }
304:
305: private void buttonConnect()
306: {
307: frame.setVisible( false );
308: try
309: {
310: Connection con = getJOBConnection();
311: doTask(con);
312: }
313: catch(Exception ex)
314: {
315: setError( ex.getMessage());
316: }
317: }
318: }