DekGenius.com
[ Team LiB ] Previous Section Next Section

E.3 The com.mediamania.hotcache package

This package contains the classes that can be used to support a hot cache, as presented in Chapter 14.

E.3.1 com.mediamania.hotcache.AbstractCache

 1    package com.mediamania.hotcache;
 2    
 3    import java.util.Map;
 4    import java.util.HashMap;
 5    
 6    import com.mediamania.prototype.PrototypeQueries;
 7    import com.mediamania.MediaManiaApp;
 8    import com.mediamania.prototype.Movie;
 9    
10    public abstract class AbstractCache extends MediaManiaApp 
11        implements com.mediamania.hotcache.CacheAccess {
12        
13        protected Map cache = new HashMap(  );
14    
15        /** Creates a new instance of AbstractCache.  The AbstractCache is the
16         * base class for MasterCache and SlaveCache.
17         */
18        protected AbstractCache(  ) {
19        }
20    
21        /** Get the Movie by title.  If the movie is not in the cache, put it in.
22         * @param title the title of the movie
23         * @return the movie instance
24         */
25        public Movie getMovieByTitle(String title) {
26            Movie movie = (Movie) cache.get(title);
27            if (movie == null) {
28                movie = PrototypeQueries.getMovie (pm, title);
29                if (movie != null) {
30                    cache.put (title, movie);
31                }
32            }
33            return movie;
34        }
35    }

E.3.2 com.mediamania.hotcache.AbstractDriver

 1    package com.mediamania.hotcache;
 2    
 3    import java.io.InputStream;
 4    import java.io.InputStreamReader;
 5    import java.io.IOException;
 6    import java.io.Reader;
 7    import java.io.BufferedReader;
 8    
 9    import java.util.StringTokenizer;
10    
11    import java.net.URL;
12    import java.net.MalformedURLException;
13    
14    import com.mediamania.Utilities;
15    
16    import com.mediamania.prototype.Movie;
17    
18    public class AbstractDriver {
19        protected BufferedReader requestReader;
20        protected BufferedReader updateReader;
21        protected CacheAccess cache;
22        protected int timeoutMillis;
23        protected AbstractDriver(String updateURL, String requestURL,
24            String timeout) {
25            updateReader = openReader(updateURL);
26            requestReader = openReader(requestURL);
27            timeoutMillis = Integer.parseInt(timeout);
28        }
29        
30        protected BufferedReader openReader (String urlName) {
31            try {
32                URL url = new URL(urlName);
33                InputStream is = url.openStream(  );
34                Reader r = new InputStreamReader(is);
35                return new BufferedReader(r);
36            } catch (Exception ex) {
37                return null;
38            }
39        }
40            
41        protected void serviceReaders(  ) {
42            boolean done = false;
43            boolean lastTime = false;
44            try {
45                while (!done) {
46                    if (updateReader.ready(  )) {
47                        handleUpdate(  );
48                        done = false;
49                        lastTime = false;
50                    } else if (requestReader.ready(  )) {
51                        handleRequest(  );
52                        done = false;
53                        lastTime = false;
54                    } else {
55                        try {
56                            Thread.sleep (timeoutMillis);
57                            if (lastTime) done = true;
58                            lastTime = true;
59                        } catch (InterruptedException ex) {
60                            done = true;
61                        }
62                    }
63                }
64            } catch (Exception ex) {
65                return;
66            }
67        }
68        
69        protected void handleRequest(  ) throws IOException {
70            String request = requestReader.readLine(  );
71            Movie movie = cache.getMovieByTitle(request);
72            System.out.println("Movie: " + movie.getTitle(  ));
73        }
74        
75        protected void handleUpdate(  ) throws IOException {
76            String update = updateReader.readLine(  );
77            StringTokenizer tokenizer = new StringTokenizer(update, ";");
78            String movieName = tokenizer.nextToken(  );
79            String webSite = tokenizer.nextToken(  );
80            cache.updateWebSite (movieName, webSite);
81        }
82    }

