diff --git a/src/core/de.evoal.core.arff/src/main/java/de/evoal/core/arff/cdi/ArffBlackboardEntry.java b/src/core/de.evoal.core.arff/src/main/java/de/evoal/core/arff/cdi/ArffBlackboardEntry.java index f8634c4646bb3826280ecfe8d2cac5fc543e787a..848f3267b0841f1d74ae738d0492acd15c6c076b 100644 --- a/src/core/de.evoal.core.arff/src/main/java/de/evoal/core/arff/cdi/ArffBlackboardEntry.java +++ b/src/core/de.evoal.core.arff/src/main/java/de/evoal/core/arff/cdi/ArffBlackboardEntry.java @@ -4,7 +4,7 @@ public final class ArffBlackboardEntry { /** * The arff file to read. */ - public static final String ARFF_INPUT = "arff:arff-input"; + public static final String ARFF_INPUT = "arff:input"; /** diff --git a/src/core/de.evoal.core.arff/src/main/java/de/evoal/core/arff/io/ArffPropertiesWriter.java b/src/core/de.evoal.core.arff/src/main/java/de/evoal/core/arff/io/ArffPropertiesWriter.java index 8eac81f3fd296bb7bfd009761819d962405ba853..7b1b967a8e8773b0309cf5773bb1182fe35762bf 100644 --- a/src/core/de.evoal.core.arff/src/main/java/de/evoal/core/arff/io/ArffPropertiesWriter.java +++ b/src/core/de.evoal.core.arff/src/main/java/de/evoal/core/arff/io/ArffPropertiesWriter.java @@ -13,7 +13,7 @@ import java.io.FileOutputStream; @Slf4j @Dependent -@Named("json-writer") +@Named("arff-writer") public class ArffPropertiesWriter implements PropertiesWriter { private FileOutputStream outputStream; diff --git a/src/core/de.evoal.core.arff/src/test/java/de/evoal/core/arff/ArffPropertiesReaderTest.java b/src/core/de.evoal.core.arff/src/test/java/de/evoal/core/arff/ArffPropertiesReaderTest.java new file mode 100644 index 0000000000000000000000000000000000000000..9663299824f9e19878c4197da39e8406925c74cc --- /dev/null +++ b/src/core/de.evoal.core.arff/src/test/java/de/evoal/core/arff/ArffPropertiesReaderTest.java @@ -0,0 +1,40 @@ +package de.evoal.core.arff; + +import de.evoal.core.api.properties.PropertiesSpecification; +import de.evoal.core.api.properties.io.PropertiesReader; +import de.evoal.core.api.utils.EvoalIOException; +import de.evoal.core.arff.utils.LanguageUtils; +import de.evoal.core.arff.utils.ResourceUtils; +import de.evoal.languages.model.ddl.DataDescriptionModel; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +public class ArffPropertiesReaderTest { + + @Test + public void testSimpleArff() throws EvoalIOException, IOException { + final Path temporary = Files.createTempDirectory("evoal"); + final File temporaryFolder = temporary.toFile(); + ResourceUtils.unpack(getClass().getClassLoader(), temporaryFolder, "simple/input.arff", "simple/specification.ddl"); +// final DataDescriptionModel model = LanguageUtils.load(new File(temporaryFolder, "simple/specification.ddl"), DataDescriptionModel.class); +// final PropertiesSpecification specification = toSpecification(model); + + +// final PropertiesReader testee = new ArffPropertiesReader() +// .init(new File(temporaryFolder, "input.arff"), specification); + +// Assertions.assertTrue(testee.hasNext()); + } + + private PropertiesSpecification toSpecification(final DataDescriptionModel model) { + return PropertiesSpecification + .builder() + .add(model.getDescriptions().stream()) + .build(); + } +} diff --git a/src/core/de.evoal.core.arff/src/test/java/de/evoal/core/arff/utils/LanguageUtils.java b/src/core/de.evoal.core.arff/src/test/java/de/evoal/core/arff/utils/LanguageUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..8ab0f281f22eb70ccc001b66ac284e393a961894 --- /dev/null +++ b/src/core/de.evoal.core.arff/src/test/java/de/evoal/core/arff/utils/LanguageUtils.java @@ -0,0 +1,60 @@ +package de.evoal.core.arff.utils; + +import de.evoal.languages.model.ddl.DataDescriptionModel; +import de.evoal.languages.model.ddl.DdlPackage; +import de.evoal.languages.model.ddl.dsl.DataDescriptionLanguageStandaloneSetup; +import lombok.NonNull; +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.resource.ResourceSet; +import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; + +import java.io.File; +import java.util.List; + +public class LanguageUtils { + + /** + * Loads an EMF model and returns the model instance. + * + * @param path Path of the model to load. + * + * @return A valid reference to the model + * + * @throws Exception If there is any problem while loading the model + */ + public static <T extends EObject> T load(final @NonNull File path, final Class<T> cl) { + loadPackages(); + + final URI modelURI = URI.createPlatformResourceURI(path.toString(), true); + return load(modelURI, cl); + } + + private static void loadPackages() { + //DataDescriptionLanguageStandaloneSetup.doSetup(); + } + + private static <T extends EObject> T load(final URI modelURI, final Class<T> cl) { + final ResourceSet rs = new ResourceSetImpl(); + final Resource modelResource = rs.getResource(modelURI, true); + + final List<EObject> resourceContents = modelResource.getContents(); + + if(resourceContents.isEmpty()) { + throw new RuntimeException(String.format("Resource %s is empty.", modelURI)); + } + + if(resourceContents.size() > 1) { + throw new RuntimeException(String.format("Resource %s has to many members.", modelURI)); + } + + final EObject root = resourceContents.get(0); + + try { + return cl.cast(root); + } catch(final ClassCastException e) { + throw new RuntimeException("Loaded object cannot be casted to " + cl.getName(), e); + } + } +} diff --git a/src/core/de.evoal.core.arff/src/test/java/de/evoal/core/arff/utils/ResourceUtils.java b/src/core/de.evoal.core.arff/src/test/java/de/evoal/core/arff/utils/ResourceUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..aff7f2b57c0353daf7d1803b5cf0da585d8c5d90 --- /dev/null +++ b/src/core/de.evoal.core.arff/src/test/java/de/evoal/core/arff/utils/ResourceUtils.java @@ -0,0 +1,49 @@ +package de.evoal.core.arff.utils; + +import org.junit.jupiter.api.io.TempDir; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.InputStream; +import java.nio.file.*; +import java.io.IOException; +import java.net.URL; +import java.nio.file.attribute.FileAttribute; +import java.nio.file.attribute.PosixFileAttributes; +import java.nio.file.attribute.PosixFilePermission; +import java.nio.file.attribute.PosixFilePermissions; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.Set; + +public final class ResourceUtils { + private static Logger log = LoggerFactory.getLogger(ResourceUtils.class); + public static void unpack(final ClassLoader loader, final File destination, final String ... files) throws IOException { + for(final String base : files) { + log.info("Searching for file {}.", base); + final Enumeration<URL> resources = loader.getResources(base); + while(resources.hasMoreElements()) { + final URL resource = resources.nextElement(); + + final Path outputPath = Path.of(destination.toString(), base); + final Set<PosixFilePermission> permissions = new HashSet<>(); + permissions.add(PosixFilePermission.OWNER_READ); + permissions.add(PosixFilePermission.OWNER_WRITE); + permissions.add(PosixFilePermission.OWNER_EXECUTE); + + try { + Files.createDirectory(outputPath.getParent(), PosixFilePermissions.asFileAttribute(permissions)); + } catch(final FileAlreadyExistsException e) { + // ignore + } + + log.info("Copying to {}", outputPath); + + try(final InputStream iStream = resource.openStream()) { + Files.copy(iStream, outputPath, StandardCopyOption.REPLACE_EXISTING); + } + } + } + } +} diff --git a/src/core/de.evoal.core.arff/src/test/resources/simple/input.arff b/src/core/de.evoal.core.arff/src/test/resources/simple/input.arff new file mode 100644 index 0000000000000000000000000000000000000000..5d36ac62ca67243a4f2be8bb0ca4dba73daa1aaa --- /dev/null +++ b/src/core/de.evoal.core.arff/src/test/resources/simple/input.arff @@ -0,0 +1,26 @@ +% 1. Title: Iris Plants Database +% +% 2. Sources: +% (a) Creator: R.A. Fisher +% (b) Donor: Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov) +% (c) Date: July, 1988 +% +@RELATION iris + +@ATTRIBUTE sepallength NUMERIC +@ATTRIBUTE sepalwidth NUMERIC +@ATTRIBUTE petallength NUMERIC +@ATTRIBUTE petalwidth NUMERIC +@ATTRIBUTE class {Iris-setosa,Iris-versicolor,Iris-virginica} + +@DATA +5.1,3.5,1.4,0.2,Iris-setosa +4.9,3.0,1.4,0.2,Iris-setosa +4.7,3.2,1.3,0.2,Iris-setosa +4.6,3.1,1.5,0.2,Iris-setosa +5.0,3.6,1.4,0.2,Iris-setosa +5.4,3.9,1.7,0.4,Iris-setosa +4.6,3.4,1.4,0.3,Iris-setosa +5.0,3.4,1.5,0.2,Iris-setosa +4.4,2.9,1.4,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa \ No newline at end of file diff --git a/src/core/de.evoal.core.arff/src/test/resources/simple/specification.ddl b/src/core/de.evoal.core.arff/src/test/resources/simple/specification.ddl new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/core/de.evoal.core/src/main/java/de/evoal/core/main/Evoal.java b/src/core/de.evoal.core/src/main/java/de/evoal/core/main/Evoal.java index 07913ade960a3d03831e3fa30a5c9a8884718314..5d9da60baebeab9c5b0158efee56a7a2b811f0a6 100644 --- a/src/core/de.evoal.core/src/main/java/de/evoal/core/main/Evoal.java +++ b/src/core/de.evoal.core/src/main/java/de/evoal/core/main/Evoal.java @@ -39,7 +39,7 @@ public final class Evoal { try { main = BeanProvider.getContextualReference(mainName, false, MainClass.class); } catch(final Throwable e) { - logMainError(); + logMainError(e); System.exit(1); } @@ -52,8 +52,9 @@ public final class Evoal { cdiContainer.shutdown(); } - private static void logMainError() { - log.error("Name of main class was not set. Please specify the main class via command line (-BMAIN=<name>)."); + private static void logMainError(final Throwable e) { + log.error("Filed to create main.", e); + log.error("Name of main class was not set correctly. Please specify the main class via command line (-B{}=<name>).", BlackboardEntry.MAIN); Set<Bean<MainClass>> beans = BeanProvider.getBeanDefinitions(MainClass.class, true, true); log.error(" possible names are:"); diff --git a/src/core/de.evoal.core/src/main/java/de/evoal/core/main/producer/BlackboardValueProducer.java b/src/core/de.evoal.core/src/main/java/de/evoal/core/main/producer/BlackboardValueProducer.java index 5a36a78c40d61f1b7400bc93e76bfedd54f3c6cd..31426938dcdbf7eb04d281b8469853a7dd598608 100644 --- a/src/core/de.evoal.core/src/main/java/de/evoal/core/main/producer/BlackboardValueProducer.java +++ b/src/core/de.evoal.core/src/main/java/de/evoal/core/main/producer/BlackboardValueProducer.java @@ -33,16 +33,17 @@ public class BlackboardValueProducer { @BlackboardValue(BlackboardEntry.EA_CONFIGURATION) public String injectStringValue(final InjectionPoint ip, final Blackboard board) { final BlackboardValue value = ip.getAnnotated().getAnnotation(BlackboardValue.class); + final Object result = board.get(value.value()); - return castValue(board.get(value.value())); + return castValue(result); } @Produces @BlackboardValue(BlackboardEntry.EA_CONFIGURATION) public File injectFileValue(final InjectionPoint ip, final Blackboard board) { final BlackboardValue value = ip.getAnnotated().getAnnotation(BlackboardValue.class); - - return castValue(board.get(value.value())); + final Object result = board.get(value.value()); + return new File(result.toString()); } @Produces