Package org.jboss.aop.array

Source Code of org.jboss.aop.array.ArrayRegistry

/*     */ package org.jboss.aop.array;
/*     */
/*     */ import java.util.ArrayList;
/*     */ import java.util.HashMap;
/*     */ import java.util.Iterator;
/*     */ import java.util.List;
/*     */ import java.util.Set;
/*     */ import java.util.WeakHashMap;
/*     */ import java.util.concurrent.locks.Lock;
/*     */ import java.util.concurrent.locks.ReadWriteLock;
/*     */ import java.util.concurrent.locks.ReentrantReadWriteLock;
/*     */
/*     */ public class ArrayRegistry
/*     */ {
/*  39 */   private static final ArrayRegistryEntryFactory ELEMENT_ARRAY_REGISTRY_ENTRY_FACTORY = new ElementArrayRegistryEntryFactory(null);
/*  40 */   private static final ArrayRegistryEntryFactory FIELD_ARRAY_REGISTRY_ENTRY_FACTORY = new FieldArrayRegistryEntryFactory(null);
/*  41 */   private ArrayReferenceBuilder referenceBuilder = new ArrayReferenceBuilder(null);
/*  42 */   private static ArrayRegistry singleton = new ArrayRegistry();
/*  43 */   private ReadWriteLock lock = new ReentrantReadWriteLock();
/*  44 */   private WeakHashMap<Object, WeakHashMap<Object, HashMap<Object, ArrayRegistryEntry>>> cache = new WeakHashMap();
/*     */
/*     */   public static ArrayRegistry getInstance()
/*     */   {
/*  48 */     return singleton;
/*     */   }
/*     */
/*     */   public void addFieldReference(Object owner, String fieldName, Object array)
/*     */   {
/*  58 */     if (array == null)
/*     */     {
/*  60 */       return;
/*     */     }
/*  62 */     addReference(owner, fieldName, array, FIELD_ARRAY_REGISTRY_ENTRY_FACTORY);
/*     */   }
/*     */
/*     */   public void addElementReference(Object owner, int index, Object array)
/*     */   {
/*  67 */     if (array == null)
/*     */     {
/*  69 */       return;
/*     */     }
/*  71 */     addReference(owner, new Integer(index), array, ELEMENT_ARRAY_REGISTRY_ENTRY_FACTORY);
/*     */   }
/*     */
/*     */   public void addReference(Object owner, Object qualifier, Object array, ArrayRegistryEntryFactory factory)
/*     */   {
/*  76 */     if (array == null)
/*     */     {
/*  78 */       return;
/*     */     }
/*  80 */     Lock writeLock = this.lock.writeLock();
/*  81 */     writeLock.lock();
/*     */     try
/*     */     {
/*  84 */       WeakHashMap arrayReferences = (WeakHashMap)this.cache.get(array);
/*  85 */       if (arrayReferences == null)
/*     */       {
/*  87 */         arrayReferences = new WeakHashMap();
/*  88 */         this.cache.put(array, arrayReferences);
/*     */       }
/*     */
/*  91 */       HashMap ownerReferences = (HashMap)arrayReferences.get(owner);
/*  92 */       if (ownerReferences == null)
/*     */       {
/*  94 */         ownerReferences = new HashMap();
/*  95 */         arrayReferences.put(owner, ownerReferences);
/*     */       }
/*     */
/*  98 */       ArrayRegistryEntry regEntry = (ArrayRegistryEntry)ownerReferences.get(qualifier);
/*  99 */       if ((regEntry == null) || (regEntry.getArray() != array))
/*     */       {
/* 101 */         ArrayRegistryEntry entry = factory.createArrayRegistryEntry(owner, qualifier, factory);
/* 102 */         ownerReferences.put(qualifier, entry);
/*     */       }
/* 104 */       addNestedArrays(array);
/*     */     }
/*     */     finally
/*     */     {
/* 108 */       writeLock.unlock();
/*     */     }
/*     */   }
/*     */
/*     */   public void removeFieldReference(Object owner, String fieldName, Object array)
/*     */   {
/* 114 */     if (array == null)
/*     */     {
/* 116 */       return;
/*     */     }
/*     */
/* 119 */     removeReference(owner, fieldName, array);
/*     */   }
/*     */
/*     */   public void removeElementReference(Object owner, int index, Object array)
/*     */   {
/* 124 */     if (array == null)
/*     */     {
/* 126 */       return;
/*     */     }
/*     */
/* 129 */     removeReference(owner, new Integer(index), array);
/*     */   }
/*     */
/*     */   public void removeReference(Object owner, Object qualifier, Object array)
/*     */   {
/* 134 */     if (array == null)
/*     */     {
/* 136 */       return;
/*     */     }
/*     */
/* 139 */     Lock writeLock = this.lock.writeLock();
/* 140 */     writeLock.lock();
/*     */     try
/*     */     {
/* 143 */       WeakHashMap arrayReferences = (WeakHashMap)this.cache.get(array);
/* 144 */       if (arrayReferences != null)
/*     */       {
/* 146 */         HashMap ownerReferences = (HashMap)arrayReferences.get(owner);
/* 147 */         if (ownerReferences != null)
/*     */         {
/* 149 */           ArrayRegistryEntry regEntry = (ArrayRegistryEntry)ownerReferences.remove(qualifier);
/* 150 */           if (regEntry != null)
/*     */           {
/* 152 */             if (ownerReferences.size() == 0)
/*     */             {
/* 154 */               arrayReferences.remove(owner);
/*     */
/* 156 */               if (arrayReferences.size() == 0)
/*     */               {
/* 158 */                 this.cache.remove(array);
/*     */               }
/*     */             }
/*     */
/* 162 */             removeNestedArrays(array);
/*     */           }
/*     */         }
/*     */
/*     */       }
/*     */
/*     */     }
/*     */     finally
/*     */     {
/* 171 */       writeLock.unlock();
/*     */     }
/*     */   }
/*     */
/*     */   public boolean isRegistered(Object array)
/*     */   {
/* 177 */     Lock readLock = this.lock.readLock();
/* 178 */     readLock.lock();
/*     */     try
/*     */     {
/* 182 */       WeakHashMap arrayReferences = (WeakHashMap)this.cache.get(array);
/* 183 */       if (arrayReferences == null)
/*     */       {
/* 185 */         i = 0;
/*     */         return i;
/*     */       }
/* 187 */       int i = 1;
/*     */       return i; } finally { readLock.unlock(); } throw localObject;
/*     */   }
/*     */
/*     */   public List<ArrayReference> getArrayOwners(Object array)
/*     */   {
/* 197 */     Lock readLock = this.lock.readLock();
/* 198 */     readLock.lock();
/*     */     try
/*     */     {
/* 202 */       List localList = this.referenceBuilder.getArrayReferences(array);
/*     */       return localList; } finally { readLock.unlock(); } throw localObject;
/*     */   }
/*     */
/*     */   private void addNestedArrays(Object array)
/*     */   {
/* 212 */     if (array == null)
/*     */     {
/* 214 */       return;
/*     */     }
/* 216 */     ArrayType type = isArray(array);
/* 217 */     if (type == ArrayType.MULTIDIM_ARRAY)
/*     */     {
/* 219 */       for (int i = 0; i < ((Object[])(Object[])array).length; i++)
/*     */       {
/* 221 */         addElementReference(array, i, ((Object[])(Object[])array)[i]);
/* 222 */         addNestedArrays(((Object[])(Object[])array)[i]);
/*     */       }
/*     */     }
/* 225 */     else if (type == ArrayType.OBJECT_ARRAY)
/*     */     {
/* 227 */       for (int i = 0; i < ((Object[])(Object[])array).length; i++)
/*     */       {
/* 229 */         Object val = ((Object[])(Object[])array)[i];
/* 230 */         if ((val == null) || (!val.getClass().isArray()))
/*     */           continue;
/* 232 */         addElementReference(array, i, ((Object[])(Object[])array)[i]);
/* 233 */         addNestedArrays(((Object[])(Object[])array)[i]);
/*     */       }
/*     */     }
/*     */   }
/*     */
/*     */   private void removeNestedArrays(Object array)
/*     */   {
/* 241 */     if (array == null)
/*     */     {
/* 243 */       return;
/*     */     }
/* 245 */     ArrayType type = isArray(array);
/* 246 */     if (type == ArrayType.MULTIDIM_ARRAY)
/*     */     {
/* 248 */       for (int i = 0; i < ((Object[])(Object[])array).length; i++)
/*     */       {
/* 250 */         removeElementReference(array, i, ((Object[])(Object[])array)[i]);
/* 251 */         removeNestedArrays(((Object[])(Object[])array)[i]);
/*     */       }
/*     */     }
/* 254 */     else if (type == ArrayType.OBJECT_ARRAY)
/*     */     {
/* 256 */       for (int i = 0; i < ((Object[])(Object[])array).length; i++)
/*     */       {
/* 258 */         Object val = ((Object[])(Object[])array)[i];
/* 259 */         if ((val == null) || (!val.getClass().isArray()))
/*     */           continue;
/* 261 */         removeElementReference(array, i, ((Object[])(Object[])array)[i]);
/* 262 */         removeNestedArrays(((Object[])(Object[])array)[i]);
/*     */       }
/*     */     }
/*     */   }
/*     */
/*     */   private ArrayType isArray(Object arrayCandidate)
/*     */   {
/* 270 */     Class candidateClass = arrayCandidate.getClass();
/* 271 */     if (candidateClass.isArray())
/*     */     {
/* 273 */       Class componentType = candidateClass.getComponentType();
/* 274 */       if (componentType.isArray())
/*     */       {
/* 276 */         return ArrayType.MULTIDIM_ARRAY;
/*     */       }
/* 278 */       if (componentType == Object.class)
/*     */       {
/* 280 */         return ArrayType.OBJECT_ARRAY;
/*     */       }
/*     */     }
/* 283 */     return ArrayType.NOT_ARRAY;
/*     */   }
/*     */
/*     */   private static enum ArrayType
/*     */   {
/* 384 */     NOT_ARRAY, MULTIDIM_ARRAY, OBJECT_ARRAY;
/*     */   }
/*     */
/*     */   private class ArrayReferenceBuilder
/*     */   {
/*     */     private ArrayReferenceBuilder()
/*     */     {
/*     */     }
/*     */
/*     */     private List<ArrayReference> getArrayReferences(Object array)
/*     */     {
/* 311 */       List references = null;
/* 312 */       WeakHashMap arrayReferences = (WeakHashMap)ArrayRegistry.this.cache.get(array);
/*     */       Iterator i$;
/* 313 */       if ((arrayReferences != null) && (arrayReferences.size() > 0))
/*     */       {
/* 315 */         for (i$ = arrayReferences.keySet().iterator(); i$.hasNext(); ) { Object owner = i$.next();
/*     */
/* 317 */           ownerReferences = (HashMap)arrayReferences.get(owner);
/* 318 */           for (i$ = ownerReferences.keySet().iterator(); i$.hasNext(); ) { Object qualifier = i$.next();
/*     */
/* 320 */             ArrayRegistryEntry regEntry = (ArrayRegistryEntry)ownerReferences.get(qualifier);
/*     */
/* 322 */             if (regEntry.isOwnerRoot())
/*     */             {
/* 324 */               ArrayReference reference = getRootReference((FieldArrayRegistryEntry)regEntry);
/* 325 */               if (reference != null)
/*     */               {
/* 327 */                 if (references == null)
/*     */                 {
/* 329 */                   references = new ArrayList();
/*     */                 }
/* 331 */                 references.add(reference);
/*     */               }
/*     */             }
/*     */             else
/*     */             {
/* 336 */               List parentReferences = getElementReferences((ElementArrayRegistryEntry)regEntry);
/* 337 */               if (parentReferences != null)
/*     */               {
/* 339 */                 if (references == null)
/*     */                 {
/* 341 */                   references = new ArrayList();
/*     */                 }
/* 343 */                 references.addAll(parentReferences);
/*     */               }
/*     */             }
/*     */           }
/*     */         }
/*     */       }
/*     */       HashMap ownerReferences;
/*     */       Iterator i$;
/* 349 */       return references;
/*     */     }
/*     */
/*     */     private ArrayReference getRootReference(FieldArrayRegistryEntry regEntry)
/*     */     {
/* 354 */       Object root = regEntry.getOwner();
/* 355 */       if (root != null)
/*     */       {
/* 357 */         String fieldName = regEntry.getFieldName();
/* 358 */         return new ArrayReferenceImpl(root, fieldName);
/*     */       }
/* 360 */       return null;
/*     */     }
/*     */
/*     */     private List<ArrayReference> getElementReferences(ElementArrayRegistryEntry regEntry)
/*     */     {
/* 365 */       Object ownerArray = regEntry.getOwner();
/* 366 */       if (ownerArray != null)
/*     */       {
/* 368 */         List references = getArrayReferences(ownerArray);
/* 369 */         if ((references != null) && (references.size() > 0))
/*     */         {
/* 371 */           for (ArrayReference reference : references)
/*     */           {
/* 373 */             ((ArrayReferenceImpl)reference).addNestedArrayIndex(regEntry.getIndex());
/*     */           }
/*     */         }
/* 376 */         return references;
/*     */       }
/* 378 */       return null;
/*     */     }
/*     */   }
/*     */
/*     */   private static class ElementArrayRegistryEntryFactory
/*     */     implements ArrayRegistry.ArrayRegistryEntryFactory
/*     */   {
/*     */     public ArrayRegistryEntry createArrayRegistryEntry(Object owner, Object qualifier, Object array)
/*     */     {
/* 303 */       return new ElementArrayRegistryEntry(owner, (Integer)qualifier, array);
/*     */     }
/*     */   }
/*     */
/*     */   private static class FieldArrayRegistryEntryFactory
/*     */     implements ArrayRegistry.ArrayRegistryEntryFactory
/*     */   {
/*     */     public ArrayRegistryEntry createArrayRegistryEntry(Object owner, Object qualifier, Object array)
/*     */     {
/* 295 */       return new FieldArrayRegistryEntry(owner, (String)qualifier, array);
/*     */     }
/*     */   }
/*     */
/*     */   private static abstract interface ArrayRegistryEntryFactory
/*     */   {
/*     */     public abstract ArrayRegistryEntry createArrayRegistryEntry(Object paramObject1, Object paramObject2, Object paramObject3);
/*     */   }
/*     */ }

/* Location:           /home/mnovotny/projects/EMBEDDED_JBOSS_BETA3_COMMUNITY/embedded/output/lib/embedded-jboss/lib/jboss-embedded-all.jar
* Qualified Name:     org.jboss.aop.array.ArrayRegistry
* JD-Core Version:    0.6.0
*/
TOP

Related Classes of org.jboss.aop.array.ArrayRegistry

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.