Changeset 24254
- Timestamp:
- 2011-07-14T21:39:43+12:00 (12 years ago)
- Location:
- main/trunk/greenstone3
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
main/trunk/greenstone3/src/java/org/greenstone/gsdl3/action/Action.java
r24227 r24254 77 77 } 78 78 79 79 protected void extractMetadataNames(Element format, HashSet meta_names) { 80 80 //NodeList nodes = format.getElementsByTagNameNS("metadata", "http://www.greenstone.org/configformat"); 81 81 NodeList metadata_nodes = format.getElementsByTagName("gsf:metadata"); … … 90 90 metadata.append("all"); 91 91 metadata.append(GSConstants.META_RELATION_SEP); 92 } 92 } else if (all.equals("offset")) { // multiple is no longer boolean. 93 // Can be "true", "false" or it can be "offset" (when requested to use mdoffset) 94 metadata.append("offset"); 95 metadata.append(GSConstants.META_RELATION_SEP); 96 } // if multiple=false, then get first value for the metadata 93 97 if (!select.equals("")) { 94 98 metadata.append(select); -
main/trunk/greenstone3/src/java/org/greenstone/gsdl3/action/GS2BrowseAction.java
r21928 r24254 272 272 Element d = this.doc.createElement(GSXML.DOC_NODE_ELEM); 273 273 d.setAttribute(GSXML.NODE_ID_ATT, ((Element)doc_nodes.item(c)).getAttribute(GSXML.NODE_ID_ATT)); 274 if(((Element)doc_nodes.item(c)).hasAttribute(GSXML.NODE_MDOFFSET_ATT)) { 275 d.setAttribute(GSXML.NODE_MDOFFSET_ATT, ((Element)doc_nodes.item(c)).getAttribute(GSXML.NODE_MDOFFSET_ATT)); 276 } 274 277 doc_list.appendChild(d); 275 278 } -
main/trunk/greenstone3/src/java/org/greenstone/gsdl3/service/AbstractBrowse.java
r23050 r24254 574 574 * <docNode nodeId='xxx' nodeType='leaf' docType='hierarchy'/> 575 575 */ 576 protected Element createDocNode(String node_id ) {576 protected Element createDocNode(String node_id, int offset) { 577 577 Element node = this.doc.createElement(GSXML.DOC_NODE_ELEM); 578 578 node.setAttribute(GSXML.NODE_ID_ATT, node_id); … … 587 587 String node_type = getNodeType(node_id, doc_type); 588 588 node.setAttribute(GSXML.NODE_TYPE_ATT, node_type); 589 590 // mdoffset information stored in DB determines which of multiple values for 591 // a metadata needs to be displayed when a classifier is built on that metadata 592 node.setAttribute(GSXML.NODE_MDOFFSET_ATT, Integer.toString(offset)); 589 593 return node; 590 594 } … … 621 625 ArrayList child_ids = getChildrenIds(node_id); 622 626 if (child_ids==null) return; 627 628 // get a list of all mdoffsets at this point 629 ArrayList child_offsets = getOffsetsForChildrenIds(node_id); 630 // make sure that if it's doesn't match up with child_ids in length, 631 // it is padded with 0s to make up the length 632 if(child_offsets == null) { 633 child_offsets = new ArrayList(child_ids.size()); 634 } 635 if(child_offsets.size() < child_ids.size()) { 636 Integer zero = new Integer(0); 637 for(int i = child_offsets.size()-1; i < child_ids.size(); i++) { 638 child_offsets.add(zero); 639 } 640 } 641 623 642 for (int i=0; i< child_ids.size(); i++) { 624 643 String child_id = (String)child_ids.get(i); 644 int child_offset = ((Integer)child_offsets.get(i)).intValue(); // counts both docnodes and classnodes at the childlevel, is this right? 625 645 Element child_elem; 626 646 if (isDocumentId(child_id)) { 627 child_elem = createDocNode(child_id );647 child_elem = createDocNode(child_id, child_offset); 628 648 } else { 629 649 child_elem = createClassifierNode(child_id); … … 684 704 } 685 705 706 /** Override to get a list of mdoffsets of children. Return null if no children or if no mdoffsets for them */ 707 protected ArrayList getOffsetsForChildrenIds(String node_id) { 708 return null; 709 } 710 686 711 /** if id ends in .fc, .pc etc, then translate it to the correct id */ 687 712 abstract protected String translateId(String node_id); -
main/trunk/greenstone3/src/java/org/greenstone/gsdl3/service/AbstractDocumentRetrieve.java
r22085 r24254 241 241 Element request_node = (Element) request_nodes.item(i); 242 242 String node_id = request_node.getAttribute(GSXML.NODE_ID_ATT); 243 244 // make a custom copy of metadata_names_list for each docID, since mdoffset value varies for each doc 245 ArrayList customised_metadata_names_list = new ArrayList(metadata_names_list.size()); 246 int mdoffset = 0; 247 if(request_node.hasAttribute(GSXML.NODE_MDOFFSET_ATT)) { 248 String offset = request_node.getAttribute(GSXML.NODE_MDOFFSET_ATT); 249 mdoffset = Integer.parseInt(offset); 250 251 for(int x = 0; x < metadata_names_list.size(); x++) { 252 String metaname = (String)metadata_names_list.get(x); 253 if(metaname.indexOf("offset" + GSConstants.META_RELATION_SEP) != -1) { 254 // append offset number to the metaname 255 metaname = metaname.replace("offset"+GSConstants.META_RELATION_SEP, "offset"+mdoffset+GSConstants.META_RELATION_SEP); 256 } 257 customised_metadata_names_list.add(x, metaname); 258 } 259 } 243 260 244 261 boolean is_external_link = false; … … 272 289 if (!is_external_link){ 273 290 try { 274 Element metadata_list = getMetadataList(node_id, all_metadata, metadata_names_list);291 Element metadata_list = getMetadataList(node_id, all_metadata, customised_metadata_names_list); 275 292 request_node.appendChild(metadata_list); 276 293 } catch (GSException e) { -
main/trunk/greenstone3/src/java/org/greenstone/gsdl3/service/AbstractGS2DocumentRetrieve.java
r23792 r24254 41 41 import java.util.Iterator; 42 42 import java.util.ArrayList; 43 import java.util.regex.Matcher; 44 import java.util.regex.Pattern; 43 45 44 46 import org.apache.log4j.*; … … 196 198 197 199 } else { 200 // prepare regex to work with mdoffset: looking for <offset\d*_> 201 Pattern pattern = Pattern.compile("offset[0-9]*" + GSConstants.META_RELATION_SEP); 202 198 203 for (int i=0; i<metadata_names.size(); i++) { 199 204 String meta_name = (String) metadata_names.get(i); 200 205 String value = getMetadata(node_id, info, meta_name, lang); 206 207 // Remove the occurrence (if any) in this metaname of the mdoffset number in the pattern <offset\d*_> 208 // Leaving string "offset" in at this point: it will be handled in config_format.xsl's gsf:metadata template match 209 Matcher matcher = pattern.matcher(meta_name); 210 meta_name = matcher.replaceFirst("offset" + GSConstants.META_RELATION_SEP); 211 //replaceFirst(""); // if removing the occurrence (if any) of entire pattern <offset\d*_> in input 212 201 213 GSXML.addMetadata(this.doc, metadata_list, meta_name, value); 202 214 } … … 317 329 protected String getMetadata(String node_id, DBInfo info, 318 330 String metadata, String lang) { 319 boolean multiple = false;331 String multiple = "false"; // multiple can now be "true", "false" or "offset<number>". It's no longer a boolean 320 332 String relation = ""; 321 333 String separator = ", "; … … 346 358 metadata = metadata.substring(pos+1); 347 359 // check for all on the front 348 if (temp.equals("all") ) {349 multiple =true;360 if (temp.equals("all") || temp.startsWith("offset")) { // multiple can now be "true", "false" or "offset" 361 multiple = temp; // multiple=true; 350 362 pos = metadata.indexOf(GSConstants.META_RELATION_SEP); 351 363 if (pos ==-1) { … … 399 411 StringBuffer result = new StringBuffer(); 400 412 401 if ( !multiple) {413 if (multiple.equals("false")) { 402 414 result.append(this.macro_resolver.resolve(relation_info.getInfo(metadata), lang, MacroResolver.SCOPE_META, relation_id)); 403 } else { 404 // we have multiple meta 415 } else if(multiple.startsWith("offset")) { // multiple = offset 416 String offset = multiple.substring("offset".length(), multiple.length()); 417 int offsetVal = offset.equals("") ? 0 : Integer.parseInt(offset); 418 String value = relation_info.getInfoOffset(metadata, offsetVal); // what if this metadata is not the one we need to get the offset for? MDTYPE! 419 // at the moment, do we assume the user will specify retrieving the offset only for such metadata as has an offset? 420 // At least, getInfoOffset will return the firstelement if the offset exceeds the bounds of the values for this metadata key 421 422 result.append(this.macro_resolver.resolve(value, lang, MacroResolver.SCOPE_META, relation_id)); 423 424 } else { // multiple = true, we have multiple meta 405 425 Vector values = relation_info.getMultiInfo(metadata); 406 426 if (values != null) { 407 427 boolean first = true; 408 428 for (int i=0; i<values.size(); i++) { … … 415 435 } 416 436 } 417 logger.info(result); 437 logger.info(result); 418 438 } 419 439 // if not ancestors, then this is all we do … … 428 448 relation_info = this.coll_db.getInfo(relation_id); 429 449 if (relation_info == null) return result.toString(); 430 if ( !multiple) {450 if (multiple.equals("false")) { //if (!multiple) 431 451 result.insert(0, separator); 432 452 result.insert(0, this.macro_resolver.resolve(relation_info.getInfo(metadata), lang, MacroResolver.SCOPE_META, relation_id)); -
main/trunk/greenstone3/src/java/org/greenstone/gsdl3/service/GS2Browse.java
r22974 r24254 175 175 176 176 } 177 /** returns a list of the mdoffset values in order for the children, null is 178 * returned if there are no children or if the mdoffset field is empty */ 179 protected ArrayList getOffsetsForChildrenIds(String node_id) { 180 DBInfo info = this.coll_db.getInfo(node_id); 181 if (info == null) { 182 return null; 183 } 184 185 ArrayList childrenOffsets = new ArrayList(); 186 187 String offset = info.getInfo("mdoffset").trim(); 188 if(offset.equals("")) { 189 return null; 190 } 191 StringTokenizer st = new StringTokenizer(offset, ";"); 192 while (st.hasMoreTokens()) { 193 String val = st.nextToken().trim(); 194 childrenOffsets.add(Integer.valueOf(val)); 195 } 196 return childrenOffsets; 197 } 198 177 199 /** returns the node id of the parent node, null if no parent */ 178 200 protected String getParentId(String node_id){ -
main/trunk/greenstone3/src/java/org/greenstone/gsdl3/util/DBInfo.java
r16869 r24254 53 53 } 54 54 55 /** get the value for the key at offset. If offset out of bounds, 56 * just return the first one. */ 57 public String getInfoOffset(String key, int offset) { 58 Vector items = (Vector)info_map_.get(key); 59 if (items==null) { 60 return ""; 61 } 62 if(offset >= 0 && offset < items.size()) { 63 return (String)items.get(offset); 64 } // else 65 return (String)items.firstElement(); 66 } 67 68 55 69 // methods for keys that can have multiple values 56 70 -
main/trunk/greenstone3/src/java/org/greenstone/gsdl3/util/GSXML.java
r24221 r24254 157 157 public static final String NODE_TYPE_INTERNAL = "internal"; 158 158 public static final String NODE_TYPE_LEAF = "leaf"; 159 public static final String NODE_MDOFFSET_ATT = "mdoffset"; 159 160 160 161 public static final String DOC_TYPE_SIMPLE = "simple"; … … 1039 1040 StringWriter sw = new StringWriter(); 1040 1041 trans.transform(new DOMSource(e), new StreamResult(sw)); 1041 System.err.println( sw.toString() ); 1042 System.err.println( sw.toString() ); // logger.info( sw.toString() ); 1042 1043 } catch( Exception ex ) { 1043 1044 System.err.println( "couldn't write " + e + " to log" ); -
main/trunk/greenstone3/web/interfaces/default/transform/config_format.xsl
r24227 r24254 34 34 <a><xslt:attribute name='href'><xslt:value-of select='$library_name'/>?a=b&rt=r&s=<xslt:value-of select='$serviceName'/>&c=<xslt:value-of select='$collName'/>&cl=<xslt:value-of select='@nodeID'/><xslt:if test="classifierNode|documentNode">.pr</xslt:if><xslt:if test="parent::node()[@orientation='horizontal']">&sib=1</xslt:if></xslt:attribute> 35 35 <xsl:apply-templates/> 36 </a> 36 </a> 37 37 </xsl:when> 38 38 <xsl:when test="@type='source'"> … … 112 112 113 113 <xsl:template match="gsf:metadata" mode="get-metadata-name"> 114 <xsl:if test="@multiple='true'">all_</xsl:if><xsl:if test= '@select'><xsl:value-of select='@select'/>_</xsl:if><xsl:if test="@separator">*<xsl:value-of select='@separator'/>*_</xsl:if><xsl:value-of select="@name"/>114 <xsl:if test="@multiple='true'">all_</xsl:if><xsl:if test="starts-with(@multiple,'offset')"><xsl:value-of select='@multiple'/>_</xsl:if><xsl:if test='@select'><xsl:value-of select='@select'/>_</xsl:if><xsl:if test="@separator">*<xsl:value-of select='@separator'/>*_</xsl:if><xsl:value-of select="@name"/> 115 115 </xsl:template> 116 116
Note:
See TracChangeset
for help on using the changeset viewer.