View Javadoc
1   package org.apache.commons.jcs3.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 java.io.IOException;
23  import java.util.Set;
24  import java.util.stream.Collectors;
25  
26  import org.apache.commons.jcs3.access.behavior.IGroupCacheAccess;
27  import org.apache.commons.jcs3.access.exception.CacheException;
28  import org.apache.commons.jcs3.access.exception.InvalidArgumentException;
29  import org.apache.commons.jcs3.engine.CacheElement;
30  import org.apache.commons.jcs3.engine.behavior.ICacheElement;
31  import org.apache.commons.jcs3.engine.behavior.IElementAttributes;
32  import org.apache.commons.jcs3.engine.control.CompositeCache;
33  import org.apache.commons.jcs3.engine.control.group.GroupAttrName;
34  import org.apache.commons.jcs3.engine.control.group.GroupId;
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( final 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( final K name, final String group )
64      {
65          final 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( final String group, final K name )
77      {
78          final GroupId gid = new GroupId( this.getCacheControl().getCacheName(), group );
79          return new GroupAttrName<>( 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( final K name, final String groupName, final 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( final K name, final String groupName, final V value, final 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             final GroupAttrName<K> key = getGroupAttrName( groupName, name );
136             final CacheElement<GroupAttrName<K>, V> ce =
137                 new CacheElement<>( this.getCacheControl().getCacheName(), key, value );
138 
139             final IElementAttributes attributes = (attr == null) ? this.getCacheControl().getElementAttributes() : attr;
140             ce.setElementAttributes( attributes );
141 
142             this.getCacheControl().update( ce );
143         }
144         catch ( final IOException e )
145         {
146             throw new CacheException( e );
147         }
148 
149     }
150 
151     /**
152      * Removes a single item by name from a group.
153      *
154      * @param name
155      * @param group
156      */
157     @Override
158     public void removeFromGroup( final K name, final String group )
159     {
160         final GroupAttrName<K> key = getGroupAttrName( group, name );
161         this.getCacheControl().remove( key );
162     }
163 
164     /**
165      * Gets the set of keys of objects currently in the group.
166      * <p>
167      * @param group
168      * @return A Set of keys.
169      */
170     @Override
171     public Set<K> getGroupKeys( final String group )
172     {
173         final GroupId groupId = new GroupId( this.getCacheControl().getCacheName(), group );
174 
175         return this.getCacheControl().getKeySet()
176                 .stream()
177                 .filter(gan -> gan.groupId.equals(groupId))
178                 .map(gan -> gan.attrName)
179                 .collect(Collectors.toSet());
180     }
181 
182     /**
183      * Gets the set of group names in the cache
184      * <p>
185      * @return A Set of group names.
186      */
187     public Set<String> getGroupNames()
188     {
189         return this.getCacheControl().getKeySet()
190                 .stream()
191                 .map(gan -> gan.groupId.groupName)
192                 .collect(Collectors.toSet());
193     }
194 
195     /**
196      * Invalidates a group: remove all the group members
197      * <p>
198      * @param group
199      *            The name of the group to invalidate
200      */
201     @Override
202     public void invalidateGroup( final String group )
203     {
204         this.getCacheControl().remove(getGroupAttrName(group, null));
205     }
206 }