View Javadoc
1   //******************************************************************************
2   //
3   // File:    ResourceCache.java
4   // Package: edu.rit.pj.cluster
5   // Unit:    Class edu.rit.pj.cluster.ResourceCache
6   //
7   // This Java source file is copyright (C) 2006 by Alan Kaminsky. All rights
8   // reserved. For further information, contact the author, Alan Kaminsky, at
9   // ark@cs.rit.edu.
10  //
11  // This Java source file is part of the Parallel Java Library ("PJ"). PJ is free
12  // software; you can redistribute it and/or modify it under the terms of the GNU
13  // General Public License as published by the Free Software Foundation; either
14  // version 3 of the License, or (at your option) any later version.
15  //
16  // PJ is distributed in the hope that it will be useful, but WITHOUT ANY
17  // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
18  // A PARTICULAR PURPOSE. See the GNU General Public License for more details.
19  //
20  // Linking this library statically or dynamically with other modules is making a
21  // combined work based on this library. Thus, the terms and conditions of the GNU
22  // General Public License cover the whole combination.
23  //
24  // As a special exception, the copyright holders of this library give you
25  // permission to link this library with independent modules to produce an
26  // executable, regardless of the license terms of these independent modules, and
27  // to copy and distribute the resulting executable under terms of your choice,
28  // provided that you also meet, for each linked independent module, the terms
29  // and conditions of the license of that module. An independent module is a module
30  // which is not derived from or based on this library. If you modify this library,
31  // you may extend this exception to your version of the library, but you are not
32  // obligated to do so. If you do not wish to do so, delete this exception
33  // statement from your version.
34  //
35  // A copy of the GNU General Public License is provided in the file gpl.txt. You
36  // may also obtain a copy of the GNU General Public License on the World Wide
37  // Web at http://www.gnu.org/licenses/gpl.html.
38  //
39  //******************************************************************************
40  package edu.rit.pj.cluster;
41  
42  import java.util.HashMap;
43  import java.util.Map;
44  
45  /**
46   * Class ResourceCache provides a cache of resources, indexed by resource name.
47   * A resource is a piece of content (sequence of bytes) obtained from a class
48   * loader.
49   * <P>
50   * <I>Note:</I> Class ResourceCache is multiple thread safe.
51   *
52   * @author Alan Kaminsky
53   * @version 26-Oct-2006
54   */
55  public class ResourceCache {
56  
57  // Hidden data members.
58      private Map<String, ResourceInfo> myMap
59              = new HashMap<String, ResourceInfo>();
60  
61  // Hidden helper classes.
62      private static class ResourceInfo {
63  
64          public byte[] content;
65  
66          public ResourceInfo(byte[] content) {
67              this.content = content;
68          }
69      }
70  
71  // Exported constructors.
72      /**
73       * Construct a new resource cache.
74       */
75      public ResourceCache() {
76      }
77  
78  // Exported operations.
79      /**
80       * Determine if this resource cache contains resource information for the
81       * given resource name. If the answer is yes, the resource content may or
82       * may not have been found.
83       *
84       * @param name Resource name.
85       * @return True if this resource cache contains resource information for
86       * <code>name</code>, false otherwise.
87       */
88      public synchronized boolean contains(String name) {
89          ResourceInfo info = myMap.get(name);
90          return info != null;
91      }
92  
93      /**
94       * Determine if this resource cache contains the resource content for the
95       * given resource name. If the answer is yes, the resource content was
96       * found, otherwise the resource content was not found or no resource
97       * information is available.
98       *
99       * @param name Resource name.
100      * @return True if this resource cache contains the resource content for
101      * <code>name</code>, false otherwise.
102      */
103     public synchronized boolean containsContent(String name) {
104         ResourceInfo info = myMap.get(name);
105         return info == null ? false : info.content != null;
106     }
107 
108     /**
109      * Obtain the resource content for the given resource name from this
110      * resource cache (blocking). This method will block if necessary until this
111      * resource cache contains the content for <code>name</code> or until this
112      * resource cache knows the content was not found.
113      *
114      * @param name Resource name.
115      * @return Resource content, or null if not found.
116      * @exception InterruptedException Thrown if the calling thread is
117      * interrupted while blocked in this method.
118      * @throws java.lang.InterruptedException if any.
119      */
120     public synchronized byte[] get(String name)
121             throws InterruptedException {
122         ResourceInfo info = myMap.get(name);
123         while (info == null) {
124             wait();
125             info = myMap.get(name);
126         }
127         return info.content;
128     }
129 
130     /**
131      * Obtain the resource content for the given resource name from this
132      * resource cache (non-blocking). This method will return null if the
133      * resource content was not found or no resource information is available.
134      *
135      * @param name Resource name.
136      * @return Resource content, or null if not found or no information is
137      * available.
138      */
139     public synchronized byte[] getNoWait(String name) {
140         ResourceInfo info = myMap.get(name);
141         return info == null ? null : info.content;
142     }
143 
144     /**
145      * Store the given resource content under the given resource name in this
146      * resource cache. Any existing content for <code>name</code> is overwritten.
147      * <P>
148      * <I>Note:</I> The resource cache assumes that the contents of
149      * <code>content</code> are not changed after <code>put()</code> is called.
150      *
151      * @param name Resource name.
152      * @param content Resource content, or null if not found.
153      */
154     public synchronized void put(String name,
155             byte[] content) {
156         myMap.put(name, new ResourceInfo(content));
157         notifyAll();
158     }
159 
160     /**
161      * Remove the resource content for the given resource name from this
162      * resource cache. If there is no content for <code>name</code>, the
163      * <code>remove()</code> method does nothing.
164      *
165      * @param name Resource name.
166      */
167     public synchronized void remove(String name) {
168         myMap.remove(name);
169     }
170 
171 }