MARMOTTA-556: fixed some important details
Project: http://git-wip-us.apache.org/repos/asf/marmotta/repo Commit: http://git-wip-us.apache.org/repos/asf/marmotta/commit/f89825a8 Tree: http://git-wip-us.apache.org/repos/asf/marmotta/tree/f89825a8 Diff: http://git-wip-us.apache.org/repos/asf/marmotta/diff/f89825a8 Branch: refs/heads/MARMOTTA-556 Commit: f89825a8b6993389d8e927cd1d0844ef1a6b8a64 Parents: f935531 Author: Sergio Fernández <[email protected]> Authored: Tue Oct 28 09:05:10 2014 +0100 Committer: Sergio Fernández <[email protected]> Committed: Tue Oct 28 09:05:10 2014 +0100 ---------------------------------------------------------------------- .../platform/ldf/services/LdfServiceImpl.java | 118 ++++++++++--------- .../ldf/webservices/LdfWebServiceTest.java | 19 +-- 2 files changed, 71 insertions(+), 66 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/marmotta/blob/f89825a8/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java ---------------------------------------------------------------------- diff --git a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java index 09a4dc8..d6fac6c 100644 --- a/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java +++ b/platform/marmotta-ldf/src/main/java/org/apache/marmotta/platform/ldf/services/LdfServiceImpl.java @@ -114,70 +114,82 @@ public class LdfServiceImpl implements LdfService { @Override public Model getFragment(URI subject, URI predicate, Value object, Resource context, int page) throws RepositoryException, IllegalArgumentException { final RepositoryConnection conn = sesameService.getConnection(); - conn.begin(); - - //first get the triple fragment for ordering by a fixed criteria - //TODO: do this effectively - final RepositoryResult<Statement> results = conn.getStatements(subject, predicate, object, true, context); - final List<Statement> statements = FluentIterable.from(ResultUtils.iterable(results)).toSortedList(new Comparator<Statement>() { - @Override - public int compare(Statement s1, Statement s2) { - int subjectComparison = s1.getSubject().stringValue().compareTo(s2.getSubject().stringValue()); - int predicatedComparison = s1.getPredicate().stringValue().compareTo(s2.getPredicate().stringValue()); - if (subjectComparison != 0) { - return subjectComparison; - } else if (predicatedComparison != 0) { - return predicatedComparison; - } else if ((s1.getObject() instanceof Literal) && (s2.getObject() instanceof Resource)) { - return 1; - } else if ((s1.getObject() instanceof Resource) && (s2.getObject() instanceof Literal)) { - return -1; - } else { - return s1.getObject().stringValue().compareTo(s2.getObject().stringValue()); + final List<Statement> statements; + try { + conn.begin(); + + //first get the triple fragment for ordering by a fixed criteria + //TODO: do this effectively + final RepositoryResult<Statement> results = conn.getStatements(subject, predicate, object, true, context); + statements = FluentIterable.from(ResultUtils.iterable(results)).toSortedList(new Comparator<Statement>() { + @Override + public int compare(Statement s1, Statement s2) { + int subjectComparison = s1.getSubject().stringValue().compareTo(s2.getSubject().stringValue()); + int predicatedComparison = s1.getPredicate().stringValue().compareTo(s2.getPredicate().stringValue()); + if (subjectComparison != 0) { + return subjectComparison; + } else if (predicatedComparison != 0) { + return predicatedComparison; + } else if ((s1.getObject() instanceof Literal) && (s2.getObject() instanceof Resource)) { + return 1; + } else if ((s1.getObject() instanceof Resource) && (s2.getObject() instanceof Literal)) { + return -1; + } else { + return s1.getObject().stringValue().compareTo(s2.getObject().stringValue()); + } } + }); + if (!results.isClosed()) { + //ResultUtils in theory closes the RepositoryResult connection... + results.close(); } - }); - //ResultUtils takes care of closing the connection when consuming the RepositoryResult - //then filter - final int size = statements.size(); - final int offset = LdfService.PAGE_SIZE * (page - 1); + //then filter + final int size = statements.size(); + final int offset = LdfService.PAGE_SIZE * (page - 1); - if (offset > size) { - throw new IllegalArgumentException("page " + page + " can't be generated, empty fragment"); - } + if (offset > size) { + throw new IllegalArgumentException("page " + page + " can't be generated, empty fragment"); + } - final Model model = new TreeModel(); - final ValueFactoryImpl vf = new ValueFactoryImpl(); + final Model model = new TreeModel(); + final ValueFactoryImpl vf = new ValueFactoryImpl(); - final int limit = LdfService.PAGE_SIZE < size - offset ? LdfService.PAGE_SIZE : size - offset; - List<Statement> filteredStatements = statements.subList(offset, limit); - if (filteredStatements.isEmpty()) { - throw new IllegalArgumentException("empty fragment"); - } + final int limit = LdfService.PAGE_SIZE < size - offset ? LdfService.PAGE_SIZE : size - offset; + List<Statement> filteredStatements = statements.subList(offset, limit); + if (filteredStatements.isEmpty()) { + throw new IllegalArgumentException("empty fragment"); + } - //add the fragment - model.addAll(filteredStatements); + //add the fragment + model.addAll(filteredStatements); - //and add ldf metadata - Resource dataset = context != null ? context : vf.createBNode(); - model.add(dataset, RDF.TYPE, VOID.Dataset); - model.add(dataset, RDF.TYPE, HYDRA.Collection); + //and add ldf metadata + Resource dataset = context != null ? context : vf.createBNode(); + model.add(dataset, RDF.TYPE, VOID.Dataset); + model.add(dataset, RDF.TYPE, HYDRA.Collection); - Resource fragment = vf.createBNode(); //TODO - model.add(dataset, VOID.subset, fragment); - model.add(fragment, RDF.TYPE, HYDRA.Collection); - if (offset != 0 && limit != size) { - model.add(fragment, RDF.TYPE, HYDRA.PagedCollection); - } - model.add(fragment, VOID.triples, vf.createLiteral(Integer.toString(filteredStatements.size()), XSD.Integer)); - model.add(fragment, HYDRA.totalItems, vf.createLiteral(Integer.toString(filteredStatements.size()), XSD.Integer)); - model.add(fragment, HYDRA.itemsPerPage, vf.createLiteral(Integer.toString(LdfService.PAGE_SIZE), XSD.Integer)); - //TODO: HYDRA_FIRSTPAGE, HYDRA_PREVIOUSPAGE, HYDRA_NEXTPAGE + Resource fragment = vf.createBNode(); //TODO + model.add(dataset, VOID.subset, fragment); + model.add(fragment, RDF.TYPE, HYDRA.Collection); + if (offset != 0 && limit != size) { + model.add(fragment, RDF.TYPE, HYDRA.PagedCollection); + } + model.add(fragment, VOID.triples, vf.createLiteral(Integer.toString(filteredStatements.size()), XSD.Integer)); + model.add(fragment, HYDRA.totalItems, vf.createLiteral(Integer.toString(filteredStatements.size()), XSD.Integer)); + model.add(fragment, HYDRA.itemsPerPage, vf.createLiteral(Integer.toString(LdfService.PAGE_SIZE), XSD.Integer)); + //TODO: HYDRA_FIRSTPAGE, HYDRA_PREVIOUSPAGE, HYDRA_NEXTPAGE + + //TODO: hydra controls - //TODO: hydra controls + return model; - return model; + } finally { + conn.commit(); + if(conn.isOpen()) { + conn.close(); + } + } } http://git-wip-us.apache.org/repos/asf/marmotta/blob/f89825a8/platform/marmotta-ldf/src/test/java/org/apache/marmotta/platform/ldf/webservices/LdfWebServiceTest.java ---------------------------------------------------------------------- diff --git a/platform/marmotta-ldf/src/test/java/org/apache/marmotta/platform/ldf/webservices/LdfWebServiceTest.java b/platform/marmotta-ldf/src/test/java/org/apache/marmotta/platform/ldf/webservices/LdfWebServiceTest.java index 05be6ed..d37d6e0 100644 --- a/platform/marmotta-ldf/src/test/java/org/apache/marmotta/platform/ldf/webservices/LdfWebServiceTest.java +++ b/platform/marmotta-ldf/src/test/java/org/apache/marmotta/platform/ldf/webservices/LdfWebServiceTest.java @@ -36,7 +36,7 @@ public class LdfWebServiceTest { @BeforeClass public static void setUp() { - marmotta = new JettyMarmotta("/marmotta", LdfWebService.class, ContextWebService.class); + marmotta = new JettyMarmotta("/marmotta", LdfWebService.class); RestAssured.baseURI = "http://localhost"; RestAssured.port = marmotta.getPort(); @@ -59,10 +59,6 @@ public class LdfWebServiceTest { @Test public void testFragment() throws IOException, InterruptedException, URISyntaxException, MarmottaImportException { - final ImportService importService = marmotta.getService(ImportService.class); - final ContextService contextService = marmotta.getService(ContextService.class); - final ConfigurationService configurationService = marmotta.getService(ConfigurationService.class); - final String ctx = RandomStringUtils.random(8, true, false); final String uri = "http://www.wikier.org/foaf#wikier"; @@ -73,14 +69,11 @@ public class LdfWebServiceTest { get(LdfWebService.PATH + "/" + ctx); // 2. import some data - final InputStream is = this.getClass().getClassLoader().getResourceAsStream("/wikier.rdf"); - expect(). - statusCode(200). - given(). - body(IOUtils.toString(is)). - header("Content-Type", "application/rdf+xml"). - when(). - post(configurationService.getBaseContext() + ctx); + final ConfigurationService configurationService = marmotta.getService(ConfigurationService.class); + final ImportService importService = marmotta.getService(ImportService.class); + final InputStream is = this.getClass().getClassLoader().getResourceAsStream("wikier.rdf"); + final ValueFactoryImpl vf = new ValueFactoryImpl(); + importService.importData(is, "application/rdf+xml", null, vf.createURI(configurationService.getBaseContext() + ctx)); // 3. request a fragment expect().
