@Override
 public boolean matches(final String page, final String parameters) {
   final String pageId = getPageId(parameters);
   return NAME.equals(page)
       && (StringUtils.isEmpty(parameters)
           || parameters.equals(pageId)
           || parameters.contains(PageMode.OVERVIEW.toString()));
 }
 @Override
 public void parse(
     final XMLExtendedStreamReader reader, PathAddress parentAddress, List<ModelNode> list)
     throws XMLStreamException {
   if (getXmlWrapperElement() != null) {
     if (reader.getLocalName().equals(getXmlWrapperElement())) {
       if (reader.hasNext()) {
         if (reader.nextTag() == END_ELEMENT) {
           return;
         }
       }
     } else {
       throw ParseUtils.unexpectedElement(reader);
     }
   }
   boolean wildcard = getPathElement().isWildcard();
   String name = null;
   ModelNode op = Util.createAddOperation();
   Map<String, AttributeDefinition> attributes = getAttributeMap();
   for (int i = 0; i < reader.getAttributeCount(); i++) {
     String attributeName = reader.getAttributeLocalName(i);
     String value = reader.getAttributeValue(i);
     if (wildcard && NAME.equals(attributeName)) {
       name = value;
     } else if (attributes.containsKey(attributeName)) {
       AttributeDefinition def = attributes.get(attributeName);
       if (def instanceof SimpleAttributeDefinition) {
         ((SimpleAttributeDefinition) def).parseAndSetParameter(value, op, reader);
       } else if (def instanceof StringListAttributeDefinition) {
         ((StringListAttributeDefinition) def).parseAndSetParameter(value, op, reader);
       } else {
         throw new IllegalArgumentException("we should know how to handle " + def);
       }
     } else {
       throw ParseUtils.unexpectedAttribute(reader, i);
     }
   }
   if (wildcard && name == null) {
     throw MESSAGES.missingRequiredAttributes(new StringBuilder(NAME), reader.getLocation());
   }
   PathElement path =
       wildcard ? PathElement.pathElement(getPathElement().getKey(), name) : getPathElement();
   PathAddress address = parentAddress.append(path);
   op.get(ADDRESS).set(address.toModelNode());
   list.add(op);
   parseChildren(reader, address, list);
   if (getXmlWrapperElement() != null) {
     ParseUtils.requireNoContent(reader);
   }
 }
 @Override
 public boolean matches(final String page, final String parameters) {
   return NAME.equals(page)
       && (!StringUtils.isEmpty(parameters)
           && parameters.contains(DocumentPageMode.PERSONREFERENCES.toString()));
 }
Esempio n. 4
0
  /**
   * Given the input stream, read a document
   *
   * @since solr 1.3
   */
  public SolrInputDocument readDoc(XMLStreamReader parser) throws XMLStreamException {
    SolrInputDocument doc = new SolrInputDocument();

    String attrName = "";
    for (int i = 0; i < parser.getAttributeCount(); i++) {
      attrName = parser.getAttributeLocalName(i);
      if ("boost".equals(attrName)) {
        doc.setDocumentBoost(Float.parseFloat(parser.getAttributeValue(i)));
      } else {
        log.warn("XML element <doc> has invalid XML attr:" + attrName);
      }
    }

    StringBuilder text = new StringBuilder();
    String name = null;
    float boost = 1.0f;
    boolean isNull = false;
    String update = null;
    Collection<SolrInputDocument> subDocs = null;
    Map<String, Map<String, Object>> updateMap = null;
    boolean complete = false;
    while (!complete) {
      int event = parser.next();
      switch (event) {
          // Add everything to the text
        case XMLStreamConstants.SPACE:
        case XMLStreamConstants.CDATA:
        case XMLStreamConstants.CHARACTERS:
          text.append(parser.getText());
          break;

        case XMLStreamConstants.END_ELEMENT:
          if ("doc".equals(parser.getLocalName())) {
            if (subDocs != null && !subDocs.isEmpty()) {
              doc.addChildDocuments(subDocs);
              subDocs = null;
            }
            complete = true;
            break;
          } else if ("field".equals(parser.getLocalName())) {
            // should I warn in some text has been found too
            Object v = isNull ? null : text.toString();
            if (update != null) {
              if (updateMap == null) updateMap = new HashMap<>();
              Map<String, Object> extendedValues = updateMap.get(name);
              if (extendedValues == null) {
                extendedValues = new HashMap<>(1);
                updateMap.put(name, extendedValues);
              }
              Object val = extendedValues.get(update);
              if (val == null) {
                extendedValues.put(update, v);
              } else {
                // multiple val are present
                if (val instanceof List) {
                  List list = (List) val;
                  list.add(v);
                } else {
                  List<Object> values = new ArrayList<>();
                  values.add(val);
                  values.add(v);
                  extendedValues.put(update, values);
                }
              }
              break;
            }
            doc.addField(name, v, boost);
            boost = 1.0f;
            // field is over
            name = null;
          }
          break;

        case XMLStreamConstants.START_ELEMENT:
          text.setLength(0);
          String localName = parser.getLocalName();
          if ("doc".equals(localName)) {
            if (subDocs == null) subDocs = Lists.newArrayList();
            subDocs.add(readDoc(parser));
          } else {
            if (!"field".equals(localName)) {
              String msg = "XML element <doc> has invalid XML child element: " + localName;
              log.warn(msg);
              throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, msg);
            }
            boost = 1.0f;
            update = null;
            isNull = false;
            String attrVal = "";
            for (int i = 0; i < parser.getAttributeCount(); i++) {
              attrName = parser.getAttributeLocalName(i);
              attrVal = parser.getAttributeValue(i);
              if (NAME.equals(attrName)) {
                name = attrVal;
              } else if ("boost".equals(attrName)) {
                boost = Float.parseFloat(attrVal);
              } else if ("null".equals(attrName)) {
                isNull = StrUtils.parseBoolean(attrVal);
              } else if ("update".equals(attrName)) {
                update = attrVal;
              } else {
                log.warn("XML element <field> has invalid XML attr: " + attrName);
              }
            }
          }
          break;
      }
    }

    if (updateMap != null) {
      for (Map.Entry<String, Map<String, Object>> entry : updateMap.entrySet()) {
        name = entry.getKey();
        Map<String, Object> value = entry.getValue();
        doc.addField(name, value, 1.0f);
      }
    }

    return doc;
  }