Example usage for org.dom4j Node getPath

List of usage examples for org.dom4j Node getPath

Introduction

In this page you can find the example usage for org.dom4j Node getPath.

Prototype

String getPath();

Source Link

Document

Returns the XPath expression which will return a node set containing the given node such as /a/b/@c.

Usage

From source file:com.cladonia.xngreditor.actions.ToolsSortNodeAction.java

License:Open Source License

/**
 * The implementation of the validate action, called after a user action.
 * //  w w  w  . j a v a  2s.c  om
 * @param event
 *            the action event.
 */
public void actionPerformed(ActionEvent event) {

    if (dialog == null) {
        dialog = new ToolsSortNodeDialog(parent, props);
    }
    //called to make sure that the model is up to date to
    //prevent any problems found when undo-ing etc.
    parent.getView().updateModel();
    //get the document
    final ExchangerDocument document = parent.getDocument();
    if (document.isError()) {
        MessageHandler.showError(parent, "Please make sure the document is well-formed.", "Parser Error");
        return;
    }
    //create temporary document
    String currentXPath = null;
    Node node = (Node) document.getLastNode(parent.getView().getEditor().getCursorPosition(), true);

    if (props.isUniqueXPath()) {
        currentXPath = node.getUniquePath();
    } else {
        currentXPath = node.getPath();
    }
    dialog.show(currentXPath);
    if (!dialog.isCancelled()) {
        //get the new vector of namespaces
        //Vector newNamespaces = dialog.getNamespaces();
        parent.setWait(true);
        parent.setStatus("Sorting Nodes ...");
        // Run in Thread!!!
        Runnable runner = new Runnable() {

            public void run() {

                try {
                    dialog.mappingPanel.save();
                    ExchangerDocument tempDoc = new ExchangerDocument(document.getText());
                    String newDocument = sortByXPath(tempDoc, dialog.getXpathPredicate(),
                            dialog.getSortXpathPredicate(), dialog.ascendingRadio.isSelected());
                    if (newDocument != null) {
                        if (dialog.toNewDocumentRadio.isSelected()) {
                            //user has selected to create the result as a
                            // new document
                            parent.open(new ExchangerDocument(newDocument), null);
                        } else {
                            parent.getView().getEditor().setText(newDocument);
                            SwingUtilities.invokeLater(new Runnable() {

                                public void run() {

                                    parent.switchToEditor();
                                    parent.getView().updateModel();
                                }
                            });
                        }
                    }
                } catch (Exception e) {
                    // This should never happen, just report and continue
                    MessageHandler.showError(parent, "Cannot Sort Nodes", "Tools Sort Node Error");
                } finally {
                    parent.setStatus("Done");
                    parent.setWait(false);
                }
            }
        };
        // Create and start the thread ...
        Thread thread = new Thread(runner);
        thread.start();
        //          }
    }
}

From source file:com.cladonia.xngreditor.actions.ToolsStripTextAction.java

License:Open Source License

/**
 * The implementation of the validate action, called after a user action.
 * //ww w. j  a va 2  s.  co m
 * @param event
 *            the action event.
 */
public void actionPerformed(ActionEvent event) {

    if (dialog == null) {
        dialog = new ToolsStripTextDialog(parent, props);
    }
    //called to make sure that the model is up to date to
    //prevent any problems found when undo-ing etc.
    parent.getView().updateModel();
    //get the document
    final ExchangerDocument document = parent.getDocument();
    if (document.isError()) {
        MessageHandler.showError(parent, "Please make sure the document is well-formed.", "Parser Error");
        return;
    }
    //create temporary document
    String currentXPath = null;
    Node node = (Node) document.getLastNode(parent.getView().getEditor().getCursorPosition(), true);

    if (props.isUniqueXPath()) {
        currentXPath = node.getUniquePath();
    } else {
        currentXPath = node.getPath();
    }
    dialog.show(currentXPath);
    if (!dialog.isCancelled()) {
        parent.setWait(true);
        parent.setStatus("Stripping Document Text ...");
        // Run in Thread!!!
        Runnable runner = new Runnable() {

            public void run() {

                try {

                    if ((dialog.elementsCheckBox.isSelected()) || (dialog.attributesCheckBox.isSelected())) {

                        ExchangerDocument tempDoc = new ExchangerDocument(document.getText());
                        String newDocument = null;

                        if (dialog.xpathPanel.xpathBox.isSelected()) {
                            String xpathPredicate = dialog.xpathPanel.getXpathPredicate();
                            newDocument = treeWalk(tempDoc, xpathPredicate,
                                    dialog.elementsCheckBox.isSelected(),
                                    dialog.attributesCheckBox.isSelected(),
                                    dialog.mixedContentCheckBox.isSelected(), TRAVERSE_CHILDREN);
                        } else {

                            newDocument = treeWalk(tempDoc, dialog.elementsCheckBox.isSelected(),
                                    dialog.attributesCheckBox.isSelected(),
                                    dialog.mixedContentCheckBox.isSelected());
                        }
                        if (newDocument != null) {
                            if (dialog.toNewDocumentRadio.isSelected()) {
                                //user has selected to create the result as a
                                // new document
                                parent.open(new ExchangerDocument(newDocument), null);
                            } else {
                                parent.getView().getEditor().setText(newDocument);
                                SwingUtilities.invokeLater(new Runnable() {

                                    public void run() {

                                        parent.switchToEditor();
                                        parent.getView().updateModel();
                                    }
                                });
                            }
                        }
                    }
                } catch (Exception e) {
                    // This should never happen, just report and continue
                    MessageHandler.showError(parent, "Cannot Strip Document Text", "Tools Strip Text Error");
                }

                finally {
                    parent.setStatus("Done");
                    parent.setWait(false);
                }
            }
        };
        // Create and start the thread ...
        Thread thread = new Thread(runner);
        thread.start();
        //          }
    }
}

From source file:com.cladonia.xngreditor.actions.ToolsUppercaseAction.java

License:Open Source License

/**
 * The implementation of the validate action, called 
 * after a user action./*w w w. j  a va2  s .  c  o m*/
 *
 * @param event the action event.
 */
