Commit 74d639f1 authored by Maxime Lefrançois's avatar Maxime Lefrançois
Browse files

Merge branch 'SalvaBranch2' into 'master'

Added Themis, OOPS and RDFaGenerator Services to clauses 9.3, 9.4.5, 9.5 to the new code

See merge request saref/saref-pipeline!5
parents d1a1595b b2e5c160
Loading
Loading
Loading
Loading
+24 −0
Original line number Original line Diff line number Diff line
@@ -176,6 +176,30 @@
			<version>11</version>
			<version>11</version>
		</dependency>
		</dependency>


		<dependency>
			<groupId>org.apache.any23</groupId>
			<artifactId>apache-any23-core</artifactId>
			<version>2.0</version>
		</dependency>

		<dependency>
			<groupId>org.openrdf.sesame</groupId>
			<artifactId>sesame-rio-api</artifactId>
			<version>4.0.2</version>
		</dependency>

		<dependency>
			<groupId>com.squareup.okhttp3</groupId>
			<artifactId>okhttp</artifactId>
			<version>4.2.2</version>
		</dependency>

		<dependency>
			<groupId>com.opencsv</groupId>
			<artifactId>opencsv</artifactId>
			<version>4.1</version>
		</dependency>

	</dependencies>
	</dependencies>


	<build>
	<build>
+15 −0
Original line number Original line Diff line number Diff line
@@ -32,8 +32,11 @@ import java.nio.file.Path;
import java.util.Optional;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Collectors;


import org.apache.commons.io.FileUtils;

import fr.emse.gitlab.saref.SAREF;
import fr.emse.gitlab.saref.SAREF;
import fr.emse.gitlab.saref.SAREFPipelineException;
import fr.emse.gitlab.saref.SAREFPipelineException;
import fr.emse.gitlab.saref.managers.GenerateRDFaManager;
import fr.emse.gitlab.saref.managers.RepositoryManager;
import fr.emse.gitlab.saref.managers.RepositoryManager;


/**
/**
@@ -61,6 +64,7 @@ public class Clause_9_3_Checker extends AbstractClauseChecker {
		try {
		try {
			checkExists(dir.toPath());
			checkExists(dir.toPath());
			checkFirstLine(dir.toPath());
			checkFirstLine(dir.toPath());
			requirementsRDFaGenerator();
		} catch (IOException ex) {
		} catch (IOException ex) {
			logError(getMessage(MESSAGE.ioexception), ex);
			logError(getMessage(MESSAGE.ioexception), ex);
		}
		}
@@ -117,4 +121,15 @@ public class Clause_9_3_Checker extends AbstractClauseChecker {
		});
		});
	}
	}


	private void requirementsRDFaGenerator() throws SAREFPipelineException, IOException{
		String categoryChanger = "";
		String repoName = project.getName();
		String href = project.getNamespace();
		File reqCSV = new File(repository.getDirectory(), "/requirements/requirements.csv");
		File versionSite = new File(siteManager.siteDir, version.getVersionPath());
		FileUtils.forceMkdir(versionSite);
		File reqHTML = new File(versionSite, "requirements.html");
		GenerateRDFaManager.GenerateRDFa(categoryChanger, repoName, href, reqCSV, reqHTML, "requirements");
	}

}
}
+84 −5
Original line number Original line Diff line number Diff line
@@ -25,9 +25,14 @@
 */
 */
package fr.emse.gitlab.saref.checkers;
package fr.emse.gitlab.saref.checkers;


import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Collectors;


import org.apache.jena.rdf.model.Model;
import org.semanticweb.owl.explanation.api.Explanation;
import org.semanticweb.owl.explanation.api.Explanation;
import org.semanticweb.owl.explanation.api.ExplanationGenerator;
import org.semanticweb.owl.explanation.api.ExplanationGenerator;
import org.semanticweb.owlapi.model.OWLAxiom;
import org.semanticweb.owlapi.model.OWLAxiom;
@@ -37,7 +42,13 @@ import org.semanticweb.owlapi.profiles.OWLProfileReport;


import fr.emse.gitlab.saref.SAREFPipelineException;
import fr.emse.gitlab.saref.SAREFPipelineException;
import fr.emse.gitlab.saref.managers.OntologyManager;
import fr.emse.gitlab.saref.managers.OntologyManager;
import fr.emse.gitlab.saref.managers.OopsManager;
import fr.emse.gitlab.saref.managers.RepositoryManager;
import fr.emse.gitlab.saref.managers.RepositoryManager;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;


