AriadnePlus/dnet-ariadneplus/src/main/java/eu/dnetlib/ariadneplus/workflows/nodes/ClarinFileVisitor.java

264 lines
9.1 KiB
Java

package eu.dnetlib.ariadneplus.workflows.nodes;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import eu.dnetlib.clients.enabling.ISLookUpClient;
import eu.dnetlib.enabling.locators.UniqueServiceLocator;
import eu.dnetlib.miscutils.datetime.DateUtils;
import eu.dnetlib.rmi.datasource.DatasourceManagerService;
import eu.dnetlib.rmi.datasource.DatasourceManagerServiceException;
import eu.dnetlib.rmi.datasource.IfaceDesc;
import eu.dnetlib.rmi.enabling.ISLookUpException;
import eu.dnetlib.rmi.enabling.ISRegistryException;
import eu.dnetlib.rmi.enabling.ISRegistryService;
import org.antlr.stringtemplate.StringTemplate;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import static java.nio.file.FileVisitResult.CONTINUE;
/**
* Created by Alessia Bardi on 12/01/2018.
*
* @author Alessia Bardi
*/
public class ClarinFileVisitor extends SimpleFileVisitor<Path> {
private static final Log log = LogFactory.getLog(ClarinFileVisitor.class);
private static final String API_PREFIX = "api_________::";
private static final String TDS_TEMPLATE ="/eu/dnetlib/ariadneplus/workflows/nodes/clarin_tds.xml.st";
private List<String> interfaces = Lists.newArrayList();
private String clarinDatasourceProfileID;
private String clarinDatasourceOriginalId;
private DatasourceManagerService dsMan = null;
private String inputBaseUrlPrefix;
private String metadataIdentifierPath;
private ISLookUpClient lookupClient;
private ISRegistryService registryService;
private int countVisitedFiles = 0;
private int countCreatedTDS = 0;
private int countUpdatedTDS = 0;
private int countVisitedFolders = 0;
private int countCreatedInterfaces = 0;
@Override
public FileVisitResult preVisitDirectory(final Path dir, final BasicFileAttributes attrs) throws IOException {
log.info("Processing " + dir.toString());
countVisitedFolders++;
String dirName = dir.getFileName().toString();
if(dirName.equalsIgnoreCase("x3ml-mappings")) return CONTINUE;
String apiId = API_PREFIX + getClarinDatasourceOriginalId() + "::" + dirName;
if (!interfaces.contains(apiId)) {
//API TO BE CREATED
IfaceDesc iface = new IfaceDesc();
iface.setActive(false);
iface.setCompliance("metadata");
iface.setContentDescription("metadata");
iface.setId(apiId);
iface.setRemovable(true);
iface.setTypology("dnet:repository::clarin");
iface.setAccessProtocol("filesystem");
Map<String, String> accessParams = Maps.newHashMap();
accessParams.put("extensions", "xml");
iface.setAccessParams(accessParams);
iface.setBaseUrl(StringUtils.appendIfMissing(getInputBaseUrlPrefix(), "/") + dirName);
Map<String, String> extraFields = Maps.newHashMap();
extraFields.put("metadata_identifier_path", getMetadataIdentifierPath());
iface.setExtraFields(extraFields);
try {
dsMan.addInterface(getClarinDatasourceProfileID(), iface);
countCreatedInterfaces++;
log.info("CREATED NEW INTERFACE " + iface.getId() + " for " + getClarinDatasourceOriginalId() + "(" + getClarinDatasourceProfileID() + ")");
} catch (DatasourceManagerServiceException e) {
log.error("Can't add interface " + iface.getId() + " to " + getClarinDatasourceOriginalId() + "(" + getClarinDatasourceProfileID() + ")", e);
return CONTINUE;
}
} else {
if (log.isDebugEnabled()) {
log.debug("Interface " + apiId + " already exists");
}
}
return CONTINUE;
}
@Override
public FileVisitResult visitFile(final Path file, final BasicFileAttributes attrs) throws IOException {
String filename = file.getFileName().toString();
log.info("Processing " + file.toString());
countVisitedFiles++;
String tdsTitle = filename;
//call Files.lines which will use a stream to iterate over each line of the file.
//Next we will convert the stream to a string by calling Collectors.joining() which will join all the strings together.
String updatedCode = Files.lines(file).collect(Collectors.joining()).replace("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>", "");
try {
List<String> res = this.lookupClient.search("//RESOURCE_PROFILE[.//RESOURCE_TYPE/@value=\"TransformationRuleDSResourceType\" and .//CONFIGURATION/SCRIPT/TITLE/string()=\""+tdsTitle+"\"]/HEADER/RESOURCE_IDENTIFIER/@value/string()");
if(res == null || res.isEmpty()){
log.debug("Creating new TDS profile for "+filename);
final String template = IOUtils.toString(getClass().getResourceAsStream(TDS_TEMPLATE), Charset.forName("UTF-8"));
final StringTemplate st = new StringTemplate(template);
st.setAttribute("date", DateUtils.calculate_ISO8601(DateUtils.now()));
st.setAttribute("title", tdsTitle);
st.setAttribute("mapping", "<![CDATA["+updatedCode+"]]>");
String profId = this.registryService.registerProfile(st.toString());
countCreatedTDS++;
log.info("REGISTERED NEW TDS FOR "+filename+": "+profId);
}
else{
String tdsProfileId = res.get(0);
log.debug("Updating TDS profile "+tdsProfileId+"for "+filename);
boolean done = this.registryService.updateProfileNode(tdsProfileId, "//CONFIGURATION/SCRIPT/CODE", "<CODE><![CDATA["+updatedCode+"]]></CODE>");
if(done){
log.info("TDS PROFILE "+tdsProfileId+" UPDATED with contents from "+filename);
countUpdatedTDS++;
}
if(!done){
log.error("!!! TDS PROFILE "+tdsProfileId+" COULD NOT BE UPDATED with contents from "+filename);
}
}
} catch (ISLookUpException | ISRegistryException e) {
log.error("CANNOT UPDATE/CREATE TDS PROFILE FOR "+filename, e);
}
return CONTINUE;
}
protected ClarinFileVisitor() {
super();
}
public ClarinFileVisitor(final String clarinDatasourceProfileID, final String clarinDatasourceOriginalId,
final String inputBaseUrlPrefix, final String metadataIdentifierPath, final List<String> interfaces,
final UniqueServiceLocator locator, final ISLookUpClient lookupClient) {
super();
this.clarinDatasourceOriginalId = clarinDatasourceOriginalId;
this.clarinDatasourceProfileID = clarinDatasourceProfileID;
this.inputBaseUrlPrefix = inputBaseUrlPrefix;
this.metadataIdentifierPath = metadataIdentifierPath;
this.interfaces = interfaces;
this.dsMan = locator.getService(DatasourceManagerService.class);
this.registryService = locator.getService(ISRegistryService.class);
this.lookupClient = lookupClient;
}
public List<String> getInterfaces() {
return interfaces;
}
public void setInterfaces(final List<String> interfaces) {
this.interfaces = interfaces;
}
public String getClarinDatasourceOriginalId() {
return clarinDatasourceOriginalId;
}
public void setClarinDatasourceOriginalId(final String clarinDatasourceOriginalId) {
this.clarinDatasourceOriginalId = clarinDatasourceOriginalId;
}
public DatasourceManagerService getDsMan() {
return dsMan;
}
public void setDsMan(final DatasourceManagerService dsMan) {
this.dsMan = dsMan;
}
public String getInputBaseUrlPrefix() {
return inputBaseUrlPrefix;
}
public void setInputBaseUrlPrefix(final String inputBaseUrlPrefix) {
this.inputBaseUrlPrefix = inputBaseUrlPrefix;
}
public String getMetadataIdentifierPath() {
return metadataIdentifierPath;
}
public void setMetadataIdentifierPath(final String metadataIdentifierPath) {
this.metadataIdentifierPath = metadataIdentifierPath;
}
public String getClarinDatasourceProfileID() {
return clarinDatasourceProfileID;
}
public void setClarinDatasourceProfileID(final String clarinDatasourceProfileID) {
this.clarinDatasourceProfileID = clarinDatasourceProfileID;
}
public ISLookUpClient getLookupClient() {
return lookupClient;
}
public void setLookupClient(final ISLookUpClient lookupClient) {
this.lookupClient = lookupClient;
}
public ISRegistryService getRegistryService() {
return registryService;
}
public void setRegistryService(final ISRegistryService registryService) {
this.registryService = registryService;
}
public int getCountVisitedFiles() {
return countVisitedFiles;
}
public void setCountVisitedFiles(final int countVisitedFiles) {
this.countVisitedFiles = countVisitedFiles;
}
public int getCountCreatedTDS() {
return countCreatedTDS;
}
public void setCountCreatedTDS(final int countCreatedTDS) {
this.countCreatedTDS = countCreatedTDS;
}
public int getCountUpdatedTDS() {
return countUpdatedTDS;
}
public void setCountUpdatedTDS(final int countUpdatedTDS) {
this.countUpdatedTDS = countUpdatedTDS;
}
public int getCountVisitedFolders() {
return countVisitedFolders;
}
public void setCountVisitedFolders(final int countVisitedFolders) {
this.countVisitedFolders = countVisitedFolders;
}
public int getCountCreatedInterfaces() {
return countCreatedInterfaces;
}
public void setCountCreatedInterfaces(final int countCreatedInterfaces) {
this.countCreatedInterfaces = countCreatedInterfaces;
}
}