public void actionPerformed(ActionEvent event) {
    if (dialog == null) {
        dialog = new ToolsUppercaseDialog(parent, props);
    }

    //called to make sure that the model is up to date to 
    //prevent any problems found when undo-ing etc.
    parent.getView().updateModel();

    final ExchangerDocument document = parent.getDocument();

    if (document.isError()) {
        MessageHandler.showError(parent, "Please make sure the document is well-formed.", "Parser Error");
        return;
    }

    String currentXPath = null;
    Node node = (Node) document.getLastNode(parent.getView().getEditor().getCursorPosition(), true);

    if (props.isUniqueXPath()) {
        currentXPath = node.getUniquePath();
    } else {
        currentXPath = node.getPath();
    }

    dialog.show(currentXPath);

    if (!dialog.isCancelled()) {

        parent.setWait(true);
        parent.setStatus("Changing Case ...");

        // Run in Thread!!!
        Runnable runner = new Runnable() {
            public void run() {
                try {

                    //make sure one of the options was selected
                    if ((dialog.elementsRadio.isSelected()) || (dialog.attributeRadio.isSelected())
                            || (dialog.elementsAndAttributesRadio.isSelected())) {
                        ExchangerDocument tempDoc = new ExchangerDocument(document.getText());

                        String newDocument = null;
                        boolean TRAVERSE_CHILDREN = true;

                        if (dialog.xpathPanel.xpathBox.isSelected()) {
                            String xpathPredicate = dialog.xpathPanel.getXpathPredicate();
                            newDocument = uppercase(tempDoc, xpathPredicate, dialog.elementsRadio.isSelected(),
                                    dialog.attributeRadio.isSelected(),
                                    dialog.elementsAndAttributesRadio.isSelected(), TRAVERSE_CHILDREN);

                        } else {

                            //set the string to the new empty document
                            newDocument = uppercase(tempDoc, dialog.elementsRadio.isSelected(),
                                    dialog.attributeRadio.isSelected(),
                                    dialog.elementsAndAttributesRadio.isSelected());
                        }
                        if (newDocument != null) {
                            if (dialog.toNewDocumentRadio.isSelected()) {
                                //user has selected to create the result as a new document
                                parent.open(new ExchangerDocument(newDocument), null);
                            } else {
                                parent.getView().getEditor().setText(newDocument);
                                SwingUtilities.invokeLater(new Runnable() {
                                    public void run() {
                                        parent.switchToEditor();

                                        parent.getView().updateModel();
                                    }
                                });
                            }
                        } //end if
                    } //end if

                } catch (Exception e) {
                    // This should never happen, just report and continue
                    MessageHandler.showError(parent, "Cannot Convert To Uppercase", "Tools Uppercase Error");
                } finally {
                    parent.setStatus("Done");
                    parent.setWait(false);
                }
            }//end run  

        };//end runnable

        // Create and start the thread ...
        Thread thread = new Thread(runner);
        thread.start();
        //          }

    }
}

From source file:edu.scripps.fl.pubchem.PubChemXMLParserFactory.java

License:Apache License

protected PCAssay populateAssayFromXMLNode(Node topNode) throws Exception {
    //      String assayDescPath = "PC-AssaySubmit_assay/PC-AssaySubmit_assay_descr/PC-AssayDescription";
    Node assayDescNode = null;/*from w  w w . j av  a  2s.  com*/
    if (topNode.getName().equals("PC-AssayDescription"))
        assayDescNode = topNode;
    else {
        assayDescNode = topNode.selectSingleNode(".//PC-AssayDescription");
    }
    if (assayDescNode == null)
        throw new Exception(
                String.format("Cannot find PC-AssayDescription node in provided node %s", topNode.getPath()));

    Node node = assayDescNode.selectSingleNode("PC-AssayDescription_aid/PC-ID/PC-ID_id");
    Integer aid = new Integer(node.getText());

    try {
        PCAssay assay = new PCAssay();
        if (aid > 0)
            assay.setAID(aid);

        node = assayDescNode.selectSingleNode("PC-AssayDescription_aid/PC-ID/PC-ID_version");
        Integer version = new Integer(node.getText());
        assay.setVersion(version);

        node = assayDescNode.selectSingleNode("PC-AssayDescription_revision");
        Integer revision = new Integer(node.getText());
        assay.setRevision(revision);

        Node trackingNode = assayDescNode
                .selectSingleNode("PC-AssayDescription_aid-source/PC-Source/PC-Source_db/PC-DBTracking");

        node = trackingNode.selectSingleNode("PC-DBTracking_name");
        assay.setSourceName(node.getText());

        node = trackingNode.selectSingleNode("PC-DBTracking_source-id/Object-id/Object-id_str");
        assay.setExtRegId(node.getText());

        // hold until date
        node = trackingNode.selectSingleNode("PC-DBTracking_date");
        if (node != null) {
            String year = node.selectSingleNode("Date/Date_std/Date-std/Date-std_year").getText();
            String month = node.selectSingleNode("Date/Date_std/Date-std/Date-std_month").getText();
            String day = node.selectSingleNode("Date/Date_std/Date-std/Date-std_day").getText();
            if (DEBUGGING)
                log.info("year: " + year + " month: " + month + " day: " + day);
            Calendar calendar = Calendar.getInstance();
            calendar.set(Integer.parseInt(year), Integer.parseInt(month) - 1, Integer.parseInt(day));
            assay.setHoldUntilDate(calendar.getTime());
            if (DEBUGGING)
                log.info(calendar.getTime().toString());
        }

        node = assayDescNode.selectSingleNode("PC-AssayDescription_name");
        assay.setName(node.getText());

        List<Node> nodes = assayDescNode
                .selectNodes("PC-AssayDescription_description/PC-AssayDescription_description_E");
        assay.setDescription(join(nodes, separator));

        nodes = assayDescNode.selectNodes("PC-AssayDescription_protocol/PC-AssayDescription_protocol_E");
        assay.setProtocol(join(nodes, separator));

        nodes = assayDescNode.selectNodes("PC-AssayDescription_comment/PC-AssayDescription_comment_E");
        assay.setComment(join(nodes, separator));

        node = assayDescNode.selectSingleNode("PC-AssayDescription_activity-outcome-method");
        if (node != null)
            assay.setActivityOutcomeMethod(node.valueOf("@value"));

        node = assayDescNode
                .selectSingleNode("PC-AssayDescription_grant-number/PC-AssayDescription_grant-number_E");
        if (node != null)
            assay.setGrantNumber(node.getText());

        node = assayDescNode.selectSingleNode("PC-AssayDescription_project-category");
        if (node != null)
            assay.setProjectCategory(node.valueOf("@value"));

        assay.getAssayXRefs().removeAll(assay.getAssayXRefs());

        nodes = assayDescNode.selectNodes("PC-AssayDescription_xref/PC-AnnotatedXRef");
        handleXRefs(assay, null, nodes);

        nodes = assayDescNode.selectNodes("PC-AssayDescription_target/PC-AssayTargetInfo");
        handleTargetXRefs(assay, null, nodes);

        handlePanels(assay, assayDescNode);

        handleColumns(assay, assayDescNode);

        handleComments(assay, assayDescNode);

        return assay;
    } catch (Exception ex) {
        throw new RuntimeException("Problem with AID " + aid, ex);
    }
}

