001    /*
002     * $Id: DHTTransport.java 3210 2010-07-05 12:25:27Z kredel $
003     */
004    
005    package edu.jas.util;
006    
007    
008    import java.io.Serializable;
009    import java.io.IOException;
010    import java.rmi.MarshalledObject;
011    
012    
013    /**
014     * Transport container for a distributed version of a HashTable. 
015     * <b>Note:</b> Contains code for timing of marshalled versus plain 
016     * object serialization which can be removed later.
017     * @author Heinz Kredel
018     */
019    
020    public abstract class DHTTransport<K, V> implements Serializable {
021    
022    
023        public static long etime  = 0L; // encode marshalled
024        public static long dtime  = 0L; // decode marshalled
025        public static long ertime = 0L; // encode plain raw
026        public static long drtime = 0L; // decode plain raw
027    
028    
029        public static enum Stor { // storage and transport class
030            marshal, plain
031        };
032    
033    
034        public static final Stor stor = Stor.marshal; //Stor.plain; 
035    
036    
037        /**
038         * protected constructor.
039         */
040        protected DHTTransport() {
041        }
042    
043    
044        /**
045         * Create a new DHTTransport Container.
046         * @param key
047         * @param value
048         */
049        public static <K,V> DHTTransport<K,V> create(K key, V value) throws IOException {
050            switch (stor) {
051            case marshal: return new DHTTransportMarshal<K,V>(key,value);
052            case plain:   return new DHTTransportPlain<K,V>(key,value);
053            default: throw new IllegalArgumentException("this should not happen");
054            }
055        }
056    
057    
058        /**
059         * Get the key from this DHTTransport Container.
060         */
061        public abstract K key() throws IOException, ClassNotFoundException;
062    
063    
064        /**
065         * Get the value from this DHTTransport Container.
066         */
067        public abstract V value() throws IOException, ClassNotFoundException;
068    
069    
070        /**
071         * toString.
072         */
073        @Override
074        public String toString() {
075            return this.getClass().getName();
076    
077        }
078    
079    }
080    
081    
082    
083    /**
084     * Transport container for a distributed version of a HashTable. Immutable
085     * objects. Uses MarshalledObject to avoid deserialization on server side.
086     * @author Heinz Kredel
087     */
088    
089    class DHTTransportMarshal<K, V> extends DHTTransport<K, V> {
090    
091    
092        protected final MarshalledObject/*<K>*/ key;
093    
094    
095        protected final MarshalledObject/*<V>*/ value;
096    
097    
098        /**
099         * Constructs a new DHTTransport Container.
100         * @param key
101         * @param value
102         */
103        public DHTTransportMarshal(K key, V value) throws IOException {
104            long t = System.currentTimeMillis();
105            this.key = new MarshalledObject/*<K>*/(key);
106            this.value = new MarshalledObject/*<V>*/(value);
107            t = System.currentTimeMillis() - t;
108            synchronized( DHTTransport.class ) {
109                etime += t;
110            }
111            //System.out.println("         marshal time = " + t);
112        }
113    
114    
115        /**
116         * Get the key from this DHTTransport Container.
117         */
118        public K key() throws IOException, ClassNotFoundException {
119            long t = System.currentTimeMillis();
120            K k = (K) this.key.get();
121            t = System.currentTimeMillis() - t;
122            synchronized( DHTTransport.class ) {
123                dtime += t;
124            }
125            return k;
126        }
127    
128    
129        /**
130         * Get the value from this DHTTransport Container.
131         */
132        public V value() throws IOException, ClassNotFoundException {
133            long t = System.currentTimeMillis();
134            V v = (V) this.value.get();
135            t = System.currentTimeMillis() - t;
136            synchronized( DHTTransport.class ) {
137                dtime += t;
138            }
139            return v;
140        }
141    
142    
143        /**
144         * toString.
145         */
146        @Override
147        public String toString() {
148            return super.toString() + "(" + key + "," + value + ")";
149        }
150    
151    
152        private void writeObject(java.io.ObjectOutputStream out) throws IOException {
153            long t = System.currentTimeMillis();
154            out.defaultWriteObject();
155            t = System.currentTimeMillis() - t;
156            synchronized( DHTTransport.class ) {
157                ertime += t;
158            }
159        }
160    
161        private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
162            long t = System.currentTimeMillis();
163            in.defaultReadObject();
164            t = System.currentTimeMillis() - t; // not meaningful, includes waiting time
165            synchronized( DHTTransport.class ) {
166                drtime += t;
167            }
168        }
169    
170    }
171    
172    
173    /**
174     * Transport container for a distributed version of a HashTable. Immutable
175     * objects. Uses plain objects.
176     * @author Heinz Kredel
177     */
178    
179    class DHTTransportPlain<K, V> extends DHTTransport<K, V> {
180    
181    
182        protected final K key;
183    
184    
185        protected final V value;
186    
187    
188        /**
189         * Constructs a new DHTTransport Container.
190         * @param key
191         * @param value
192         */
193        public DHTTransportPlain(K key, V value) throws IOException {
194            this.key = key;
195            this.value = value;
196        }
197    
198    
199        /**
200         * Get the key from this DHTTransport Container.
201         */
202        public K key() throws IOException, ClassNotFoundException {
203            return this.key;
204        }
205    
206    
207        /**
208         * Get the value from this DHTTransport Container.
209         */
210        public V value() throws IOException, ClassNotFoundException {
211            return this.value;
212        }
213    
214    
215        /**
216         * toString.
217         */
218        @Override
219        public String toString() {
220            return super.toString() + "(" + key + "," + value + ")";
221        }
222    
223    
224        private void writeObject(java.io.ObjectOutputStream out) throws IOException {
225            long t = System.currentTimeMillis();
226            out.defaultWriteObject();
227            t = System.currentTimeMillis() - t;
228            synchronized( DHTTransport.class ) {
229                ertime += t;
230            }
231        }
232    
233        private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
234            long t = System.currentTimeMillis();
235            in.defaultReadObject();
236            t = System.currentTimeMillis() - t;
237            synchronized( DHTTransport.class ) {
238                drtime += t;
239            }
240        }
241    
242    }