Changeset 29523

Show
Ignore:
Timestamp:
03.12.2014 12:42:45 (4 years ago)
Author:
kjdon
Message:

implementing siblings and children, descendents still to implement. also, do a quick search and replace of [meta-name] strings inside metadata values. currently won't handle parent(Top) type ones, only ones without any qualifier

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • main/trunk/greenstone3/src/java/org/greenstone/gsdl3/service/AbstractGS2DocumentRetrieve.java

    r28966 r29523  
    229229    if (index == -1) { 
    230230      // metadata is for this node 
    231       Vector<String> values = info.getMultiInfo(metadata); 
    232       return values; 
     231      return info.getMultiInfo(metadata); 
    233232    } 
    234233    // we need to get metadata for one or more different nodes 
     
    236235    String relation_id=""; 
    237236    metadata = metadata.substring(index + 1); 
    238     if (relation.equals("parent") || relation.equals("ancestors")) { 
     237    if (relation.equals("root")) { 
     238      relation_id = OID.getTop(node_id); 
     239      if (relation_id.equals(node_id)) { 
     240    // use the current node info 
     241    return info.getMultiInfo(metadata); 
     242      } else { 
     243    return getMetaValuesForOID(relation_id, metadata); 
     244      } 
     245    } 
     246    if (relation.equals("parent")) { 
    239247      relation_id = OID.getParent(node_id); 
    240248      if (relation_id.equals(node_id)) { 
     249    // no parent 
    241250    return null; 
    242251      } 
    243     } else if (relation.equals("root")) { 
    244       relation_id = OID.getTop(node_id); 
    245     } 
    246  
    247     DBInfo relation_info; 
    248     if (relation_id.equals(node_id)) { 
    249       relation_info = info; 
    250     } else { 
    251       relation_info = this.coll_db.getInfo(relation_id); 
    252     } 
    253     if (relation_info == null) 
    254       { 
     252      return getMetaValuesForOID(relation_id, metadata); 
     253    } 
     254 
     255    if (relation.equals("ancestors")) { 
     256      if (OID.isTop(node_id)) { 
    255257    return null; 
    256258      } 
    257  
    258     Vector<String> values = relation_info.getMultiInfo(metadata); 
    259     // do resolving 
    260     if (!relation.equals("ancestors")){ 
     259      String current_id = node_id; 
     260      relation_id = OID.getParent(current_id); 
     261      Vector<String> values = new Vector<String>(); 
     262      while (!relation_id.equals(current_id)) { 
     263     
     264    Vector<String> more_values = getMetaValuesForOID(relation_id, metadata); 
     265    if (more_values != null) { 
     266      values.addAll(0, more_values); 
     267    } 
     268    current_id = relation_id; 
     269    relation_id = OID.getParent(current_id); 
     270      } 
    261271      return values; 
    262272    } 
    263  
    264     // ancestors: go up the chain 
    265  
    266     String current_id = relation_id; 
    267     relation_id = OID.getParent(current_id); 
    268     while (!relation_id.equals(current_id)) 
    269       { 
    270     relation_info = this.coll_db.getInfo(relation_id); 
    271     if (relation_info == null) 
    272       return values; 
     273    if (relation.equals("siblings")) { 
     274      String parent_id = OID.getParent(node_id); 
     275      if (parent_id.equals(node_id)) { 
     276    // no parent, therefore no siblings 
     277    return null; 
     278      } 
     279      // siblings is the same as asking for children of the parent 
     280      node_id = parent_id; 
     281      relation = "children"; 
     282      current_info = this.coll_db.getInfo(parent_id); 
     283      if (current_info == null) { 
     284    return null; 
     285      } 
     286    } 
     287    if (relation.equals("children")) { 
     288      Vector<String> values = new Vector<String>(); 
     289      String contains = current_info.getInfo("contains"); 
     290      contains = StringUtils.replace(contains, "\"", node_id); 
     291      String[] children = contains.split(";");  
     292      for (int i = 0; i < children.length; i++) { 
    273293     
    274     Vector<String> more_values = relation_info.getMultiInfo(metadata); 
    275     if (more_values != null) 
    276       { 
    277         values.addAll(0, more_values); 
    278       } 
     294    String child_id = children[i]; 
     295    Vector<String> more_values = getMetaValuesForOID(child_id, metadata); 
     296    if (more_values != null) { 
     297      values.addAll(more_values); 
     298    } 
     299      } 
     300      return values; 
     301    }  
     302    if (relation.equals("descendents")) { 
     303      return null; 
     304    } 
     305    // unknown relation 
     306    logger.error("asked for relation "+relation+" and don't understand it."); 
     307    return null; 
     308  } 
     309       
     310  //   } else { 
     311  //   if (relation.equals("parent") || relation.equals("ancestors")) { 
     312  //     relation_id = OID.getParent(node_id); 
     313  //     if (relation_id.equals(node_id)) { 
     314  //    return null; 
     315  //     } 
     316  //   } else if (relation.equals("root")) { 
     317  //     relation_id = OID.getTop(node_id); 
     318  //   } 
     319 
     320  //   DBInfo relation_info; 
     321  //   if (relation_id.equals(node_id)) { 
     322  //     relation_info = info; 
     323  //   } else { 
     324  //     relation_info = this.coll_db.getInfo(relation_id); 
     325  //   } 
     326  //   if (relation_info == null) 
     327  //     { 
     328  //    return null; 
     329  //     } 
     330 
     331  //   Vector<String> values = relation_info.getMultiInfo(metadata); 
     332  //   // do resolving 
     333  //   if (!relation.equals("ancestors")){ 
     334  //     return values; 
     335  //   } 
     336 
     337  //   // ancestors: go up the chain 
     338 
     339  //   String current_id = relation_id; 
     340  //   relation_id = OID.getParent(current_id); 
     341  //   while (!relation_id.equals(current_id)) 
     342  //     { 
     343  //    relation_info = this.coll_db.getInfo(relation_id); 
     344  //    if (relation_info == null) 
     345  //      return values; 
     346     
     347  //    Vector<String> more_values = relation_info.getMultiInfo(metadata); 
     348  //    if (more_values != null) 
     349  //      { 
     350  //        values.addAll(0, more_values); 
     351  //      } 
    279352     
    280353             
    281     current_id = relation_id; 
    282     relation_id = OID.getParent(current_id); 
    283       } 
    284     return values; // for now 
    285   } 
    286  
     354  //    current_id = relation_id; 
     355  //    relation_id = OID.getParent(current_id); 
     356  //     } 
     357  //   return values; // for now 
     358  // } 
     359 
     360    protected Vector<String> getMetaValuesForOID(String oid, String metadata) { 
     361      DBInfo info = this.coll_db.getInfo(oid); 
     362      if (info == null) { 
     363    return null; 
     364      } 
     365       
     366      Vector<String> values = info.getMultiInfo(metadata); 
     367      // lets look through the values and look for [xxx] things. We need to look up metadata for them. 
     368      if (values == null) { return values; } 
     369       
     370      for (int j = 0; j < values.size(); j++) { 
     371    String val = values.elementAt(j); 
     372    if (val.contains("[")) { 
     373      // look for metadata refs 
     374      String [] metas = StringUtils.substringsBetween(val, "[", "]"); 
     375      for (int i=0; i<metas.length; i++) { 
     376        String meta = metas[i]; 
     377        String meta_val = info.getInfo(meta); 
     378        if (!meta_val.equals("")) { 
     379          val = StringUtils.replace(val,"["+meta+"]",meta_val); 
     380        } 
     381      } 
     382      values.set(j,val); 
     383    } 
     384      } 
     385      return values; 
     386    } 
    287387    protected int getNumChildren(String node_id) 
    288388    {