From source file:edu.ucsd.library.xdre.imports.RDFDAMS4ImportHandler.java

/**
 * Procedure to populate the RDF metadata and ingest the files
 *//*from   ww w. j  av a  2s.  c om*/
public boolean execute() throws Exception {
    if (filesPaths != null) {
        File file = null;
        // List the source files
        for (int i = 0; i < filesPaths.length; i++) {
            file = new File(filesPaths[i]);
            if (file.exists()) {
                listFile(filesMap, file);
            }
        }
    }

    String message = "";
    Document doc = null;
    DamsURI damsURI = null;

    String oid = null;
    int fLen = rdfFiles.length;
    String currFile = null;
    SAXReader saxReader = new SAXReader();
    for (int i = 0; i < fLen && !interrupted; i++) {
        currFile = rdfFiles[i].getName();
        setStatus(
                "Processing external import for file " + currFile + " (" + (i + 1) + " of " + fLen + ") ... ");
        try {
            doc = saxReader.read(rdfFiles[i]);
            List<Node> nodes = doc.selectNodes("//@rdf:about");
            for (int j = 0; j < nodes.size(); j++) {
                Node nUri = nodes.get(j);
                String iUri = nUri.getStringValue();
                Node parentNode = nUri.getParent();
                String nName = parentNode.getName();
                if (iUri.endsWith("/COL") || !(iUri.startsWith("http") && iUri.indexOf("/ark:/") > 0)) {
                    // Assign ARK
                    if (nName.endsWith("Object") || nName.endsWith("Component") || nName.endsWith("File")
                            || (((Element) parentNode).isRootElement()
                                    || (parentNode.getParent().isRootElement()
                                            && parentNode.getParent().getName().equals("RDF")))) {
                        String objId = iUri;

                        if (nName.endsWith("Component") || nName.endsWith("File")) {
                            damsURI = DamsURI.toParts(iUri, null);
                            objId = damsURI.getObject();
                        }
                        String srcObjKey = objId + "::" + rdfFiles[i].getAbsolutePath();
                        oid = idsMap.get(srcObjKey);

                        // Assign new ARK
                        if (oid == null) {
                            oid = getNewId();
                            idsMap.put(srcObjKey, oid);
                        }

                        if (nName.endsWith("Object")) {
                            objId = oid;
                            objRecords.put(objId, currFile);
                        } else if (nName.endsWith("Component") || nName.endsWith("File")) {
                            damsURI.setObject(oid);
                            // XXX
                            // Assign cid and fid for Component and FIle if required
                            objId = damsURI.toString();
                        } else
                            objId = oid;
                        nUri.setText(objId);
                        updateReference(doc, iUri, objId);
                    } else {
                        String field = null;
                        Node tNode = null;
                        String xPath = null;
                        Map<String, String> props = new TreeMap<String, String>();
                        String elemXPath = parentNode.getPath();
                        if (nName.endsWith("Collection") || nName.endsWith("CollectionPart")) {
                            // Retrieve the Collection record
                            field = "title_tesim";
                            xPath = "dams:title/mads:Title/mads:authoritativeLabel";
                            tNode = parentNode.selectSingleNode(xPath);
                            if (tNode == null) {
                                // Loop through to locate the rdfs:label if not selected by xPath.
                                Node n = parentNode.selectSingleNode("dams:title");
                                for (Iterator<Element> it = ((Element) n).elementIterator(); it.hasNext();) {
                                    Element elem = it.next();
                                    if (elem.getNamespacePrefix().equals("mads")
                                            && elem.getName().equals("Title"))
                                        tNode = elem.selectSingleNode("mads:authoritativeLabel");
                                }
                            }
                        } /* else if (nName.endsWith("Language") || nName.endsWith("Authority") || nName.endsWith("Subject") || nName.endsWith("Name") || nName.endsWith("Topic") || nName.endsWith("GenreForm") || nName.endsWith("Temporal") || nName.endsWith("Geographic")){
                            // Subject, Authority records use mads:authoritativeLabel
                            field = "name_tesim";
                            xPath = "mads:authoritativeLabel";
                            tNode = parentNode.selectSingleNode(xPath);
                          } */else if (nName.endsWith(COPYRIGHT)) {
                            // Copyright records use dams:copyrightStatus, plus other properties in the next step.
                            field = "status_tesim";
                            xPath = "dams:copyrightStatus";
                            tNode = parentNode.selectSingleNode(xPath);
                            props = copyrightProperties(parentNode);
                        } else if (nName.endsWith(LICENSE)) {
                            // License records use dams:LicenseNote, plus other properties in the next step.
                            field = "note_tesim";
                            xPath = "dams:licenseNote";
                            tNode = parentNode.selectSingleNode(xPath);
                            props = licenseProperties(parentNode);
                        } else if (nName.endsWith(OTHERRIGHTS)) {
                            // Copyright records use dams:copyrightStatus, plus other properties in the next step.
                            field = "otherRightsBasis_tesim";
                            xPath = "dams:otherRightsBasis";
                            tNode = parentNode.selectSingleNode(xPath);
                            props = licenseProperties(parentNode);
                        } else if (nName.endsWith(RELATEDRESOURCE)) {
                            // RelatedResource records use dams:description, plus other properties in the next step.
                            field = "description_tesim";
                            xPath = "dams:description";
                            tNode = parentNode.selectSingleNode(xPath);
                            props = relatedResourceProperties(parentNode);
                        } else if (nName.endsWith(SOURCECAPTURE)) {
                            // SourceCapture records use dams:sourceType, plus other properties in the next step.
                            field = "sourceType_tesim";
                            xPath = "dams:sourceType";
                            tNode = parentNode.selectSingleNode(xPath);
                            props = sourceCaptureProperties(parentNode);
                        } else if (elemXPath.indexOf("mads", elemXPath.lastIndexOf('/') + 1) >= 0) {
                            // MADSScheme and Language
                            if (nName.endsWith(MADSSCHEME) || nName.equals(LANGUAGE)) {
                                field = "code_tesim";
                                xPath = "mads:code";
                                tNode = parentNode.selectSingleNode(xPath);
                                if (tNode == null) {
                                    field = "name_tesim";
                                    xPath = "rdfs:label";
                                    tNode = parentNode.selectSingleNode(xPath);
                                    if (tNode == null) {
                                        // Loop through to locate the rdfs:label if not selected by xPath.
                                        for (Iterator<Element> it = ((Element) parentNode).elementIterator(); it
                                                .hasNext();) {
                                            Element elem = it.next();
                                            if (elem.getNamespacePrefix().equals("rdfs")
                                                    && elem.getName().equals("label"))
                                                tNode = elem;
                                        }
                                    }
                                }
                            } else {
                                // Subject, Authority records use mads:authoritativeLabel
                                field = "name_tesim";
                                xPath = "mads:authoritativeLabel";
                                tNode = parentNode.selectSingleNode(xPath);
                                if (tNode == null) {
                                    // Try to use the mads:code for mapping when mads:authoritativeLabel is not available
                                    field = "code_tesim";
                                    xPath = "mads:code";
                                    tNode = parentNode.selectSingleNode(xPath);
                                }
                                // Mapping for mads:isMemberOfMADSScheme
                                String madsScheme = null;
                                Node madsSchemeNode = parentNode.selectSingleNode("mads:isMemberOfMADSScheme");
                                if (madsSchemeNode != null) {
                                    Node msValueNode = madsSchemeNode.selectSingleNode("@rdf:resource");
                                    if (msValueNode != null) {
                                        madsScheme = madsSchemeNode.getStringValue();
                                        props.put("scheme_tesim", madsScheme);
                                    } else if ((madsSchemeNode = madsSchemeNode
                                            .selectSingleNode("mads:MADSScheme")) != null
                                            && madsSchemeNode.hasContent()) {
                                        if ((msValueNode = madsSchemeNode
                                                .selectSingleNode("mads:code")) != null) {
                                            madsScheme = msValueNode.getText();
                                            props.put("scheme_code_tesim", madsScheme);
                                        } else if ((msValueNode = madsSchemeNode
                                                .selectSingleNode("rdfs:label")) != null) {
                                            madsScheme = msValueNode.getText();
                                            props.put("scheme_name_tesim", madsScheme);
                                        }
                                    } else {
                                        props.put("scheme_tesim", "");
                                    }
                                } else {
                                    props.put("scheme_tesim", null);
                                }
                            }

                        } else {
                            // XXX Other Rights records like Statute, License, Other Rights etc. 
                            field = "value_tesim";
                            xPath = "rdf:value";
                            tNode = parentNode.selectSingleNode(xPath);
                            field = "code_tesim";
                            if (tNode == null) {
                                xPath = "dams:code";
                                tNode = parentNode.selectSingleNode(xPath);
                            }
                        }
                        if (tNode == null) {
                            throw new Exception("Element " + xPath + " is missing from the " + nName
                                    + " record " + iUri + " in file " + currFile + ".");
                        }
                        updateDocument(doc, parentNode, field, tNode.getText(), props);
                    }
                } else if (nName.endsWith("Object")) {
                    objRecords.put(iUri, currFile);
                }
            }

            String dams4Rdf = doc.asXML();
            logData("dams4_" + rdfFiles[i].getName(), dams4Rdf);

            // Ingest the records
            String subjectId = null;
            DamsURI objURI = null;
            List<DamsURI> objURIs = null;
            RDFStore graph = null;

            rdfStore = new RDFStore();
            Model rdf = rdfStore.loadRDFXML(dams4Rdf);
            initHandler();

            Model iRdf = null;
            int jLen = items.size();

            for (int j = 0; j < jLen && !interrupted; j++) {
                graph = new RDFStore();
                recordsCount++;
                // Add subject
                subjectId = items.get(j);
                try {
                    setStatus("Processing metadata for record " + subjectId + " (" + (j + 1) + " of " + jLen
                            + ") in file " + currFile + " ... ");
                    boolean succeeded = false;
                    objURIs = objects.get(subjectId);

                    for (int k = 0; k < objURIs.size(); k++) {
                        objURI = objURIs.get(k);
                        iRdf = rdfStore.querySubject(objURI.toString());
                        graph.merge(iRdf);
                    }

                    // Update object
                    //log.info(j + " ingesting record " + subjectId + ":\n" + graph.export(RDFStore.RDFXML_ABBREV_FORMAT) + "\n\n");

                    succeeded = damsClient.updateObject(subjectId, graph.export(RDFStore.RDFXML_ABBREV_FORMAT),
                            Constants.IMPORT_MODE_ADD);

                    if (!succeeded) {
                        if (metadataFailed.indexOf(currFile) < 0)
                            failedCount++;
                        metadataFailed.append(subjectId + " (" + currFile + "), \n");
                        message = "Metadata import for record " + subjectId + " failed (" + (j + 1) + " of "
                                + jLen + ") in file " + currFile + ".";
                        setStatus(message);
                        logError(message + "\n Error RDF: \n" + graph.export(RDFStore.RDFXML_ABBREV_FORMAT));
                    } else {
                        recordsIngested.add(subjectId);
                        message = "Metadata import for record " + subjectId + " succeeded (" + (j + 1) + " of "
                                + jLen + ") in file " + currFile + ". ";
                        setStatus(message);
                        logMessage(message);
                        log.info(message);

                        // Update SOLR fre records ingested.
                        updateSOLR(subjectId);
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                    if (metadataFailed.indexOf(currFile) < 0)
                        failedCount++;
                    metadataFailed.append(subjectId + " (" + currFile + "), \n");
                    message = "Metadata import failed: " + e.getMessage();
                    setStatus(message + " (" + (j + 1) + " of " + jLen + ") in file " + currFile + ".");
                    logError(message);
                }

                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    interrupted = true;
                    failedCount++;
                    metadataFailed.append(subjectId + " (" + currFile + ") \n");
                    message = "Metadata import interrupted for subject " + subjectId + ". \n Error: "
                            + e.getMessage() + "\n";
                    setStatus("Canceled");
                    clearSession();
                    logError(message);
                }
            }

            // Ingest the source file
            if (importOption.equalsIgnoreCase("metadataAndFiles")) {
                uploadFiles(rdf, currFile);
            }
        } catch (Exception e) {
            e.printStackTrace();
            failedCount++;
            message = "Import failed for " + currFile + ": " + e.getMessage();
            setStatus(message + " (" + (i + 1) + " of " + fLen + ").");
            logError(message);
        } finally {
            // Update SOLR for files uploaded
            int iLen = objWithFiles.size();
            for (int j = 0; j < iLen && !interrupted; j++) {
                updateSOLR(objWithFiles.get(j));
            }
        }

        setProgressPercentage(((i + 1) * 100) / fLen);

        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
            interrupted = true;
            failedCount++;
            message = "Import interrupted for oject in " + currFile + ". \n Error: " + e.getMessage() + "\n";
            setStatus("Canceled");
            clearSession();
            logError(message);
        }
    }
    return exeResult;
}

