From 4e512ef3d1288775393ff957c6ccf5a35893ef5c Mon Sep 17 00:00:00 2001 From: "fabio.sinibaldi" Date: Mon, 1 Apr 2019 13:30:16 +0000 Subject: [PATCH] git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/data-publishing/gCat-Feeder-Suite@178793 82a268e6-3cf1-43bd-a215-b396298e98cf --- .../dm/DMAlgorithmsInfoCollector.java | 4 + .../collectors/dm/DataMinerPlugin.java | 14 ++- .../collectors/dm/GCATTransformer.java | 8 +- .../collectors/dm/model/CkanModel.java | 34 ------- .../dm/model/InternalAlgorithmDescriptor.java | 8 +- .../dm/model/ckan/CKanExtraField.java | 16 +++ .../collectors/dm/model/ckan/CkanItem.java | 27 +++++ .../dm/model/ckan/CkanResource.java | 7 ++ .../collectors/dm/model/ckan/GCatModel.java | 92 ++++++++++++++++++ .../gCatFeeder/collectors/dm/profile.xml | 8 ++ .../gCatFeeder/collectors/dm/LocalTest.java | 12 +++ .../catalogues/CatalogueController.java | 3 +- .../gCatFeeder/model/CatalogueFormatData.java | 2 +- .../model/InternalConversionException.java | 35 +++++++ .../catalogues/gCat/GCatController.java | 4 +- .../catalogues/gCat/Interactions.java | 11 ++- .../gCat-Controller/pom.properties | 2 +- .../catalogues/gCat/GCatController.class | Bin 13145 -> 13223 bytes .../Interactions$CustomTargetFormat.class | Bin 1361 -> 1361 bytes .../catalogues/gCat/Interactions.class | Bin 3909 -> 4001 bytes .../service/engine/impl/ExecutionTask.java | 3 + .../gCatFeeder/tests/BaseCollectorTest.java | 35 ++++++- test-commons/src/main/resources/logback.xml | 16 +++ .../test-commons/pom.properties | 2 +- test-commons/target/classes/logback.xml | 16 +++ .../gCatFeeder/tests/BaseCollectorTest.class | Bin 5599 -> 7506 bytes 26 files changed, 305 insertions(+), 54 deletions(-) delete mode 100644 DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/model/CkanModel.java create mode 100644 DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/model/ckan/CKanExtraField.java create mode 100644 DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/model/ckan/CkanItem.java create mode 100644 DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/model/ckan/CkanResource.java create mode 100644 DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/model/ckan/GCatModel.java create mode 100644 DataMinerAlgorithmsCrawler/src/main/resources/org/gcube/data/publishing/gCatFeeder/collectors/dm/profile.xml create mode 100644 DataMinerAlgorithmsCrawler/src/test/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/LocalTest.java create mode 100644 commons/src/main/java/org/gcube/data/publishing/gCatFeeder/model/InternalConversionException.java create mode 100644 test-commons/src/main/resources/logback.xml create mode 100644 test-commons/target/classes/logback.xml diff --git a/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/DMAlgorithmsInfoCollector.java b/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/DMAlgorithmsInfoCollector.java index 9ad9863..db7922f 100644 --- a/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/DMAlgorithmsInfoCollector.java +++ b/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/DMAlgorithmsInfoCollector.java @@ -26,6 +26,7 @@ public class DMAlgorithmsInfoCollector implements DataCollector toReturn=new HashSet(); SClient client=new DataMinerService().getClient(); +// client. List opClassifications=client.getOperatorsClassifications(); log.debug("Found {} classifications.",opClassifications.size()); @@ -79,6 +80,9 @@ public class DMAlgorithmsInfoCollector implements DataCollector { @Override @@ -49,8 +56,11 @@ public class DataMinerPlugin implements CollectorPlugin{ +public class GCATTransformer implements DataTransformer{ @Override - public Set transform(Collection collectedData) { - HashSet toReturn=new HashSet<>(); + public Set transform(Collection collectedData) { + HashSet toReturn=new HashSet<>(); for(InternalAlgorithmDescriptor desc:collectedData) { toReturn.add(desc.asCKANModel()); } diff --git a/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/model/CkanModel.java b/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/model/CkanModel.java deleted file mode 100644 index c27f16a..0000000 --- a/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/model/CkanModel.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.gcube.data.publishing.gCatFeeder.collectors.dm.model; - -import org.gcube.data.publishing.gCatFeeder.model.CatalogueFormatData; - -public class CkanModel implements CatalogueFormatData { - - @Override - public String toCatalogueFormat() { - // TODO Auto-generated method stub - return null; - } - - - /** - * (Common) Title - * (Common) Description - * (Common) Tags: free list of keywords - * (Common) License - * (Common) Visibility: either public or private - * (Common) Version - * (Common) Author: the creator of metadata. Only one occurrence is supported; - * (Common) Maintainer: - * (Method specific) Creator: the author of the method (with email and ORCID). Repeatable field; - * (Method specific) Creation date: when the method has been released; - * (Method specific) Input: Repeatable field; - * (Method specific) Output: Repeatable field; - * (Method specific) RelatedPaper: a reference to an associated paper; - * (Method specific) Restrictions On Use: an optional text - * (Method specific) Attribution requirements: the text to use to acknowledge method usage; - */ - - - -} diff --git a/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/model/InternalAlgorithmDescriptor.java b/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/model/InternalAlgorithmDescriptor.java index 8805bdd..b464bfe 100644 --- a/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/model/InternalAlgorithmDescriptor.java +++ b/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/model/InternalAlgorithmDescriptor.java @@ -1,9 +1,11 @@ package org.gcube.data.publishing.gCatFeeder.collectors.dm.model; +import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; +import org.gcube.data.publishing.gCatFeeder.collectors.dm.model.ckan.GCatModel; import org.gcube.data.publishing.gCatfeeder.collectors.model.CustomData; import lombok.AllArgsConstructor; @@ -68,10 +70,10 @@ public class InternalAlgorithmDescriptor implements CustomData { - private List tags; + private List tags=new ArrayList<>(); - public CkanModel asCKANModel() { - throw new RuntimeException("Implement This"); + public GCatModel asCKANModel() { + return new GCatModel(this); } diff --git a/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/model/ckan/CKanExtraField.java b/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/model/ckan/CKanExtraField.java new file mode 100644 index 0000000..7a249bc --- /dev/null +++ b/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/model/ckan/CKanExtraField.java @@ -0,0 +1,16 @@ +package org.gcube.data.publishing.gCatFeeder.collectors.dm.model.ckan; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class CKanExtraField { + + private String key; + private String value; +} diff --git a/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/model/ckan/CkanItem.java b/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/model/ckan/CkanItem.java new file mode 100644 index 0000000..39c5e67 --- /dev/null +++ b/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/model/ckan/CkanItem.java @@ -0,0 +1,27 @@ +package org.gcube.data.publishing.gCatFeeder.collectors.dm.model.ckan; + +import java.util.ArrayList; + +import lombok.Getter; +import lombok.Setter; +@Getter +@Setter + +public class CkanItem { + + public CkanItem() { + // TODO Auto-generated constructor stub + } + + private String name; + private String title; + private String description; + private String version; + private String visibility; + private String license; + private String author; + private String maintainer; + private ArrayList tags=new ArrayList(); + + private ArrayList extras=new ArrayList<>(); +} diff --git a/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/model/ckan/CkanResource.java b/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/model/ckan/CkanResource.java new file mode 100644 index 0000000..b825395 --- /dev/null +++ b/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/model/ckan/CkanResource.java @@ -0,0 +1,7 @@ +package org.gcube.data.publishing.gCatFeeder.collectors.dm.model.ckan; + +public class CkanResource { + + + +} diff --git a/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/model/ckan/GCatModel.java b/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/model/ckan/GCatModel.java new file mode 100644 index 0000000..3cddb6a --- /dev/null +++ b/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/model/ckan/GCatModel.java @@ -0,0 +1,92 @@ +package org.gcube.data.publishing.gCatFeeder.collectors.dm.model.ckan; + +import java.io.ByteArrayOutputStream; +import java.util.ArrayList; + +import org.gcube.data.publishing.gCatFeeder.collectors.dm.model.InternalAlgorithmDescriptor; +import org.gcube.data.publishing.gCatFeeder.model.CatalogueFormatData; +import org.gcube.data.publishing.gCatFeeder.model.InternalConversionException; +import org.gcube.data.publishing.gCatFeeder.utils.ContextUtils; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@NoArgsConstructor +@Getter +@Setter +public class GCatModel implements CatalogueFormatData { + + private static ObjectMapper mapper=new ObjectMapper(); + + private static String profileXML=null; + + + public static void setProfile(String toSet) { + profileXML=toSet; + } + + public GCatModel(InternalAlgorithmDescriptor desc) { + item=new CkanItem(); +// item.setAuthor(desc.getAuthor()); + item.setDescription(desc.getDescription()); + item.setTitle(desc.getName()+" in "+ContextUtils.getCurrentScopeName()); + item.setLicense("CC-BY-NC-SA-4.0"); +// item.setMaintainer(desc.getAuthor()); + item.setName(item.getTitle().toLowerCase().toLowerCase().replaceAll(" ", "_")); + for(String tag:desc.getTags()) { + item.getTags().add(fixTag(tag)); + } + item.getExtras().add(new CKanExtraField("system", "Algorithm")); + } + + + private String profile=profileXML; + + private CkanItem item=null; + private ArrayList resources=new ArrayList<>(); + + + @Override + public String toCatalogueFormat() throws InternalConversionException { + try{ + ByteArrayOutputStream baos=new ByteArrayOutputStream(); + mapper.writeValue(baos, this); + return baos.toString(); + }catch(Throwable t) { + throw new InternalConversionException("Unable to convert",t); + } + } + + + /** + * (Common) Title + * (Common) Description + * (Common) Tags: free list of keywords + * (Common) License + * (Common) Visibility: either public or private + * (Common) Version + * (Common) Author: the creator of metadata. Only one occurrence is supported; + * (Common) Maintainer: + * (Method specific) Creator: the author of the method (with email and ORCID). Repeatable field; + * (Method specific) Creation date: when the method has been released; + * (Method specific) Input: Repeatable field; + * (Method specific) Output: Repeatable field; + * (Method specific) RelatedPaper: a reference to an associated paper; + * (Method specific) Restrictions On Use: an optional text + * (Method specific) Attribution requirements: the text to use to acknowledge method usage; + */ + + + static final String fixTag(String toFix) { + String fixedTag=toFix.replaceAll(":", " "). + replaceAll("[\\(\\)\\\\/]", "-").replaceAll("[’']","_"); + if(fixedTag.length()>100) + fixedTag=fixedTag.substring(0,96)+"..."; + return fixedTag.trim(); + } + + +} diff --git a/DataMinerAlgorithmsCrawler/src/main/resources/org/gcube/data/publishing/gCatFeeder/collectors/dm/profile.xml b/DataMinerAlgorithmsCrawler/src/main/resources/org/gcube/data/publishing/gCatFeeder/collectors/dm/profile.xml new file mode 100644 index 0000000..6f4da99 --- /dev/null +++ b/DataMinerAlgorithmsCrawler/src/main/resources/org/gcube/data/publishing/gCatFeeder/collectors/dm/profile.xml @@ -0,0 +1,8 @@ + + + Input Parameter + String + false + Input parameter expected for the execution of the algorithm + + \ No newline at end of file diff --git a/DataMinerAlgorithmsCrawler/src/test/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/LocalTest.java b/DataMinerAlgorithmsCrawler/src/test/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/LocalTest.java new file mode 100644 index 0000000..2d9f9e6 --- /dev/null +++ b/DataMinerAlgorithmsCrawler/src/test/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/LocalTest.java @@ -0,0 +1,12 @@ +package org.gcube.data.publishing.gCatFeeder.collectors.dm; + +import org.junit.Test; + +public class LocalTest { + + @Test + public void initTest() throws Exception { + new DataMinerPlugin().init(); + } + +} diff --git a/catalogue-plugin-framework/src/main/java/org/gcube/data/publishing/gCatFeeder/catalogues/CatalogueController.java b/catalogue-plugin-framework/src/main/java/org/gcube/data/publishing/gCatFeeder/catalogues/CatalogueController.java index a36014c..a4f2ed8 100644 --- a/catalogue-plugin-framework/src/main/java/org/gcube/data/publishing/gCatFeeder/catalogues/CatalogueController.java +++ b/catalogue-plugin-framework/src/main/java/org/gcube/data/publishing/gCatFeeder/catalogues/CatalogueController.java @@ -6,10 +6,11 @@ import org.gcube.data.publishing.gCatFeeder.catalogues.model.faults.PublicationE 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.ControllerConfiguration; +import org.gcube.data.publishing.gCatFeeder.model.InternalConversionException; public interface CatalogueController { - public PublishReport publishItem(CatalogueFormatData toPublish) throws WrongObjectFormatException,CatalogueInteractionException,PublicationException; + public PublishReport publishItem(CatalogueFormatData toPublish) throws WrongObjectFormatException,CatalogueInteractionException,PublicationException, InternalConversionException; public void configure (ControllerConfiguration config); } diff --git a/commons/src/main/java/org/gcube/data/publishing/gCatFeeder/model/CatalogueFormatData.java b/commons/src/main/java/org/gcube/data/publishing/gCatFeeder/model/CatalogueFormatData.java index c019d75..ef5e317 100644 --- a/commons/src/main/java/org/gcube/data/publishing/gCatFeeder/model/CatalogueFormatData.java +++ b/commons/src/main/java/org/gcube/data/publishing/gCatFeeder/model/CatalogueFormatData.java @@ -3,6 +3,6 @@ package org.gcube.data.publishing.gCatFeeder.model; public interface CatalogueFormatData { - public String toCatalogueFormat(); + public String toCatalogueFormat() throws InternalConversionException; } diff --git a/commons/src/main/java/org/gcube/data/publishing/gCatFeeder/model/InternalConversionException.java b/commons/src/main/java/org/gcube/data/publishing/gCatFeeder/model/InternalConversionException.java new file mode 100644 index 0000000..e2a1e21 --- /dev/null +++ b/commons/src/main/java/org/gcube/data/publishing/gCatFeeder/model/InternalConversionException.java @@ -0,0 +1,35 @@ +package org.gcube.data.publishing.gCatFeeder.model; + +public class InternalConversionException extends Exception { + + /** + * + */ + private static final long serialVersionUID = -5731594279138149384L; + + public InternalConversionException() { + // TODO Auto-generated constructor stub + } + + public InternalConversionException(String message) { + super(message); + // TODO Auto-generated constructor stub + } + + public InternalConversionException(Throwable cause) { + super(cause); + // TODO Auto-generated constructor stub + } + + public InternalConversionException(String message, Throwable cause) { + super(message, cause); + // TODO Auto-generated constructor stub + } + + public InternalConversionException(String message, Throwable cause, boolean enableSuppression, + boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + // TODO Auto-generated constructor stub + } + +} diff --git a/gCat-Controller/src/main/java/org/gcube/data/publishing/gCataFeeder/catalogues/gCat/GCatController.java b/gCat-Controller/src/main/java/org/gcube/data/publishing/gCataFeeder/catalogues/gCat/GCatController.java index 3c5bef8..54200d3 100644 --- a/gCat-Controller/src/main/java/org/gcube/data/publishing/gCataFeeder/catalogues/gCat/GCatController.java +++ b/gCat-Controller/src/main/java/org/gcube/data/publishing/gCataFeeder/catalogues/gCat/GCatController.java @@ -26,6 +26,7 @@ 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.data.publishing.gCatFeeder.model.InternalConversionException; import org.gcube.gcat.client.Item; import org.gcube.gcat.client.Profile; import org.gcube.gcat.client.Resource; @@ -115,11 +116,12 @@ public class GCatController implements CatalogueController{ * } * * NB serialized resources are updated with "package_id" set as the published item id + * @throws InternalConversionException * * */ @Override - public PublishReport publishItem(CatalogueFormatData arg0) throws WrongObjectFormatException,CatalogueInteractionException,PublicationException{ + public PublishReport publishItem(CatalogueFormatData arg0) throws WrongObjectFormatException,CatalogueInteractionException,PublicationException, InternalConversionException{ log.debug("Publishing {} ",arg0); String serialized=arg0.toCatalogueFormat(); try { diff --git a/gCat-Controller/src/test/java/org/gcube/data/publishing/gCatFeeder/catalogues/gCat/Interactions.java b/gCat-Controller/src/test/java/org/gcube/data/publishing/gCatFeeder/catalogues/gCat/Interactions.java index afbf25a..6ff07d4 100644 --- a/gCat-Controller/src/test/java/org/gcube/data/publishing/gCatFeeder/catalogues/gCat/Interactions.java +++ b/gCat-Controller/src/test/java/org/gcube/data/publishing/gCatFeeder/catalogues/gCat/Interactions.java @@ -11,6 +11,7 @@ import org.gcube.data.publishing.gCatFeeder.catalogues.model.faults.PublicationE 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.InternalConversionException; import org.gcube.data.publishing.gCatFeeder.tests.TokenSetter; import org.gcube.data.publishing.gCataFeeder.catalogues.gCat.GCatPlugin; import org.junit.Assert; @@ -73,19 +74,19 @@ public class Interactions { @Test(expected=WrongObjectFormatException.class) - public void empties() throws CatalogueInteractionException, WrongObjectFormatException, PublicationException, ControllerInstantiationFault { + public void empties() throws CatalogueInteractionException, WrongObjectFormatException, PublicationException, ControllerInstantiationFault, InternalConversionException { publish(getController(),"empties.json"); } @Test(expected=PublicationException.class) - public void missingProfile() throws CatalogueInteractionException, WrongObjectFormatException, PublicationException, ControllerInstantiationFault { + public void missingProfile() throws CatalogueInteractionException, WrongObjectFormatException, PublicationException, ControllerInstantiationFault, InternalConversionException { publish(getController(),"missingProfile.json"); } @Test(expected=WrongObjectFormatException.class) - public void noitem() throws CatalogueInteractionException, WrongObjectFormatException, PublicationException, ControllerInstantiationFault { + public void noitem() throws CatalogueInteractionException, WrongObjectFormatException, PublicationException, ControllerInstantiationFault, InternalConversionException { publish(getController(),"noItem.json"); } @@ -93,13 +94,13 @@ public class Interactions { public void item() { try { publish(getController(),"onlyItem.json"); - } catch (WrongObjectFormatException | PublicationException | ControllerInstantiationFault e) { + } catch (WrongObjectFormatException | PublicationException | ControllerInstantiationFault | InternalConversionException e) { Assert.fail(e.getMessage()); } } - private static PublishReport publish(CatalogueController controller, String filename) throws CatalogueInteractionException, WrongObjectFormatException, PublicationException { + private static PublishReport publish(CatalogueController controller, String filename) throws CatalogueInteractionException, WrongObjectFormatException, PublicationException, InternalConversionException { return controller.publishItem(new CustomTargetFormat(filename)); } } diff --git a/gCat-Controller/target/classes/META-INF/maven/org.gcube.data-publishing.gCat-Feeder/gCat-Controller/pom.properties b/gCat-Controller/target/classes/META-INF/maven/org.gcube.data-publishing.gCat-Feeder/gCat-Controller/pom.properties index d5fb37e..5182116 100644 --- a/gCat-Controller/target/classes/META-INF/maven/org.gcube.data-publishing.gCat-Feeder/gCat-Controller/pom.properties +++ b/gCat-Controller/target/classes/META-INF/maven/org.gcube.data-publishing.gCat-Feeder/gCat-Controller/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven Integration for Eclipse -#Thu Mar 28 15:36:44 CET 2019 +#Mon Apr 01 15:14:16 CEST 2019 version=1.0.0-SNAPSHOT groupId=org.gcube.data-publishing.gCat-Feeder m2e.projectName=gCat-Controller diff --git a/gCat-Controller/target/classes/org/gcube/data/publishing/gCataFeeder/catalogues/gCat/GCatController.class b/gCat-Controller/target/classes/org/gcube/data/publishing/gCataFeeder/catalogues/gCat/GCatController.class index 1825a954972d9e36853c7234aea891698ae9b699..9c981d70512398ea0ad28d6945c424038ac0f722 100644 GIT binary patch delta 5610 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 b-+~WZPXmhjsPUQqO+?WUA!> delta 5596 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 DxpC^v diff --git a/gCat-Controller/target/test-classes/org/gcube/data/publishing/gCatFeeder/catalogues/gCat/Interactions$CustomTargetFormat.class b/gCat-Controller/target/test-classes/org/gcube/data/publishing/gCatFeeder/catalogues/gCat/Interactions$CustomTargetFormat.class index b0bbf406c7e3efccd25ea992709f6237c4342bab..b8a55b975067235f390cfeced5e4d18a40ad5f4a 100644 GIT binary patch delta 35 qcmcb}b&+dB6APy-0}F#311E$0^0tapA_D8-I;4o|($RWWwUybI->;&zyI@pL;W8{rL0wD=8ExfG(m(({nOryUY6SogIv)I&XZHuu(-}?W*OiHL*(=?XKLRA%rVabXIZ32 zRTS7zTA!f)qFaD;y1gFy~J|>Z3nJ`_P@hbtO z{bSVa0MtqlDle!)AZqPo)G_J5r7r#3>P`@9RZwezsC#o<5R9B`Obe>^p(g;?9J{OIik3d u`N-xc$_DQx)e%1I3%%ukUaHf|W2#b@N7QhoZcz98x7iVINv0^)!1@a?BxHyH delta 688 zcmaixO;1xn6o#LWw`R6( zSh=+^LDcBRxbd&(U(onYFUxCOoH=toW}Y+eY!81w7XJA2=_@eC!*=*3YY+I#rfeVi z&&)OZ(?4#m+c+2)ST@AXM*aEpleNv!jmOPKmK8(!b>DgWGAQ&_xs@ZsV8m_iWLdM@ z!Bp2eci;aCUKvxcThVmplp03uw`d`A8lN$HH1{+(tKB&cF=^lAw)U3@xxhg#GRP%{ znX)J1@m9z_W|(D;A$m1vgrO)qS>p;>B_{9`sxY#{nf&}N6N_zyo^C_tX}v5ztCNsR zTIFL!h6TFm;z*}6mD6&dt0|zxG|;?2 plugin:collectorPluginsLoader) { + try { + Collection collected=plugin.getCollector().collect(); + for(String catalogue:plugin.getSupportedCatalogueTypes()) { + log.debug("Simulating publication towards {} ",catalogue); + Set transformed=plugin.getTransformerByCatalogueType(catalogue).transform(collected); + log.debug("Transformed size = {} "); + for(CatalogueFormatData f:transformed) + log.debug(f.toCatalogueFormat()); + } + + } catch (CollectorFault e) { + log.error("",e); + Assert.fail("Infrastructure Environment not suitable for testing"+e.getMessage()); + } catch (CatalogueNotSupportedException e) { + log.error("",e); + Assert.fail("Exception while getting transformer in scope : "+e.getMessage()); + } catch (InternalConversionException e) { + log.error("",e); + Assert.fail("Failed internatl conversion : "+e.getMessage()); + } + } + + } } - + protected static boolean isTestInfrastructureEnabled() { return testContext!=null; diff --git a/test-commons/src/main/resources/logback.xml b/test-commons/src/main/resources/logback.xml new file mode 100644 index 0000000..6ea2f23 --- /dev/null +++ b/test-commons/src/main/resources/logback.xml @@ -0,0 +1,16 @@ + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + \ No newline at end of file diff --git a/test-commons/target/classes/META-INF/maven/org.gcube.data-publishing.gCat-Feeder/test-commons/pom.properties b/test-commons/target/classes/META-INF/maven/org.gcube.data-publishing.gCat-Feeder/test-commons/pom.properties index f860194..5a2b3a1 100644 --- a/test-commons/target/classes/META-INF/maven/org.gcube.data-publishing.gCat-Feeder/test-commons/pom.properties +++ b/test-commons/target/classes/META-INF/maven/org.gcube.data-publishing.gCat-Feeder/test-commons/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven Integration for Eclipse -#Thu Mar 28 15:36:44 CET 2019 +#Mon Apr 01 15:14:17 CEST 2019 version=1.0.0-SNAPSHOT groupId=org.gcube.data-publishing.gCat-Feeder m2e.projectName=test-commons diff --git a/test-commons/target/classes/logback.xml b/test-commons/target/classes/logback.xml new file mode 100644 index 0000000..6ea2f23 --- /dev/null +++ b/test-commons/target/classes/logback.xml @@ -0,0 +1,16 @@ + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + \ No newline at end of file diff --git a/test-commons/target/classes/org/gcube/data/publishing/gCatFeeder/tests/BaseCollectorTest.class b/test-commons/target/classes/org/gcube/data/publishing/gCatFeeder/tests/BaseCollectorTest.class index df7ad411579b13ca0a976cca5ef219eade98b4e1..95ea02fc3139164adeec5a3b387df1feaeec9d93 100644 GIT binary patch delta 3127 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