/**
/**
 * Checks TS 103 673 Clause 9.4.5: OWL Profile, Consistency, and Satisfiability
 * Checks TS 103 673 Clause 9.4.5: OWL Profile, Consistency, and Satisfiability
@@ -47,7 +58,7 @@ import fr.emse.gitlab.saref.managers.RepositoryManager;
public class Clause_9_4_5_Checker extends AbstractClauseChecker {
public class Clause_9_4_5_Checker extends AbstractClauseChecker {


	private static enum MESSAGE {
	private static enum MESSAGE {
		profile, consistent, satisfiable;
		profile, consistent, satisfiable, oops, oopsError;
	}
	}


	/**
	/**
@@ -92,6 +103,74 @@ public class Clause_9_4_5_Checker extends AbstractClauseChecker {
				}
				}
			});
			});
		}
		}
		checkOops();
	}

	public void checkOops() throws SAREFPipelineException {

		ByteArrayOutputStream out = new ByteArrayOutputStream();
		String onto = "";

		Model model = version.getModel();
		model.write(out, "RDF/XML"); // write in string and then replace
		onto = out.toString().replaceAll("]]", "] ]");

		String xmlRequest = "<?xml version='1.0' encoding='UTF-8'?>" + "<OOPSRequest>" + "<OntologyURI></OntologyURI>"
				+ "<OntologyContent><![CDATA[" + onto + "]]></OntologyContent>" + "<Pitfalls>10</Pitfalls>"
				+ "<OutputFormat>RDF/XML</OutputFormat>" + "</OOPSRequest>";

		Object[] arrayData = new Object[0];

		try {

			OkHttpClient httpClient = new OkHttpClient().newBuilder().build();

			MediaType mediaType = MediaType.parse("application/xml");

			RequestBody body = RequestBody.create(xmlRequest, mediaType);

			Request request = new Request.Builder().url("http://oops.linkeddata.es/rest").method("POST", body)
					.addHeader("Content-Type", "application/xml").build();

			Response response = httpClient.newCall(request).execute();

			String result = response.body().string();

			String[] results = result.split("\\n");
			List<String> pureData = new ArrayList<String>();
			for (int i = 0; i < results.length; i++) {
				if (results[i].startsWith("<")) {
					for (int j = i; j < results.length; j++) {
						pureData.add(results[j]);
					}
				}
			}

			arrayData = pureData.toArray(); // response into array

		} catch (IOException e) {
			logWarning(getMessage(MESSAGE.oopsError));
		}

		int count = OopsManager.counter(arrayData);

		ArrayList<ArrayList<String>> result = OopsManager.getData(arrayData);

		int s = 0;

		ArrayList<String> results = new ArrayList<String>();

		while (s < count) {
			String data = result.get(0).get(s) + result.get(1).get(s) + result.get(2).get(s);
			results.add(data);
			s++;
		}

		String printData = results.stream().map(e -> e.toString())
				.collect(Collectors.joining("\n- ", "\n\n- ", "\n\n"));
		if (count != 0) {
			logWarning(getMessage(MESSAGE.oops, printData));
		}
	}
	}


}
}
+127 −5
Original line number Original line Diff line number Diff line
@@ -25,17 +25,42 @@
 */
 */
package fr.emse.gitlab.saref.checkers;
package fr.emse.gitlab.saref.checkers;


import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.File;
import java.io.IOException;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Path;
import java.nio.file.PathMatcher;
import java.nio.file.PathMatcher;
import java.util.ArrayList;
import java.util.Optional;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Collectors;


import org.apache.any23.Any23;
import org.apache.any23.extractor.ExtractionException;
import org.apache.any23.source.DocumentSource;
import org.apache.any23.source.FileDocumentSource;
import org.apache.any23.writer.RDFXMLWriter;
import org.apache.any23.writer.TripleHandler;
import org.apache.any23.writer.TripleHandlerException;
import org.apache.commons.io.FileUtils;
import org.apache.jena.rdf.model.Model;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import fr.emse.gitlab.saref.SAREFPipelineException;
import fr.emse.gitlab.saref.SAREFPipelineException;
import fr.emse.gitlab.saref.entities.SAREFRepository;
import fr.emse.gitlab.saref.entities.SAREFVersion;
import fr.emse.gitlab.saref.managers.DatasetManager;
import fr.emse.gitlab.saref.managers.GenerateRDFaManager;
import fr.emse.gitlab.saref.managers.RepositoryManager;
import fr.emse.gitlab.saref.managers.RepositoryManager;
import fr.emse.gitlab.saref.managers.ThemisManager;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;