From source file:edu.ucsd.library.xdre.imports.RDFDAMS4ImportHandler.java

/**
 * Update the document for DAMS ARK ID//from ww w .j a  v a  2  s  .co  m
 * @param doc
 * @param record
 * @param title
 * @throws Exception
 */
private void updateDocument(Document doc, Node record, String field, String title, Map<String, String> props)
        throws Exception {
    // Skip if the record detached
    if (record.getDocument() == null)
        return;

    // Subject, Authority records use mads:authoritativeLabel
    Node aboutAttr = record.selectSingleNode("@rdf:about");
    String srcUri = aboutAttr.getStringValue();
    //String nName = record.getName();
    String xPath = record.getPath();
    String elemName = xPath.substring(xPath.lastIndexOf("/") + 1);

    // MADSScheme model: MadsScheme
    if (elemName.endsWith("MADSScheme"))
        elemName = elemName.replace("MADSScheme", "Scheme");
    String modelName = (elemName.substring(0, 1).toUpperCase() + elemName.substring(1)).replace(":", "");
    String nKey = INFO_MODEL_PREFIX + modelName + "::" + title;
    if (props != null) {
        for (Iterator<String> it = props.keySet().iterator(); it.hasNext();) {
            String iKey = it.next();
            nKey += "_" + iKey + "::" + props.get(iKey);
        }
    }
    String oid = idsMap.get(nKey);
    // Retrieve the record
    if (oid == null) {
        /*Map<String, String> props = null;
        if(nName.endsWith(COPYRIGHT)){
           props = copyrightProperties(record);
        }*/
        oid = lookupRecord(damsClient, field, title, modelName, props);

        if (oid == null) {
            // Create the record
            oid = getNewId();
            aboutAttr.setText(oid);
            idsMap.put(nKey, oid);
            log.info("Found new redord " + srcUri + " (" + oid + ": " + field + " -- " + title);

        } else {
            // Record found. Add linking, remove it.
            toResourceLinking(oid, record);
        }
    } else {
        // Record added. Add linking, remove it.
        toResourceLinking(oid, record);
    }
    updateReference(doc, srcUri, oid);
}

