/* * 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.permissions.model.impl; import org.apache.jena.graph.Triple; import org.apache.jena.permissions.SecurityEvaluator.Action; import org.apache.jena.permissions.impl.ItemHolder; import org.apache.jena.permissions.impl.SecuredItemInvoker; import org.apache.jena.permissions.model.SecuredAlt; import org.apache.jena.permissions.model.SecuredBag; import org.apache.jena.permissions.model.SecuredLiteral; import org.apache.jena.permissions.model.SecuredModel; import org.apache.jena.permissions.model.SecuredRDFNode; import org.apache.jena.permissions.model.SecuredResource; import org.apache.jena.permissions.model.SecuredSeq; import org.apache.jena.rdf.model.*; import org.apache.jena.shared.AuthenticationRequiredException; import org.apache.jena.shared.ReadDeniedException; import org.apache.jena.shared.UpdateDeniedException; import org.apache.jena.util.iterator.ExtendedIterator; /** * Implementation of SecuredAlt to be used by a SecuredItemInvoker proxy. */ public class SecuredAltImpl extends SecuredContainerImpl implements SecuredAlt { /** * Get an instance of SecuredAlt. * * @param securedModel * the Secured Model to use. * @param alt * The Alt to be secured. * @return The secured Alt instance. */ public static SecuredAlt getInstance(final SecuredModel securedModel, final Alt alt) { if (securedModel == null) { throw new IllegalArgumentException( "Secured securedModel may not be null"); } if (alt == null) { throw new IllegalArgumentException("Alt may not be null"); } final ItemHolder<Alt, SecuredAlt> holder = new ItemHolder<Alt, SecuredAlt>( alt); final SecuredAltImpl checker = new SecuredAltImpl(securedModel, holder); // if we are going to create a duplicate proxy, just return this // one. if (alt instanceof SecuredAlt) { if (checker.isEquivalent((SecuredAlt) alt)) { return (SecuredAlt) alt; } } return holder.setSecuredItem(new SecuredItemInvoker(alt.getClass(), checker)); } // The item holder holding this SecuredAlt private final ItemHolder<? extends Alt, ? extends SecuredAlt> holder; /** * Constructor. * * @param securedModel * the securedModel to use. * @param holder * The item holder that will hold this SecuredAlt. */ protected SecuredAltImpl(final SecuredModel securedModel, final ItemHolder<? extends Alt, ? extends SecuredAlt> holder) { super(securedModel, holder); this.holder = holder; } @Override public SecuredRDFNode getDefault() throws ReadDeniedException, AuthenticationRequiredException { // getDefaultStatement() calls checkRead return SecuredRDFNodeImpl.getInstance(getModel(), getDefaultStatement() .getObject()); } @Override public SecuredAlt getDefaultAlt() throws ReadDeniedException, AuthenticationRequiredException { // getDefaultStatement() calls checkRead return SecuredAltImpl.getInstance(getModel(), getDefaultStatement() .getAlt()); } @Override public SecuredBag getDefaultBag() throws ReadDeniedException, AuthenticationRequiredException { // getDefaultStatement() calls checkRead return SecuredBagImpl.getInstance(getModel(), getDefaultStatement() .getBag()); } @Override public boolean getDefaultBoolean() throws ReadDeniedException, AuthenticationRequiredException { // getDefaultStatement() calls checkRead return getDefaultStatement().getBoolean(); } @Override public byte getDefaultByte() throws ReadDeniedException, AuthenticationRequiredException { // getDefaultStatement() calls checkRead return getDefaultStatement().getByte(); } @Override public char getDefaultChar() throws ReadDeniedException, AuthenticationRequiredException { // getDefaultStatement() calls checkRead return getDefaultStatement().getChar(); } @Override public double getDefaultDouble() throws ReadDeniedException, AuthenticationRequiredException { // getDefaultStatement() calls checkRead return getDefaultStatement().getDouble(); } @Override public float getDefaultFloat() throws ReadDeniedException, AuthenticationRequiredException { // getDefaultStatement() calls checkRead return getDefaultStatement().getFloat(); } @Override public int getDefaultInt() throws ReadDeniedException, AuthenticationRequiredException { // getDefaultStatement() calls checkRead return getDefaultStatement().getInt(); } @Override public String getDefaultLanguage() throws ReadDeniedException, AuthenticationRequiredException { // getDefaultStatement() calls checkRead return getDefaultStatement().getLanguage(); } @Override public SecuredLiteral getDefaultLiteral() throws ReadDeniedException, AuthenticationRequiredException { // getDefaultStatement() calls checkRead return SecuredLiteralImpl.getInstance(getModel(), getDefaultStatement() .getLiteral()); } @Override public long getDefaultLong() throws ReadDeniedException, AuthenticationRequiredException { // getDefaultStatement() calls checkRead return getDefaultStatement().getLong(); } @Override public SecuredResource getDefaultResource() throws ReadDeniedException, AuthenticationRequiredException { // getDefaultStatement() calls checkRead return SecuredResourceImpl.getInstance(getModel(), getDefaultStatement().getResource()); } @Override @Deprecated public SecuredResource getDefaultResource(final ResourceF f) throws ReadDeniedException, AuthenticationRequiredException { // getDefaultStatement() calls checkRead return SecuredResourceImpl.getInstance(getModel(), getDefaultStatement().getResource(f)); } @Override public SecuredSeq getDefaultSeq() throws ReadDeniedException, AuthenticationRequiredException { // getDefaultStatement() calls checkRead return SecuredSeqImpl.getInstance(getModel(), getDefaultStatement() .getSeq()); } @Override public short getDefaultShort() throws ReadDeniedException, AuthenticationRequiredException { // getDefaultStatement() calls checkRead return getDefaultStatement().getShort(); } private Statement getDefaultStatement() throws ReadDeniedException, AuthenticationRequiredException { checkRead(); final ExtendedIterator<Statement> iter = getStatementIterator(Action.Read); try { if (iter.hasNext()) { return iter.next(); } throw new AltHasNoDefaultException(this); } finally { iter.close(); } } @Override public String getDefaultString() throws ReadDeniedException, AuthenticationRequiredException { // getDefaultStatement() calls checkRead return getDefaultStatement().getString(); } @Override public SecuredAlt setDefault(final boolean o) throws UpdateDeniedException, AuthenticationRequiredException { return setDefault(asObject(o)); } @Override public SecuredAlt setDefault(final char o) throws UpdateDeniedException, AuthenticationRequiredException { return setDefault(asObject(o)); } @Override public SecuredAlt setDefault(final double o) throws UpdateDeniedException, AuthenticationRequiredException { return setDefault(asObject(o)); } @Override public SecuredAlt setDefault(final float o) throws UpdateDeniedException, AuthenticationRequiredException { return setDefault(asObject(o)); } @Override public SecuredAlt setDefault(final long o) throws UpdateDeniedException, AuthenticationRequiredException { return setDefault(asObject(o)); } @Override public SecuredAlt setDefault(final Object o) throws UpdateDeniedException, AuthenticationRequiredException { return setDefault(asObject(o)); } @Override public SecuredAlt setDefault(final RDFNode o) throws UpdateDeniedException, AuthenticationRequiredException { checkUpdate(); final ExtendedIterator<Statement> iter = getStatementIterator(Action.Read); try { if (iter.hasNext()) { final Statement stmt = iter.next(); final Triple t = stmt.asTriple(); final Triple t2 = new Triple(t.getSubject(), t.getPredicate(), o.asNode()); checkUpdate(t, t2); stmt.changeObject(o); return holder.getSecuredItem(); } else { add(o); return holder.getSecuredItem(); } } finally { iter.close(); } } @Override public SecuredAlt setDefault(final String o) throws UpdateDeniedException, AuthenticationRequiredException { return setDefault(asLiteral(o, "")); } @Override public SecuredAlt setDefault(final String o, final String l) throws UpdateDeniedException, AuthenticationRequiredException { return setDefault(asLiteral(o, l)); } }