Example usage for org.dom4j Node selectSingleNode

List of usage examples for org.dom4j Node selectSingleNode

Introduction

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

Prototype

Node selectSingleNode(String xpathExpression);

Source Link

Document

selectSingleNode evaluates an XPath expression and returns the result as a single Node instance.

Usage

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

private Map<String, String> getProperties(Node record, Map<String, String> propNames) {
    Map<String, String> props = new TreeMap<String, String>();
    String key = null;/* ww  w .  j  a  va  2 s.co m*/
    String solrName = null;
    String propValue = null;
    for (Iterator<String> it = propNames.keySet().iterator(); it.hasNext();) {
        propValue = null;
        key = it.next();
        solrName = propNames.get(key);
        Node tNode = record.selectSingleNode(key);
        if (tNode != null)
            propValue = tNode.getText().trim();

        props.put(solrName, propValue);
    }
    return props;
}

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

/**
 * Procedure to populate the RDF metadata and ingest the files
 *///from   www. j  a  va  2  s.  com
@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// ww  w . j  av a2s.  c om
 * @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:edu.ucsd.library.xdre.imports.RDFDAMS4ImportTsHandler.java

private Map<String, String> otherRightsProperties(Node record) {
    List<String> propNames = getOtherRightsPropNames();
    String propName = "dams:relationship//dams:name";
    if (record.selectSingleNode(propName + "//mads:authoritativeLabel") != null)
        propNames.add(propName + "//mads:authoritativeLabel");
    else/*  w  w  w  .  ja  v a2  s. c  o  m*/
        propNames.add(propName);
    return getProperties(record, propNames);
}

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

private Map<String, String> getProperties(Node record, List<String> propNames) {
    Map<String, String> props = new TreeMap<String, String>();
    String propName = null;/*w w  w  . ja  va 2  s.com*/
    String propValue = null;
    for (Iterator<String> it = propNames.iterator(); it.hasNext();) {
        propValue = null;
        propName = it.next();
        Node tNode = record.selectSingleNode(propName);
        if (tNode != null) {
            Node resNode = tNode.selectSingleNode("@rdf:resource");
            if (resNode != null)
                propValue = encodeIdentifier(resNode.getStringValue());
            else
                propValue = encodeLiteralValue(tNode);
        }

        props.put(propName, propValue);
    }
    return props;
}

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

private String encodeLiteralValue(Node node) {
    String value = null;/*from  www.j  ava  2  s. c o  m*/
    if (node != null) {
        value = "\"" + StringEscapeUtils.escapeJava(Normalizer.normalize(node.getText(), Normalizer.Form.NFC))
                .replace("'", "\\'").replace("\"", "\\\"") + "\"";
        Node langAttr = node.selectSingleNode("@xml:lang");
        if (langAttr != null)
            value += "@" + langAttr.getStringValue();
    }
    return value;
}

From source file:edu.ucsd.library.xdre.web.MarcModsImportController.java

public static Map<String, String> getCountryCodes(HttpServletRequest request) throws DocumentException {
    Map<String, String> countryCodes = new TreeMap<>();
    File dataFile = new File(
            request.getSession().getServletContext().getRealPath("files/country-code-iso-3166-all.xml"));
    SAXReader reader = new SAXReader();
    Document dataDoc = reader.read(dataFile);
    List<Node> nodes = dataDoc.selectNodes("//country");
    for (Node node : nodes) {
        String name = node.selectSingleNode("@name").getStringValue().trim();
        String alpha2 = node.selectSingleNode("@alpha-2").getStringValue().trim();
        countryCodes.put(name, alpha2);//from   w  w  w. j a  v a  2  s. c  o m
    }

    return countryCodes;
}

From source file:edu.umd.cs.findbugs.PluginLoader.java

License:Open Source License

private static String getChildText(Node node, String childName) throws PluginException {
    Node child = node.selectSingleNode(childName);
    if (child == null) {
        throw new PluginException("Could not find child \"" + childName + "\" for node");
    }/*from w w w  .  j  a v a 2  s .com*/
    return child.getText();
}

From source file:eleyzhu.facetid.common.PluginManager.java

License:Open Source License

/**
 * Loads public plugins.//from   w  w  w.  j a v  a 2  s  . co m
 *
 * @param pluginDir the directory of the expanded public plugin.
 * @return the new Plugin model for the Public Plugin.
 */
