dnet-core/dnet-core-components/src/main/java/eu/dnetlib/enabling/tools/DOMOpaqueResource.java

265 lines
6.6 KiB
Java

package eu.dnetlib.enabling.tools;
import java.io.StringWriter;
import java.util.Date;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import eu.dnetlib.miscutils.datetime.DateUtils;
/**
* OpaqueResource holding a plain old DOM document.
*
* @author marko
*
*/
public class DOMOpaqueResource implements OpaqueResource {
/**
* xpath expression error message.
*/
private static final String XPATH_ERROR = "cannot compile xpath expression";
/**
* value attribute.
*/
private static final String VALUE_ATTR = "value";
/**
* logger.
*/
private static final Log log = LogFactory.getLog(DOMOpaqueResource.class); // NOPMD by marko on 11/24/08 5:02 PM
/**
* resource identifier.
*/
private String resourceId;
/**
* resource type.
*/
private String resourceType;
/**
* resource kind.
*/
private String resourceKind;
/**
* resource uri.
*/
private String resourceUri;
/**
* modification time stamp.
*/
private Date modificationDate;
/**
* original document DOM.
*/
private Document dom;
/**
* xslt transformer instance.
*/
private Transformer transformer;
/**
* construct a DOMOpaqueInstance from a W3C DOM document.
*
* @param dom
* DOM document
* @throws XPathExpressionException
* happens
*/
public DOMOpaqueResource(final Document dom) throws XPathExpressionException {
this.dom = dom;
try {
transformer = TransformerFactory.newInstance().newTransformer();
} catch (TransformerConfigurationException e) {
throw new IllegalStateException("transformer configuration", e);
} catch (TransformerFactoryConfigurationError e) {
throw new IllegalStateException("transformer configuration", e);
}
final XPath xpath = XPathFactory.newInstance().newXPath();
this.resourceId = xpath.evaluate("/RESOURCE_PROFILE/HEADER/RESOURCE_IDENTIFIER/@value", dom);
this.resourceType = xpath.evaluate("/RESOURCE_PROFILE/HEADER/RESOURCE_TYPE/@value", dom);
this.resourceKind = xpath.evaluate("/RESOURCE_PROFILE/HEADER/RESOURCE_KIND/@value", dom);
this.resourceUri = xpath.evaluate("/RESOURCE_PROFILE/HEADER/RESOURCE_URI/@value", dom);
String modificationDateSource = xpath.evaluate("/RESOURCE_PROFILE/HEADER/DATE_OF_CREATION/@value", dom);
try {
this.modificationDate = new DateUtils().parse(modificationDateSource);
} catch (IllegalStateException e) {
log.debug("invalid date '" + modificationDateSource + "'", e);
}
}
/**
* {@inheritDoc}
*
* @see eu.dnetlib.enabling.tools.OpaqueResource#asDom()
*/
@Override
public Document asDom() {
return getDom();
}
/**
* {@inheritDoc}
*
* @see eu.dnetlib.enabling.tools.OpaqueResource#asString()
*/
@Override
public String asString() {
final StringWriter writer = new StringWriter();
try {
transformer.transform(new DOMSource(getDom()), new StreamResult(writer));
} catch (TransformerException e) {
log.fatal("cannot serialize document", e);
return null;
}
return writer.toString();
}
public Document getDom() {
return dom;
}
public void setDom(final Document dom) {
this.dom = dom;
}
@Override
public String getResourceId() {
return resourceId;
}
@Override
public String getResourceType() {
return resourceType;
}
public void setResourceType(final String resourceType) {
this.resourceType = resourceType;
}
@Override
public String getResourceKind() {
return resourceKind;
}
/**
* {@inheritDoc}
*
* @see eu.dnetlib.enabling.tools.OpaqueResource#setResourceKind(java.lang.String)
*/
@Override
public void setResourceKind(final String resourceKind) {
try {
final XPath xpath = XPathFactory.newInstance().newXPath();
final Element kindEl = (Element) xpath.evaluate("/RESOURCE_PROFILE/HEADER/RESOURCE_KIND", asDom(), XPathConstants.NODE);
kindEl.setAttribute(VALUE_ATTR, resourceKind);
this.resourceKind = resourceKind;
} catch (XPathExpressionException e) {
throw new IllegalStateException(XPATH_ERROR, e);
}
}
/**
* {@inheritDoc}
*
* @see eu.dnetlib.enabling.tools.OpaqueResource#setResourceId(java.lang.String)
*/
@Override
public void setResourceId(final String identifier) {
try {
final XPath xpath = XPathFactory.newInstance().newXPath();
final Element idEl = (Element) xpath.evaluate("/RESOURCE_PROFILE/HEADER/RESOURCE_IDENTIFIER", asDom(), XPathConstants.NODE);
idEl.setAttribute(VALUE_ATTR, identifier);
resourceId = identifier;
} catch (XPathExpressionException e) {
throw new IllegalStateException(XPATH_ERROR, e);
}
}
@Override
public Date getModificationDate() {
return modificationDate;
}
/**
* {@inheritDoc}
*
* @see eu.dnetlib.enabling.tools.OpaqueResource#setModificationDate(java.util.Date)
*/
@Override
public void setModificationDate(final Date modificationDate) {
try {
final XPath xpath = XPathFactory.newInstance().newXPath();
final Element idEl = (Element) xpath.evaluate("/RESOURCE_PROFILE/HEADER/DATE_OF_CREATION", asDom(), XPathConstants.NODE);
if (idEl == null) {
log.warn("resource with type " + getResourceType() + " has no date of creation element");
return;
}
idEl.setAttribute(VALUE_ATTR, new DateUtils(modificationDate).getDateAsISO8601String());
this.modificationDate = modificationDate;
} catch (XPathExpressionException e) {
throw new IllegalStateException(XPATH_ERROR, e);
}
}
@Override
public String getResourceUri() {
return resourceUri;
}
/**
* {@inheritDoc}
*
* @see eu.dnetlib.enabling.tools.OpaqueResource#setResourceUri(java.lang.String)
*/
@Override
public void setResourceUri(final String resourceUri) {
try {
final XPath xpath = XPathFactory.newInstance().newXPath();
final Element uriEl = (Element) xpath.evaluate("/RESOURCE_PROFILE/HEADER/RESOURCE_URI", asDom(), XPathConstants.NODE);
uriEl.setAttribute(VALUE_ATTR, resourceUri);
this.resourceUri = resourceUri;
} catch (XPathExpressionException e) {
throw new IllegalStateException(XPATH_ERROR, e);
}
}
public Transformer getTransformer() {
return transformer;
}
public void setTransformer(final Transformer transformer) {
this.transformer = transformer;
}
}