From source file:edu.ucsd.library.xdre.imports.RDFDAMS4ImportTsHandler.java

/**
 * Procedure to populate the RDF metadata and ingest the files
 *//*from  ww w  .  j  av a 2  s. c o m*/
@Override
public boolean execute() throws Exception {
    if (filesPaths != null) {
        File file = null;
        // List the source files
        for (int i = 0; i < filesPaths.length; i++) {
            file = new File(filesPaths[i]);
            if (file.exists()) {
                listFile(filesMap, file);
            }
        }
    }

    String message = "";
    Document doc = null;
    DamsURI damsURI = null;

    List<String> recordsToReplace = null;
    String oid = null;
    int fLen = rdfFiles.length;
    String currFile = null;
    SAXReader saxReader = new SAXReader();
    for (int i = 0; i < fLen && !interrupted; i++) {
        if (i == 0)
            logMessage("Object Import status:\n[Object title]   -   [URI]   -   [Status]   -   [Timestamp]");

        recordsToReplace = new ArrayList<>();
        currFile = rdfFiles[i].getName();

        preprocessedTimestamp = damsDateFormat.format(rdfFiles[i].lastModified());

        setStatus(
                "Processing external import for file " + currFile + " (" + (i + 1) + " of " + fLen + ") ... ");
        try {
            doc = saxReader.read(rdfFiles[i]);
            List<Node> nodes = doc.selectNodes("//@rdf:about");
            for (int j = 0; j < nodes.size(); j++) {
                Node nUri = nodes.get(j);
                String iUri = nUri.getStringValue();
                Node parentNode = nUri.getParent();
                String nName = parentNode.getName();
                if (iUri.endsWith("/COL") || !(iUri.startsWith("http") && iUri.indexOf("/ark:/") > 0)) {
                    // Assign ARK
                    if (nName.endsWith("Object") || nName.endsWith("Component") || nName.endsWith("File")
                            || (((Element) parentNode).isRootElement()
                                    || (parentNode.getParent().isRootElement()
                                            && parentNode.getParent().getName().equals("RDF")))) {
                        String objId = iUri;

                        if (nName.endsWith("Component") || nName.endsWith("File")) {
                            damsURI = DamsURI.toParts(iUri, null);
                            objId = damsURI.getObject();
                        }
                        String srcObjKey = objId + "::" + rdfFiles[i].getAbsolutePath();
                        oid = idsMap.get(srcObjKey);

                        // Assign new ARK
                        if (oid == null) {
                            oid = getNewId();
                            idsMap.put(srcObjKey, oid);
                        }

                        if (nName.endsWith("Object")) {
                            objId = oid;
                            objRecords.put(objId, currFile);
                        } else if (nName.endsWith("Component") || nName.endsWith("File")) {
                            damsURI.setObject(oid);
                            // XXX
                            // Assign cid and fid for Component and FIle if required
                            objId = damsURI.toString();
                        } else
                            objId = oid;
                        nUri.setText(objId);
                        updateReference(doc, iUri, objId);
                    } else {
                        String field = null;
                        Node tNode = null;
                        String xPath = null;
                        Map<String, String> props = new TreeMap<String, String>();
                        String elemXPath = parentNode.getPath();
                        if (nName.endsWith("Collection") || nName.endsWith("CollectionPart")) {
                            // Retrieve the Collection record
                            field = "dams:title/mads:authoritativeLabel";
                            xPath = "dams:title/mads:Title/mads:authoritativeLabel";
                            tNode = parentNode.selectSingleNode(xPath);
                            if (tNode == null) {
                                // Loop through to locate the rdfs:label if not selected by xPath.
                                Node n = parentNode.selectSingleNode("dams:title");
                                for (Iterator<Element> it = ((Element) n).elementIterator(); it.hasNext();) {
                                    Element elem = it.next();
                                    if (elem.getNamespacePrefix().equals("mads")
                                            && elem.getName().equals("Title"))
                                        tNode = elem.selectSingleNode("mads:authoritativeLabel");
                                }
                            }
                        } /* else if (nName.endsWith("Language") || nName.endsWith("Authority") || nName.endsWith("Subject") || nName.endsWith("Name") || nName.endsWith("Topic") || nName.endsWith("GenreForm") || nName.endsWith("Temporal") || nName.endsWith("Geographic")){
                            // Subject, Authority records use mads:authoritativeLabel
                            field = "name_tesim";
                            xPath = "mads:authoritativeLabel";
                            tNode = parentNode.selectSingleNode(xPath);
                          } */else if (nName.endsWith(COPYRIGHT)) {
                            // Copyright records use dams:copyrightStatus, plus other properties in the next step.
                            field = "dams:copyrightStatus";
                            xPath = "dams:copyrightStatus";
                            tNode = parentNode.selectSingleNode(xPath);
                            props = copyrightProperties(parentNode);
                        } else if (nName.endsWith(LICENSE)) {
                            // License records use dams:LicenseNote, plus other properties in the next step.
                            field = "dams:licenseNote";
                            xPath = "dams:licenseNote";
                            tNode = parentNode.selectSingleNode(xPath);
                            props = licenseProperties(parentNode);
                        } else if (nName.endsWith(OTHERRIGHTS)) {
                            // Copyright records use dams:copyrightStatus, plus other properties in the next step.
                            field = "dams:otherRightsBasis";
                            xPath = "dams:otherRightsBasis";
                            tNode = parentNode.selectSingleNode(xPath);
                            props = otherRightsProperties(parentNode);
                        } else if (nName.endsWith(RELATEDRESOURCE)) {
                            // RelatedResource records use dams:description, plus other properties in the next step.
                            field = "dams:description";
                            xPath = "dams:description";
                            tNode = parentNode.selectSingleNode(xPath);
                            props = relatedResourceProperties(parentNode);
                        } else if (nName.endsWith(SOURCECAPTURE)) {
                            // SourceCapture records use dams:sourceType, plus other properties in the next step.
                            field = "dams:sourceType";
                            xPath = "dams:sourceType";
                            tNode = parentNode.selectSingleNode(xPath);
                            props = sourceCaptureProperties(parentNode);
                        } else if (nName.endsWith(NOTE)) {
                            // Note records use rdf:value, dams:type, dams:displayLabel.
                            field = "rdf:value";
                            xPath = "rdf:value";
                            tNode = parentNode.selectSingleNode(xPath);
                            props = noteProperties(parentNode);
                        } else if (nName.endsWith(PERMISSION) || nName.equals(RESTRICTION)) {
                            field = "dams:type";
                            xPath = "dams:type";
                            tNode = parentNode.selectSingleNode(xPath);
                            props = dateProperties(parentNode);
                        } else if (elemXPath.indexOf("mads", elemXPath.lastIndexOf('/') + 1) >= 0) {
                            // MADSScheme and Language
                            if (nName.endsWith(MADSSCHEME)) {
                                field = "mads:code";
                                xPath = "mads:code";
                                tNode = parentNode.selectSingleNode(xPath);
                                if (tNode == null) {
                                    field = "rdfs:label";
                                    xPath = "rdfs:label";
                                    tNode = parentNode.selectSingleNode("*[name()='" + xPath + "']");
                                }
                            } else if (nName.endsWith(LANGUAGE)) {
                                field = "mads:code";
                                xPath = "mads:code";
                                tNode = parentNode.selectSingleNode(xPath);
                                if (tNode == null) {
                                    field = "mads:authoritativeLabel";
                                    xPath = "mads:authoritativeLabel";
                                    tNode = parentNode.selectSingleNode(xPath);
                                }
                            } else {
                                // Subject, Authority records use mads:authoritativeLabel
                                field = "mads:authoritativeLabel";
                                xPath = "mads:authoritativeLabel";
                                tNode = parentNode.selectSingleNode(xPath);
                                if (tNode == null) {
                                    // Try to use the mads:code for mapping when mads:authoritativeLabel is not available
                                    field = "mads:code";
                                    xPath = "mads:code";
                                    tNode = parentNode.selectSingleNode(xPath);
                                } else {
                                    Node diplayLabelNode = parentNode
                                            .selectSingleNode("*[name()='dams:displayLabel']");
                                    props.put("dams:displayLabel", encodeLiteralValue(diplayLabelNode));
                                }
                                // Mapping for mads:isMemberOfMADSScheme
                                String madsScheme = null;
                                Node madsSchemeNode = parentNode.selectSingleNode("mads:isMemberOfMADSScheme");
                                if (madsSchemeNode != null) {
                                    Node msValueNode = madsSchemeNode.selectSingleNode("@rdf:resource");
                                    if (msValueNode != null) {
                                        madsScheme = madsSchemeNode.getStringValue();
                                        props.put("mads:isMemberOfMADSScheme", "<" + madsScheme + ">");
                                    } else if ((madsSchemeNode = madsSchemeNode
                                            .selectSingleNode("mads:MADSScheme")) != null
                                            && madsSchemeNode.hasContent()) {
                                        if ((msValueNode = madsSchemeNode
                                                .selectSingleNode("mads:code")) != null) {
                                            madsScheme = encodeLiteralValue(msValueNode);
                                            props.put("mads:isMemberOfMADSScheme/mads:code", madsScheme);
                                        } else if ((msValueNode = madsSchemeNode
                                                .selectSingleNode("rdfs:label")) != null) {
                                            madsScheme = encodeLiteralValue(msValueNode);
                                            props.put("mads:isMemberOfMADSScheme/rdfs:label", madsScheme);
                                        }
                                    } else {
                                        props.put("mads:isMemberOfMADSScheme/rdfs:label", "\"\"");
                                    }
                                } else {
                                    props.put("mads:isMemberOfMADSScheme/rdfs:label", null);
                                }
                            }

                        } else {
                            // XXX Other Rights records like Statute, License, Other Rights etc. 
                            field = "rdf:value";
                            xPath = "rdf:value";
                            tNode = parentNode.selectSingleNode(xPath);
                            field = "dams:code";
                            if (tNode == null) {
                                xPath = "dams:code";
                                tNode = parentNode.selectSingleNode(xPath);
                            }
                        }
                        if (tNode == null && !field.equals("dams:licenseNote")) {
                            throw new Exception("Element " + xPath + " is missing from the " + nName
                                    + " record " + iUri + " in file " + currFile + ".");
                        }

                        updateDocument(doc, parentNode, field, encodeLiteralValue(tNode), props);
                    }
                } else {
                    if (nName.endsWith("Object"))
                        objRecords.put(iUri, currFile);
                    if (replace && !(nName.endsWith("Component") || nName.endsWith("File")))
                        recordsToReplace.add(iUri);
                }
            }

            String dams4Rdf = doc.asXML();
            logData("dams4_" + rdfFiles[i].getName(), dams4Rdf);

            // Ingest the records
            String subjectId = null;
            DamsURI objURI = null;
            List<DamsURI> objURIs = null;
            RDFStore graph = null;

            rdfStore = new RDFStore();
            rdfStore.loadRDFXML(dams4Rdf);
            initHandler();

            Model iRdf = null;

            items = sortRecords(items);
            int jLen = items.size();
            //System.out.println(currFile + " records found: " + jLen);
            for (int j = 0; j < jLen && !interrupted; j++) {

                processIndex = 0;
                status = new boolean[processNames.length];
                messages = new StringBuilder[processNames.length];
                for (int k = 0; k < messages.length; k++) {
                    messages[k] = new StringBuilder();
                }

                Model objModel = null;
                graph = new RDFStore();
                recordsCount++;
                // Add subject
                subjectId = items.get(j);
                try {
                    setStatus("Processing metadata for record " + subjectId + " (" + (j + 1) + " of " + jLen
                            + ") in file " + currFile + " ... ");
                    boolean succeeded = false;
                    objURIs = objects.get(subjectId);

                    for (int k = 0; k < objURIs.size(); k++) {
                        objURI = objURIs.get(k);
                        iRdf = rdfStore.querySubject(objURI.toString());
                        objModel = graph.merge(iRdf);
                    }

                    // Update object
                    //log.info(j + " ingesting record " + subjectId + ":\n" + graph.export(RDFStore.RDFXML_ABBREV_FORMAT) + "\n\n");
                    String importMode = Constants.IMPORT_MODE_ADD;
                    if (replace && recordsToReplace.indexOf(subjectId) >= 0)
                        importMode = Constants.IMPORT_MODE_ALL;
                    succeeded = damsClient.updateObject(subjectId, graph.export(RDFStore.RDFXML_ABBREV_FORMAT),
                            importMode);

                    // Logging for Object RDF/XML validation
                    status[processIndex] = succeeded;
                    messages[processIndex].append(damsDateFormat.format(new Date()));

                    if (!succeeded) {
                        if (metadataFailed.indexOf(currFile) < 0)
                            failedCount++;
                        metadataFailed.append(subjectId + " (" + currFile + "), \n");
                        message = "Metadata import for record " + subjectId + " failed (" + (j + 1) + " of "
                                + jLen + ") in file " + currFile + ".";
                        setStatus(message);
                        log.error(message + "\n Error RDF: \n" + graph.export(RDFStore.RDFXML_ABBREV_FORMAT));
                    } else {
                        recordsIngested.add(subjectId);
                        message = "Metadata import for record " + subjectId + " succeeded (" + (j + 1) + " of "
                                + jLen + ") in file " + currFile + ". ";
                        setStatus(message);
                        log.info(message);

                        processIndex++;
                        status[processIndex] = succeeded;
                        messages[processIndex].append(damsDateFormat.format(new Date()));
                        // Ingest the source file only if metadata ingested successfully
                        if (status[processIndex] && importOption.equalsIgnoreCase("metadataAndFiles")) {
                            uploadFiles(objModel, currFile, subjectId);
                        }
                    }

                } catch (Exception e) {
                    e.printStackTrace();

                    if (metadataFailed.indexOf(currFile) < 0)
                        failedCount++;
                    metadataFailed.append(subjectId + " (" + currFile + "), \n");
                    message = "Metadata import failed: " + e.getMessage();
                    setStatus(message + " (" + (j + 1) + " of " + jLen + ") in file " + currFile + ".");
                    log.error(message);

                    String error = e.getMessage();
                    if (error.indexOf("Invalid RDF input") >= 0) {
                        messages[processIndex].append(error);
                    } else {
                        status[processIndex] = true;
                        messages[processIndex].append(damsDateFormat.format(new Date()));
                        processIndex++;
                        messages[processIndex].append(error);
                    }
                } finally {
                    int solrRequestIndex = processNames.length - 1;
                    try {
                        // Update SOLR for the record.
                        status[solrRequestIndex] = updateSOLR(subjectId);
                        messages[solrRequestIndex].append(damsDateFormat.format(new Date()));
                        log.info("SOLR update requested for " + subjectId + ": " + damsClient.getRequestURL()
                                + " " + status[solrRequestIndex]);

                    } catch (Exception e) {
                        e.printStackTrace();
                        exeResult = false;
                        log.error("SOLR Index failed " + subjectId + ": " + e.getMessage());

                        messages[processNames.length - 1].append(e.getMessage());
                    }

                    if (exeResult)
                        exeResult = status[processIndex];

                    String resultMessage = "http://" + Constants.CLUSTER_HOST_NAME + ".ucsd.edu/dc/object/"
                            + subjectId.substring(subjectId.lastIndexOf("/") + 1) + " - "
                            + (status[processIndex] && status[solrRequestIndex] ? "successful" : "failed")
                            + " - " + damsDateFormat.format(new Date());
                    if (objRecords.containsKey(subjectId)) {
                        String title = getTitle(objModel, subjectId);
                        if (StringUtils.isBlank(title))
                            title = "[Unknown Title]";

                        logMessage("\n" + title + " - " + resultMessage);
                        if (!status[processIndex] || !status[solrRequestIndex]) {
                            // Logging for pre-procesing - succeeded. 
                            logMessage("* Pre-processing - successful - " + preprocessedTimestamp);
                            for (int k = 0; k <= processIndex; k++) {
                                if (status[k] || !status[k] && status[k - 1]) {
                                    logMessage("* " + processNames[k] + " - "
                                            + (status[k] ? "successful" : "failed") + " - "
                                            + messages[k].toString());
                                }
                            }

                            // SOLR index request logging
                            if (!status[solrRequestIndex])
                                logMessage("* " + processNames[solrRequestIndex] + " - "
                                        + (status[solrRequestIndex] ? "successful" : "failed") + " - "
                                        + messages[solrRequestIndex].toString());
                        }

                    } else {

                        ingestMessages.append("\n" + resultMessage);
                        if (!status[processIndex]) {
                            for (int k = 0; k + 1 < processIndex; k++) {
                                if (status[k] || !status[k] && status[k - 1]) {
                                    logMessage("* " + processNames[k] + " - "
                                            + (status[k] ? "successful" : "failed") + " - "
                                            + messages[k].toString());
                                }
                            }
                        }
                    }
                }

                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    interrupted = true;
                    exeResult = false;
                    failedCount++;
                    metadataFailed.append(subjectId + " (" + currFile + ") \n");
                    message = "Metadata import interrupted for subject " + subjectId + ". \n Error: "
                            + e.getMessage() + "\n";
                    setStatus("Canceled");
                    clearSession();
                    log.error(message);

                    logMessage("Client Cancled - " + damsDateFormat.format(new Date()));
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
            exeResult = false;
            failedCount++;
            message = "Import failed for " + currFile + ": " + e.getMessage();
            setStatus(message + " (" + (i + 1) + " of " + fLen + ").");
            log.error(message);
        }

        setProgressPercentage(((i + 1) * 100) / fLen);

        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
            exeResult = false;
            interrupted = true;
            failedCount++;
            message = "Import interrupted for oject in " + currFile + ". \n Error: " + e.getMessage() + "\n";
            setStatus("Canceled");
            clearSession();
            log.error(message);

            messages[processIndex].append("Client canceled - " + damsDateFormat.format(new Date()));
        }
    }
    return exeResult;
}

