Java tutorial
/** * Copyright 2008 The University of North Carolina at Chapel Hill * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package edu.unc.lib.dl.util; import java.util.HashMap; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.JDOMException; import org.jdom2.xpath.XPath; import edu.unc.lib.dl.xml.JDOMNamespaceUtil; /** * A utility class that is configured to retrieve collection identifiers * * @author count0 * */ public class JDOMXPathUtil { private static final String __p = JDOMNamespaceUtil.PREMIS_V2_NS.getPrefix(); private static XPath _dcFieldsXpath; private static XPath _guidXpath; private static XPath _isMemberOfCollectionXpath; private static XPath _isPartOfIDTYPEXpath; private static XPath _isPartOfIDVALUEXpath; private static final String _isPartOfRelationshipXpath = "//" + __p + ":relationship" + "[" + __p + ":relationshipType = '" + JDOMNamespaceUtil.RELSEXT_NS.getURI() + "isPartOf']"; private static XPath _pathInCollectionXpath; private static XPath _repoPathXpath; private static final String dcFieldsXpath = "//" + JDOMNamespaceUtil.DC_NS.getPrefix() + ":*"; private static final String guidXpath = "//" + JDOMNamespaceUtil.CDR_NS.getPrefix() + ":uid"; private static final String isMemberOfCollectionXpath = "//" + JDOMNamespaceUtil.RELSEXT_NS.getPrefix() + ":isMemberOfCollection/@resource"; private static final String isPartOfIDTYPEXpath = _isPartOfRelationshipXpath + "/" + __p + ":relatedObjectIdentification/" + __p + ":relatedObjectIdentifierType"; private static final String isPartOfIDVALUEXpath = _isPartOfRelationshipXpath + "/" + __p + ":relatedObjectIdentification/" + __p + ":relatedObjectIdentifierValue"; private static final Log log = LogFactory.getLog(JDOMXPathUtil.class); private static final String pathInCollectionXpath = "//" + JDOMNamespaceUtil.CDR_NS.getPrefix() + ":pathInCollection"; private static final String repoPathXpath = "//" + JDOMNamespaceUtil.CDR_NS.getPrefix() + ":repositoryPath"; static { try { _isMemberOfCollectionXpath = XPath.newInstance(isMemberOfCollectionXpath); _isMemberOfCollectionXpath.addNamespace(JDOMNamespaceUtil.RELSEXT_NS); _isMemberOfCollectionXpath.addNamespace(JDOMNamespaceUtil.RDF_NS); _isPartOfIDTYPEXpath = XPath.newInstance(isPartOfIDTYPEXpath); _isPartOfIDTYPEXpath.addNamespace(JDOMNamespaceUtil.PREMIS_V2_NS); _isPartOfIDVALUEXpath = XPath.newInstance(isPartOfIDVALUEXpath); _isPartOfIDVALUEXpath.addNamespace(JDOMNamespaceUtil.PREMIS_V2_NS); _pathInCollectionXpath = XPath.newInstance(pathInCollectionXpath); _pathInCollectionXpath.addNamespace(JDOMNamespaceUtil.CDR_NS); _guidXpath = XPath.newInstance(guidXpath); _guidXpath.addNamespace(JDOMNamespaceUtil.CDR_NS); _repoPathXpath = XPath.newInstance(repoPathXpath); _repoPathXpath.addNamespace(JDOMNamespaceUtil.CDR_NS); _dcFieldsXpath = XPath.newInstance(dcFieldsXpath); _dcFieldsXpath.addNamespace(JDOMNamespaceUtil.DC_NS); _dcFieldsXpath.addNamespace(JDOMNamespaceUtil.CDR_NS); } catch (JDOMException e) { log.error("Bad Configuration for JDOMXPathUtil", e); throw new IllegalArgumentException("Bad Configuration for JDOMXPathUtil", e); } } public static Map<String, String> getDCFields(Document doc) { HashMap<String, String> result = new HashMap<String, String>(); try { for (Object con : _dcFieldsXpath.selectNodes(doc)) { if (con instanceof Element) { Element el = (Element) con; String value = el.getTextTrim(); String name = el.getName(); result.put(name, value); } } } catch (JDOMException e) { throw new Error("Programming error, XPath should be valid", e); } return result; } /** * Attempt to find the globally unique identifier in the FOXML Document. * * @param foxml * @return either an identifier or null */ public static String getGUID(Document foxml) { String guid = null; try { guid = _guidXpath.valueOf(foxml).trim(); if ("".equals(guid)) { guid = null; log.info("Object is missing it's GUID: " + _guidXpath.getXPath()); } } catch (JDOMException e) { log.info("Problem finding collection identifier XPaths", e); } return guid; } /** * Attempt to find a collection-based repository path in the FOXML Document. * * @param foxml * @return either an identifier or null */ /* * public static String getRepositoryPath(Document foxml) { String path = * null; try { path = _repoPathXpath.valueOf(foxml).trim(); if * ("".equals(path)) { path = null; log.info("Object is missing it's * repository path: " + _repoPathXpath.getXPath()); } } catch (JDOMException * e) { log.info("Problem finding repository path in FOXML via XPath.", e); } * return path; } */ public static String getIsMemberOfCollectionPID(Document foxml) { String result = null; try { result = _isMemberOfCollectionXpath.valueOf(foxml).trim(); } catch (JDOMException e) { log.warn("JDOMException trying to get collection from foxml", e); } if ("".equals(result)) { result = null; } return result; } /** * @param foxml * @return a two string array containing the identifier type and the * identifier value This functions returns an identifier type and * value for the isPartOf relationship defined in PREMIS. The PREMIS * supplied isPartOf information is used to link the top object in a * SIP to it's containing object in the repository. */ public static String[] getIsPartOfRelatedObject(Document foxml) { String[] result = new String[2]; String type = null; String value = null; try { type = _isPartOfIDTYPEXpath.valueOf(foxml).trim(); value = _isPartOfIDVALUEXpath.valueOf(foxml).trim(); result[0] = type; result[1] = value; } catch (JDOMException e) { log.warn("JDOMException trying to get collection from foxml", e); } if ("".equals(type) || "".equals(value)) { result = null; } return result; } public static String getPathInCollection(Document foxml) { String result = null; try { result = _pathInCollectionXpath.valueOf(foxml).trim(); } catch (JDOMException e) { log.warn("JDOMException trying to get path in collection from foxml", e); } if ("".equals(result)) { result = null; } return result; } }