1 22 package org.jboss.metadata.plugins.context; 23 24 import java.lang.annotation.Annotation ; 25 import java.util.Collections ; 26 import java.util.List ; 27 import java.util.Map ; 28 import java.util.concurrent.ConcurrentHashMap ; 29 30 import org.jboss.metadata.spi.context.MetaDataContext; 31 import org.jboss.metadata.spi.retrieval.AnnotationItem; 32 import org.jboss.metadata.spi.retrieval.AnnotationsItem; 33 import org.jboss.metadata.spi.retrieval.MetaDataItem; 34 import org.jboss.metadata.spi.retrieval.MetaDataRetrieval; 35 import org.jboss.metadata.spi.retrieval.MetaDatasItem; 36 37 44 public class CachingMetaDataContext extends AbstractMetaDataContext 45 { 46 47 private volatile Map <String , AnnotationItem> annotations; 48 49 50 private volatile Map <String , MetaDataItem> metaDataByName; 51 52 53 private volatile AnnotationsItem cachedAnnotationsItem; 54 55 56 private volatile MetaDatasItem cachedMetaDatasItem; 57 58 59 private volatile long validTime; 60 61 66 public CachingMetaDataContext(MetaDataRetrieval retrieval) 67 { 68 this(null, retrieval); 69 } 70 71 77 public CachingMetaDataContext(MetaDataContext parent, MetaDataRetrieval retrieval) 78 { 79 this(parent, Collections.singletonList(retrieval)); 80 } 81 82 88 public CachingMetaDataContext(MetaDataContext parent, List <MetaDataRetrieval> retrievals) 89 { 90 super(parent, retrievals); 91 validTime = super.getValidTime().getValidTime(); 92 } 93 94 public AnnotationsItem retrieveAnnotations() 95 { 96 if (cachedAnnotationsItem == null) 97 cachedAnnotationsItem = super.retrieveAnnotations(); 98 return cachedAnnotationsItem; 99 } 100 101 @SuppressWarnings ("unchecked") 102 public <T extends Annotation > AnnotationItem<T> retrieveAnnotation(Class <T> annotationType) 103 { 104 if (annotationType == null) 105 throw new IllegalArgumentException ("Null annotationType"); 106 107 String annotationName = annotationType.getName(); 108 109 long newValidTime = super.getValidTime().getValidTime(); 110 if (validTime < newValidTime) 111 { 112 if (annotations != null) 113 annotations.clear(); 114 if (metaDataByName != null) 115 metaDataByName.clear(); 116 validTime = newValidTime; 117 } 118 119 if (annotations != null) 120 { 121 AnnotationItem<T> result = annotations.get(annotationName); 122 if (result != null) 123 { 124 if (result.isValid()) 125 return result; 126 annotations.remove(annotationName); 127 } 128 } 129 130 AnnotationItem<T> result = super.retrieveAnnotation(annotationType); 131 if (result != null && result.isCachable()) 132 { 133 if (annotations == null) 134 annotations = new ConcurrentHashMap <String , AnnotationItem>(); 135 annotations.put(annotationName, result); 136 } 137 138 return result; 139 } 140 141 public MetaDatasItem retrieveMetaData() 142 { 143 if (cachedMetaDatasItem == null) 144 cachedMetaDatasItem = super.retrieveMetaData(); 145 return cachedMetaDatasItem; 146 } 147 148 @SuppressWarnings ("unchecked") 149 public <T> MetaDataItem<T> retrieveMetaData(Class <T> type) 150 { 151 if (type == null) 152 throw new IllegalArgumentException ("Null type"); 153 154 String name = type.getName(); 155 156 long newValidTime = super.getValidTime().getValidTime(); 157 if (validTime < newValidTime) 158 { 159 if (annotations != null) 160 annotations.clear(); 161 if (metaDataByName != null) 162 metaDataByName.clear(); 163 validTime = newValidTime; 164 } 165 166 if (metaDataByName != null) 167 { 168 MetaDataItem<T> result = metaDataByName.get(name); 169 if (result != null) 170 { 171 if (result.isValid()) 172 return result; 173 metaDataByName.remove(name); 174 } 175 } 176 177 MetaDataItem<T> result = super.retrieveMetaData(type); 178 if (result != null && result.isCachable()) 179 { 180 if (metaDataByName == null) 181 metaDataByName = new ConcurrentHashMap <String , MetaDataItem>(); 182 metaDataByName.put(name, result); 183 } 184 185 return result; 186 } 187 188 public MetaDataItem retrieveMetaData(String name) 189 { 190 if (name == null) 191 throw new IllegalArgumentException ("Null name"); 192 193 long newValidTime = super.getValidTime().getValidTime(); 194 if (validTime < newValidTime) 195 { 196 if (annotations != null) 197 annotations.clear(); 198 if (metaDataByName != null) 199 metaDataByName.clear(); 200 validTime = newValidTime; 201 } 202 203 if (metaDataByName != null) 204 { 205 MetaDataItem result = metaDataByName.get(name); 206 if (result != null) 207 { 208 if (result.isValid()) 209 return result; 210 metaDataByName.remove(name); 211 } 212 } 213 214 MetaDataItem result = super.retrieveMetaData(name); 215 if (result != null && result.isCachable()) 216 { 217 if (metaDataByName == null) 218 metaDataByName = new ConcurrentHashMap <String , MetaDataItem>(); 219 metaDataByName.put(name, result); 220 } 221 222 return result; 223 } 224 } 225 | Popular Tags |