/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.jena.rdf.model.impl; import java.util.*; import org.apache.jena.enhanced.* ; import org.apache.jena.graph.* ; import org.apache.jena.rdf.model.* ; import org.apache.jena.shared.* ; import org.apache.jena.vocabulary.RDF ; /** An internal class not normally of interest to application developers. * A base class on which the other containers are built. */ public class ContainerImpl extends ResourceImpl implements Container, ContainerI { static NodeIteratorFactory iteratorFactory; static { iteratorFactory = new ContNodeIteratorFactoryImpl(); } /** Creates new ContainerImpl */ public ContainerImpl( ModelCom model ) { super(model); } public ContainerImpl( String uri, ModelCom model ){ super(uri, model); } public ContainerImpl(Resource r, ModelCom model) { super(r.asNode(), model); } public ContainerImpl(Node n, EnhGraph g) { super(n,g); } protected ContainerImpl( Resource r ) { this( r, (ModelCom) r.getModel() ); } private boolean is( Resource r ) { return hasProperty(RDF.type, r); } @Override public boolean isAlt() { return is(RDF.Alt); } @Override public boolean isBag() { return is(RDF.Bag); } @Override public boolean isSeq() { return is(RDF.Seq); } @Override public Container add(RDFNode n) { int i = size(); addProperty(RDF.li(i+1), n); return this; } @Override public Container add(boolean o) { return add( String.valueOf( o ) ); } @Override public Container add(long o) { return add( String.valueOf( o ) ); } @Override public Container add(char o) { return add( String.valueOf( o ) ); } @Override public Container add( float o ) { return add( String.valueOf( o ) ); } @Override public Container add(double o) { return add( String.valueOf( o ) ); } @Override public Container add(Object o) { return add( String.valueOf( o ) ); } @Override public Container add(String o) { return add( o, "" ); } @Override public Container add(String o, String l) { return add( literal( o, l ) ); } @Override public boolean contains(RDFNode n) { return containerContains( n ); } @Override public boolean contains(boolean o) { return contains( String.valueOf( o ) ); } @Override public boolean contains(long o) { return contains( String.valueOf( o ) ); } @Override public boolean contains(char o) { return contains( String.valueOf( o ) ); } @Override public boolean contains(float o) { return contains( String.valueOf( o ) ); } @Override public boolean contains(double o) { return contains( String.valueOf( o ) ); } @Override public boolean contains(Object o) { return contains( String.valueOf( o ) ); } @Override public boolean contains(String o) { return contains( o, "" ); } @Override public boolean contains( String o, String l ) { return contains( literal( o, l ) ); } private Literal literal( String s, String lang ) { return new LiteralImpl( NodeFactory.createLiteral( s, lang ), getModelCom() ); } @Override public NodeIterator iterator() { return listContainerMembers( iteratorFactory ); } @Override public int size() { int result = 0; StmtIterator iter = listProperties(); while (iter.hasNext()) if (iter.nextStatement().getPredicate().getOrdinal() != 0) result += 1; iter.close(); return result; } @Override public Container remove(Statement s) { int size = size(); Statement last = null; if (s.getPredicate().getOrdinal() == size) { // if last getModel().remove(s); } else { last = getModel().getRequiredProperty(this, RDF.li(size)); s.changeObject(last.getObject()); getModel().remove(last); } if (size() != (size -1)) throw new AssertionFailureException( "container size" ); return this; } @Override public Container remove(int index, RDFNode object) { remove(getModel().createStatement(this, RDF.li(index), object)); return this; } /** Answer an iterator over the members of this container. @param f the factory for constructing the final iterator @return the member iterator */ public NodeIterator listContainerMembers( NodeIteratorFactory f ) { StmtIterator iter = listProperties(); Vector<Statement> result = new Vector<>(); int maxOrdinal = 0; while (iter.hasNext()) { Statement stmt = iter.nextStatement(); int ordinal = stmt.getPredicate().getOrdinal(); if (ordinal != 0) { if (ordinal > maxOrdinal) { maxOrdinal = ordinal; result.setSize(ordinal); } result.setElementAt(stmt, ordinal-1); } } iter.close(); return f.createIterator( result.iterator(), result, this ); } public int containerIndexOf( RDFNode n ) { int result = 0; StmtIterator iter = listProperties(); while (iter.hasNext()) { Statement stmt = iter.nextStatement(); int ordinal = stmt.getPredicate().getOrdinal(); if (ordinal != 0 && n.equals( stmt.getObject() )) { result = ordinal; break; } } iter.close(); return result; } public boolean containerContains( RDFNode n) { return containerIndexOf( n ) != 0; } }