diff --git a/org.eclipse.rdf4j.jaxrs/org.eclipse.rdf4j/org.eclipse.rdf4j.jaxrs/src/main/java/org/eclipse/rdf4j/http/server/repository/RepositoryController.java b/org.eclipse.rdf4j.jaxrs/org.eclipse.rdf4j/org.eclipse.rdf4j.jaxrs/src/main/java/org/eclipse/rdf4j/http/server/repository/RepositoryController.java index 12472e4..2b1f95b 100644 --- a/org.eclipse.rdf4j.jaxrs/org.eclipse.rdf4j/org.eclipse.rdf4j.jaxrs/src/main/java/org/eclipse/rdf4j/http/server/repository/RepositoryController.java +++ b/org.eclipse.rdf4j.jaxrs/org.eclipse.rdf4j/org.eclipse.rdf4j.jaxrs/src/main/java/org/eclipse/rdf4j/http/server/repository/RepositoryController.java @@ -7,14 +7,10 @@ *******************************************************************************/ package org.eclipse.rdf4j.http.server.repository; -import java.io.ByteArrayInputStream; + import java.io.IOException; -import java.io.InputStream; -import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.Map; - -import javax.servlet.http.HttpServletRequest; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.FormParam; @@ -28,32 +24,26 @@ import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Context; import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; - -import org.apache.http.HttpStatus; -import org.apache.http.util.ByteArrayBuffer; +import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST; +import static javax.servlet.http.HttpServletResponse.SC_SERVICE_UNAVAILABLE; import org.eclipse.rdf4j.RDF4JException; +import org.eclipse.rdf4j.common.lang.FileFormat; +import org.eclipse.rdf4j.common.lang.service.FileFormatServiceRegistry; import org.eclipse.rdf4j.http.protocol.Protocol; +import org.eclipse.rdf4j.http.server.ClientHTTPException; import org.eclipse.rdf4j.http.server.HTTPException; import org.eclipse.rdf4j.http.server.ServerHTTPException; -import org.eclipse.rdf4j.model.IRI; -import org.eclipse.rdf4j.model.Model; -import org.eclipse.rdf4j.model.ValueFactory; -import org.eclipse.rdf4j.repository.Repository; -import org.eclipse.rdf4j.repository.RepositoryConnection; -import org.eclipse.rdf4j.repository.RepositoryException; +import org.eclipse.rdf4j.query.BooleanQuery; +import org.eclipse.rdf4j.query.Query; +import org.eclipse.rdf4j.query.QueryEvaluationException; +import org.eclipse.rdf4j.query.QueryInterruptedException; +import org.eclipse.rdf4j.query.QueryLanguage; +import org.eclipse.rdf4j.query.resultio.BooleanQueryResultWriterRegistry; import org.eclipse.rdf4j.repository.config.ConfigTemplate; import org.eclipse.rdf4j.repository.config.RepositoryConfig; -import org.eclipse.rdf4j.repository.config.RepositoryConfigUtil; - import org.eclipse.rdf4j.repository.manager.RepositoryManager; -import org.eclipse.rdf4j.repository.manager.SystemRepository; -import org.eclipse.rdf4j.rio.RDFFormat; -import org.eclipse.rdf4j.rio.RDFParseException; -import org.eclipse.rdf4j.rio.Rio; -import org.eclipse.rdf4j.rio.UnsupportedRDFormatException; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; import org.slf4j.Logger; @@ -74,6 +64,7 @@ public class RepositoryController { @Reference private RepositoryManager repositoryManager; + public RepositoryController() { System.out.println("Init RepositoryController"); @@ -82,16 +73,43 @@ public RepositoryController() { @GET @Path("/repositories/{repId}") @Produces({"application/json", "application/sparql-results+json"}) - public boolean get(@Context UriInfo uriInfo, @PathParam("repId") String repId, - @QueryParam("query") String query, @QueryParam("queryLn") String queryLn, + public Query get(@Context UriInfo uriInfo, @PathParam("repId") String repId, + @QueryParam("query") Query query, @QueryParam("queryLn") QueryLanguage queryLn, @QueryParam("queryLn") String infer, @QueryParam("queryLn") String timeout, - @QueryParam("queryLn") String distinct, @QueryParam("queryLn") String limit, - @QueryParam("queryLn") String offset) throws WebApplicationException { + @QueryParam("queryLn") boolean distinct, @QueryParam("queryLn") long limit, + @QueryParam("queryLn") long offset) throws WebApplicationException, IOException, HTTPException { System.out.println("RepositoryController.get"); System.out.println("repId=" + repId); System.out.println("query=" + query); - return true; + boolean headersOnly = false; + Object queryResult = null; + FileFormatServiceRegistry registry; + + try { + if (query instanceof BooleanQuery) { + BooleanQuery bQuery = (BooleanQuery) query; + queryResult = headersOnly ? null : bQuery.evaluate(); + registry = BooleanQueryResultWriterRegistry.getInstance(); + } + else { + throw new ClientHTTPException(SC_BAD_REQUEST, + "Unsupported query type: " + query.getClass().getName()); + } + } + catch (QueryInterruptedException e) { + throw new ServerHTTPException(SC_SERVICE_UNAVAILABLE, "Query evaluation took too long"); + } + catch (QueryEvaluationException e) { + if (e.getCause() != null && e.getCause() instanceof HTTPException) { + throw (HTTPException) e.getCause(); + } + else { + throw new ServerHTTPException("Query evaluation error: " + e.getMessage()); + } + } + + return (Query) queryResult; } diff --git a/org.eclipse.rdf4j.jaxrs/org.eclipse.rdf4j/org.eclipse.rdf4j.jaxrs/src/test/java/com/example/myproject/test/olegger_test.java b/org.eclipse.rdf4j.jaxrs/org.eclipse.rdf4j/org.eclipse.rdf4j.jaxrs/src/test/java/com/example/myproject/test/olegger_test.java new file mode 100644 index 0000000..5abc9ca --- /dev/null +++ b/org.eclipse.rdf4j.jaxrs/org.eclipse.rdf4j/org.eclipse.rdf4j.jaxrs/src/test/java/com/example/myproject/test/olegger_test.java @@ -0,0 +1,140 @@ +package com.example.myproject.test; + +import static org.junit.Assert.*; +import static org.ops4j.pax.exam.CoreOptions.*; + +import javax.inject.Inject; +import javax.servlet.http.HttpServletRequest; + +import jdk.nashorn.internal.ir.annotations.Reference; +import shaded.org.apache.commons.io.IOUtils; + +import org.eclipse.rdf4j.http.server.repository.RepositoryConfigController; +import org.eclipse.rdf4j.http.server.repository.RepositoryController; +import org.eclipse.rdf4j.http.server.transaction.ActiveTransactionRegistry; +import org.eclipse.rdf4j.http.server.transaction.TransactionQuery; +import org.eclipse.rdf4j.model.Model; +import org.eclipse.rdf4j.model.util.ModelBuilder; +import org.eclipse.rdf4j.model.vocabulary.FOAF; +import org.eclipse.rdf4j.model.vocabulary.RDF; +import org.eclipse.rdf4j.query.Update; +import org.eclipse.rdf4j.repository.Repository; +import org.eclipse.rdf4j.repository.RepositoryConnection; +import org.eclipse.rdf4j.repository.RepositoryException; +import org.eclipse.rdf4j.repository.config.ConfigTemplate; +import org.eclipse.rdf4j.repository.config.RepositoryConfig; +import org.eclipse.rdf4j.repository.manager.RepositoryManager; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.ops4j.pax.exam.Configuration; +import org.ops4j.pax.exam.Option; +import org.ops4j.pax.exam.junit.PaxExam; +import org.ops4j.pax.exam.karaf.options.LogLevelOption; +import org.ops4j.pax.exam.options.MavenArtifactUrlReference; +import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy; +import org.ops4j.pax.exam.spi.reactors.PerClass; +import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.features; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.Reader; +import java.io.StringReader; +import java.io.StringWriter; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.ProtocolException; +import java.net.URL; +import java.net.URLConnection; +import java.util.HashMap; +import java.util.Map; +import java.util.Scanner; +import java.util.Vector; +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; + +import org.apache.karaf.itests.KarafTestSupport; +import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.*; + + +@RunWith(PaxExam.class) +@ExamReactorStrategy(PerClass.class) +public class olegger_test extends KarafTestSupport { + + //@Inject + //private RepositoryManager manager; + + @Override + @Configuration + public Option[] config() { + MavenArtifactUrlReference karafUrl = maven().groupId("org.apache.karaf").artifactId("apache-karaf").versionAsInProject().type("tar.gz"); + + String httpPort = "8181"; + String rmiRegistryPort = Integer.toString(getAvailablePort(Integer.parseInt(MIN_RMI_REG_PORT), Integer.parseInt(MAX_RMI_REG_PORT))); + String rmiServerPort = Integer.toString(getAvailablePort(Integer.parseInt(MIN_RMI_SERVER_PORT), Integer.parseInt(MAX_RMI_SERVER_PORT))); + String sshPort = Integer.toString(getAvailablePort(Integer.parseInt(MIN_SSH_PORT), Integer.parseInt(MAX_SSH_PORT))); + String localRepository = System.getProperty("org.ops4j.pax.url.mvn.localRepository"); + if (localRepository == null) { + localRepository = ""; + } + + return new Option[] { + //KarafDistributionOption.debugConfiguration("8889", true), + karafDistributionConfiguration().frameworkUrl(karafUrl).name("Apache Karaf").unpackDirectory(new File("target/exam")), + // enable JMX RBAC security, thanks to the KarafMBeanServerBuilder + configureSecurity().disableKarafMBeanServerBuilder(), + keepRuntimeFolder(), + logLevel(LogLevelOption.LogLevel.INFO), + mavenBundle().groupId("org.awaitility").artifactId("awaitility").versionAsInProject(), + mavenBundle().groupId("org.apache.servicemix.bundles").artifactId("org.apache.servicemix.bundles.hamcrest").versionAsInProject(), + mavenBundle().groupId("org.apache.karaf.itests").artifactId("common").versionAsInProject(), + features(maven().groupId("ru.agentlab.rdf4j.server") + .artifactId("ru.agentlab.rdf4j.server.features").type("xml") + .version("0.0.1-SNAPSHOT"), "org.eclipse.rdf4j.jaxrs"), + junitBundles(), + editConfigurationFilePut("etc/org.ops4j.pax.web.cfg", "org.osgi.service.http.port", httpPort), + editConfigurationFilePut("etc/org.apache.karaf.management.cfg", "rmiRegistryPort", rmiRegistryPort), + editConfigurationFilePut("etc/org.apache.karaf.management.cfg", "rmiServerPort", rmiServerPort), + editConfigurationFilePut("etc/org.apache.karaf.shell.cfg", "sshPort", sshPort), + editConfigurationFilePut("etc/org.ops4j.pax.url.mvn.cfg", "org.ops4j.pax.url.mvn.localRepository", localRepository) + }; + } + + + @Test + public void getQueryTest1() throws Exception { + + URL url = new URL("http://localhost:8181/rdf4j2-server/repositories/rpotest?query=ask%20{?s%20?p%20?o}"); + URLConnection conn = url.openConnection(); + InputStream inputStream = conn.getInputStream(); + + StringWriter writer = new StringWriter(); + IOUtils.copy(inputStream, writer, "UTF-8"); + String line = writer.toString(); + + if (line.contains("false")) { + fail("Запрос не выполнен"); + } + + } + + @Test + public void getQueryTest2() throws Exception { + + URL url = new URL("http://localhost:8181/rdf4j2-server/repositories/rpotest?query=ask%20{?s%20?p%20?o}"); + URLConnection conn = url.openConnection(); + InputStream inputStream = conn.getInputStream(); + + StringWriter writer = new StringWriter(); + IOUtils.copy(inputStream, writer, "UTF-8"); + String line = writer.toString(); + + if (line.contains("true")) { + fail("Запрос выполнен, но не должен был"); + } + } +} \ No newline at end of file