Exemple #1
0
  /**
   * This will invoke the <code>startElement</code> callback in the <code>ContentHandler</code>.
   *
   * @param element <code>Element</code> used in callbacks.
   * @param nsAtts <code>List</code> of namespaces to declare with the element or <code>null</code>.
   */
  private void startElement(Element element, Attributes nsAtts) throws JDOMException {
    String namespaceURI = element.getNamespaceURI();
    String localName = element.getName();
    String rawName = element.getQualifiedName();

    // Allocate attribute list.
    AttributesImpl atts = (nsAtts != null) ? new AttributesImpl(nsAtts) : new AttributesImpl();

    List attributes = element.getAttributes();
    Iterator i = attributes.iterator();
    while (i.hasNext()) {
      Attribute a = (Attribute) i.next();
      atts.addAttribute(
          a.getNamespaceURI(),
          a.getName(),
          a.getQualifiedName(),
          getAttributeTypeName(a.getAttributeType()),
          a.getValue());
    }

    try {
      contentHandler.startElement(namespaceURI, localName, rawName, atts);
    } catch (SAXException se) {
      throw new JDOMException("Exception in startElement", se);
    }
  }
Exemple #2
0
    public void addMessage(SAXParseException exception, String typeOfError) {
      if (errorCount == 0) xpaths = new Element("xsderrors", ns);
      errorCount++;

      Element elem = (Element) so.getLocator().getNode();
      Element x = new Element("xpath", ns);
      try {
        String xpath = jeeves.utils.XPath.getXPath(elem);
        // -- remove the first element to ensure XPath fits XML passed with
        // -- root element
        if (xpath.startsWith("/")) {
          int ind = xpath.indexOf('/', 1);
          if (ind != -1) {
            xpath = xpath.substring(ind + 1);
          } else {
            xpath = "."; // error to be placed on the root element
          }
        }
        x.setText(xpath);
      } catch (JDOMException e) {
        e.printStackTrace();
        x.setText("nopath");
      }
      String message = exception.getMessage() + " (Element: " + elem.getQualifiedName();
      String parentName;
      if (!elem.isRootElement()) {
        Element parent = (Element) elem.getParent();
        if (parent != null) parentName = parent.getQualifiedName();
        else parentName = "Unknown";
      } else {
        parentName = "/";
      }
      message += " with parent element: " + parentName + ")";

      Element m = new Element("message", ns).setText(message);
      Element errorType = new Element("typeOfError", ns).setText(typeOfError);
      Element errorNumber = new Element("errorNumber", ns).setText(String.valueOf(errorCount));
      Element e = new Element("error", ns);
      e.addContent(errorType);
      e.addContent(errorNumber);
      e.addContent(m);
      e.addContent(x);
      xpaths.addContent(e);
    }