private Plugin loadPublicPlugin(File pluginDir) {

    File pluginFile = new File(pluginDir, "plugin.xml");
    SAXReader saxReader = new SAXReader();
    Document pluginXML = null;
    try {
        pluginXML = saxReader.read(pluginFile);
    } catch (DocumentException e) {
        Log.error(e);
    }

    Plugin pluginClass = null;

    List<? extends Node> plugins = pluginXML.selectNodes("/plugin");
    for (Node plugin1 : plugins) {
        PublicPlugin publicPlugin = new PublicPlugin();

        String clazz = null;
        String name;
        String minVersion;

        try {

            name = plugin1.selectSingleNode("name").getText();
            clazz = plugin1.selectSingleNode("class").getText();

            try {
                String lower = name.replaceAll("[^0-9a-zA-Z]", "").toLowerCase();
                // Dont load the plugin if its on the Blacklist
                if (_blacklistPlugins.contains(lower) || _blacklistPlugins.contains(clazz)
                        || SettingsManager.getLocalPreferences().getDeactivatedPlugins().contains(name)) {
                    return null;
                }
            } catch (Exception e) {
                // Whatever^^
                return null;
            }

            // Check for minimum Spark version
            try {
                minVersion = plugin1.selectSingleNode("minSparkVersion").getText();

                String buildNumber = JiveInfo.getVersion();
                boolean ok = buildNumber.compareTo(minVersion) >= 0;

                if (!ok) {
                    return null;
                }
            } catch (Exception e) {
                Log.error("Unable to load plugin " + name
                        + " due to missing <minSparkVersion>-Tag in plugin.xml.");
                return null;
            }

            // Check for minimum Java version
            try {
                String javaversion = plugin1.selectSingleNode("java").getText().replaceAll("[^0-9]", "");
                javaversion = javaversion == null ? "0" : javaversion;
                int jv = Integer.parseInt(attachMissingZero(javaversion));

                String myversion = System.getProperty("java.version").replaceAll("[^0-9]", "");
                int mv = Integer.parseInt(attachMissingZero(myversion));

                boolean ok = (mv >= jv);

                if (!ok) {
                    Log.error("Unable to load plugin " + name + " due to old JavaVersion.\nIt Requires "
                            + plugin1.selectSingleNode("java").getText() + " you have "
                            + System.getProperty("java.version"));
                    return null;
                }

            } catch (NullPointerException e) {
                Log.warning("Plugin " + name + " has no <java>-Tag, consider getting a newer Version");
            }

            // set dependencies 
            try {
                List<? extends Node> dependencies = plugin1.selectNodes("depends/plugin");
                for (Node depend1 : dependencies) {
                    Element depend = (Element) depend1;
                    PluginDependency dependency = new PluginDependency();
                    dependency.setVersion(depend.selectSingleNode("version").getText());
                    dependency.setName(depend.selectSingleNode("name").getText());
                    publicPlugin.addDependency(dependency);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

            // Do operating system check.
            boolean operatingSystemOK = isOperatingSystemOK(plugin1);
            if (!operatingSystemOK) {
                return null;
            }

            publicPlugin.setPluginClass(clazz);
            publicPlugin.setName(name);

            try {
                String version = plugin1.selectSingleNode("version").getText();
                publicPlugin.setVersion(version);

                String author = plugin1.selectSingleNode("author").getText();
                publicPlugin.setAuthor(author);

                String email = plugin1.selectSingleNode("email").getText();
                publicPlugin.setEmail(email);

                String description = plugin1.selectSingleNode("description").getText();
                publicPlugin.setDescription(description);

                String homePage = plugin1.selectSingleNode("homePage").getText();
                publicPlugin.setHomePage(homePage);
            } catch (Exception e) {
                Log.debug("We can ignore these.");
            }

            try {
                pluginClass = (Plugin) getParentClassLoader().loadClass(clazz).newInstance();
                Log.debug(name + " has been loaded.");
                publicPlugin.setPluginDir(pluginDir);
                publicPlugins.add(publicPlugin);

                registerPlugin(pluginClass);
            } catch (Throwable e) {
                Log.error("Unable to load plugin " + clazz + ".", e);
            }
        } catch (Exception ex) {
            Log.error("Unable to load plugin " + clazz + ".", ex);
        }

    }

    return pluginClass;
}

From source file:eleyzhu.facetid.common.PluginManager.java

License:Open Source License

/**
 * Checks the plugin for required operating system.
 *
 * @param plugin the Plugin element to check.
 * @return true if the operating system is ok for the plugin to run on.
 *//*from   www . jav  a 2  s.  c  o  m*/
private boolean isOperatingSystemOK(Node plugin) {
    // Check for operating systems
    try {

        final Element osElement = (Element) plugin.selectSingleNode("os");
        if (osElement != null) {
            String operatingSystem = osElement.getText();

            boolean ok = false;

            final String currentOS = JiveInfo.getOS().toLowerCase();

            // Iterate through comma delimited string
            StringTokenizer tkn = new StringTokenizer(operatingSystem, ",");
            while (tkn.hasMoreTokens()) {
                String os = tkn.nextToken().toLowerCase();
                if (currentOS.contains(os) || currentOS.equalsIgnoreCase(os)) {
                    ok = true;
                }
            }

            if (!ok) {
                Log.debug("Unable to load plugin " + plugin.selectSingleNode("name").getText()
                        + " due to invalid operating system. Required OS = " + operatingSystem);
                return false;
            }
        }
    } catch (Exception e) {
        Log.error(e);
    }

    return true;
}