WEB开发网
开发学院软件开发Java 深入浅出 jackrabbit 三 创建 document 阅读

深入浅出 jackrabbit 三 创建 document

 2009-09-17 00:00:00 来源:WEB开发网   
核心提示: 重点:最后一个需要说明的field是下面这段代码产生的field: Java代码InternalValue[]values=propState.getValues();for(inti=0;i<values.length;i++){addValue(doc,values[i],propSt

重点:最后一个需要说明的field是下面这段代码产生的field:

Java代码   

InternalValue[] values = propState.getValues(); 
        for (int i = 0; i < values.length; i++) { 
          addValue(doc, values[i], propState.getName()); 
        }

这段代码ahuaxuan之前已经加了一点注释,下面我们来深入到方法的内部来看看这个方法究竟会创建什么样的field。下面这个方法看上去有点长,好像很会创建很多种field的样子,非也,下面这段代码其实只会创建3种field。

Java代码   

private void addValue(Document doc, InternalValue value, Name name) { 
    String fieldName = name.getLocalName(); 
    try { 
      fieldName = resolver.getJCRName(name); 
    } catch (NamespaceException e) { 
      // will never happen 
    } 
    switch (value.getType()) { 
      case PropertyType.BINARY: 
        if (isIndexed(name)) { 
//很重要,如果是二进制的property,那么在这个方法里会被解析 
          addBinaryValue(doc, fieldName, value.getBLOBFileValue()); 
        } 
        break; 
      case PropertyType.BOOLEAN: 
        if (isIndexed(name)) { 
          addBooleanValue(doc, fieldName, Boolean.valueOf(value.getBoolean())); 
        } 
        break; 
      case PropertyType.DATE: 
        if (isIndexed(name)) { 
          addCalendarValue(doc, fieldName, value.getDate()); 
        } 
        break; 
      case PropertyType.DOUBLE: 
        if (isIndexed(name)) { 
          addDoubleValue(doc, fieldName, new Double(value.getDouble())); 
        } 
        break; 
      case PropertyType.LONG: 
        if (isIndexed(name)) { 
          addLongValue(doc, fieldName, new Long(value.getLong())); 
        } 
        break; 
      case PropertyType.REFERENCE: 
        if (isIndexed(name)) { 
          addReferenceValue(doc, fieldName, value.getUUID()); 
        } 
        break; 
      case PropertyType.PATH: 
        if (isIndexed(name)) { 
          addPathValue(doc, fieldName, value.getPath()); 
        } 
        break; 
      case PropertyType.STRING: 
//很重要,普通string的property也会成为一种field,而binary和//string之间的case其实都是一种field。也就是说这个方法里负责创建3种//field。 
        if (isIndexed(name)) { 
          // never fulltext index jcr:uuid String 
          if (name.equals(NameConstants.JCR_UUID)) { 
            addStringValue(doc, fieldName, value.getString(), 
                false, false, DEFAULT_BOOST); 
          } else { 
            addStringValue(doc, fieldName, value.getString(), 
                true, isIncludedInNodeIndex(name), 
                getPropertyBoost(name)); 
          } 
        } 
        break; 
      case PropertyType.NAME: 
        // jcr:primaryType and jcr:mixinTypes are required for correct 
        // node type resolution in queries 
        if (isIndexed(name) || 
            name.equals(NameConstants.JCR_PRIMARYTYPE) || 
            name.equals(NameConstants.JCR_MIXINTYPES)) { 
          addNameValue(doc, fieldName, value.getQName()); 
        } 
        break; 
      default: 
        throw new IllegalArgumentException("illegal internal value type"); 
    } 
  }

上一页  1 2 3 4 5 6 7  下一页

Tags:深入浅出 jackrabbit 创建

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接