Exemple #3
0
  /**
   * This will invoke the <code>endElement</code> callback in the <code>ContentHandler</code>.
   *
   * @param element <code>Element</code> used in callbacks.
   */
  private void endElement(Element element) throws JDOMException {
    String namespaceURI = element.getNamespaceURI();
    String localName = element.getName();
    String rawName = element.getQualifiedName();

    try {
      contentHandler.endElement(namespaceURI, localName, rawName);
    } catch (SAXException se) {
      throw new JDOMException("Exception in endElement", se);
    }
  }
  /**
   * Displays information about all nodes in a result set.
   *
   * @param nodelist the result list of an XPath expression evaluation
   */
  public static void display_node_list(List nodelist) {
    int size = nodelist.size();

    for (Object obj : nodelist) {
      String value = null;

      if (obj instanceof Element) {
        Element elem = (Element) obj;
        String details =
            String.format(
                "%d children, %d attrs", elem.getChildren().size(), elem.getAttributes().size());
        value = String.format("%s (%s)", elem.getQualifiedName(), details);
      } else if (obj instanceof Attribute) {
        Attribute attr = (Attribute) obj;
        value = String.format("@%s=\'%s\'", attr.getQualifiedName(), attr.getValue());
      } else if (obj instanceof Text) {
        Text text = (Text) obj;
        value = String.format("\"%s\"", text.getText());
      } else if (obj instanceof String) {
        String s = (String) obj;
        value = String.format("\"%s\"", s);
      } else if (obj instanceof Boolean) {
        Boolean b = (Boolean) obj;
        value = String.format("%s", b.toString());
      } else if (obj instanceof Double) {
        Double d = (Double) obj;
        value = String.format("%s", d.toString());
      } else {
        value = "Unsupported dynamic type";
      } // if-else

      System.out.printf("   (%s) %s\n", obj.getClass().getName(), value);
    } // for

    System.out.printf("Result: %d nodes\n", size);
  } // display_node_list()
  public Z3950ServerResults harvest() throws Exception {
    Set<String> newUuids = new HashSet<String>();

    int groupSize = 10;

    log.info("Retrieving remote metadata information:" + params.uuid);

    Z3950ServerResults serverResults = new Z3950ServerResults();

    // --- Clean all before harvest : Remove/Add mechanism
    localUuids = new UUIDMapper(dbms, params.uuid);

    // --- remove old metadata
    for (String uuid : localUuids.getUUIDs()) {
      String id = localUuids.getID(uuid);
      if (log.isDebugEnabled()) log.debug("  - Removing old metadata before update with id: " + id);
      dataMan.deleteMetadataGroup(context, dbms, id);
      serverResults.locallyRemoved++;
    }

    if (serverResults.locallyRemoved > 0) dbms.commit();

    // --- Search remote node
    MetaSearcher s = searchMan.newSearcher(SearchManager.Z3950, Geonet.File.SEARCH_Z3950_CLIENT);

    ServiceConfig config = new ServiceConfig();

    Element request = new Element("request");

    // --- Z39.50 servers from harvest params
    for (String id : params.getRepositories()) {
      request.addContent(new Element(Geonet.SearchResult.SERVERS).setText(id));
    }

    // --- Z39.50 query from harvest params
    request.addContent(new Element(Geonet.SearchResult.ZQUERY).setText(params.query));

    // --- don't get html presentations (get them later)
    request.addContent(new Element(Geonet.SearchResult.SERVERHTML).setText("off"));

    // --- set timeout to be 100 seconds
    request.addContent(new Element(Geonet.SearchResult.TIMEOUT).setText("100"));
    // --- set hitsPerPage
    request.addContent(new Element(Geonet.SearchResult.HITS_PER_PAGE).setText(groupSize + ""));

    // --- do the search
    s.search(context, request, config);

    if (s.getSize() == 0) {
      log.error("Search failed or returned 0 results, trying again");
      s.search(context, request, config);
      if (s.getSize() == 0) {
        throw new Exception("Bad luck, Search failed or returned 0 results");
      }
    }

    if (log.isDebugEnabled()) log.debug("Search returned " + s.getSize() + " hits");

    // -- process the hits in groups of groupSize
    int numberOfHits = Math.min(Integer.parseInt(params.maximumHits), s.getSize());
    // -- add from and to placeholders to request

    request.addContent(new Element("from"));
    request.addContent(new Element("to"));

    Element categories = Lib.local.retrieve(dbms, "Categories");
    if (log.isDebugEnabled()) log.debug("categories " + Xml.getString(categories));

    Element repositories = new Info().getZRepositories(context, settingMan);
    if (log.isDebugEnabled()) log.debug("repos " + Xml.getString(repositories));

    // -- build a map of collection code versus repository name for
    // -- assigning the categories
    Map<String, String> codes = new HashMap<String, String>();
    Map<String, String> catCodes = new HashMap<String, String>();

    // -- add new category for each repository
    boolean addcateg = false;
    for (String repo : params.getRepositories()) {
      Element repoElem = Xml.selectElement(repositories, "record[id='" + repo + "']");
      if (repoElem != null) {
        Element repoId = repoElem.getChild("id");
        String repoName = repoElem.getChildText("name");
        codes.put(
            repoId.getAttributeValue("serverCode") + ":" + repoId.getAttributeValue("code"),
            repoName);
        // create a result holder for this repository
        serverResults.getServerResult(repoName);

        // sanitize the name of the category
        String categName = repoName.replaceAll("[^\\w]", "");
        categName = categName.toLowerCase();
        catCodes.put(
            repoId.getAttributeValue("serverCode") + ":" + repoId.getAttributeValue("code"),
            categName);

        if (Xml.selectElement(categories, "record[name='" + categName + "']") == null) {
          int newId = context.getSerialFactory().getSerial(dbms, "Categories");
          dbms.execute("INSERT INTO Categories(id, name) VALUES (?, ?)", newId, categName);
          Lib.local.insert(dbms, "Categories", newId, repoName);
          addcateg = true;
        }
      }
    }

    if (addcateg) dbms.commit();

    // --- return only maximum hits as directed by the harvest params
    int nrGroups = (numberOfHits / groupSize) + 1;
    for (int i = 1; i <= nrGroups; i++) {
      int lower = ((i - 1) * groupSize) + 1;
      int upper = Math.min((i * groupSize), numberOfHits);
      request.getChild("from").setText("" + lower);
      request.getChild("to").setText("" + upper);

      // --- Loading results
      List<Document> list = s.presentDocuments(context, request, config);

      // --- Loading categories and groups
      localCateg = new CategoryMapper(dbms);
      localGroups = new GroupMapper(dbms);

      if (log.isDebugEnabled())
        log.debug(
            "There are "
                + (list.size() - 1)
                + " children in the results ("
                + lower
                + " to "
                + upper
                + ")");

      boolean transformIt = false;
      String thisXslt = context.getAppPath() + Geonet.Path.IMPORT_STYLESHEETS + "/";
      if (!params.importXslt.equals("none")) {
        thisXslt = thisXslt + params.importXslt;
        transformIt = true;
      }

      // --- For each record....
      for (Document doc : list) {
        Element md = doc.getRootElement();
        String eName = md.getQualifiedName();
        if (eName.equals("summary")) continue;

        // -- Remove existing geonet:info children as for example
        // -- GeoNetwork Z39.50 server return when full mode
        // -- an extra element with server info not needed
        // -- once harvested
        String colCode = "";
        Element info = md.getChild(Edit.RootChild.INFO, Edit.NAMESPACE);
        if (info != null) {
          String serverCode = info.getChildText("server");
          int colPos = serverCode.indexOf(':');
          if (colPos != -1) {
            colCode = serverCode.substring(0, colPos) + ":" + info.getChildText("collection");
          }
        }
        md.removeChildren(Edit.RootChild.INFO, Edit.NAMESPACE);
        String repoName = codes.get(colCode);
        if (log.isDebugEnabled()) log.debug("Processing record from server " + repoName);
        HarvestResult result = serverResults.getServerResult(repoName);
        result.totalMetadata++;

        if (eName.equals("error")) {
          log.error("JZKit could not retrieve record - returned " + Xml.getString(md));
          result.unretrievable++;
          continue;
        }

        // transform using importxslt if not none
        if (transformIt) {
          try {
            if (log.isDebugEnabled()) log.debug("Before transform: " + Xml.getString(md));
            md = Xml.transform(md, thisXslt);
            if (log.isDebugEnabled()) log.debug("After transform: " + Xml.getString(md));
          } catch (Exception e) {
            System.out.println("Cannot transform XML, ignoring. Error was: " + e.getMessage());
            result.badFormat++;
            continue; // skip this one
          }
        }

        // detect schema, extract uuid and add
        String schema = dataMan.autodetectSchema(md, null);
        if (schema == null) {
          log.warning("Skipping metadata with unknown schema.");
          result.unknownSchema++;
          continue;
        }

        String uuid = null;
        try {
          uuid = dataMan.extractUUID(schema, md);
        } catch (Exception e) {
          log.error("Unable to extract UUID: " + e.getMessage());
          e.printStackTrace();
        }

        if (uuid == null || uuid.equals("")) {
          log.warning("Skipping metadata due to failure extracting uuid (uuid null or empty).");
          result.unretrievable++;
          continue;
        }

        log.info("  - Adding metadata with " + uuid);

        // --- generate a new metadata id

        int id = context.getSerialFactory().getSerial(dbms, "Metadata");
        // TODO end confusion about datatypes
        String id$ = Integer.toString(id);

        String docType = "";
        if (!transformIt && (doc.getDocType() != null)) {
          docType = Xml.getString(doc.getDocType());
        }

        // --- check for duplicate uuid - violates constraints on metadata table
        // --- if we attempt insert
        boolean alreadyAdded = !newUuids.add(uuid);
        boolean alreadyInDb = (dataMan.getMetadataId(dbms, uuid) != null);
        if (alreadyAdded || alreadyInDb) {
          log.error("Uuid " + uuid + " already exists in this set/database - cannot insert");
          result.couldNotInsert++;
          continue;
        }

        //
        // insert metadata
        //
        try {
          String groupOwner = "1", isTemplate = "n", title = null;
          int owner = 1;
          String category = null, createDate = new ISODate().toString(), changeDate = createDate;
          boolean ufo = false, indexImmediate = false;
          dataMan.insertMetadata(
              context,
              dbms,
              schema,
              md,
              id,
              uuid,
              owner,
              groupOwner,
              params.uuid,
              isTemplate,
              docType,
              title,
              category,
              createDate,
              changeDate,
              ufo,
              indexImmediate);

        } catch (Exception e) {
          log.error("Unable to insert metadata " + e.getMessage());
          e.printStackTrace();
          result.couldNotInsert++;
          continue;
        }

        addPrivileges(id$, params.getPrivileges(), localGroups, dataMan, context, dbms, log);
        addCategories(
            id$,
            params.getCategories(),
            localCateg,
            dataMan,
            dbms,
            context,
            log,
            catCodes.get(colCode));

        dataMan.setTemplateExt(dbms, id, "n", null);
        dataMan.setHarvestedExt(dbms, id, params.uuid, params.name);

        // validate it here if requested
        if (params.validate) {
          Document docVal;
          if (!transformIt && (doc.getDocType() != null)) {
            docVal = new Document(md, (DocType) doc.getDocType().detach());
          } else {
            docVal = new Document(md);
          }

          if (!dataMan.doValidate(dbms, schema, id$, docVal, context.getLanguage())) {
            result.doesNotValidate++;
          }
        }

        dataMan.indexMetadata(dbms, id$);

        result.addedMetadata++;
      }
    }

    dbms.commit();
    return serverResults;
  }
  /**
   * This method is used to recursively create a java object based on the provided element.
   * Available elements : list, item, map, string and data. To create simple object see the
   * convertSimpleObject method.
   *
   * @param element the element to convert.
   * @return the created POJO, null if the element does not fit.
   */
  private void appendObject(Map<String, Object> container, Element element) {

    final String name = element.getQualifiedName();
    final List<Attribute> attributes = element.getAttributes();
    final List<Element> childElements = element.getChildren();

    /*
     * The simplest tag containing only a text value !
     */
    if ((childElements.size() == 0) && (attributes.size() == 0)) {
      container.put(name, element.getTextNormalize());
      return;
    }

    /*
     * Element is composed of attributes and child elements that we put in a map
     */
    final Map<String, Object> objectMap = new HashMap<String, Object>();

    // add attributes, using the predefined prefix to avoid collisions with
    // elements names
    for (final Attribute attr : attributes) {
      objectMap.put(this.mAttrPrefix + attr.getQualifiedName(), attr.getValue());
    }

    // add child elements under their names (recursive call)
    for (final Element elt : childElements) {
      appendObject(objectMap, elt);
    }

    // add all the text content concatenated in one
    final String textContent = element.getTextNormalize();

    if (textContent.length() > 0) {
      objectMap.put(this.mTextAttrName, textContent);
    }

    /*
     * now its time to add our object in the parent container but.. are we
     * the only one with the given name ?
     */
    if (container.containsKey(name)) {
      // we are not alone !
      final Object existingMappedElement = container.get(name);
      List<Object> fraternity;

      if (existingMappedElement instanceof List) {
        // the fraternity is allready organized
        fraternity = (List) existingMappedElement;
        fraternity.add(objectMap);

      } else {
        // we have one self-ignoring brother
        // > create the fraternity
        fraternity = new ArrayList<Object>();
        fraternity.add(existingMappedElement);
        fraternity.add(objectMap);
      }
      container.put(name, fraternity);

    } else {
      // we are truly unique.. (until now)
      container.put(name, objectMap);
    }
  }
  /**
   * Constructor for switch Block
   *
   * <p>
   *
   * @param applyElement Reference to <code>org.jdom.Element</code> containing "apply" element
   * @param m The parent <code>Model</code>
   */
  @SuppressWarnings("unchecked")
  public BlockMathSwitch(Element applyElement, Model m) {
    // Initialize superblock elements
    super("pending", "switch", m);

    // Parse parts of the Apply element
    Namespace mathml = Namespace.getNamespace("", "http://www.w3.org/1998/Math/MathML");
    Element piecewise = applyElement.getChild("piecewise", mathml);

    // second chance if not qualified
    if (piecewise == null) {
      piecewise = applyElement.getChild("piecewise");
    }

    // take appropriate action based on type
    if (piecewise == null) {
      List<Element> elist = applyElement.getChildren();
      Iterator<Element> elisti = elist.iterator();
      Element el = elisti.next();
      System.err.println(
          "Error - BlockMathSwitch constructor called with"
              + " wrong type element. Expected <piecewise>, found <"
              + el.getQualifiedName()
              + ">.");
    } else {
      // set name of ourself - will be "uniquified" later
      this.setName("switch" + "_" + m.getNumBlocks());

      // look for two children: <piece> and <otherwise>
      List<Element> kids = piecewise.getChildren();
      if (kids.size() < 2) {
        System.err.println(
            "Error - expected at least two child elements (one <piece> and one <otherwise> element); found only "
                + kids.size()
                + " elements total.");
      } else {
        // Get the children that describe switch
        List<Element> pieces = piecewise.getChildren("piece", mathml);
        Element otherwise = piecewise.getChild("otherwise", mathml);

        // check they are not null
        if (pieces.isEmpty()) {
          pieces = piecewise.getChildren("piece"); // 2nd chance
        }
        if (pieces.isEmpty()) {
          System.err.println("Error - <piecewise> element contained no <piece> elements");
          return;
        }
        if (otherwise == null) {
          otherwise = piecewise.getChild("otherwise"); // 2nd chance
        }
        if (otherwise == null) {
          System.err.println("Error - <piecewise> element contained no <otherwise> element");
          return;
        }

        // look at first piece
        Element piece = pieces.get(0);
        List<Element> pieceChildren = piece.getChildren();
        if (pieceChildren.size() != 2) {
          System.err.println(
              "Error - <piece> element can only have two children - found "
                  + pieces.size()
                  + " instead.");
          return;
        }
        List<Element> other = otherwise.getChildren();
        if (other.size() != 1) {
          System.err.println(
              "Error - <otherwise> element needs one child - found " + other.size() + " instead.");
          return;
        }
        // process like:                  this.genInputsFromApply(ikid);
        // piece has two children: output 1 and condition it is used, and
        // otherwise has default condition.
        // Input 1 is passed if condition is true
        this.genInputsFromApply(pieceChildren.iterator(), 1); // input 1 & condition (input 2)

        if (pieces.size() <= 1) {
          // if last piece, then input 3 is the <otherwise> child
          this.genInputsFromApply(other.iterator(), 3); // input 3 (otherwise)
        } else {
          // if not, then recurse after removing the first <piece> element
          boolean childRemoved = this.removeFirstPiece(piecewise);
          if (!childRemoved)
            throw new AssertionError(
                "Unable to remove first child from <piecewise> "
                    + "while trying to build an upstream switch for "
                    + this.getName());
          BlockMathSwitch bms = new BlockMathSwitch(applyElement, m);
          this.addInput(bms, 3);
        }
      }
    }

    // System.out.println("    BlockMathSwitch constructor: " + myName + " created.");
  }