View Javadoc
1   package org.apache.commons.jcs.access;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import org.apache.commons.jcs.access.behavior.IGroupCacheAccess;
23  import org.apache.commons.jcs.access.exception.CacheException;
24  import org.apache.commons.jcs.access.exception.InvalidArgumentException;
25  import org.apache.commons.jcs.engine.CacheElement;
26  import org.apache.commons.jcs.engine.behavior.ICacheElement;
27  import org.apache.commons.jcs.engine.behavior.IElementAttributes;
28  import org.apache.commons.jcs.engine.control.CompositeCache;
29  import org.apache.commons.jcs.engine.control.group.GroupAttrName;
30  import org.apache.commons.jcs.engine.control.group.GroupId;
31  
32  import java.io.IOException;
33  import java.util.HashSet;
34  import java.util.Set;
35  
36  /**
37   * Access for groups.
38   */
39  public class GroupCacheAccess<K, V>
40      extends AbstractCacheAccess<GroupAttrName<K>, V>
41      implements IGroupCacheAccess<K, V>
42  {
43      /**
44       * Constructor for the GroupCacheAccess object
45       * <p>
46       * @param cacheControl
47       */
48      public GroupCacheAccess( CompositeCache<GroupAttrName<K>, V> cacheControl )
49      {
50          super(cacheControl);
51      }
52  
53      /**
54       * Gets an item out of the cache that is in a specified group.
55       * <p>
56       * @param name
57       *            The key name.
58       * @param group
59       *            The group name.
60       * @return The cached value, null if not found.
61       */
62      @Override
63      public V getFromGroup( K name, String group )
64      {
65          ICacheElement<GroupAttrName<K>, V> element = this.getCacheControl().get( getGroupAttrName( group, name ) );
66          return ( element != null ) ? element.getVal() : null;
67      }
68  
69      /**
70       * Internal method used for group functionality.
71       * <p>
72       * @param group
73       * @param name
74       * @return GroupAttrName
75       */
76      private GroupAttrName<K> getGroupAttrName( String group, K name )
77      {
78          GroupId gid = new GroupId( this.getCacheControl().getCacheName(), group );
79          return new GroupAttrName<K>( gid, name );
80      }
81  
82      /**
83       * Allows the user to put an object into a group within a particular cache
84       * region. This method sets the object's attributes to the default for the
85       * region.
86       * <p>
87       * @param name
88       *            The key name.
89       * @param groupName
90       *            The group name.
91       * @param value
92       *            The object to cache
93       * @throws CacheException
94       */
95      @Override
96      public void putInGroup( K name, String groupName, V value )
97          throws CacheException
98      {
99          putInGroup( name, groupName, value, null );
100     }
101 
102     /**
103      * Allows the user to put an object into a group within a particular cache
104      * region. This method allows the object's attributes to be individually
105      * specified.
106      * <p>
107      * @param name
108      *            The key name.
109      * @param groupName
110      *            The group name.
111      * @param value
112      *            The object to cache
113      * @param attr
114      *            The objects attributes.
115      * @throws CacheException
116      */
117     @Override
118     public void putInGroup( K name, String groupName, V value, IElementAttributes attr )
119         throws CacheException
120     {
121         if ( name == null )
122         {
123             throw new InvalidArgumentException( "Key must not be null" );
124         }
125 
126         if ( value == null )
127         {
128             throw new InvalidArgumentException( "Value must not be null" );
129         }
130 
131         // Create the element and update. This may throw an IOException which
132         // should be wrapped by cache access.
133         try
134         {
135             GroupAttrName<K> key = getGroupAttrName( groupName, name );
136             CacheElement<GroupAttrName<K>, V> ce =
137                 new CacheElement<GroupAttrName<K>, V>( this.getCacheControl().getCacheName(), key, value );
138 
139             IElementAttributes attributes = (attr == null) ? this.getCacheControl().getElementAttributes() : attr;
140             ce.setElementAttributes( attributes );
141 
142             this.getCacheControl().update( ce );
143         }
144         catch ( IOException e )
145         {
146             throw new CacheException( e );
147         }
148 
149     }
150 
151     /**
152      * @param name
153      * @param group
154      */
155     @Override
156     public void removeFromGroup( K name, String group )
157     {
158         GroupAttrName<K> key = getGroupAttrName( group, name );
159         this.getCacheControl().remove( key );
160     }
161 
162     /**
163      * Gets the set of keys of objects currently in the group.
164      * <p>
165      * @param group
166      * @return A Set of keys.
167      */
168     @Override
169     public Set<K> getGroupKeys( String group )
170     {
171         Set<K> groupKeys = new HashSet<K>();
172         GroupId groupId = new GroupId( this.getCacheControl().getCacheName(), group );
173 
174         for (GroupAttrName<K> gan : this.getCacheControl().getKeySet())
175         {
176             if (gan.groupId.equals( groupId ))
177             {
178                 groupKeys.add( gan.attrName );
179             }
180         }
181 
182         return groupKeys;
183     }
184 
185     /**
186      * Gets the set of group names in the cache
187      * <p>
188      * @return A Set of group names.
189      */
190     public Set<String> getGroupNames()
191     {
192         HashSet<String> names = new HashSet<String>();
193         for (GroupAttrName<K> gan : this.getCacheControl().getKeySet())
194         {
195             names.add(gan.groupId.groupName);
196         }
197         return names;
198     }
199 
200     /**
201      * Invalidates a group: remove all the group members
202      * <p>
203      * @param group
204      *            The name of the group to invalidate
205      */
206     @Override
207     public void invalidateGroup( String group )
208     {
209         this.getCacheControl().remove(getGroupAttrName(group, null));
210     }
211 }