From source file:edu.ucsd.library.xdre.imports.RDFDAMS4ImportTsHandler.java

/**
 * Update the document for DAMS ARK ID/*from w ww  .ja v  a 2  s.  com*/
 * @param doc
 * @param record
 * @param title
 * @throws Exception
 */
private void updateDocument(Document doc, Node record, String field, String title, Map<String, String> props)
        throws Exception {
    // Skip if the record detached
    if (record.getDocument() == null)
        return;

    // Subject, Authority records use mads:authoritativeLabel
    Node aboutAttr = record.selectSingleNode("@rdf:about");
    String srcUri = aboutAttr.getStringValue();
    //String nName = record.getName();
    String xPath = record.getPath();
    String elemName = xPath.substring(xPath.lastIndexOf("/") + 1);

    String modelName = elemName;
    String nKey = INFO_MODEL_PREFIX + modelName + "::" + title;
    if (props != null) {
        for (Iterator<String> it = props.keySet().iterator(); it.hasNext();) {
            String iKey = it.next();
            nKey += "_" + iKey + "::" + props.get(iKey);
        }
    }
    String oid = idsMap.get(nKey);

    if (oid == null) {
        //Lookup records from the triplestore, matching the required properties that are null or empty.
        List<Map<String, String>> oids = lookupRecordsFromTs(field, title, "\"" + modelName + "\"", props);
        if (oids != null && oids.size() > 0) {

            String propName = null;
            String propValue = null;
            Document recDoc = null;
            Node cNode = null;
            if (props != null) {
                List<Map<String, String>> oidsCopy = new ArrayList<Map<String, String>>();
                oidsCopy.addAll(oids);
                for (int i = 0; i < oidsCopy.size(); i++) {

                    Collection<String> propValues = props.values();
                    Map<String, String> resolution = oidsCopy.get(i);
                    String rid = resolution.values().iterator().next();
                    if (rid.startsWith("http")) {
                        if (propValues.contains(null)) {

                            recDoc = damsClient.getRecord(rid);
                            for (Iterator<String> it = props.keySet().iterator(); it.hasNext();) {
                                propName = it.next();
                                propValue = props.get(propName);
                                // Test for the nodes for null properties and remove it from the result
                                if (propValue == null) {
                                    int idx = propName.indexOf("/", 1);
                                    if (idx > 0)
                                        cNode = recDoc.selectSingleNode("//" + modelName + "/" + propName);
                                    else
                                        cNode = recDoc.selectSingleNode("//" + modelName + "/" + propName);

                                    if (cNode != null) {
                                        oids.remove(resolution);
                                        break;
                                    }
                                }
                            }
                        }
                    } else // removed internal BlankNodes from the results
                        oids.remove(resolution);
                }
            }

            if (oids.size() > 0) {
                oid = oids.get(0).values().iterator().next();
                if (oids.size() > 1) {
                    String duids = "";
                    for (Iterator<Map<String, String>> it = oids.iterator(); it.hasNext();)
                        duids += (duids.length() > 0 ? ", " : "") + it.next().values().iterator().next();

                    log.warn("Duplicated records found for " + title + " (" + field + "): " + duids + ".");
                }
            }

        }

        if (oid == null) {
            // Create the record
            oid = getNewId();
            aboutAttr.setText(oid);
        } else {
            // Record found. Add to the map, link and remove it.
            toResourceLinking(oid, record);
        }
        idsMap.put(nKey, oid);
    } else {
        // Record added. Add linking, remove it.
        toResourceLinking(oid, record);
    }
    updateReference(doc, srcUri, oid);
}

