1 10 package org.mmbase.module.corebuilders; 11 12 import java.util.*; 13 import org.mmbase.cache.Cache; 14 import org.mmbase.module.core.*; 15 import org.mmbase.storage.search.*; 16 import org.mmbase.storage.search.implementation.*; 17 18 19 import org.mmbase.util.logging.Logger; 20 import org.mmbase.util.logging.Logging; 21 22 34 35 public class OAlias extends MMObjectBuilder { 36 37 private static final Logger log = Logging.getLoggerInstance(OAlias.class); 38 39 private Cache numberCache = new Cache(128) { 41 public String getName() { return "AliasCache"; } 42 public String getDescription() { return "Cache for node aliases"; } 43 }; 44 45 private static final Integer NOT_FOUND = new Integer (-1); 46 47 public OAlias() { 48 numberCache.putCache(); 49 } 50 51 public boolean init() { 52 boolean res = super.init(); 53 if (res) checkAddTmpField("_destination"); 54 return res; 55 } 56 57 63 public int getNumber(String name) { 64 if (log.isDebugEnabled()) { 65 log.debug("Finding oalias node '" + name + "'"); 66 } 67 68 Integer nodeNumber = (Integer ) numberCache.get(name); 69 if (nodeNumber == null) { 70 try { 71 NodeSearchQuery query = new NodeSearchQuery(this); 72 BasicFieldValueConstraint constraint = new BasicFieldValueConstraint(query.getField(getField("name")), name); 73 query.setConstraint(constraint); 74 Iterator i = getNodes(query).iterator(); 75 if (i.hasNext()) { 76 MMObjectNode node = (MMObjectNode) i.next(); 77 int rtn = node.getIntValue("destination"); 78 numberCache.put(name, new Integer (rtn)); 79 return rtn; 80 } else { 81 numberCache.put(name, NOT_FOUND); 82 return -1; 83 } 84 } catch (SearchQueryException sqe) { 85 log.error(sqe.toString()); 86 return -1; 87 } 88 } else { 89 return nodeNumber.intValue(); 90 } 91 } 92 93 101 public String getAlias(int number) { 102 NodeSearchQuery query = new NodeSearchQuery(this); 103 BasicFieldValueConstraint constraint = new BasicFieldValueConstraint(query.getField(getField("destination")), new Integer (number)); 104 query.setConstraint(constraint); 105 try { 106 Iterator i = getNodes(query).iterator(); 107 if (i.hasNext()) { 108 MMObjectNode node = (MMObjectNode)i.next(); 109 return node.getStringValue("name"); 110 } else { 111 return null; 112 } 113 } catch (SearchQueryException sqe) { 114 log.error(sqe.toString()); 115 return null; 116 117 } 118 } 119 120 128 public MMObjectNode getAliasedNode(String alias) { 129 MMObjectNode node = null; 130 int nr = getNumber(alias); 131 if (nr > 0) { 132 try { 133 node = getNode(nr); 134 } catch (RuntimeException e) { 135 log.error("Alias '" + alias + "' points to non-existing node with number " + nr); 136 throw e; 137 } 138 } 139 return node; 140 } 141 142 147 public void createAlias(String alias, int number) { 148 createAlias(alias, number, "system"); 149 } 150 151 156 public void createAlias(String alias, int number, String owner) { 157 MMObjectNode node = getNewNode(owner); 158 node.setValue("name", alias); 159 node.setValue("destination", number); 160 node.insert(owner); 161 numberCache.remove(alias); 162 } 163 164 168 public void removeNode(MMObjectNode node) { 169 String name = node.getStringValue("name"); 170 super.removeNode(node); 171 numberCache.remove(name); 172 } 173 174 180 public boolean nodeRemoteChanged(String machine, String number, String builder, String ctype) { 181 if (builder.equals(getTableName())) { 182 if (ctype.equals("c") || ctype.equals("n")) { 183 MMObjectNode node = getNode(number); 185 numberCache.put(node.getStringValue("name"), node.getIntegerValue("destination")); 186 } else if (ctype.equals("d")) { 187 Integer n = new Integer (number); 188 Iterator i = numberCache.entrySet().iterator(); 189 while (i.hasNext()) { 190 Map.Entry entry = (Map.Entry) i.next(); 191 Object value = entry.getValue(); 192 if (n.equals(value)) { 193 i.remove(); 194 } 195 } 196 } 197 } 198 return super.nodeRemoteChanged(machine, number, builder, ctype); 199 } 200 201 } 202 | Popular Tags |