/*
* 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.query;
import org.apache.jena.graph.Graph ;
import org.apache.jena.permissions.SecurityEvaluator;
import org.apache.jena.permissions.graph.SecuredGraph;
import org.apache.jena.query.Query ;
import org.apache.jena.sparql.ARQInternalErrorException ;
import org.apache.jena.sparql.algebra.Op ;
import org.apache.jena.sparql.core.DatasetGraph ;
import org.apache.jena.sparql.engine.Plan ;
import org.apache.jena.sparql.engine.QueryEngineFactory ;
import org.apache.jena.sparql.engine.QueryEngineRegistry ;
import org.apache.jena.sparql.engine.binding.Binding ;
import org.apache.jena.sparql.util.Context ;
public class SecuredQueryEngineFactory implements QueryEngineFactory
{
private boolean silentService = true;
private SecuredQueryEngineConfig cfgResource;
private SecurityEvaluator securityEvaluator;
private static SecuredQueryEngineFactory factory = new SecuredQueryEngineFactory();
static public SecuredQueryEngineFactory getFactory() {
return factory;
}
static public void register() {
QueryEngineRegistry.addFactory(factory);
}
static public void unregister() {
QueryEngineRegistry.removeFactory(factory);
}
public SecurityEvaluator getSecurityEvaluator() {
return securityEvaluator;
}
public void setSecurityEvaluator(SecurityEvaluator securityEvaluator) {
this.securityEvaluator = securityEvaluator;
}
public boolean isSilentService() {
return silentService;
}
public void setSilentService(boolean silentService) {
this.silentService = silentService;
}
public void setSecuredQueryEngineConfig(SecuredQueryEngineConfig cfgResource) {
this.cfgResource = cfgResource;
}
/**
* Only accept a secured dataset
*/
@Override
public boolean accept(Query query, DatasetGraph dataset, Context context) {
Graph g = dataset.getDefaultGraph();
return g instanceof SecuredGraph;
}
@Override
public Plan create(Query query, DatasetGraph dataset, Binding initial,
Context context) {
// set up the context
if (cfgResource != null) {
cfgResource.initializeContext( context );
}
// Create a query engine instance.
SecuredQueryEngine engine = new SecuredQueryEngine(query, dataset,
initial, context);
return engine.getPlan();
}
@Override
public boolean accept(Op op, DatasetGraph dataset, Context context) { // Refuse
// to
// accept
// algebra
// expressions
// directly.
return false;
}
@Override
public Plan create(Op op, DatasetGraph dataset, Binding inputBinding,
Context context) { // Should not be called because acceept/Op is
// false
throw new ARQInternalErrorException(this.getClass().getSimpleName()
+ ": factory called directly with an algebra expression");
}
}