git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/data-publishing/gCat-Feeder-Suite@178631 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
parent
d0c06a0fec
commit
9be8b0dbb2
|
@ -1,12 +1,15 @@
|
||||||
package org.gcube.data.publishing.gCatFeeder.catalogues;
|
package org.gcube.data.publishing.gCatFeeder.catalogues;
|
||||||
|
|
||||||
import org.gcube.data.publishing.gCatFeeder.catalogues.model.PublishReport;
|
import org.gcube.data.publishing.gCatFeeder.catalogues.model.PublishReport;
|
||||||
|
import org.gcube.data.publishing.gCatFeeder.catalogues.model.faults.CatalogueInteractionException;
|
||||||
|
import org.gcube.data.publishing.gCatFeeder.catalogues.model.faults.PublicationException;
|
||||||
import org.gcube.data.publishing.gCatFeeder.catalogues.model.faults.WrongObjectFormatException;
|
import org.gcube.data.publishing.gCatFeeder.catalogues.model.faults.WrongObjectFormatException;
|
||||||
import org.gcube.data.publishing.gCatFeeder.model.CatalogueFormatData;
|
import org.gcube.data.publishing.gCatFeeder.model.CatalogueFormatData;
|
||||||
|
import org.gcube.data.publishing.gCatFeeder.model.ControllerConfiguration;
|
||||||
|
|
||||||
public interface CatalogueController {
|
public interface CatalogueController {
|
||||||
|
|
||||||
public PublishReport publishItem(CatalogueFormatData toPublish) throws WrongObjectFormatException;
|
public PublishReport publishItem(CatalogueFormatData toPublish) throws WrongObjectFormatException,CatalogueInteractionException,PublicationException;
|
||||||
|
|
||||||
|
|
||||||
|
public void configure (ControllerConfiguration config);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
package org.gcube.data.publishing.gCatFeeder.catalogues.model.faults;
|
||||||
|
|
||||||
|
public class CatalogueInteractionException extends PublicationException {
|
||||||
|
|
||||||
|
public CatalogueInteractionException() {
|
||||||
|
// TODO Auto-generated constructor stub
|
||||||
|
}
|
||||||
|
|
||||||
|
public CatalogueInteractionException(String message, Throwable cause, boolean enableSuppression,
|
||||||
|
boolean writableStackTrace) {
|
||||||
|
super(message, cause, enableSuppression, writableStackTrace);
|
||||||
|
// TODO Auto-generated constructor stub
|
||||||
|
}
|
||||||
|
|
||||||
|
public CatalogueInteractionException(String message, Throwable cause) {
|
||||||
|
super(message, cause);
|
||||||
|
// TODO Auto-generated constructor stub
|
||||||
|
}
|
||||||
|
|
||||||
|
public CatalogueInteractionException(String message) {
|
||||||
|
super(message);
|
||||||
|
// TODO Auto-generated constructor stub
|
||||||
|
}
|
||||||
|
|
||||||
|
public CatalogueInteractionException(Throwable cause) {
|
||||||
|
super(cause);
|
||||||
|
// TODO Auto-generated constructor stub
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -18,11 +18,7 @@
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.gcube.data-publishing</groupId>
|
|
||||||
<artifactId>gcat-client</artifactId>
|
|
||||||
<version>[1.0.0-SNAPSHOT,2.0.0-SNAPSHOT]</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
Manifest-Version: 1.0
|
||||||
|
Built-By: fabio
|
||||||
|
Build-Jdk: 1.8.0_201
|
||||||
|
Created-By: Maven Integration for Eclipse
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
#Generated by Maven Integration for Eclipse
|
||||||
|
#Tue Mar 19 16:04:16 CET 2019
|
||||||
|
version=1.0.0-SNAPSHOT
|
||||||
|
groupId=org.gcube.data-publishing.gCat-Feeder
|
||||||
|
m2e.projectName=ckan-controller-plugin
|
||||||
|
m2e.projectLocation=/home/fabio/workspaces/DEV/gCat-Feeder-Suite/ckan-controller-plugin
|
||||||
|
artifactId=ckan-controller-plugin
|
|
@ -0,0 +1,26 @@
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>org.gcube.data-publishing.gCat-Feeder</groupId>
|
||||||
|
<artifactId>gCat-Feeder-Suite</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
<artifactId>ckan-controller-plugin</artifactId>
|
||||||
|
<name>ckan-controller-plugin</name>
|
||||||
|
<description>controller plugin for gCat-Feeder aimed to publish metadata to CKAN catalogue</description>
|
||||||
|
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.gcube.data-publishing.gCat-Feeder</groupId>
|
||||||
|
<artifactId>catalogue-plugin-framework</artifactId>
|
||||||
|
<version>[1.0.0-SNAPSHOT,2.0.0-SNAPSHOT)</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
|
||||||
|
</project>
|
Binary file not shown.
Binary file not shown.
|
@ -3,6 +3,7 @@ package org.gcube.data.publishing.gCatfeeder.collectors;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.gcube.data.publishing.gCatFeeder.model.CatalogueFormatData;
|
import org.gcube.data.publishing.gCatFeeder.model.CatalogueFormatData;
|
||||||
|
import org.gcube.data.publishing.gCatFeeder.model.ControllerConfiguration;
|
||||||
import org.gcube.data.publishing.gCatfeeder.collectors.model.CustomData;
|
import org.gcube.data.publishing.gCatfeeder.collectors.model.CustomData;
|
||||||
import org.gcube.data.publishing.gCatfeeder.collectors.model.PluginDescriptor;
|
import org.gcube.data.publishing.gCatfeeder.collectors.model.PluginDescriptor;
|
||||||
import org.gcube.data.publishing.gCatfeeder.collectors.model.faults.CatalogueNotSupportedException;
|
import org.gcube.data.publishing.gCatfeeder.collectors.model.faults.CatalogueNotSupportedException;
|
||||||
|
@ -18,4 +19,6 @@ public interface CollectorPlugin<E extends CustomData>{
|
||||||
public DataTransformer<? extends CatalogueFormatData,E> getTransformerByCatalogueType(String catalogueType)throws CatalogueNotSupportedException;
|
public DataTransformer<? extends CatalogueFormatData,E> getTransformerByCatalogueType(String catalogueType)throws CatalogueNotSupportedException;
|
||||||
|
|
||||||
public DataCollector<E> getCollector();
|
public DataCollector<E> getCollector();
|
||||||
|
|
||||||
|
public ControllerConfiguration getPublisherControllerConfiguration(String catalogueType)throws CatalogueNotSupportedException;;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
package org.gcube.data.publishing.gCatFeeder.model;
|
||||||
|
|
||||||
|
|
||||||
|
public class ControllerConfiguration {
|
||||||
|
|
||||||
|
public static enum PublishingPolicy{
|
||||||
|
FAIL,UPDATE,SKIP
|
||||||
|
}
|
||||||
|
|
||||||
|
private PublishingPolicy onClash=PublishingPolicy.UPDATE;
|
||||||
|
|
||||||
|
public PublishingPolicy getOnClash() {
|
||||||
|
return onClash;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -23,6 +23,14 @@
|
||||||
<artifactId>gcat-client</artifactId>
|
<artifactId>gcat-client</artifactId>
|
||||||
<version>[1.0.0-SNAPSHOT,2.0.0-SNAPSHOT]</version>
|
<version>[1.0.0-SNAPSHOT,2.0.0-SNAPSHOT]</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.gcube.data-publishing.gCat-Feeder</groupId>
|
||||||
|
<artifactId>test-commons</artifactId>
|
||||||
|
<version>[1.0.0-SNAPSHOT,2.0.0-SNAPSHOT]</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
|
|
@ -1,52 +0,0 @@
|
||||||
package org.gcube.data.pu;
|
|
||||||
|
|
||||||
import org.gcube.data.publishing.gCatFeeder.catalogues.CatalogueController;
|
|
||||||
import org.gcube.data.publishing.gCatFeeder.catalogues.model.PublishReport;
|
|
||||||
import org.gcube.data.publishing.gCatFeeder.catalogues.model.faults.WrongObjectFormatException;
|
|
||||||
import org.gcube.data.publishing.gCatFeeder.model.CatalogueFormatData;
|
|
||||||
import org.gcube.data.publishing.gCatFeeder.model.CatalogueInstanceDescriptor;
|
|
||||||
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
|
|
||||||
@Slf4j
|
|
||||||
public class GCatController implements CatalogueController{
|
|
||||||
|
|
||||||
|
|
||||||
private static ObjectMapper mapper=new ObjectMapper();
|
|
||||||
|
|
||||||
|
|
||||||
private CatalogueInstanceDescriptor desc;
|
|
||||||
|
|
||||||
public GCatController(CatalogueInstanceDescriptor instance) {
|
|
||||||
this.desc=instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Expected structure
|
|
||||||
*
|
|
||||||
* {
|
|
||||||
* "profile" : "<serialized_profile>",
|
|
||||||
* "item" : "<serialized_item>",
|
|
||||||
* "resources" : [
|
|
||||||
* "<serialized_resource>",
|
|
||||||
* "<serialized_resource>",
|
|
||||||
* ....]
|
|
||||||
* }
|
|
||||||
*
|
|
||||||
* NB serialized resources are updated with "package_id" set as the published item id
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public PublishReport publishItem(CatalogueFormatData arg0) throws WrongObjectFormatException {
|
|
||||||
log.debug("Publishing {} ",arg0);
|
|
||||||
String serialized=arg0.toCatalogueFormat();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -0,0 +1,371 @@
|
||||||
|
package org.gcube.data.publishing.gCataFeeder.catalogues.gCat;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import javax.ws.rs.WebApplicationException;
|
||||||
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
|
import javax.xml.xpath.XPath;
|
||||||
|
import javax.xml.xpath.XPathConstants;
|
||||||
|
import javax.xml.xpath.XPathExpression;
|
||||||
|
import javax.xml.xpath.XPathExpressionException;
|
||||||
|
import javax.xml.xpath.XPathFactory;
|
||||||
|
|
||||||
|
import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
|
||||||
|
import org.gcube.data.publishing.gCatFeeder.catalogues.CatalogueController;
|
||||||
|
import org.gcube.data.publishing.gCatFeeder.catalogues.model.PublishReport;
|
||||||
|
import org.gcube.data.publishing.gCatFeeder.catalogues.model.faults.CatalogueInteractionException;
|
||||||
|
import org.gcube.data.publishing.gCatFeeder.catalogues.model.faults.ControllerInstantiationFault;
|
||||||
|
import org.gcube.data.publishing.gCatFeeder.catalogues.model.faults.PublicationException;
|
||||||
|
import org.gcube.data.publishing.gCatFeeder.catalogues.model.faults.WrongObjectFormatException;
|
||||||
|
import org.gcube.data.publishing.gCatFeeder.model.CatalogueFormatData;
|
||||||
|
import org.gcube.data.publishing.gCatFeeder.model.CatalogueInstanceDescriptor;
|
||||||
|
import org.gcube.data.publishing.gCatFeeder.model.ControllerConfiguration;
|
||||||
|
import org.gcube.data.publishing.gCatFeeder.model.ControllerConfiguration.PublishingPolicy;
|
||||||
|
import org.gcube.gcat.client.Item;
|
||||||
|
import org.gcube.gcat.client.Profile;
|
||||||
|
import org.gcube.gcat.client.Resource;
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.JsonNode;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
public class GCatController implements CatalogueController{
|
||||||
|
|
||||||
|
|
||||||
|
private static ObjectMapper mapper;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private static DocumentBuilderFactory factory;
|
||||||
|
private static DocumentBuilder builder;
|
||||||
|
private static XPathFactory xPathfactory;
|
||||||
|
private static XPath xpath;
|
||||||
|
private static XPathExpression expr;
|
||||||
|
|
||||||
|
static {
|
||||||
|
mapper=new ObjectMapper();
|
||||||
|
factory= DocumentBuilderFactory.newInstance();
|
||||||
|
xPathfactory = XPathFactory.newInstance();
|
||||||
|
xpath = xPathfactory.newXPath();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
try {
|
||||||
|
builder= factory.newDocumentBuilder();
|
||||||
|
expr= xpath.compile("");
|
||||||
|
} catch (ParserConfigurationException | XPathExpressionException e) {
|
||||||
|
throw new RuntimeException("Unable to initialize Controller");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private CatalogueInstanceDescriptor desc;
|
||||||
|
|
||||||
|
private String callerToken=null;
|
||||||
|
private ControllerConfiguration config;
|
||||||
|
|
||||||
|
public GCatController(CatalogueInstanceDescriptor instance) throws ControllerInstantiationFault {
|
||||||
|
try{
|
||||||
|
this.desc=instance;
|
||||||
|
|
||||||
|
if(isCustomToken())
|
||||||
|
setCustomToken();
|
||||||
|
|
||||||
|
checkInstance();
|
||||||
|
|
||||||
|
if(isCustomToken())
|
||||||
|
resetToken();
|
||||||
|
}catch(ControllerInstantiationFault e) {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void configure(ControllerConfiguration config) {
|
||||||
|
this.config = config;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expected structure
|
||||||
|
*
|
||||||
|
* {
|
||||||
|
* "profile" : "<xml_profile>",
|
||||||
|
* "item" : "<json_item>",
|
||||||
|
* "resources" : [
|
||||||
|
* "<json_resource>",
|
||||||
|
* "<json_resource>",
|
||||||
|
* ....]
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* NB serialized resources are updated with "package_id" set as the published item id
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public PublishReport publishItem(CatalogueFormatData arg0) throws WrongObjectFormatException,CatalogueInteractionException,PublicationException{
|
||||||
|
log.debug("Publishing {} ",arg0);
|
||||||
|
String serialized=arg0.toCatalogueFormat();
|
||||||
|
try {
|
||||||
|
if(isCustomToken())
|
||||||
|
setCustomToken();
|
||||||
|
|
||||||
|
log.debug("Parsing data..");
|
||||||
|
JsonNode node=mapper.readTree(serialized);
|
||||||
|
if(!node.hasNonNull("item")) throw new WrongObjectFormatException("No \"item\" specified in serialized object");
|
||||||
|
JsonNode itemNode=node.path("item");
|
||||||
|
if(node.hasNonNull("profile")) {
|
||||||
|
log.debug("Publishing profile..");
|
||||||
|
String xmlProfile=node.path("profile").asText();
|
||||||
|
String profileName=getProfileName(xmlProfile);
|
||||||
|
createProfile(profileName, xmlProfile);
|
||||||
|
}
|
||||||
|
|
||||||
|
log.debug("Publishing Item..");
|
||||||
|
String itemResp=createItem(itemNode.asText());
|
||||||
|
String itemId = getId(itemResp);
|
||||||
|
log.debug("Pubilshed Item with ID {} ",itemId);
|
||||||
|
|
||||||
|
if(node.hasNonNull("resources")) {
|
||||||
|
log.debug("Pubilshing resources for {} ",itemId);
|
||||||
|
Iterator<JsonNode> resIterator=node.path("resources").elements();
|
||||||
|
while(resIterator.hasNext()) {
|
||||||
|
JsonNode resNode=resIterator.next();
|
||||||
|
String resourceName=resNode.path("name").asText();
|
||||||
|
createResource(itemId, resourceName, resNode.asText());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new PublishReport(true, itemId);
|
||||||
|
|
||||||
|
} catch(WrongObjectFormatException | PublicationException e) {
|
||||||
|
throw e;
|
||||||
|
} catch (Throwable e) {
|
||||||
|
throw new WrongObjectFormatException("Unable to read format ",e);
|
||||||
|
}finally{
|
||||||
|
if(isCustomToken())
|
||||||
|
resetToken();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private String createProfile(String profileName,String xmlProfile) throws WrongObjectFormatException, PublicationException{
|
||||||
|
Profile profile=null;
|
||||||
|
try{
|
||||||
|
if(isForcedUrl())
|
||||||
|
profile = new Profile(getForcedUrl());
|
||||||
|
else profile=new Profile();
|
||||||
|
|
||||||
|
// check if exists
|
||||||
|
boolean exists=false;
|
||||||
|
|
||||||
|
try {
|
||||||
|
profile.read(profileName);
|
||||||
|
exists=true;
|
||||||
|
}catch(Throwable t) {
|
||||||
|
exists=false;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(getOnClash()) {
|
||||||
|
case SKIP : return null;
|
||||||
|
case FAIL : {
|
||||||
|
if(exists) throw new PublicationException("Profile "+profileName+" already existing");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case UPDATE : {
|
||||||
|
if(exists) return profile.update(profileName, xmlProfile);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return profile.create(profileName, xmlProfile);
|
||||||
|
}catch(WebApplicationException e) {
|
||||||
|
handleWebException(e);
|
||||||
|
return null;
|
||||||
|
}catch(MalformedURLException e) {
|
||||||
|
throw new CatalogueInteractionException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private String createResource(String itemId,String resourceName,String toCreate) throws WrongObjectFormatException, PublicationException{
|
||||||
|
Resource resource=null;
|
||||||
|
try{
|
||||||
|
if(isForcedUrl())
|
||||||
|
resource = new Resource(getForcedUrl());
|
||||||
|
else resource=new Resource();
|
||||||
|
|
||||||
|
// Try to create
|
||||||
|
|
||||||
|
try {
|
||||||
|
log.debug("Trying to create resource {} for package {} ",resourceName,itemId);
|
||||||
|
return resource.create(itemId, toCreate);
|
||||||
|
}catch(WebApplicationException e) {
|
||||||
|
// Conflict = resource already existing
|
||||||
|
if(e.getResponse().getStatus()==409) {
|
||||||
|
switch(getOnClash()) {
|
||||||
|
case SKIP : return null;
|
||||||
|
case FAIL : throw new PublicationException("Resource "+resourceName+" already existing");
|
||||||
|
case UPDATE : {
|
||||||
|
// Look for resource id
|
||||||
|
log.debug("Looking for resource with name {} under item {} ",resourceName,itemId);
|
||||||
|
String resourceList=resource.list(itemId);
|
||||||
|
JsonNode listNode=mapper.readTree(resourceList);
|
||||||
|
Iterator<JsonNode> iterator=listNode.elements();
|
||||||
|
String resourceId=null;
|
||||||
|
while(iterator.hasNext()) {
|
||||||
|
JsonNode res=iterator.next();
|
||||||
|
if(res.path("name").asText().equals(resourceName)) {
|
||||||
|
resourceId=res.path("id").asText();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log.debug("Found id {} for resource Name {} ",resourceId,resourceName);
|
||||||
|
|
||||||
|
return resource.update(itemId, resourceId, toCreate);
|
||||||
|
}
|
||||||
|
default : return null;
|
||||||
|
}
|
||||||
|
}else throw e;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}catch(WebApplicationException e) {
|
||||||
|
handleWebException(e);
|
||||||
|
return null;
|
||||||
|
}catch(MalformedURLException e) {
|
||||||
|
throw new CatalogueInteractionException(e);
|
||||||
|
}catch(IOException e) {
|
||||||
|
throw new CatalogueInteractionException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private String createItem(String toCreate) throws WrongObjectFormatException, PublicationException{
|
||||||
|
Item item=null;
|
||||||
|
try{
|
||||||
|
if(isForcedUrl())
|
||||||
|
item = new Item(getForcedUrl());
|
||||||
|
else item=new Item();
|
||||||
|
return item.create(toCreate);
|
||||||
|
}catch(WebApplicationException e) {
|
||||||
|
handleWebException(e);
|
||||||
|
return null;
|
||||||
|
}catch(MalformedURLException e) {
|
||||||
|
throw new CatalogueInteractionException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// instance utils
|
||||||
|
|
||||||
|
private PublishingPolicy getOnClash() {
|
||||||
|
return config.getOnClash();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private boolean isForcedUrl() {
|
||||||
|
return desc.getCustomToken()==null&&desc.getUrl()!=null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private URL getForcedUrl() throws MalformedURLException {
|
||||||
|
return new URL(desc.getUrl());
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isCustomToken() {
|
||||||
|
return desc.getCustomToken()!=null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setCustomToken() {
|
||||||
|
callerToken=SecurityTokenProvider.instance.get();
|
||||||
|
SecurityTokenProvider.instance.set(desc.getCustomToken());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void resetToken() {
|
||||||
|
SecurityTokenProvider.instance.set(callerToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkInstance() throws ControllerInstantiationFault{
|
||||||
|
Item item=null;
|
||||||
|
try{
|
||||||
|
if(isForcedUrl())
|
||||||
|
item=new Item(getForcedUrl());
|
||||||
|
else item=new Item();
|
||||||
|
item.list(10, 0);
|
||||||
|
}catch(Throwable t) {
|
||||||
|
String msg=String.format("Unable to contact gCat with configuration %1$s ",desc);
|
||||||
|
log.error(msg,t);
|
||||||
|
throw new ControllerInstantiationFault(msg,t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Static utils from catalogue-ws
|
||||||
|
|
||||||
|
private static String getProfileName(String xmlProfile) throws WrongObjectFormatException {
|
||||||
|
try{
|
||||||
|
Document doc = builder.parse(xmlProfile);
|
||||||
|
return (String) expr.evaluate(doc, XPathConstants.STRING);
|
||||||
|
}catch(Throwable t) {
|
||||||
|
throw new WrongObjectFormatException("Unable to parse profile. ",t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static String getId(String publishResponse) {
|
||||||
|
try {
|
||||||
|
return mapper.readTree(publishResponse).path("result").path("id").asText();
|
||||||
|
} catch (Throwable t) {
|
||||||
|
t.printStackTrace();
|
||||||
|
throw new RuntimeException("FAILED Parsing of "+publishResponse);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getPublishedUrl(String publishResponse) {
|
||||||
|
try {
|
||||||
|
Iterator<JsonNode> iterator=mapper.readTree(publishResponse).path("result").path("extras").elements();
|
||||||
|
while(iterator.hasNext()) {
|
||||||
|
JsonNode node=iterator.next();
|
||||||
|
if(node.path("key").asText().equals("Item URL"))
|
||||||
|
return node.path("value").asText();
|
||||||
|
}
|
||||||
|
return "N/A";
|
||||||
|
} catch (Throwable t) {
|
||||||
|
t.printStackTrace();
|
||||||
|
throw new RuntimeException("FAILED Parsing of "+publishResponse);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void handleWebException(WebApplicationException e) throws WrongObjectFormatException, PublicationException {
|
||||||
|
log.debug("Received Web Exception {} ",e);
|
||||||
|
String msg=e.getResponse().readEntity(String.class);
|
||||||
|
switch(e.getResponse().getStatus()) {
|
||||||
|
case 400 : throw new WrongObjectFormatException("BAD Request : "+msg,e);
|
||||||
|
case 401 : throw new CatalogueInteractionException("Unauthorized : "+msg,e);
|
||||||
|
case 404 : throw new CatalogueInteractionException("NOT FOUND : "+msg,e);
|
||||||
|
case 405 : throw new CatalogueInteractionException("Method Not Allowed : "+msg,e);
|
||||||
|
case 409 : throw new CatalogueInteractionException("Conflict : "+msg,e);
|
||||||
|
case 500 : throw new CatalogueInteractionException("Remote Error : "+msg,e);
|
||||||
|
default : throw new PublicationException("Unexpected error code : "+msg,e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
package org.gcube.data.publishing.gCataFeeder.catalogues.gCat;
|
||||||
|
|
||||||
|
import org.gcube.data.publishing.gCatFeeder.catalogues.CatalogueController;
|
||||||
|
import org.gcube.data.publishing.gCatFeeder.catalogues.CataloguePlugin;
|
||||||
|
import org.gcube.data.publishing.gCatFeeder.catalogues.model.CataloguePluginDescriptor;
|
||||||
|
import org.gcube.data.publishing.gCatFeeder.catalogues.model.faults.ControllerInstantiationFault;
|
||||||
|
import org.gcube.data.publishing.gCatFeeder.model.CatalogueInstanceDescriptor;
|
||||||
|
|
||||||
|
public class GCatPlugin implements CataloguePlugin {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CataloguePluginDescriptor getDescriptor() {
|
||||||
|
return new CataloguePluginDescriptor("GCAT");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CatalogueController instantiateController(CatalogueInstanceDescriptor desc)
|
||||||
|
throws ControllerInstantiationFault {
|
||||||
|
return new GCatController(desc);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
package org.gcube.data.publishing.gCatFeeder.catalogues.gCat;
|
||||||
|
|
||||||
|
import org.gcube.data.publishing.gCatFeeder.tests.TokenSetter;
|
||||||
|
import org.gcube.data.publishing.gCatFeeder.utils.TokenUtils;
|
||||||
|
import org.junit.Before;
|
||||||
|
|
||||||
|
public class Interactions {
|
||||||
|
|
||||||
|
@Before
|
||||||
|
private void setToken() {
|
||||||
|
TokenSetter.set("/gcube/devsec");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
Manifest-Version: 1.0
|
||||||
|
Built-By: fabio
|
||||||
|
Build-Jdk: 1.8.0_201
|
||||||
|
Created-By: Maven Integration for Eclipse
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
#Generated by Maven Integration for Eclipse
|
||||||
|
#Tue Mar 19 16:05:42 CET 2019
|
||||||
|
version=1.0.0-SNAPSHOT
|
||||||
|
groupId=org.gcube.data-publishing.gCat-Feeder
|
||||||
|
m2e.projectName=gCat-Controller
|
||||||
|
m2e.projectLocation=/home/fabio/workspaces/DEV/gCat-Feeder-Suite/gCat-Controller
|
||||||
|
artifactId=gCat-Controller
|
|
@ -0,0 +1,39 @@
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>org.gcube.data-publishing.gCat-Feeder</groupId>
|
||||||
|
<artifactId>gCat-Feeder-Suite</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
<artifactId>gCat-Controller</artifactId>
|
||||||
|
<name>gCat Controller</name>
|
||||||
|
<description>Controller implementation for GCat Service</description>
|
||||||
|
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.gcube.data-publishing.gCat-Feeder</groupId>
|
||||||
|
<artifactId>catalogue-plugin-framework</artifactId>
|
||||||
|
<version>[1.0.0-SNAPSHOT,2.0.0-SNAPSHOT)</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.gcube.data-publishing</groupId>
|
||||||
|
<artifactId>gcat-client</artifactId>
|
||||||
|
<version>[1.0.0-SNAPSHOT,2.0.0-SNAPSHOT]</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.gcube.data-publishing.gCat-Feeder</groupId>
|
||||||
|
<artifactId>test-commons</artifactId>
|
||||||
|
<version>[1.0.0-SNAPSHOT,2.0.0-SNAPSHOT]</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</project>
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
1
pom.xml
1
pom.xml
|
@ -22,6 +22,7 @@
|
||||||
<module>catalogue-plugin-framework</module>
|
<module>catalogue-plugin-framework</module>
|
||||||
<module>ckan-controller-plugin</module>
|
<module>ckan-controller-plugin</module>
|
||||||
<module>gCat-Controller</module>
|
<module>gCat-Controller</module>
|
||||||
|
<module>test-commons</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
<dependencyManagement>
|
<dependencyManagement>
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<classpath>
|
||||||
|
<classpathentry kind="src" output="target/classes" path="src/main/java">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="optional" value="true"/>
|
||||||
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="optional" value="true"/>
|
||||||
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry kind="output" path="target/classes"/>
|
||||||
|
</classpath>
|
|
@ -0,0 +1,23 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>test-commons</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.m2e.core.maven2Builder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
<nature>org.eclipse.m2e.core.maven2Nature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
|
@ -0,0 +1,6 @@
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
encoding//src/main/java=UTF-8
|
||||||
|
encoding//src/main/resources=UTF-8
|
||||||
|
encoding//src/test/java=UTF-8
|
||||||
|
encoding//src/test/resources=UTF-8
|
||||||
|
encoding/<project>=UTF-8
|
|
@ -0,0 +1,5 @@
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
|
||||||
|
org.eclipse.jdt.core.compiler.compliance=1.8
|
||||||
|
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
|
||||||
|
org.eclipse.jdt.core.compiler.source=1.8
|
|
@ -0,0 +1,4 @@
|
||||||
|
activeProfiles=
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
resolveWorkspaceProjects=true
|
||||||
|
version=1
|
|
@ -0,0 +1,11 @@
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>org.gcube.data-publishing.gCat-Feeder</groupId>
|
||||||
|
<artifactId>gCat-Feeder-Suite</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
<artifactId>test-commons</artifactId>
|
||||||
|
<name>test commons</name>
|
||||||
|
<description>Utility classes for test purposes</description>
|
||||||
|
</project>
|
|
@ -0,0 +1,38 @@
|
||||||
|
package org.gcube.data.publishing.gCatFeeder.tests;
|
||||||
|
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import org.gcube.common.authorization.library.provider.SecurityTokenProvider;
|
||||||
|
import org.gcube.common.scope.api.ScopeProvider;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
public class TokenSetter {
|
||||||
|
private static Properties props=new Properties();
|
||||||
|
|
||||||
|
private static final Logger log= LoggerFactory.getLogger(TokenSetter.class);
|
||||||
|
|
||||||
|
static{
|
||||||
|
try {
|
||||||
|
props.load(TokenSetter.class.getResourceAsStream("/tokens.properties"));
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException("YOU NEED TO SET TOKEN FILE IN CONFIGURATION");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void set(String scope){
|
||||||
|
try{
|
||||||
|
if(!props.containsKey(scope)) throw new RuntimeException("No token found for scope : "+scope);
|
||||||
|
SecurityTokenProvider.instance.set(props.getProperty(scope));
|
||||||
|
}catch(Throwable e){
|
||||||
|
log.warn("Unable to set token for scope "+scope,e);
|
||||||
|
}
|
||||||
|
ScopeProvider.instance.set(scope);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
Manifest-Version: 1.0
|
||||||
|
Built-By: fabio
|
||||||
|
Build-Jdk: 1.8.0_201
|
||||||
|
Created-By: Maven Integration for Eclipse
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
#Generated by Maven Integration for Eclipse
|
||||||
|
#Tue Mar 19 16:04:13 CET 2019
|
||||||
|
version=1.0.0-SNAPSHOT
|
||||||
|
groupId=org.gcube.data-publishing.gCat-Feeder
|
||||||
|
m2e.projectName=test-commons
|
||||||
|
m2e.projectLocation=/home/fabio/workspaces/DEV/gCat-Feeder-Suite/test-commons
|
||||||
|
artifactId=test-commons
|
|
@ -0,0 +1,11 @@
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>org.gcube.data-publishing.gCat-Feeder</groupId>
|
||||||
|
<artifactId>gCat-Feeder-Suite</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
<artifactId>test-commons</artifactId>
|
||||||
|
<name>test commons</name>
|
||||||
|
<description>Utility classes for test purposes</description>
|
||||||
|
</project>
|
Binary file not shown.
Loading…
Reference in New Issue