1 5 package com.jofti.tree; 6 7 import java.util.ArrayList ; 8 import java.util.Collection ; 9 import java.util.Iterator ; 10 import java.util.LinkedHashSet ; 11 import java.util.List ; 12 import java.util.Map ; 13 import java.util.Set ; 14 15 import org.apache.commons.logging.Log; 16 import org.apache.commons.logging.LogFactory; 17 18 import com.jofti.api.NameSpaceKey; 19 import com.jofti.btree.BTOperations; 20 import com.jofti.btree.BTree; 21 import com.jofti.cache.adapter.NameSpaceWrapper; 22 import com.jofti.exception.JoftiException; 23 import com.jofti.introspect.ClassIntrospector; 24 import com.jofti.util.ObjectProcedureAdapter; 25 import com.jofti.util.OpenHashMap; 26 27 34 public class NameSpaceTreeOperationAdapter extends TreeOperationAdapter{ 35 36 37 public NameSpaceTreeOperationAdapter(){ 38 } 39 40 private static Log log = LogFactory.getLog(NameSpaceTreeOperationAdapter.class); 41 42 43 46 public boolean contains(Comparable key,BTree tree, ClassIntrospector parser)throws JoftiException{ 47 return BTOperations.contains(tree, key, parser.getKeyDimension(((NameSpaceKey)key).getKey().getClass())); 48 } 49 50 53 public void insert(Comparable key, Object value, BTree tree,ClassIntrospector parser) throws IllegalArgumentException , JoftiException{ 54 56 Map attributes = parser.getAttributeValues(value); 57 if (attributes == null || attributes.isEmpty()){ 58 if(log.isDebugEnabled()){ 59 log.debug("No attributes found for '" + key +"' ignoring in index"); 60 } 61 return; 62 } 63 64 List addedObjects = new ArrayList (); 65 NameSpaceKey tempKey = (NameSpaceKey)key; 66 67 if(log.isDebugEnabled()){ 69 log.debug("Attempting to insert name space '" + tempKey +"'"); 70 } 71 BTOperations.insertValue(tree, key,new NameSpaceWrapper(tempKey.getNameSpace()),parser.getKeyDimension(NameSpaceWrapper.class)); 72 73 75 try { 76 77 if(log.isDebugEnabled()){ 78 log.debug("Attempting to insert key '" + key +"'"); 79 } 80 BTOperations.insertKeyValue(tree, key, attributes,parser.getKeyDimension(((NameSpaceKey)key).getClass())); 82 addedObjects.add(key); 83 if(log.isDebugEnabled()){ 84 log.debug("inserted key '" + key +"'"); 85 } 86 87 treeInsert(key,tree,attributes,addedObjects); 88 89 } catch (JoftiException e){ 90 log.error("Error encountered - removing indexed objects " + addedObjects,e); 91 removeIndexedValues(key,addedObjects,tree,parser ); 92 } 93 94 } 95 98 public void removeByKey(Comparable value, BTree tree, ClassIntrospector parser) throws JoftiException 99 { 100 101 102 Collection matchingValues = BTOperations.getKeyAttributes(tree,value,parser.getKeyDimension(((NameSpaceKey)value).getClass())); 104 105 if (matchingValues != null){ 106 if (matchingValues.size() >0){ 107 for (Iterator it = matchingValues.iterator();it.hasNext();){ 108 BTOperations.removeValueObject(tree,value,(Comparable )it.next()); 109 110 } 111 } 112 if(log.isDebugEnabled()){ 113 log.debug("Attempting to remove key '" + value +"'"); 114 } 115 116 BTOperations.removeValue(tree, value, value,parser.getKeyDimension(value.getClass())); 117 if(log.isDebugEnabled()){ 118 log.debug("Removed key '" + value +"'"); 119 } 120 NameSpaceKey tempKey = (NameSpaceKey)value; 121 if(log.isDebugEnabled()){ 122 log.debug("Attempting to remove name space entry'" + value +"'"); 123 } 124 BTOperations.removeValue(tree, value,new NameSpaceWrapper(tempKey.getNameSpace()),parser.getKeyDimension(NameSpaceWrapper.class)); 125 126 } 127 128 } 129 130 133 public void remove(Comparable key, Object value, BTree tree,ClassIntrospector parser) throws IllegalArgumentException , JoftiException{ 134 try{ 136 137 if(log.isDebugEnabled()){ 138 log.debug("Attempting to remove key '" + key +"'"); 139 } 140 141 BTOperations.removeValue(tree, key, key,parser.getKeyDimension(((NameSpaceKey)key).getKey().getClass())); 142 if(log.isDebugEnabled()){ 143 log.debug("Removed key '" + key +"'"); 144 } 145 146 treeRemove(key,value,tree,parser); 147 148 NameSpaceKey tempKey = (NameSpaceKey)key; 149 if(log.isDebugEnabled()){ 151 log.debug("Attempting to remove name space entry'" + tempKey +"'"); 152 } 153 BTOperations.removeValue(tree, key,new NameSpaceWrapper(tempKey.getNameSpace()),parser.getKeyDimension(NameSpaceWrapper.class)); 154 155 } catch (JoftiException e){ 156 throw e; 157 } 158 } 159 160 166 private void removeIndexedValues(Object key, List added,BTree tree,ClassIntrospector parser ){ 167 removeIndexedValues(key,added,tree); 168 if (key instanceof NameSpaceKey){ 169 NameSpaceKey tempKey = (NameSpaceKey)key; 170 if(log.isDebugEnabled()){ 172 log.debug("Attempting to remove name space entry'" + tempKey +"'"); 173 } 174 try { 175 BTOperations.removeValue(tree, new NameSpaceWrapper(tempKey.getNameSpace()),(Comparable )key,parser.getKeyDimension(NameSpaceWrapper.class)); 176 } catch (JoftiException e){ 177 log.warn(e); 178 } 179 } 180 } 181 182 185 public Map getAllValuesForKey(Comparable key, BTree tree, ClassIntrospector parser)throws JoftiException{ 186 187 return BTOperations.match(tree,key, parser.getKeyDimension(key.getClass())); 188 189 } 190 191 197 public Collection getAllValuesForDimension(BTree tree, ClassIntrospector parser)throws JoftiException{ 198 final Set tempSet = new LinkedHashSet (); 199 Map keyDimensions = parser.getKeyDimensions(); 200 201 202 for(Iterator it = keyDimensions.entrySet().iterator();it.hasNext();){ 203 Map.Entry entry = (Map.Entry ) it.next(); 204 if (!(entry.getKey() instanceof NameSpaceWrapper)){ 205 OpenHashMap tempMap = (OpenHashMap)BTOperations.getAllResultsForDimension(tree, ((Integer )entry.getValue()).intValue()); 206 tempMap.forEachKey(new ObjectProcedureAdapter(){ 207 public boolean apply(Object key){ 208 tempSet.add(key); 209 return true; 210 } 211 }); 212 } 214 215 } 216 return tempSet; 217 218 } 219 } 220 | Popular Tags |