From source file:org.pentaho.di.ui.trans.steps.getxmldata.GetXMLDataDialog.java

License:Open Source License

@SuppressWarnings("unchecked")
private void getLoopPathList() {
    try {/*  ww  w  .j a v  a  2 s  . c om*/
        GetXMLDataMeta meta = new GetXMLDataMeta();
        getInfo(meta);
        FileInputList fileinputList = meta.getFiles(transMeta);

        if (fileinputList.nrOfFiles() > 0) {
            // Check the first file

            if (fileinputList.getFile(0).exists()) {
                listpath.clear();
                // get encoding. By default UTF-8
                String encoding = "UTF-8";
                if (!Const.isEmpty(meta.getEncoding()))
                    encoding = meta.getEncoding();
                SAXReader reader = new SAXReader();
                Document document = reader.read(KettleVFS.getInputStream(fileinputList.getFile(0)), encoding);
                List<Node> nodes = document.selectNodes(document.getRootElement().getName());

                for (Node node : nodes) {
                    if (!listpath.contains(node.getPath())) {
                        listpath.add(node.getPath());
                        addLoopXPath(node);
                    }
                }
                String[] list_xpath = (String[]) listpath.toArray(new String[listpath.size()]);

                EnterSelectionDialog dialog = new EnterSelectionDialog(shell, list_xpath,
                        Messages.getString("GetXMLDataDialog.Dialog.SelectALoopPath.Title"),
                        Messages.getString("GetXMLDataDialog.Dialog.SelectALoopPath.Message"));
                String listxpaths = dialog.open();

                if (listxpaths != null)
                    wLoopXPath.setText(listxpaths);

            } else {
                // The file not exists !
                throw new KettleException(Messages.getString("GetXMLDataDialog.Exception.FileDoesNotExist",
                        KettleVFS.getFilename(fileinputList.getFile(0))));
            }
        }

        else {
            // No file specified
            MessageBox mb = new MessageBox(shell, SWT.OK | SWT.ICON_ERROR);
            mb.setMessage(Messages.getString("GetXMLDataDialog.FilesMissing.DialogMessage"));
            mb.setText(Messages.getString("System.Dialog.Error.Title"));
            mb.open();
        }
    } catch (Exception e) {
        new ErrorDialog(shell, Messages.getString("GetXMLDataDialog.UnableToGetListOfPaths.Title"),
                Messages.getString("GetXMLDataDialog.UnableToGetListOfPaths.Message"), e);
    }
}

From source file:org.pentaho.di.ui.trans.steps.getxmldata.GetXMLDataDialog.java

License:Open Source License

private void addLoopXPath(Node node) {
    Element ce = (Element) node;

    // List child 
    for (int j = 0; j < ce.nodeCount(); j++) {
        Node cnode = ce.node(j);

        if (!Const.isEmpty(cnode.getName())) {
            Element cce = (Element) cnode;
            if (!listpath.contains(cnode.getPath()))
                listpath.add(cnode.getPath());
            // let's get child nodes
            if (cce.nodeCount() > 1)
                addLoopXPath(cnode);//from w ww. ja  v  a  2  s  . co  m
        }
    }
}