1 10 11 package org.mmbase.applications.xmlimporter; 12 13 import java.util.*; 14 import org.mmbase.module.core.MMObjectBuilder; 15 import org.mmbase.module.core.MMObjectNode; 16 import org.mmbase.util.logging.Logger; 17 import org.mmbase.util.logging.Logging; 18 19 24 public abstract class BasicFinder implements SimilarObjectFinder { 25 26 27 private static Logger log 28 = Logging.getLoggerInstance(BasicFinder.class.getName()); 29 30 38 protected static List findPersistentObjects( 39 MMObjectBuilder builder, String criterium) { 40 41 Enumeration en = builder.search("WHERE " + criterium); 42 List result = new ArrayList(); 43 while (en.hasMoreElements()) { 44 MMObjectNode node = (MMObjectNode) en.nextElement(); 45 result.add(node.getIntegerValue("number")); 46 } 47 return result; 48 } 49 50 51 public BasicFinder() {} 52 53 59 public void init(HashMap params) throws TransactionHandlerException { 60 } 61 62 70 public List findSimilarObject(Transaction transaction, TmpObject tmpObj) 71 throws TransactionHandlerException { 72 Set exactMatches = new HashSet(); 73 Set closeMatches = new HashSet(); 74 75 MMObjectNode node1 = tmpObj.getNode(); 76 int otype = node1.getOType(); 77 Integer mmBaseId1 = new Integer (tmpObj.getMMBaseId()); 78 79 Iterator iTmpObjects = transaction.getTmpObjects().iterator(); 82 while (iTmpObjects.hasNext()) { 83 TmpObject tmpObj2 = (TmpObject)iTmpObjects.next(); 84 if (tmpObj2 == tmpObj) { 85 break; 91 } 92 if (!tmpObj2.isRelation()) { 93 if (tmpObj2.getNode().getOType() == otype) { 94 evaluateMatch(tmpObj2, tmpObj, exactMatches, closeMatches); 95 } 96 } 97 } 98 99 Iterator iPersistentObjects 102 = getExactPersistentObjects(tmpObj).iterator(); 103 while (iPersistentObjects.hasNext()) { 104 Integer mmBaseId2 = ((Integer ) iPersistentObjects.next()); 105 106 if (mmBaseId2.equals(mmBaseId1)) { 108 continue; 109 } 110 111 TmpObject persObj2 113 = transaction.getAccessObject(mmBaseId2.intValue()); 114 115 exactMatches.add(persObj2); 117 } 118 119 if (exactMatches.size() > 0) { 121 if (log.isDebugEnabled()) { 122 log.debug("Matches (exact) found for " + tmpObj + ":\n" 123 + exactMatches); 124 } 125 return new ArrayList(exactMatches); 126 } 127 128 Iterator iCloseObjects 131 = getClosePersistentObjects(tmpObj).iterator(); 132 while (iCloseObjects.hasNext()) { 133 Integer mmBaseId2 = ((Integer ) iCloseObjects.next()); 134 135 if (mmBaseId2.equals(mmBaseId1)) { 137 continue; 138 } 139 140 TmpObject persObj2 142 = transaction.getAccessObject(mmBaseId2.intValue()); 143 144 evaluateMatch(persObj2, tmpObj, exactMatches, closeMatches); 147 } 148 149 if (log.isDebugEnabled()) { 151 log.debug("Matches (close) found for " + tmpObj + ":\n" 152 + closeMatches); 153 } 154 return new ArrayList(closeMatches); 155 } 156 157 169 public abstract float scoreNode(TmpObject tmpObj1, TmpObject tmpObj2); 170 171 182 public abstract Collection getExactPersistentObjects(TmpObject tmpObj); 183 184 196 public abstract Collection getClosePersistentObjects(TmpObject tmpObj); 197 198 208 private void evaluateMatch( 209 TmpObject tmpObj1, TmpObject tmpObj2, Set exactMatches, Set closeMatches) { 210 float matchingRate = scoreNode(tmpObj1, tmpObj2); 211 if (matchingRate == 1.0) { 212 exactMatches.add(tmpObj1); 214 } else if (matchingRate > 0.0) { 215 closeMatches.add(tmpObj1); 217 } 218 } 219 220 } 221 | Popular Tags |