/**
/**
 * Checks TS 103 673 Clause 9.5: Ontology tests
 * Checks TS 103 673 Clause 9.5: Ontology tests
@@ -47,7 +72,7 @@ public class Clause_9_5_Checker extends AbstractClauseChecker {
	private static final String FIRST_LINE = "Id;Requirement;Category;Test";
	private static final String FIRST_LINE = "Id;Requirement;Category;Test";


	private static enum MESSAGE {
	private static enum MESSAGE {
		directories, csv, missing, ioexception, line;
		directories, csv, missing, ioexception, line, themis, themisError;
	}
	}


	/**
	/**
@@ -67,6 +92,8 @@ public class Clause_9_5_Checker extends AbstractClauseChecker {
		try {
		try {
			checkExists(dir.toPath());
			checkExists(dir.toPath());
			checkFirstLine(dir.toPath());
			checkFirstLine(dir.toPath());
			testsRDFaGenerator();
			checkThemis();
		} catch (IOException ex) {
		} catch (IOException ex) {
			logError(getMessage(MESSAGE.ioexception));
			logError(getMessage(MESSAGE.ioexception));
		}
		}
@@ -123,4 +150,99 @@ public class Clause_9_5_Checker extends AbstractClauseChecker {
		});
		});
	}
	}


	public void checkThemis() throws SAREFPipelineException {
		File versionSite = new File(siteManager.siteDir, version.getVersionPath());
		File tHTML = new File(versionSite, "tests.html");
		DocumentSource source = new FileDocumentSource(tHTML);
		Any23 runner = new Any23();
		try(ByteArrayOutputStream out = new ByteArrayOutputStream(); TripleHandler handler = new RDFXMLWriter(out);) {
			runner.extract(source, handler);

			String xmlData = out.toString();

			ArrayList<String[]> res = makeCall(xmlData, repository, datasetManager, version);

			ArrayList<String> result = new ArrayList<String>();

			for (int i = 0; i < res.size(); i++) {
				String response = res.get(i)[0] + ", " + res.get(i)[1] + ", " + res.get(i)[2];
				result.add(response);
			}

			if (!res.isEmpty()) {
				String data = result.stream().map(e -> e.toString()).collect(Collectors.joining("\n- ", "\n\n- ", "\n\n"));
				logWarning(getMessage(MESSAGE.themis, data));
			}

		} catch (ExtractionException | IOException | TripleHandlerException e) {
			logWarning(getMessage(MESSAGE.themisError));
		}
	}

	public ArrayList<String[]> makeCall(String xmlData, SAREFRepository repository, DatasetManager datasetManager,
			SAREFVersion version) throws SAREFPipelineException {

		ArrayList<String[]> res = new ArrayList<String[]>();
		try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
			String onto = "";

			Model model = version.getModel();
			model.write(out, "RDF/XML");
			onto = out.toString();

			OkHttpClient httpClient = new OkHttpClient().newBuilder().build();

			MediaType mediaType = MediaType.parse("application/json");

			String jsonRequest = "{\"ontologiesCode\":[\""
					+ onto.replaceAll("\\\"", "\\\\\"").replaceAll("\"", "\\\"").replaceAll("\t", " ") + "\"],"
					+ "\"testfile\":[\"" + xmlData.replaceAll("\\\"", "\\\\\"").replaceAll("\"", "\\\"").replaceAll("\t", " ")
					+ "\"]," + "\"format\":\"junit\"}";

			RequestBody body = RequestBody.create(jsonRequest, mediaType);

			Request request = new Request.Builder().url("http://themis.linkeddata.es/rest/api/results")
					.method("POST", body).addHeader("accept", "application/json")
					.addHeader("Content-Type", "application/json").build();

			Response response = httpClient.newCall(request).execute();

			String result = response.body().string();

			Document doc = ThemisManager.convertStringToXMLDocument(result);

			NodeList nodeList = doc.getElementsByTagName("testcase");
			for (int temp = 0; temp < nodeList.getLength(); temp++) {
				org.w3c.dom.Node node = nodeList.item(temp);
				String[] part = new String[3];
				if (node.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) {
					Element element = (Element) node;
					part[0] = "" + element.getAttributeNode("id");
					part[1] = "" + element.getAttributeNode("name");
					part[2] = "" + ((Element) node).getElementsByTagName("error").item(0).getAttributes()
							.getNamedItem("message");

					res.add(part);
				}
			}
		} catch (IOException e) {
			logWarning(getMessage(MESSAGE.themisError));
		}
		return res;
	}

	private void testsRDFaGenerator() throws SAREFPipelineException, IOException {
		if(pipeline.ignoreSite) {
			return;
		}
		String categoryChanger = "";
		String repoName = project.getName();
		String href = project.getNamespace();
		File testCSV = new File(repository.getDirectory(), "/tests/tests.csv");
		File versionSite = new File(siteManager.siteDir, version.getVersionPath());
		FileUtils.forceMkdir(versionSite);
		File testHTML = new File(versionSite, "tests.html");
		GenerateRDFaManager.GenerateRDFa(categoryChanger, repoName, href, testCSV, testHTML, "tests");
	}

}
}
+1 −1
Original line number Original line Diff line number Diff line
@@ -45,7 +45,7 @@ public class SAREFNamedGraph {
			return false;
			return false;
		if (getClass() != obj.getClass())
		if (getClass() != obj.getClass())
			return false;
			return false;
		SAREFTerm other = (SAREFTerm) obj;
		SAREFNamedGraph other = (SAREFNamedGraph) obj;
		if (iri == null) {
		if (iri == null) {
			if (other.iri != null)
			if (other.iri != null)
				return false;
				return false;
Loading