E.3.3 com.mediamania.hotcache.CacheAccess

 1    package com.mediamania.hotcache;
 2    
 3    import com.mediamania.prototype.Movie;
 4    
 5    /** Manage a cache of persistent Movie instances.
 6     */
 7    public interface CacheAccess {
 8        
 9        /** Get the Movie by title.
10         * @param title the title of the movie
11         * @return the movie instance
12         */    
13        Movie getMovieByTitle (String title);
14        
15        /** Update the Movie website.
16         * @param title the title of the movie
17         * @param website the new website for the movie
18         */    
19        void updateWebSite (String title, String website);
20    }

E.3.4 com.mediamania.hotcache.MasterCache

 1    package com.mediamania.hotcache;
 2    
 3    import java.util.Map;
 4    import java.util.HashMap;
 5    
 6    import com.mediamania.prototype.PrototypeQueries;
 7    import com.mediamania.prototype.Movie;
 8    
 9    public class MasterCache extends AbstractCache 
10        implements com.mediamania.hotcache.CacheAccess {
11        
12        /** Creates a new instance of MasterCache.  The MasterCache performs 
13         * updates of the database and manages a cache of Movie.
14         */
15        public MasterCache(  ) {
16        }
17        
18        /** Update the Movie website.
19         * @param title the title of the movie
20         * @param website the new website for the movie
21         */
22        public void updateWebSite(String title, String website) {
23            Movie movie = getMovieByTitle (title);
24            if (movie != null) {
25                tx.begin(  );
26                movie.setWebSite (website);
27                tx.commit(  );
28            }
29        }
30        
31        public void execute(  ) {
32        }
33        
34        protected static Map getPropertyOverrides(  )
35        {
36            Map overrides = new HashMap(  );
37            overrides.put ("javax.jdo.options.NontransactionalRead", "true");
38            overrides.put ("javax.jdo.options.RetainValues", "true");
39            return overrides;
40        }
41    }

E.3.5 com.mediamania.hotcache.MasterDriver

 1    package com.mediamania.hotcache;
 2    
 3    public class MasterDriver extends AbstractDriver {
 4        protected MasterDriver(String updateURL, String requestURL, 
 5            String timeout) {
 6                super(updateURL, requestURL, timeout);
 7                cache = new MasterCache(  );
 8        }
 9        
10        public static void main(String[] args) {
11            MasterDriver master = new MasterDriver(
12                args[0], args[1], args[2]);
13            master.serviceReaders(  );
14        }
15    }

E.3.6 com.mediamania.hotcache.SlaveCache

 1    package com.mediamania.hotcache;
 2    
 3    import java.util.Map;
 4    import java.util.HashMap;
 5    
 6    import com.mediamania.prototype.Movie;
 7    
 8    public class SlaveCache extends AbstractCache 
 9        implements com.mediamania.hotcache.CacheAccess {
10        
11        /** Creates a new instance of SlaveCache.  The SlaveCache performs 
12         * lookups of the database and manages a cache of Movie.
13         */
14        public SlaveCache(  ) {
15        }
16    
17        /** Update the Movie website in the cache, only if it is already there.  
18         * The datastore will be updated by the MasterCache.
19         * @param title the title of the movie
20         * @param website the new website for the movie
21         */
22        public void updateWebSite(String title, String website) {
23            Movie movie = (Movie)cache.get (title);
24            if (movie == null) 
25                return;
26            movie.setWebSite (website);
27        }
28        
29        public void execute(  ) {
30        }
31        
32        protected static Map getPropertyOverrides(  )
33        {
34            Map overrides = new HashMap(  );
35            overrides.put ("javax.jdo.options.NontransactionalRead", "true");
36            overrides.put ("javax.jdo.options.NontransactionalWrite", "true");
37            return overrides;
38        }
39    }

E.3.7 com.mediamania.hotcache.SlaveDriver

 1    package com.mediamania.hotcache;
 2    
 3    public class SlaveDriver extends AbstractDriver {
 4        protected SlaveDriver(String updateURL, String requestURL, 
 5            String timeout) {
 6                super(updateURL, requestURL, timeout);
 7                cache = new SlaveCache(  );
 8        }
 9        
10        public static void main(String[] args) {
11            SlaveDriver slave = new SlaveDriver(
12                args[0], args[1], args[2]);
13            slave.serviceReaders(  );
14        }
15    }
    [ Team LiB ] Previous Section Next Section