dnet-core/dnet-data-services/src/main/java/eu/dnetlib/data/mdstore/modular/MDStoreUtils.java

82 lines
3.3 KiB
Java

package eu.dnetlib.data.mdstore.modular;
import com.google.common.collect.Lists;
import eu.dnetlib.data.mdstore.MDStoreServiceException;
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpDocumentNotFoundException;
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException;
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService;
import eu.dnetlib.enabling.locators.UniqueServiceLocator;
import org.springframework.beans.factory.annotation.Autowired;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;
import java.io.ByteArrayInputStream;
import java.util.List;
public class MDStoreUtils {
/**
* service locator.
*/
@Autowired
private UniqueServiceLocator serviceLocator;
public List<MDFormatDescription> getField(final String format, final String layout) throws MDStoreServiceException {
String xquery = "for $x in collection('/db/DRIVER/MDFormatDSResources/MDFormatDSResourceType')/RESOURCE_PROFILE/BODY[CONFIGURATION/NAME='" + format + "'] return $x/STATUS/LAYOUTS/LAYOUT[@name='" + layout
+ "']/FIELDS";
try {
String result = serviceLocator.getService(ISLookUpService.class).getResourceProfileByQuery(xquery);
final List<MDFormatDescription> mdformat = Lists.newArrayList();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder;
builder = factory.newDocumentBuilder();
Document doc = builder.parse(new ByteArrayInputStream(result.getBytes()));
XPathFactory xPathFactory = XPathFactory.newInstance();
XPath myXpath = xPathFactory.newXPath();
XPathExpression expression = myXpath.compile("//FIELD");
Object values = expression.evaluate(doc, XPathConstants.NODESET);
NodeList v = (NodeList) values;
for (int i = 0; i < v.getLength(); i++) {
Node currentItem = v.item(i);
NamedNodeMap attributes = currentItem.getAttributes();
String name = null;
String xpath = null;
if (attributes.getNamedItem("name") != null) {
name = attributes.getNamedItem("name").getNodeValue();
}
if (attributes.getNamedItem("xpath") != null) {
xpath = attributes.getNamedItem("xpath").getNodeValue();
}
if (attributes.getNamedItem("value") != null) {
xpath = attributes.getNamedItem("value").getNodeValue();
}
MDFormatDescription currentMdFormat = new MDFormatDescription();
currentMdFormat.setName(name);
currentMdFormat.setXpath(xpath);
mdformat.add(currentMdFormat);
}
return mdformat;
} catch (ISLookUpDocumentNotFoundException e1) {
return null;
} catch (ISLookUpException e1) {
return null;
} catch (Exception e) {
throw new MDStoreServiceException("Error on retrieving field from mdformat", e);
}
}
}