1 10 package org.mmbase.module.core; 11 12 import org.mmbase.bridge.Field; 13 import org.mmbase.module.corebuilders.RelDef; 14 15 import org.mmbase.util.logging.Logger; 16 import org.mmbase.util.logging.Logging; 17 import org.mmbase.util.Casting; 18 19 25 public class TemporaryNodeManager implements TemporaryNodeManagerInterface { 26 27 private static final Logger log = Logging.getLoggerInstance(TemporaryNodeManager.class); 28 29 32 public static final String UNKNOWN = "unknown"; 33 36 public static final String INVALID_VALUE = "invalid value"; 37 38 private final MMBase mmbase; 39 40 43 public TemporaryNodeManager(MMBase mmbase) { 44 this.mmbase = mmbase; 45 } 46 47 50 public String createTmpNode(String type, String owner, String key) { 51 if (log.isDebugEnabled()) { 52 log.debug("createTmpNode : type=" + type + " owner=" + owner + " key=" + key); 53 } 54 MMObjectBuilder builder = mmbase.getBuilder(type); 57 MMObjectNode node; 58 if (builder != null) { 59 node = builder.getNewTmpNode(owner, getTmpKey(owner, key)); 60 if (log.isDebugEnabled()) { 61 log.debug("New tmpnode " + node); 62 } 63 } else { 64 log.error("Can't find builder " + type); 65 } 66 return key; 67 } 68 69 72 public String createTmpRelationNode(String role,String owner,String key, String source,String destination) throws Exception { 73 RelDef reldef = mmbase.getRelDef(); 75 int rnumber = reldef.getNumberByName(role, true); 76 if(rnumber == -1) { 77 throw new Exception ("role " + role + " is not a proper relation"); 78 } 79 MMObjectBuilder builder = reldef.getBuilder(reldef.getNode(rnumber)); 80 String bulname = builder.getTableName(); 81 82 createTmpNode(bulname, owner, key); 84 setObjectField(owner, key, "_snumber", getTmpKey(owner, source)); 85 setObjectField(owner, key, "_dnumber", getTmpKey(owner, destination)); 86 setObjectField(owner, key, "rnumber", "" + rnumber); 87 return key; 88 } 89 90 93 public String createTmpAlias(String name,String owner,String key, String destination) { 94 MMObjectBuilder builder = mmbase.getOAlias(); 95 String bulname = builder.getTableName(); 96 97 createTmpNode(bulname, owner, key); 99 setObjectField(owner, key, "_destination", getTmpKey(owner, destination)); 100 setObjectField(owner, key, "name", name); 101 return key; 102 } 103 104 107 public String deleteTmpNode(String owner,String key) { 108 MMObjectBuilder b = mmbase.getBuilder("object"); 109 b.removeTmpNode(getTmpKey(owner, key)); 110 if (log.isDebugEnabled()) { 111 log.debug("delete node " + getTmpKey(owner, key)); 112 } 113 return key; 114 } 115 116 119 public MMObjectNode getNode(String owner, String key) { 120 MMObjectBuilder bul = mmbase.getBuilder("object"); 121 MMObjectNode node = bul.getTmpNode(getTmpKey(owner, key)); 122 if (node == null) { 124 log.debug("getNode tmp not node found " + key); 125 node = bul.getNode(key); 126 if(node == null) throw new RuntimeException ("Node not found !! (key = '" + key + "')"); 127 } 128 return node; 129 } 130 131 134 public String getObject(String owner, String key, String dbkey) { 135 MMObjectBuilder bul = mmbase.getBuilder("object"); 136 MMObjectNode node = bul.getTmpNode(getTmpKey(owner, key)); 137 if (node == null) { 138 log.debug("getObject not tmp node found " + key); 139 node = bul.getHardNode(dbkey); 140 if (node == null) { 141 log.warn("Node not found in database " + dbkey); 142 } else { 143 bul.putTmpNode(getTmpKey(owner, key), node); 144 } 145 } 146 if (node != null) { 147 return key; 148 } else { 149 return null; 150 } 151 } 152 153 158 public String setObjectField(String owner, String key, String field, Object value) { 159 MMObjectNode node = getNode(owner, key); 160 if (node != null) { 161 int type = node.getDBType(field); 162 if (type >= 0) { 163 if (value instanceof String ) { 164 String stringValue = (String )value; 165 switch(type) { 166 case Field.TYPE_XML: 167 case Field.TYPE_STRING: 168 node.setValue(field, stringValue); 169 break; 170 case Field.TYPE_NODE: 171 case Field.TYPE_INTEGER: 172 try { 173 int i = -1; 174 if (!stringValue.equals("")) i = Integer.parseInt(stringValue); 175 node.setValue(field, i); 176 } catch (NumberFormatException x) { 177 log.debug("Value for field " + field + " is not a number '" + stringValue + "'"); 178 return INVALID_VALUE; 179 } 180 break; 181 case Field.TYPE_BINARY: 182 log.error("We don't support casts from String to Binary"); 183 return INVALID_VALUE; case Field.TYPE_FLOAT: 185 try { 186 float f = -1; 187 if (!stringValue.equals("")) f = Float.parseFloat(stringValue); 188 node.setValue(field,f); 189 } catch (NumberFormatException x) { 190 log.debug("Value for field " + field + " is not a number " + stringValue); 191 return INVALID_VALUE; 192 } 193 break; 194 case Field.TYPE_DOUBLE: 195 try { 196 double d = -1; 197 if (!stringValue.equals("")) d = Double.parseDouble(stringValue); 198 node.setValue(field,d); 199 } catch (NumberFormatException x) { 200 log.debug("Value for field " + field + " is not a number " + stringValue); 201 return INVALID_VALUE; 202 } 203 break; 204 case Field.TYPE_LONG: 205 try { 206 long l = -1; 207 if (!stringValue.equals("")) l = Long.parseLong(stringValue); 208 node.setValue(field,l); 209 } catch (NumberFormatException x) { 210 log.debug("Value for field " + field + " is not a number " + stringValue); 211 return INVALID_VALUE; 212 } 213 break; 214 case Field.TYPE_DATETIME: 215 try { 216 node.setValue(field, Casting.toDate(value)); 217 } catch (Exception e) { 218 return INVALID_VALUE; 219 } 220 break; 221 case Field.TYPE_BOOLEAN: 222 if (org.mmbase.datatypes.StringDataType.BOOLEAN_PATTERN.matcher(stringValue).matches()) { 223 node.setValue(field, Casting.toBoolean(value)); 224 } else { 225 return INVALID_VALUE; 226 } 227 break; 228 default: 229 log.error("Unknown type for field " + field); 230 break; 231 } 232 } else { 233 node.setValue(field, value); 234 } 235 } else { 236 node.setValue(field, value); 237 log.warn("Invalid type for field " + field); 238 return UNKNOWN; 239 } 240 } else { 241 log.error("setObjectField(): Can't find node : "+key); 242 } 243 return ""; 244 } 245 246 250 public String getObjectFieldAsString(String owner,String key,String field) { 251 String rtn; 252 MMObjectNode node = getNode(owner,key); 253 if (node == null) { 254 log.error("getObjectFieldAsString(): node " + key + " not found!"); 255 rtn = ""; 256 } else { 257 rtn = node.getStringValue(field); 258 } 259 return rtn; 260 } 261 262 265 public Object getObjectField(String owner,String key,String field) { 266 Object rtn; 267 MMObjectNode node = getNode(owner,key); 268 if (node == null) { 269 log.error("getObjectFieldAsString(): node " + key + " not found!"); 270 rtn = ""; 271 } else { 272 rtn = node.getStringValue(field); 273 } 274 return rtn; 275 } 276 277 280 private String getTmpKey(String owner,String key) { 281 return owner + "_" + key; 282 } 283 } 284 | Popular Tags |