001: /*--
002:
003: Copyright (C) 2002 Anthony Eden.
004: All rights reserved.
005:
006: Redistribution and use in source and binary forms, with or without
007: modification, are permitted provided that the following conditions
008: are met:
009:
010: 1. Redistributions of source code must retain the above copyright
011: notice, this list of conditions, and the following disclaimer.
012:
013: 2. Redistributions in binary form must reproduce the above copyright
014: notice, this list of conditions, and the disclaimer that follows
015: these conditions in the documentation and/or other materials
016: provided with the distribution.
017:
018: 3. The names "OBE" and "Open Business Engine" must not be used to
019: endorse or promote products derived from this software without prior
020: written permission. For written permission, please contact
021: me@anthonyeden.com.
022:
023: 4. Products derived from this software may not be called "OBE" or
024: "Open Business Engine", nor may "OBE" or "Open Business Engine"
025: appear in their name, without prior written permission from
026: Anthony Eden (me@anthonyeden.com).
027:
028: In addition, I request (but do not require) that you include in the
029: end-user documentation provided with the redistribution and/or in the
030: software itself an acknowledgement equivalent to the following:
031: "This product includes software developed by
032: Anthony Eden (http://www.anthonyeden.com/)."
033:
034: THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
035: WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
036: OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
037: DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT,
038: INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
039: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
040: SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
041: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
042: STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
043: IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
044: POSSIBILITY OF SUCH DAMAGE.
045:
046: For more information on OBE, please see <http://obe.sourceforge.net/>.
047:
048: */
049:
050: package org.obe.client;
051:
052: import org.apache.xmlrpc.XmlRpcClient;
053:
054: import javax.swing.*;
055: import java.util.Vector;
056:
057: /**
058: * An extension of the JList component which polls a remote XML-RPC server and updates
059: * its data if the remote list has been changed. The list will only be updated if the
060: * local last-modified timestamp and the remote last-modified timestamp do not match.
061: * <p/>
062: * <p>This class implements the Pollable interface and can therefore be added to a
063: * PollThread to be polled on a regular basis. If the class is not added to a poll
064: * thread then it will only be updated when <code>poll()</code> is manually invoked.
065: *
066: * @author Anthony Eden
067: */
068:
069: public class RemoteList extends JList implements Pollable {
070:
071: /**
072: * Construct a new RemoteList.
073: *
074: * @param pollMethod The poll method
075: * @param lastModifiedMethod The method for determining the last modified
076: * @param clientProvider The XML-RPC client provider
077: */
078:
079: public RemoteList(String pollMethod, String lastModifiedMethod,
080: XmlRpcClientProvider clientProvider) {
081: this .pollMethod = pollMethod;
082: this .lastModifiedMethod = lastModifiedMethod;
083: this .clientProvider = clientProvider;
084: }
085:
086: /**
087: * Poll the XML-RPC server to see if the list should be updated.
088: */
089:
090: public void poll() {
091: XmlRpcClient client = clientProvider.getClient();
092: if (client != null) {
093: try {
094: if (!isListModified(client)) {
095: return;
096: }
097:
098: Object selectedValue = getSelectedValue();
099: setListData((Vector) client.execute(pollMethod,
100: EMPTY_VECTOR));
101: setSelectedValue(selectedValue, true);
102: } catch (Exception e) {
103: e.printStackTrace();
104: }
105: }
106: }
107:
108: /**
109: * Return true if the list is modified on the XML-RPC server.
110: *
111: * @param client The XML-RPC client object
112: * @return True if the list is modified
113: * @throws Exception
114: */
115:
116: private boolean isListModified(XmlRpcClient client)
117: throws Exception {
118: Double d = (Double) client.execute(lastModifiedMethod,
119: EMPTY_VECTOR);
120: double lastModified = d.doubleValue();
121: if (lastModified == listLastModified) {
122: return false;
123: } else {
124: listLastModified = lastModified;
125: return true;
126: }
127: }
128:
129: private static final Vector EMPTY_VECTOR = new Vector();
130:
131: private String pollMethod;
132: private String lastModifiedMethod;
133: private double listLastModified;
134: private XmlRpcClientProvider clientProvider;
135:
136: }
|