View Javadoc
1   /**
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements. See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership. The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *     http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
17   */
18  package org.apache.commons.rdf.rdf4j.impl;
19  
20  import java.util.Collections;
21  import java.util.ConcurrentModificationException;
22  import java.util.Iterator;
23  import java.util.Optional;
24  import java.util.Set;
25  import java.util.stream.Stream;
26  
27  import org.apache.commons.rdf.api.BlankNodeOrIRI;
28  import org.apache.commons.rdf.api.IRI;
29  import org.apache.commons.rdf.api.RDFTerm;
30  import org.apache.commons.rdf.api.Triple;
31  import org.apache.commons.rdf.rdf4j.ClosableIterable;
32  import org.apache.commons.rdf.rdf4j.RDF4JBlankNodeOrIRI;
33  import org.apache.commons.rdf.rdf4j.RDF4JGraph;
34  import org.apache.commons.rdf.rdf4j.RDF4J;
35  import org.apache.commons.rdf.rdf4j.RDF4JTriple;
36  import org.eclipse.rdf4j.model.Model;
37  import org.eclipse.rdf4j.model.Resource;
38  import org.eclipse.rdf4j.repository.Repository;
39  
40  @SuppressWarnings("PMD.UnnecessaryFullyQualifiedName") // we use fully-qualified names for clarity
41  final class ModelGraphImpl implements RDF4JGraph {
42  
43      private final Model model;
44      private final RDF4J rdf4jTermFactory;
45  
46      ModelGraphImpl(final Model model, final RDF4J rdf4jTermFactory) {
47          this.model = model;
48          this.rdf4jTermFactory = rdf4jTermFactory;
49      }
50  
51      @Override
52      public void add(final BlankNodeOrIRI subject, final org.apache.commons.rdf.api.IRI predicate, final RDFTerm object) {
53          model.add((Resource) rdf4jTermFactory.asValue(subject),
54                  (org.eclipse.rdf4j.model.IRI) rdf4jTermFactory.asValue(predicate), rdf4jTermFactory.asValue(object));
55      }
56  
57      @Override
58      public void add(final Triple triple) {
59          model.add(rdf4jTermFactory.asStatement(triple));
60      }
61  
62      @Override
63      public Optional<Model> asModel() {
64          return Optional.of(model);
65      }
66  
67      @Override
68      public Optional<Repository> asRepository() {
69          return Optional.empty();
70      }
71  
72      @Override
73      public void clear() {
74          model.clear();
75      }
76  
77      @Override
78      public boolean contains(final BlankNodeOrIRI subject, final org.apache.commons.rdf.api.IRI predicate, final RDFTerm object) {
79          return model.contains((Resource) rdf4jTermFactory.asValue(subject),
80                  (org.eclipse.rdf4j.model.IRI) rdf4jTermFactory.asValue(predicate), rdf4jTermFactory.asValue(object));
81      }
82  
83      @Override
84      public boolean contains(final Triple triple) {
85          return model.contains(rdf4jTermFactory.asStatement(triple));
86      }
87  
88      @Override
89      public void remove(final BlankNodeOrIRI subject, final org.apache.commons.rdf.api.IRI predicate, final RDFTerm object) {
90          model.remove((Resource) rdf4jTermFactory.asValue(subject),
91                  (org.eclipse.rdf4j.model.IRI) rdf4jTermFactory.asValue(predicate), rdf4jTermFactory.asValue(object));
92      }
93  
94      @Override
95      public void remove(final Triple triple) {
96          model.remove(rdf4jTermFactory.asStatement(triple));
97      }
98  
99      @Override
100     public long size() {
101         final int size = model.size();
102         if (size < Integer.MAX_VALUE) {
103             return size;
104         }
105         // TODO: Check if this can really happen with RDF4J models
106         // Collection.size() can't help us, we'll have to count
107         return model.parallelStream().count();
108     }
109 
110     @Override
111     public Stream<RDF4JTriple> stream() {
112         return model.parallelStream().map(rdf4jTermFactory::asTriple);
113     }
114 
115     @Override
116     public Stream<RDF4JTriple> stream(final BlankNodeOrIRI subject, final org.apache.commons.rdf.api.IRI predicate,
117             final RDFTerm object) {
118         return model.filter((Resource) rdf4jTermFactory.asValue(subject),
119                 (org.eclipse.rdf4j.model.IRI) rdf4jTermFactory.asValue(predicate), rdf4jTermFactory.asValue(object))
120                 .parallelStream().map(rdf4jTermFactory::asTriple);
121     }
122 
123     @Override
124     public Set<RDF4JBlankNodeOrIRI> getContextMask() {
125         // ModelGraph always do the unionGraph
126         return Collections.emptySet();
127         // TODO: Should we support contextMask like in RepositoryGraphImpl?
128     }
129 
130     @Override
131     public ClosableIterable<Triple> iterate(final BlankNodeOrIRI subject, final IRI predicate, final RDFTerm object) {
132         return new ClosableIterable<Triple>() {
133             @SuppressWarnings("unchecked")
134             @Override
135             public Iterator<Triple> iterator() {
136                 // double-cast to fight Java generics..
137                 final Stream<? extends Triple> s = stream(subject, predicate, object);
138                 return (Iterator<Triple>) s.iterator();
139             }
140 
141             @Override
142             public void close() throws Exception {
143                 // no-op as Model don't have transaction
144             }
145         };
146     }
147 
148     @Override
149     public ClosableIterable<Triple> iterate() throws ConcurrentModificationException, IllegalStateException {
150         return iterate(null, null, null);
151     }
152 
153 }