http://git-wip-us.apache.org/repos/asf/jena/blob/662cf71d/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/DatasetRef.java ---------------------------------------------------------------------- diff --git a/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/DatasetRef.java b/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/DatasetRef.java deleted file mode 100644 index 040c759..0000000 --- a/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/DatasetRef.java +++ /dev/null @@ -1,241 +0,0 @@ -/* - * 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.fuseki.server; - -import java.util.* ; -import java.util.concurrent.atomic.AtomicLong ; - -import org.apache.jena.fuseki.Fuseki ; - -import com.hp.hpl.jena.query.ReadWrite ; -import com.hp.hpl.jena.sparql.core.DatasetGraph ; - -public class DatasetRef implements DatasetMXBean, Counters -{ - public String name = null ; - public DatasetGraph dataset = null ; - - public ServiceRef query = new ServiceRef("query") ; - public ServiceRef update = new ServiceRef("update") ; - public ServiceRef upload = new ServiceRef("upload") ; - public ServiceRef readGraphStore = new ServiceRef("gspRead") ; - public ServiceRef readWriteGraphStore = new ServiceRef("gspReadWrite") ; - - // Dataset-level counters. - private final CounterSet counters = new CounterSet() ; - @Override - public CounterSet getCounters() { return counters ; } - - private Map<String, ServiceRef> endpoints = new HashMap<String, ServiceRef>() ; - private List<ServiceRef> serviceRefs = new ArrayList<ServiceRef>() ; - private boolean initialized = false ; - - // Two step initiation (c.f. Builder pattern) - // Create object - incrementally set state - call init to calculate internal datastructures. - public DatasetRef() {} - public void init() { - if ( initialized ) - Fuseki.serverLog.warn("Already initialized: dataset = "+name) ; - initialized = true ; - initServices() ; - } - - @Override public String toString() { return "DatasetRef:'"+name+"'" ; } - - private void initServices() { - add(query) ; - add(update) ; - add(upload) ; - add(readGraphStore) ; - add(readWriteGraphStore) ; - addCounters() ; - } - - private void add(ServiceRef srvRef) { - serviceRefs.add(srvRef) ; - for ( String ep : srvRef.endpoints ) - endpoints.put(ep, srvRef) ; - } - - public ServiceRef getServiceRef(String service) { - if ( ! initialized ) - Fuseki.serverLog.error("Not initialized: dataset = "+name) ; - if ( service.startsWith("/") ) - service = service.substring(1, service.length()) ; - return endpoints.get(service) ; - } - - public Collection<ServiceRef> getServiceRefs() { - return serviceRefs ; - } - - /** Counter of active read transactions */ - public AtomicLong activeReadTxn = new AtomicLong(0) ; - - /** Counter of active write transactions */ - public AtomicLong activeWriteTxn = new AtomicLong(0) ; - - /** Cumulative counter of read transactions */ - public AtomicLong totalReadTxn = new AtomicLong(0) ; - - /** Cumulative counter of writer transactions */ - public AtomicLong totalWriteTxn = new AtomicLong(0) ; - -// /** Count of requests received - anyzservice */ -// public AtomicLong countServiceRequests = new AtomicLong(0) ; -// /** Count of requests received that fail in some way */ -// public AtomicLong countServiceRequestsBad = new AtomicLong(0) ; -// /** Count of requests received that fail in some way */ -// public AtomicLong countServiceRequestsOK = new AtomicLong(0) ; -// -// // SPARQL Query -// -// /** Count of SPARQL Queries successfully executed */ -// public AtomicLong countQueryOK = new AtomicLong(0) ; -// /** Count of SPARQL Queries with syntax errors */ -// public AtomicLong countQueryBadSyntax = new AtomicLong(0) ; -// /** Count of SPARQL Queries with timeout on execution */ -// public AtomicLong countQueryTimeout = new AtomicLong(0) ; -// /** Count of SPARQL Queries with execution errors (not timeouts) */ -// public AtomicLong countQueryBadExecution = new AtomicLong(0) ; - - public void startTxn(ReadWrite mode) - { - switch(mode) - { - case READ: - activeReadTxn.getAndIncrement() ; - totalReadTxn.getAndIncrement() ; - break ; - case WRITE: - activeWriteTxn.getAndIncrement() ; - totalWriteTxn.getAndIncrement() ; - break ; - } - } - - public void finishTxn(ReadWrite mode) - { - switch(mode) - { - case READ: - activeReadTxn.decrementAndGet() ; - break ; - case WRITE: - activeWriteTxn.decrementAndGet() ; - break ; - } - } - - //TODO Need to be able to set this from the config file. - public boolean allowDatasetUpdate = false; - - public boolean allowTimeoutOverride = false; - public long maximumTimeoutOverride = Long.MAX_VALUE; - - public boolean isReadOnly() - { - return ! allowDatasetUpdate && - ! update.isActive() && - ! upload.isActive() && - ! readWriteGraphStore.isActive() - ; - } - - // MBean - - @Override - public String getName() { return name ; } - - @Override public long getRequests() { - return counters.value(CounterName.Requests) ; - } - - @Override - public long getRequestsGood() { - return counters.value(CounterName.RequestsGood) ; - } - @Override - public long getRequestsBad() { - return counters.value(CounterName.RequestsBad) ; - } - - private void addCounters() { - getCounters().add(CounterName.Requests) ; - getCounters().add(CounterName.RequestsGood) ; - getCounters().add(CounterName.RequestsBad) ; - - query.getCounters().add(CounterName.Requests) ; - query.getCounters().add(CounterName.RequestsGood) ; - query.getCounters().add(CounterName.RequestsBad) ; - query.getCounters().add(CounterName.QueryTimeouts) ; - query.getCounters().add(CounterName.QueryExecErrors) ; - - update.getCounters().add(CounterName.Requests) ; - update.getCounters().add(CounterName.RequestsGood) ; - update.getCounters().add(CounterName.RequestsBad) ; - update.getCounters().add(CounterName.UpdateExecErrors) ; - - upload.getCounters().add(CounterName.Requests) ; - upload.getCounters().add(CounterName.RequestsGood) ; - upload.getCounters().add(CounterName.RequestsBad) ; - - addCountersForGSP(readWriteGraphStore.getCounters(), false) ; - if ( readGraphStore != readWriteGraphStore ) - addCountersForGSP(readGraphStore.getCounters(), true) ; - } - - private void addCountersForGSP(CounterSet cs, boolean readWrite) { - cs.add(CounterName.Requests) ; - cs.add(CounterName.RequestsGood) ; - cs.add(CounterName.RequestsBad) ; - - cs.add(CounterName.GSPget) ; - cs.add(CounterName.GSPgetGood) ; - cs.add(CounterName.GSPgetBad) ; - - cs.add(CounterName.GSPhead) ; - cs.add(CounterName.GSPheadGood) ; - cs.add(CounterName.GSPheadBad) ; - - // Add anyway. - // if ( ! readWrite ) - // return ; - - cs.add(CounterName.GSPput) ; - cs.add(CounterName.GSPputGood) ; - cs.add(CounterName.GSPputBad) ; - - cs.add(CounterName.GSPpost) ; - cs.add(CounterName.GSPpostGood) ; - cs.add(CounterName.GSPpostBad) ; - - cs.add(CounterName.GSPdelete) ; - cs.add(CounterName.GSPdeleteGood) ; - cs.add(CounterName.GSPdeleteBad) ; - - cs.add(CounterName.GSPpatch) ; - cs.add(CounterName.GSPpatchGood) ; - cs.add(CounterName.GSPpatchBad) ; - - cs.add(CounterName.GSPoptions) ; - cs.add(CounterName.GSPoptionsGood) ; - cs.add(CounterName.GSPoptionsBad) ; - } -}
http://git-wip-us.apache.org/repos/asf/jena/blob/662cf71d/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/DatasetRegistry.java ---------------------------------------------------------------------- diff --git a/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/DatasetRegistry.java b/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/DatasetRegistry.java deleted file mode 100644 index 152e8cd..0000000 --- a/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/DatasetRegistry.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * 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.fuseki.server; - -import org.apache.jena.fuseki.migrate.Registry ; - -public class DatasetRegistry extends Registry<DatasetRef> -{ - private static DatasetRegistry singleton = new DatasetRegistry() ; - - public static DatasetRegistry get() { return singleton ; } - - private DatasetRegistry() {} -} http://git-wip-us.apache.org/repos/asf/jena/blob/662cf71d/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/FusekiConfig.java ---------------------------------------------------------------------- diff --git a/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/FusekiConfig.java b/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/FusekiConfig.java deleted file mode 100644 index 9c36a7c..0000000 --- a/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/FusekiConfig.java +++ /dev/null @@ -1,374 +0,0 @@ -/* - * 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.fuseki.server; - -import java.lang.reflect.Method ; -import java.util.ArrayList ; -import java.util.Arrays ; -import java.util.List ; - -import org.apache.jena.atlas.iterator.Iter ; -import org.apache.jena.atlas.lib.StrUtils ; -import org.apache.jena.fuseki.Fuseki ; -import org.apache.jena.fuseki.FusekiConfigException ; -import org.apache.jena.fuseki.HttpNames ; -import org.slf4j.Logger ; - -import com.hp.hpl.jena.assembler.Assembler ; -import com.hp.hpl.jena.assembler.JA ; -import com.hp.hpl.jena.query.ARQ ; -import com.hp.hpl.jena.query.Dataset ; -import com.hp.hpl.jena.query.Query ; -import com.hp.hpl.jena.query.QueryExecution ; -import com.hp.hpl.jena.query.QueryExecutionFactory ; -import com.hp.hpl.jena.query.QueryFactory ; -import com.hp.hpl.jena.query.QuerySolution ; -import com.hp.hpl.jena.query.QuerySolutionMap ; -import com.hp.hpl.jena.query.ResultSet ; -import com.hp.hpl.jena.query.ResultSetFactory ; -import com.hp.hpl.jena.rdf.model.Literal ; -import com.hp.hpl.jena.rdf.model.Model ; -import com.hp.hpl.jena.rdf.model.RDFNode ; -import com.hp.hpl.jena.rdf.model.ResIterator ; -import com.hp.hpl.jena.rdf.model.Resource ; -import com.hp.hpl.jena.rdf.model.Statement ; -import com.hp.hpl.jena.rdf.model.StmtIterator ; -import com.hp.hpl.jena.shared.PrefixMapping ; -import com.hp.hpl.jena.sparql.core.DatasetGraph ; -import com.hp.hpl.jena.sparql.core.DatasetGraphFactory ; -import com.hp.hpl.jena.sparql.core.DatasetGraphReadOnly ; -import com.hp.hpl.jena.sparql.core.assembler.AssemblerUtils ; -import com.hp.hpl.jena.tdb.TDB ; -import com.hp.hpl.jena.util.FileManager ; -import com.hp.hpl.jena.vocabulary.RDF ; -import com.hp.hpl.jena.vocabulary.RDFS ; - -public class FusekiConfig -{ - static { Fuseki.init(); } - - // The datastructure that captures a servers configuration. - - // Server port - int port ; - // Management command port - -1 for none. - int mgtPort ; - List<DatasetRef> datasets = null ; - - - private static Logger log = Fuseki.configLog ; - - private static String prefixes = StrUtils.strjoinNL( - "PREFIX fu: <http://jena.apache.org/fuseki#>" , - "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>", - "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>", - "PREFIX tdb: <http://jena.hpl.hp.com/2008/tdb#>", - "PREFIX list: <http://jena.hpl.hp.com/ARQ/list#>", - "PREFIX list: <http://jena.hpl.hp.com/ARQ/list#>", - "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>", - "PREFIX apf: <http://jena.hpl.hp.com/ARQ/property#>", - "PREFIX afn: <http://jena.hpl.hp.com/ARQ/function#>" , - "") ; - - public static ServerConfig defaultConfiguration(String datasetPath, DatasetGraph dsg, boolean allowUpdate, boolean listenLocal) - { - DatasetRef dbDesc = new DatasetRef() ; - dbDesc.name = datasetPath ; - dbDesc.dataset = dsg ; - dbDesc.query.endpoints.add(HttpNames.ServiceQuery) ; - dbDesc.query.endpoints.add(HttpNames.ServiceQueryAlt) ; - - if ( allowUpdate ) - { - dbDesc.update.endpoints.add(HttpNames.ServiceUpdate) ; - dbDesc.upload.endpoints.add(HttpNames.ServiceUpload) ; - dbDesc.readWriteGraphStore.endpoints.add(HttpNames.ServiceData) ; - dbDesc.allowDatasetUpdate = true ; - } - else - dbDesc.readGraphStore.endpoints.add(HttpNames.ServiceData) ; - ServerConfig config = new ServerConfig() ; - config.datasets = Arrays.asList(dbDesc) ; - config.port = 3030 ; - config.mgtPort = 3031 ; - config.pagesPort = config.port ; - config.loopback = listenLocal ; - config.jettyConfigFile = null ; - config.pages = Fuseki.PagesStatic ; - config.enableCompression = true ; - config.verboseLogging = false ; - return config ; - } - - public static ServerConfig configure(String filename) - { - // Be absolutely sure everything has initialized. - // Some initialization registers assemblers and sets abbreviation vocabulary. - ARQ.init(); - TDB.init() ; - Fuseki.init() ; - Model m = FileManager.get().loadModel(filename) ; - - // Find one server. - List<Resource> servers = getByType(FusekiVocab.tServer, m) ; - if ( servers.size() == 0 ) - throw new FusekiConfigException("No server found (no resource with type "+strForResource(FusekiVocab.tServer)) ; - if ( servers.size() > 1 ) - throw new FusekiConfigException(servers.size()+" servers found (must be exactly one in a configuration file)") ; - - // ---- Server - Resource server = servers.get(0) ; - processServer(server) ; - - // ---- Services - ResultSet rs = query("SELECT * { ?s fu:services [ list:member ?member ] }", m) ; - if ( ! rs.hasNext() ) - log.warn("No services found") ; - - List<DatasetRef> services = new ArrayList<DatasetRef>() ; - - for ( ; rs.hasNext() ; ) - { - QuerySolution soln = rs.next() ; - Resource svc = soln.getResource("member") ; - DatasetRef sd = processService(svc) ; - services.add(sd) ; - } - - // TODO Properties for the other fields. - ServerConfig config = new ServerConfig() ; - config.datasets = services ; - config.port = 3030 ; - config.mgtPort = 3031 ; - config.pagesPort = config.port ; - config.jettyConfigFile = null ; - config.pages = Fuseki.PagesStatic ; - config.enableCompression = true ; - config.verboseLogging = false ; - return config ; - } - - - // DatasetRef used where there isn't a real Dataset e.g. the SPARQL processor. - - private static DatasetRef noDataset = new DatasetRef() ; - private static DatasetGraph dummyDSG = new DatasetGraphReadOnly(DatasetGraphFactory.createMemFixed()) ; - static { - noDataset.name = "" ; - noDataset.dataset = dummyDSG ; - noDataset.query.endpoints.add(HttpNames.ServiceQuery) ; - noDataset.query.endpoints.add(HttpNames.ServiceQueryAlt) ; - noDataset.allowDatasetUpdate = false ; - noDataset.init(); - // Don't register it. - // This is used as a placeholder and shoudl not be found by "all datasets" - // DatasetRegistry.get().put("", noDataset) ; - } - - /** Return the DatasetRef (read-only) for when there is no dataset, just a SPARQL Query processor */ - public static DatasetRef serviceOnlyDatasetRef() { return noDataset ; } - - private static void processServer(Resource server) - { - // Global, currently. - AssemblerUtils.setContext(server, Fuseki.getContext()) ; - - StmtIterator sIter = server.listProperties(JA.loadClass) ; - for( ; sIter.hasNext(); ) - { - Statement s = sIter.nextStatement() ; - RDFNode rn = s.getObject() ; - String className = null ; - if ( rn instanceof Resource ) - { - String uri = ((Resource)rn).getURI() ; - if ( uri == null ) - { - log.warn("Blank node for class to load") ; - continue ; - } - String javaScheme = "java:" ; - if ( ! uri.startsWith(javaScheme) ) - { - log.warn("Class to load is not 'java:': "+uri) ; - continue ; - } - className = uri.substring(javaScheme.length()) ; - } - if ( rn instanceof Literal ) - className = ((Literal)rn).getLexicalForm() ; - /*Loader.*/loadAndInit(className) ; - } - // ---- - } - - private static void loadAndInit(String className) - { - try { - Class<?> classObj = Class.forName(className); - log.info("Loaded "+className) ; - Method initMethod = classObj.getMethod("init"); - initMethod.invoke(null); - } catch (ClassNotFoundException ex) - { - log.warn("Class not found: "+className); - } - catch (Exception e) { throw new FusekiConfigException(e) ; } - } - - private static DatasetRef processService(Resource svc) - { - log.info("Service: "+nodeLabel(svc)) ; - DatasetRef sDesc = new DatasetRef() ; - sDesc.name = ((Literal)getOne(svc, "fu:name")).getLexicalForm() ; - log.info(" name = "+sDesc.name) ; - - addServiceEP("query", sDesc.name, sDesc.query, svc, "fu:serviceQuery") ; - addServiceEP("update", sDesc.name, sDesc.update, svc, "fu:serviceUpdate") ; - addServiceEP("upload", sDesc.name, sDesc.upload, svc, "fu:serviceUpload") ; - addServiceEP("graphStore(RW)", sDesc.name, sDesc.readWriteGraphStore, svc, "fu:serviceReadWriteGraphStore") ; - addServiceEP("graphStore(R)", sDesc.name, sDesc.readGraphStore, svc, "fu:serviceReadGraphStore") ; - // Extract timeout overriding configuration if present. - if (svc.hasProperty(FusekiVocab.pAllowTimeoutOverride)) { - sDesc.allowTimeoutOverride = svc.getProperty(FusekiVocab.pAllowTimeoutOverride).getObject().asLiteral().getBoolean(); - if (svc.hasProperty(FusekiVocab.pMaximumTimeoutOverride)) { - sDesc.maximumTimeoutOverride = (int) (svc.getProperty(FusekiVocab.pMaximumTimeoutOverride).getObject().asLiteral().getFloat() * 1000); - } - } - - Resource datasetDesc = ((Resource)getOne(svc, "fu:dataset")) ; - - // Check if it is in the model. - if ( ! datasetDesc.hasProperty(RDF.type) ) - throw new FusekiConfigException("No rdf:type for dataset "+nodeLabel(datasetDesc)) ; - - Dataset ds = (Dataset)Assembler.general.open(datasetDesc) ; - sDesc.dataset = ds.asDatasetGraph() ; - return sDesc ; - - } - - private static RDFNode getOne(Resource svc, String property) - { - String ln = property.substring(property.indexOf(':')+1) ; - ResultSet rs = query("SELECT * { ?svc "+property+" ?x}", svc.getModel(), "svc", svc) ; - if ( ! rs.hasNext() ) - throw new FusekiConfigException("No "+ln+" for service "+nodeLabel(svc)) ; - RDFNode x = rs.next().get("x") ; - if ( rs.hasNext() ) - throw new FusekiConfigException("Multiple "+ln+" for service "+nodeLabel(svc)) ; - return x ; - } - - private static List<Resource> getByType(Resource type, Model m) - { - ResIterator rIter = m.listSubjectsWithProperty(RDF.type, type) ; - return Iter.toList(rIter) ; - } - - private static void addServiceEP(String label, String name, ServiceRef service, Resource svc, String property) - { - ResultSet rs = query("SELECT * { ?svc "+property+" ?ep}", svc.getModel(), "svc", svc) ; - for ( ; rs.hasNext() ; ) - { - QuerySolution soln = rs.next() ; - String epName = soln.getLiteral("ep").getLexicalForm() ; - service.endpoints.add(epName) ; - log.info(" "+label+" = /"+name+"/"+epName) ; - } - } - - - private static ResultSet query(String string, Model m) - { - return query(string, m, null, null) ; - } - - private static ResultSet query(String string, Model m, String varName, RDFNode value) - { - Query query = QueryFactory.create(prefixes+string) ; - QuerySolutionMap initValues = null ; - if ( varName != null ) - initValues = querySolution(varName, value) ; - try(QueryExecution qExec = QueryExecutionFactory.create(query, m, initValues)) { - ResultSet rs = ResultSetFactory.copyResults(qExec.execSelect()) ; - return rs ; - } - } - - private static QuerySolutionMap querySolution(String varName, RDFNode value) - { - QuerySolutionMap qsm = new QuerySolutionMap() ; - querySolution(qsm, varName, value) ; - return qsm ; - } - - private static QuerySolutionMap querySolution(QuerySolutionMap qsm, String varName, RDFNode value) - { - qsm.add(varName, value) ; - return qsm ; - } - - // Node presentation - private static String nodeLabel(RDFNode n) - { - if ( n == null ) - return "<null>" ; - if ( n instanceof Resource ) - return strForResource((Resource)n) ; - - Literal lit = (Literal)n ; - return lit.getLexicalForm() ; - } - - private static String strForResource(Resource r) { return strForResource(r, r.getModel()) ; } - - private static String strForResource(Resource r, PrefixMapping pm) - { - if ( r == null ) - return "NULL "; - if ( r.hasProperty(RDFS.label)) - { - RDFNode n = r.getProperty(RDFS.label).getObject() ; - if ( n instanceof Literal ) - return ((Literal)n).getString() ; - } - - if ( r.isAnon() ) - return "<<blank node>>" ; - - if ( pm == null ) - pm = r.getModel() ; - - return strForURI(r.getURI(), pm ) ; - } - - private static String strForURI(String uri, PrefixMapping pm) - { - if ( pm != null ) - { - String x = pm.shortForm(uri) ; - - if ( ! x.equals(uri) ) - return x ; - } - return "<"+uri+">" ; - } -} - http://git-wip-us.apache.org/repos/asf/jena/blob/662cf71d/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/FusekiErrorHandler.java ---------------------------------------------------------------------- diff --git a/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/FusekiErrorHandler.java b/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/FusekiErrorHandler.java deleted file mode 100644 index d1660f5..0000000 --- a/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/FusekiErrorHandler.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * 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.fuseki.server; - -import static java.lang.String.format ; - -import java.io.* ; - -import javax.servlet.http.HttpServletRequest ; -import javax.servlet.http.HttpServletResponse ; - -import org.apache.jena.fuseki.Fuseki ; -import org.apache.jena.web.HttpSC ; -import org.eclipse.jetty.http.HttpHeaders ; -import org.eclipse.jetty.http.HttpMethods ; -import org.eclipse.jetty.http.MimeTypes ; -import org.eclipse.jetty.server.AbstractHttpConnection ; -import org.eclipse.jetty.server.Request ; -import org.eclipse.jetty.server.handler.ErrorHandler ; - -public class FusekiErrorHandler extends ErrorHandler -{ - @Override - public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException - { - AbstractHttpConnection connection = AbstractHttpConnection.getCurrentConnection(); - connection.getRequest().setHandled(true); - String method = request.getMethod(); - - if(!method.equals(HttpMethods.GET) && !method.equals(HttpMethods.POST) && !method.equals(HttpMethods.HEAD)) - return; - - response.setContentType(MimeTypes.TEXT_PLAIN_UTF_8) ; - response.setHeader(HttpHeaders.CACHE_CONTROL, "must-revalidate,no-cache,no-store") ; - - ByteArrayOutputStream bytes = new ByteArrayOutputStream(1024) ; - //String writer = IO.UTF8(null) ; - try(Writer writer = new OutputStreamWriter(bytes, "UTF-8")) { - - handleErrorPage(request, writer, connection.getResponse().getStatus(), connection.getResponse().getReason()); - - if ( ! Fuseki.VERSION.equalsIgnoreCase("development") ) - { - writer.write("\n") ; - writer.write("\n") ; - writer.write(format("Fuseki - version %s (Build date: %s)\n", Fuseki.VERSION, Fuseki.BUILD_DATE)) ; - } - writer.flush(); - } - response.setContentLength(bytes.size()) ; - // Copy - response.getOutputStream().write(bytes.toByteArray()) ; - } - - @Override - protected void handleErrorPage(HttpServletRequest request, Writer writer, int code, String message) - throws IOException - { - if ( message == null ) - message = HttpSC.getMessage(code) ; - writer.write(format("Error %d: %s\n", code, message)) ; - - Throwable th = (Throwable)request.getAttribute("javax.servlet.error.exception"); - while(th!=null) - { - writer.write("\n"); - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - th.printStackTrace(pw); - pw.flush(); - writer.write(sw.getBuffer().toString()); - writer.write("\n"); - th = th.getCause(); - } - } -} http://git-wip-us.apache.org/repos/asf/jena/blob/662cf71d/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/FusekiServletContextListener.java ---------------------------------------------------------------------- diff --git a/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/FusekiServletContextListener.java b/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/FusekiServletContextListener.java deleted file mode 100644 index f1c9642..0000000 --- a/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/FusekiServletContextListener.java +++ /dev/null @@ -1,43 +0,0 @@ -/** - * 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.fuseki.server; - -import javax.servlet.ServletContextEvent ; -import javax.servlet.ServletContextListener ; - -public class FusekiServletContextListener implements ServletContextListener { - // This could do the initialization. - private final SPARQLServer sparqlServer ; - public FusekiServletContextListener(SPARQLServer sparqlServer) { - this.sparqlServer = sparqlServer ; - } - - @Override - public void contextInitialized(ServletContextEvent sce) { -// Fuseki.serverLog.info("contextInitialized") ; -// for ( DatasetRef dsRef : sparqlServer.getDatasets() ) -// Fuseki.serverLog.info("Dataset: "+dsRef.getName()) ; - } - - @Override - public void contextDestroyed(ServletContextEvent sce) { -// Fuseki.serverLog.info("contextDestroyed") ; - } -} - http://git-wip-us.apache.org/repos/asf/jena/blob/662cf71d/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/FusekiVocab.java ---------------------------------------------------------------------- diff --git a/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/FusekiVocab.java b/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/FusekiVocab.java deleted file mode 100644 index d4d4e54..0000000 --- a/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/FusekiVocab.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * 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.fuseki.server; - -import org.apache.jena.fuseki.FusekiException ; -import org.apache.jena.iri.IRI ; -import org.apache.jena.riot.system.IRIResolver ; - -import com.hp.hpl.jena.rdf.model.Property ; -import com.hp.hpl.jena.rdf.model.Resource ; -import com.hp.hpl.jena.rdf.model.ResourceFactory ; - -public class FusekiVocab -{ - public static String NS = "http://jena.apache.org/fuseki#" ; - - public static final Resource tServer = resource("Server") ; - - public static final Property pServices = property("services") ; - public static final Property pServiceName = property("name") ; - - public static final Property pServiceQueryEP = property("serviceQuery") ; - public static final Property pServiceUpdateEP = property("serviceUpdate") ; - public static final Property pServiceUploadEP = property("serviceUpload") ; - public static final Property pServiceReadWriteGraphStoreEP = property("serviceReadWriteGraphStore") ; - public static final Property pServiceReadgraphStoreEP = property("serviceReadGraphStore") ; - - public static final Property pAllowTimeoutOverride = property("allowTimeoutOverride"); - public static final Property pMaximumTimeoutOverride = property("maximumTimeoutOverride"); - - private static Resource resource(String localname) { return ResourceFactory.createResource(iri(localname)) ; } - private static Property property(String localname) { return ResourceFactory.createProperty(iri(localname)) ; } - - private static String iri(String localname) - { - String uri = NS+localname ; - IRI iri = IRIResolver.parseIRI(uri) ; - if ( iri.hasViolation(true) ) - throw new FusekiException("Bad IRI: "+iri) ; - if ( ! iri.isAbsolute() ) - throw new FusekiException("Bad IRI: "+iri) ; - - return uri ; - } -} - http://git-wip-us.apache.org/repos/asf/jena/blob/662cf71d/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/SPARQLServer.java ---------------------------------------------------------------------- diff --git a/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/SPARQLServer.java b/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/SPARQLServer.java deleted file mode 100644 index 7448eb2..0000000 --- a/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/SPARQLServer.java +++ /dev/null @@ -1,484 +0,0 @@ -/* - * 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.fuseki.server ; - -import static java.lang.String.format ; -import static org.apache.jena.fuseki.Fuseki.serverLog ; - -import java.io.FileInputStream ; -import java.util.* ; - -import javax.servlet.DispatcherType ; -import javax.servlet.http.HttpServlet ; - -import org.apache.jena.atlas.lib.FileOps ; -import org.apache.jena.fuseki.Fuseki ; -import org.apache.jena.fuseki.FusekiException ; -import org.apache.jena.fuseki.HttpNames ; -import org.apache.jena.fuseki.mgt.ActionDataset ; -import org.apache.jena.fuseki.mgt.MgtFunctions ; -import org.apache.jena.fuseki.mgt.PageNames ; -import org.apache.jena.fuseki.servlets.* ; -import org.apache.jena.fuseki.validation.DataValidator ; -import org.apache.jena.fuseki.validation.IRIValidator ; -import org.apache.jena.fuseki.validation.QueryValidator ; -import org.apache.jena.fuseki.validation.UpdateValidator ; -import org.apache.jena.riot.WebContent ; -import org.eclipse.jetty.http.MimeTypes ; -import org.eclipse.jetty.security.* ; -import org.eclipse.jetty.security.authentication.BasicAuthenticator ; -import org.eclipse.jetty.server.Connector ; -import org.eclipse.jetty.server.Server ; -import org.eclipse.jetty.server.nio.BlockingChannelConnector ; -import org.eclipse.jetty.servlet.DefaultServlet ; -import org.eclipse.jetty.servlet.ServletContextHandler ; -import org.eclipse.jetty.servlet.ServletHolder ; -import org.eclipse.jetty.servlets.GzipFilter ; -import org.eclipse.jetty.util.security.Constraint ; -import org.eclipse.jetty.xml.XmlConfiguration ; - -import com.hp.hpl.jena.sparql.mgt.ARQMgt ; -import com.hp.hpl.jena.sparql.util.Utils ; - -/** - * SPARQLServer is the Jena server instance which wraps/utilizes - * {@link org.eclipse.jetty.server.Server}. This class provides - * immediate access to the {@link org.eclipse.jetty.server.Server#start()} and - * {@link org.eclipse.jetty.server.Server#stop()} commands as well as obtaining - * instances of the server and server configuration. Finally we can obtain - * instances of {@link org.apache.jena.fuseki.server.ServerConfig}. - * - */ -public class SPARQLServer { - static { - Fuseki.init() ; - } - - private ServerConfig serverConfig ; - - private Server server = null ; - private static List<String> epDataset = Arrays.asList("*") ; - - /** - * Default constructor which requires a {@link org.apache.jena.fuseki.server.ServerConfig} - * object as input. We use this config to specify (verbose) logging, enable compression - * etc. - * @param config - */ - public SPARQLServer(ServerConfig config) { - this.serverConfig = config ; - // Currently server-wide. - Fuseki.verboseLogging = config.verboseLogging ; - - // GZip compression - // Note that regardless of this setting we'll always leave it turned off - // for the servlets - // where it makes no sense to have it turned on e.g. update and upload - - ServletContextHandler context = buildServer(serverConfig.jettyConfigFile, config.enableCompression) ; - configureDatasets(context) ; - } - - private void configureDatasets(ServletContextHandler context) { - // Build them all. - for (DatasetRef dsDesc : serverConfig.datasets) - configureOneDataset(context, dsDesc, serverConfig.enableCompression) ; - - } - - /** - * Initialize the {@link SPARQLServer} instance. - */ - public void start() { - String now = Utils.nowAsString() ; - serverLog.info(format("%s %s %s", Fuseki.NAME, Fuseki.VERSION, Fuseki.BUILD_DATE)) ; - // This does not get set usefully for Jetty as we use it. - // String jettyVersion = org.eclipse.jetty.server.Server.getVersion() ; - // serverLog.info(format("Jetty %s",jettyVersion)) ; - String host = server.getConnectors()[0].getHost() ; - if ( host != null ) - serverLog.info("Incoming connections limited to " + host) ; - serverLog.info(format("Started %s on port %d", now, server.getConnectors()[0].getPort())) ; - - try { - server.start() ; - } catch (java.net.BindException ex) { - serverLog.error("SPARQLServer: Failed to start server: " + ex.getMessage()) ; - System.exit(1) ; - } catch (Exception ex) { - serverLog.error("SPARQLServer: Failed to start server: " + ex.getMessage(), ex) ; - System.exit(1) ; - } - - ServletContextHandler context = (ServletContextHandler)server.getHandler() ; - } - - /** - * Stop the {@link SPARQLServer} instance. - */ - public void stop() { - String now = Utils.nowAsString() ; - serverLog.info(format("Stopped %s on port %d", now, server.getConnectors()[0].getPort())) ; - try { - server.stop() ; - } catch (Exception ex) { - Fuseki.serverLog.warn("SPARQLServer: Exception while stopping server: " + ex.getMessage(), ex) ; - } - removeJMX() ; - } - - /** - * Get the Jetty instance. - * @return Server - */ - public Server getServer() { - return server ; - } - - /** - * Get the datasets associated with the server. - * @return returns the datasets via {@link org.apache.jena.fuseki.server.ServerConfig#datasets} - */ - public List<DatasetRef> getDatasets() { - return serverConfig.datasets ; - } - - /** - * Obtain the {@link org.apache.jena.fuseki.server.ServerConfig} - * @return ServerConfig - */ - public ServerConfig getServerConfig() { - return serverConfig ; - } - - // Later : private and in constructor. - private ServletContextHandler buildServer(String jettyConfig, boolean enableCompression) { - if ( jettyConfig != null ) { - // --jetty-config=jetty-fuseki.xml - // for detailed configuration of the server using Jetty features. - server = configServer(jettyConfig) ; - } else - server = defaultServerConfig(serverConfig.port, serverConfig.loopback) ; - // Keep the server to a maximum number of threads. - // server.setThreadPool(new QueuedThreadPool(ThreadPoolSize)) ; - - ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS) ; - context.setErrorHandler(new FusekiErrorHandler()) ; - context.addEventListener(new FusekiServletContextListener(this)); - - // Increase form size. - context.getServletContext().getContextHandler().setMaxFormContentSize(10 * 1000 * 1000) ; - - // Wire up authentication if appropriate - if ( jettyConfig == null && serverConfig.authConfigFile != null ) { - Constraint constraint = new Constraint() ; - constraint.setName(Constraint.__BASIC_AUTH) ; - constraint.setRoles(new String[]{"fuseki"}) ; - constraint.setAuthenticate(true) ; - - ConstraintMapping mapping = new ConstraintMapping() ; - mapping.setConstraint(constraint) ; - mapping.setPathSpec("/*") ; - - IdentityService identService = new DefaultIdentityService() ; - - ConstraintSecurityHandler securityHandler = new ConstraintSecurityHandler() ; - securityHandler.addConstraintMapping(mapping) ; - securityHandler.setIdentityService(identService) ; - - HashLoginService loginService = new HashLoginService("Fuseki Authentication", serverConfig.authConfigFile) ; - loginService.setIdentityService(identService) ; - - securityHandler.setLoginService(loginService) ; - securityHandler.setAuthenticator(new BasicAuthenticator()) ; - - context.setSecurityHandler(securityHandler) ; - - serverLog.debug("Basic Auth Configuration = " + serverConfig.authConfigFile) ; - } - - // Wire up context handler to server - server.setHandler(context) ; - - // Constants. Add RDF types. - MimeTypes mt = new MimeTypes() ; - mt.addMimeMapping("rdf", WebContent.contentTypeRDFXML + ";charset=utf-8") ; - mt.addMimeMapping("ttl", WebContent.contentTypeTurtle + ";charset=utf-8") ; - mt.addMimeMapping("nt", WebContent.contentTypeNTriples + ";charset=ascii") ; - mt.addMimeMapping("nq", WebContent.contentTypeNQuads + ";charset=ascii") ; - mt.addMimeMapping("trig", WebContent.contentTypeTriG + ";charset=utf-8") ; - - // mt.addMimeMapping("tpl", "text/html;charset=utf-8") ; - context.setMimeTypes(mt) ; - server.setHandler(context) ; - - serverLog.debug("Pages = " + serverConfig.pages) ; - - boolean installManager = true ; - boolean installServices = true ; - - String validationRoot = "/validate" ; - - // Should all services be /_/.... or some such? - - if ( installManager || installServices ) { - // TODO Respect port. - if ( serverConfig.pagesPort != serverConfig.port ) - serverLog.warn("Not supported yet - pages on a different port to services") ; - if ( serverConfig.pages != null ) { - if ( ! FileOps.exists(serverConfig.pages) ) - serverLog.warn("No pages directory - "+serverConfig.pages) ; - String base = serverConfig.pages ; - Map<String, Object> data = new HashMap<String, Object>() ; - data.put("mgt", new MgtFunctions()) ; - SimpleVelocityServlet templateEngine = new SimpleVelocityServlet(base, data) ; - addServlet(context, templateEngine, "*.tpl", false) ; - } - } - - if ( installManager ) { - // Action when control panel selects a dataset. - HttpServlet datasetChooser = new ActionDataset() ; - addServlet(context, datasetChooser, PageNames.actionDatasetNames, false) ; - } - - if ( installServices ) { - // Validators - HttpServlet validateQuery = new QueryValidator() ; - HttpServlet validateUpdate = new UpdateValidator() ; - HttpServlet validateData = new DataValidator() ; - HttpServlet validateIRI = new IRIValidator() ; - - HttpServlet dumpService = new DumpServlet() ; - HttpServlet generalQueryService = new SPARQL_QueryGeneral() ; - - addServlet(context, validateQuery, validationRoot + "/query", false) ; - addServlet(context, validateUpdate, validationRoot + "/update", false) ; - addServlet(context, validateData, validationRoot + "/data", false) ; - addServlet(context, validateIRI, validationRoot + "/iri", false) ; - - // general query processor. - addServlet(context, generalQueryService, HttpNames.ServiceGeneralQuery, enableCompression) ; - } - - if ( installManager || installServices ) { - String[] files = {"fuseki.html", "index.html"} ; - context.setWelcomeFiles(files) ; - addContent(context, "/", serverConfig.pages) ; - } - - return context ; - } - - /** Experimental - off by default. The überservlet sits on the dataset name and handles all requests. - * Includes direct naming and quad access to the dataset. - */ - public static boolean überServlet = false ; - - private static List<String> ListOfEmptyString = Arrays.asList("") ; - - private void configureOneDataset(ServletContextHandler context, DatasetRef dsDesc, boolean enableCompression) { - String datasetPath = dsDesc.name ; - if ( datasetPath.equals("/") ) - datasetPath = "" ; - else - if ( !datasetPath.startsWith("/") ) - datasetPath = "/" + datasetPath ; - - if ( datasetPath.endsWith("/") ) - datasetPath = datasetPath.substring(0, datasetPath.length() - 1) ; - - dsDesc.init() ; - - DatasetRegistry.get().put(datasetPath, dsDesc) ; - serverLog.info(format("Dataset path = %s", datasetPath)) ; - - HttpServlet sparqlQuery = new SPARQL_QueryDataset() ; - HttpServlet sparqlUpdate = new SPARQL_Update() ; - HttpServlet sparqlUpload = new SPARQL_Upload() ; - HttpServlet sparqlHttpR = new SPARQL_REST_R() ; - HttpServlet sparqlHttpRW = new SPARQL_REST_RW() ; - HttpServlet sparqlDataset = new SPARQL_UberServlet.AccessByConfig() ; - - if ( !überServlet ) { - // If uberserver, these are unnecessary but can be used. - // If just means the überservlet isn't handling these operations. - addServlet(context, datasetPath, sparqlQuery, dsDesc.query, enableCompression) ; - addServlet(context, datasetPath, sparqlUpdate, dsDesc.update, false) ; - addServlet(context, datasetPath, sparqlUpload, dsDesc.upload, false) ; // No point - no results of any size. - addServlet(context, datasetPath, sparqlHttpR, dsDesc.readGraphStore, enableCompression) ; - addServlet(context, datasetPath, sparqlHttpRW, dsDesc.readWriteGraphStore, enableCompression) ; - // This adds direct operations on the dataset itself. - // addServlet(context, datasetPath, sparqlDataset, - // ListOfEmptyString, enableCompression) ; - } else { - // This is the servlet that analyses requests and dispatches them to - // the appropriate servlet. - // SPARQL Query, SPARQL Update -- handles dataset?query= - // dataset?update= - // Graph Store Protocol (direct and indirect naming) if enabled. - // GET/PUT/POST on the dataset itself. - // It also checks for a request that looks like a service request - // and passes it - // on to the service (this takes precedence over direct naming). - addServlet(context, datasetPath, sparqlDataset, epDataset, enableCompression) ; - } - - // Add JMX beans to record daatset and it's services. - addJMX(dsDesc) ; - } - - private static Server configServer(String jettyConfig) { - try { - serverLog.info("Jetty server config file = " + jettyConfig) ; - Server server = new Server() ; - XmlConfiguration configuration = new XmlConfiguration(new FileInputStream(jettyConfig)) ; - configuration.configure(server) ; - return server ; - } catch (Exception ex) { - serverLog.error("SPARQLServer: Failed to configure server: " + ex.getMessage(), ex) ; - throw new FusekiException("Failed to configure a server using configuration file '" + jettyConfig + "'") ; - } - } - - private static Server defaultServerConfig(int port, boolean loopback) { - // Server, with one NIO-based connector, large input buffer size (for - // long URLs, POSTed forms (queries, updates)). - Server server = new Server() ; - - // Using "= new SelectChannelConnector() ;" on Darwin (OS/X) causes - // problems - // with initialization not seen (thread scheduling?) in Joseki. - - // BlockingChannelConnector is better for pumping large responses back - // but there have been observed problems with DirectMemory allocation - // (-XX:MaxDirectMemorySize=1G does not help) - // Connector connector = new SelectChannelConnector() ; - - // Connector and specific settings. - BlockingChannelConnector bcConnector = new BlockingChannelConnector() ; - // bcConnector.setUseDirectBuffers(false) ; - - Connector connector = bcConnector ; - // Ignore. If set, then if this goes off, it keeps going off - // and you get a lot of log messages. - connector.setMaxIdleTime(0) ; // Jetty outputs a lot of messages if this - // goes off. - if ( loopback ) - connector.setHost("localhost"); - connector.setPort(port) ; - // Some people do try very large operations ... - connector.setRequestHeaderSize(64 * 1024) ; - connector.setRequestBufferSize(5 * 1024 * 1024) ; - connector.setResponseBufferSize(5 * 1024 * 1024) ; - server.addConnector(connector) ; - return server ; - } - - private static void addContent(ServletContextHandler context, String pathSpec, String pages) { - DefaultServlet staticServlet = new DefaultServlet() ; - ServletHolder staticContent = new ServletHolder(staticServlet) ; - staticContent.setInitParameter("resourceBase", pages) ; - - // Note we set GZip to false for static content because the Jetty - // DefaultServlet has - // a built-in GZip capability that is better for static content than the - // mechanism the - // GzipFilter uses for dynamic content - addServlet(context, staticContent, pathSpec, false) ; - } - - private void addServlet(ServletContextHandler context, String datasetPath, HttpServlet servlet, - ServiceRef serviceRef, boolean enableCompression) { - addServlet(context, datasetPath, servlet, serviceRef.endpoints, enableCompression) ; - } - - // SHARE - private static void addServlet(ServletContextHandler context, String datasetPath, HttpServlet servlet, - List<String> pathSpecs, boolean enableCompression) { - for (String pathSpec : pathSpecs) { - if ( pathSpec.equals("") ) { - // "" is special -- add as "base" and "base/" - addServlet(context, servlet, datasetPath + "/", enableCompression) ; - addServlet(context, servlet, datasetPath, enableCompression) ; - continue ; - } - - if ( pathSpec.endsWith("/") ) - pathSpec = pathSpec.substring(0, pathSpec.length() - 1) ; - if ( pathSpec.startsWith("/") ) - pathSpec = pathSpec.substring(1, pathSpec.length()) ; - addServlet(context, servlet, datasetPath + "/" + pathSpec, enableCompression) ; - } - } - - private static void addServlet(ServletContextHandler context, HttpServlet servlet, String pathSpec, - boolean enableCompression) { - ServletHolder holder = new ServletHolder(servlet) ; - addServlet(context, holder, pathSpec, enableCompression) ; - } - - private static void addServlet(ServletContextHandler context, ServletHolder holder, String pathSpec, - boolean enableCompression) { - if ( serverLog.isDebugEnabled() ) { - if ( enableCompression ) - serverLog.debug("Add servlet @ " + pathSpec + " (with gzip)") ; - else - serverLog.debug("Add servlet @ " + pathSpec) ; - } - context.addServlet(holder, pathSpec) ; - - if ( enableCompression ) - context.addFilter(GzipFilter.class, pathSpec, EnumSet.allOf(DispatcherType.class)) ; - } - - private void addJMX() { - DatasetRegistry registry = DatasetRegistry.get() ; - for (String ds : registry.keys()) { - DatasetRef dsRef = registry.get(ds) ; - addJMX(dsRef) ; - } - } - - private void addJMX(DatasetRef dsRef) { - String x = dsRef.name ; - // if ( x.startsWith("/") ) - // x = x.substring(1) ; - ARQMgt.register(Fuseki.PATH + ".dataset:name=" + x, dsRef) ; - // For all endpoints - for (ServiceRef sRef : dsRef.getServiceRefs()) { - ARQMgt.register(Fuseki.PATH + ".dataset:name=" + x + "/" + sRef.name, sRef) ; - } - } - - private void removeJMX() { - DatasetRegistry registry = DatasetRegistry.get() ; - for (String ds : registry.keys()) { - DatasetRef ref = registry.get(ds) ; - } - } - - private void removeJMX(DatasetRef dsRef) { - String x = dsRef.getName() ; - ARQMgt.unregister(Fuseki.PATH + ".dataset:name=" + x) ; - for (ServiceRef sRef : dsRef.getServiceRefs()) { - ARQMgt.unregister(Fuseki.PATH + ".dataset:name=" + x + "/" + sRef.name) ; - } - } -} http://git-wip-us.apache.org/repos/asf/jena/blob/662cf71d/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/ServerConfig.java ---------------------------------------------------------------------- diff --git a/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/ServerConfig.java b/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/ServerConfig.java deleted file mode 100644 index 4e0b865..0000000 --- a/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/ServerConfig.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * 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.fuseki.server; - -import java.util.List ; - -/** This represents a configuration of a SPARQL server. - */ - -public class ServerConfig -{ - public ServerConfig() {} - - /** Port to run the server service on */ - public int port ; - /** Port for the management interface : -1 for no management interface */ - public int mgtPort ; - /** Port for the pages UI : this can be the same as the services port. */ - public int pagesPort ; - /** Jetty config file - if null, use the built-in configuration of Jetty */ - public String jettyConfigFile = null ; - /** Listen only on the loopback (localhost) interface */ - public boolean loopback = false ; - /** The local directory for serving the static pages */ - public String pages ; - /** The list of datasets */ - public List<DatasetRef> datasets ; - /** Enable Accept-Encoding compression. Set to false by default.*/ - public boolean enableCompression = false ; - - /** Enable additional logging */ - public boolean verboseLogging = false ; - /** - * Authentication config file used to setup Jetty Basic auth, if a Jetty config file was set this is ignored since Jetty config allows much more complex auth methods to be implemented - */ - public String authConfigFile ; - -} - http://git-wip-us.apache.org/repos/asf/jena/blob/662cf71d/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/ServiceMXBean.java ---------------------------------------------------------------------- diff --git a/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/ServiceMXBean.java b/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/ServiceMXBean.java deleted file mode 100644 index 11c7330..0000000 --- a/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/ServiceMXBean.java +++ /dev/null @@ -1,32 +0,0 @@ -/** - * 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.fuseki.server; - -public interface ServiceMXBean -{ - String getName() ; - - long getRequests() ; - long getRequestsGood() ; - long getRequestsBad() ; - -// void enable() ; -// void disable() ; -} - http://git-wip-us.apache.org/repos/asf/jena/blob/662cf71d/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/ServiceRef.java ---------------------------------------------------------------------- diff --git a/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/ServiceRef.java b/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/ServiceRef.java deleted file mode 100644 index 6236050..0000000 --- a/jena-fuseki/src/main/java/org/apache/jena/fuseki/server/ServiceRef.java +++ /dev/null @@ -1,63 +0,0 @@ -/** - * 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.fuseki.server; - -import java.util.ArrayList ; -import java.util.List ; - -/** Configuration of an individual service */ -public class ServiceRef implements ServiceMXBean, Counters -{ - public final String name ; - - // Service-level counters. - private final CounterSet counters = new CounterSet() ; - @Override - public CounterSet getCounters() { return counters ; } - - /** Endpoints (as absolute path URLs) */ - public List<String> endpoints = new ArrayList<String>() ; - - // Attach counters to services or datasets - // Can we have a counter of the same name on different services? - // Cost : number of maps. - // +ve: Multiple services with the same name counter - - public ServiceRef(String serviceName) { - this.name = serviceName ; - } - - public boolean isActive() { return endpoints.isEmpty() ; } - - @Override - public String getName() { return name ; } - - @Override public long getRequests() { - return counters.value(CounterName.Requests) ; - } - @Override - public long getRequestsGood() { - return counters.value(CounterName.RequestsGood) ; - } - @Override - public long getRequestsBad() { - return counters.value(CounterName.RequestsBad) ; - } -} - http://git-wip-us.apache.org/repos/asf/jena/blob/662cf71d/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/ActionErrorException.java ---------------------------------------------------------------------- diff --git a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/ActionErrorException.java b/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/ActionErrorException.java deleted file mode 100644 index 6c5ebe9..0000000 --- a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/ActionErrorException.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * 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.fuseki.servlets; - -class ActionErrorException extends RuntimeException -{ - final Throwable exception ; - final String message ; - final int rc ; - ActionErrorException(Throwable ex, String message, int rc) - { - this.exception = ex ; - this.message = message ; - this.rc = rc ; - } -} http://git-wip-us.apache.org/repos/asf/jena/blob/662cf71d/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/ConcurrencyPolicyMRSW.java ---------------------------------------------------------------------- diff --git a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/ConcurrencyPolicyMRSW.java b/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/ConcurrencyPolicyMRSW.java deleted file mode 100644 index 259453d..0000000 --- a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/ConcurrencyPolicyMRSW.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * 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.fuseki.servlets; - -import java.util.ConcurrentModificationException ; -import java.util.concurrent.atomic.AtomicLong ; - -import org.apache.jena.fuseki.Fuseki ; -import org.slf4j.Logger ; - -public final class ConcurrencyPolicyMRSW -{ - static private Logger log = Fuseki.requestLog ; //org.slf4j.LoggerFactory.getLogger(ConcurrencyPolicyMRSW.class) ; - static private final boolean logging = false ; //log.isDebugEnabled() ; - - // This is a simplified version of ConcurrencyPolicyMRSW from TDB. - private final AtomicLong readCounter = new AtomicLong(0) ; - private final AtomicLong writeCounter = new AtomicLong(0) ; - static private final AtomicLong policyCounter = new AtomicLong(0) ; - - public ConcurrencyPolicyMRSW() - { policyCounter.incrementAndGet() ; } - - // Loggin -inside the operation. - - //@Override - public void startRead() - { - readCounter.getAndIncrement() ; - log() ; - checkConcurrency() ; - } - - //@Override - public void finishRead() - { - log() ; - readCounter.decrementAndGet() ; - checkConcurrency() ; - } - - //@Override - public void startUpdate() - { - writeCounter.getAndIncrement() ; - log() ; - checkConcurrency() ; - } - - //@Override - public void finishUpdate() - { - log() ; - writeCounter.decrementAndGet() ; - checkConcurrency() ; - } - - private synchronized void checkConcurrency() - { - long R = readCounter.get() ; - long W = writeCounter.get() ; - long id = policyCounter.get(); - if ( R > 0 && W > 0 ) - policyError(id, R, W) ; - if ( W > 1 ) - policyError(id, R, W) ; - } - - private void log() - { - if ( ! logging ) - return ; - long R , W , id ; - synchronized(this) - { - R = readCounter.get() ; - W = writeCounter.get() ; - id = policyCounter.get(); - } - log.info(format(id, R, W)) ; - } - - private static void policyError(long id, long R, long W) - { - policyError(format(id, R, W)) ; - } - - private static void policyError(String message) - { - throw new ConcurrentModificationException(message) ; - } - - private static String format(long id, long R, long W) - { - return String.format("(lock=%d) Reader = %d, Writer = %d", id, R, W) ; - } -} http://git-wip-us.apache.org/repos/asf/jena/blob/662cf71d/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/DumpServlet.java ---------------------------------------------------------------------- diff --git a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/DumpServlet.java b/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/DumpServlet.java deleted file mode 100644 index 7ece249..0000000 --- a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/DumpServlet.java +++ /dev/null @@ -1,313 +0,0 @@ -/* - * 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. - */ - -/** A servlet that dumps its request - */ - -// Could be neater - much, much neater! -package org.apache.jena.fuseki.servlets; - -import java.io.BufferedReader ; -import java.io.IOException ; -import java.io.PrintWriter ; -import java.io.StringWriter ; -import java.util.Date ; -import java.util.Enumeration ; -import java.util.Locale ; -import java.util.Properties ; - -import javax.servlet.ServletContext ; -import javax.servlet.http.Cookie ; -import javax.servlet.http.HttpServlet ; -import javax.servlet.http.HttpServletRequest ; -import javax.servlet.http.HttpServletResponse ; - -public class DumpServlet extends HttpServlet -{ - private static final long serialVersionUID = 99L; // Serilizable. - - - public DumpServlet() - { - - } - - @Override - public void init() - { - return ; - } - - @Override - public void doGet(HttpServletRequest req, HttpServletResponse resp) - { - try { - PrintWriter out = resp.getWriter() ; - resp.setContentType("text/html"); - - String now = new Date().toString() ; - - // HEAD - out.println("<html>") ; - out.println("<head>") ; - out.println("<Title>Dump @ "+now+"</Title>") ; - // Reduce the desire to cache it. - out.println("<meta CONTENT=now HTTP-EQUIV=expires>") ; - out.println("</head>") ; - - // BODY - out.println("<body>") ; - out.println("<pre>") ; - - out.println("Dump : "+now); - out.println() ; - out.println("==== Request"); - out.println() ; - out.print(dumpRequest(req)) ; - out.println() ; - - out.println(">>>> Body"); - out.println() ; - printBody(out, req) ; - out.println("<<<< Body"); - - out.println("==== ServletContext"); - out.println() ; - out.print(dumpServletContext()); - out.println() ; - - out.println("==== Environment"); - out.println() ; - out.print(dumpEnvironment()); - out.println() ; - - out.println("</pre>") ; - - out.println("</body>") ; - out.println("</html>") ; - out.flush() ; - } catch (IOException e) - { } - } - - // This resets the input stream - - static public String dumpRequest(HttpServletRequest req) - { - StringWriter sw = new StringWriter() ; - try( PrintWriter pw = new PrintWriter(sw) ) { - // Standard environment - pw.println("Method: "+req.getMethod()); - pw.println("getContentLength: "+Integer.toString(req.getContentLength())); - pw.println("getContentType: "+req.getContentType()); - pw.println("getRequestURI: "+req.getRequestURI()); - pw.println("getRequestURL: "+req.getRequestURL()); - pw.println("getContextPath: "+req.getContextPath()); - pw.println("getServletPath: "+req.getServletPath()); - pw.println("getPathInfo: "+req.getPathInfo()); - pw.println("getPathTranslated: "+req.getPathTranslated()); - pw.println("getQueryString: "+req.getQueryString()); - pw.println("getProtocol: "+req.getProtocol()); - pw.println("getScheme: "+req.getScheme()); - pw.println("getServerName: "+req.getServerName()); - pw.println("getServerPort: "+req.getServerPort()); - pw.println("getRemoteUser: "+req.getRemoteUser()); - pw.println("getRemoteAddr: "+req.getRemoteAddr()); - pw.println("getRemoteHost: "+req.getRemoteHost()); - pw.println("getRequestedSessionId: "+req.getRequestedSessionId()); - { - Cookie c[] = req.getCookies() ; - if ( c == null ) - pw.println("getCookies: <none>"); - else - { - for ( Cookie aC : c ) - { - pw.println( "Cookie: " + aC.getName() ); - pw.println( " value: " + aC.getValue() ); - pw.println( " version: " + aC.getVersion() ); - pw.println( " comment: " + aC.getComment() ); - pw.println( " domain: " + aC.getDomain() ); - pw.println( " maxAge: " + aC.getMaxAge() ); - pw.println( " path: " + aC.getPath() ); - pw.println( " secure: " + aC.getSecure() ); - pw.println(); - } - } - } - - { - // To do: create a string for the output so can send to console and return it. - Enumeration<String> en = req.getHeaderNames() ; - - for ( ; en.hasMoreElements() ; ) - { - String name = en.nextElement() ; - String value = req.getHeader(name) ; - pw.println("Head: "+name + " = " + value) ; - } - } - - Enumeration<String> en2 = req.getAttributeNames() ; - if ( en2.hasMoreElements() ) - pw.println(); - for ( ; en2.hasMoreElements() ; ) - { - String name = en2.nextElement() ; - String value = req.getAttribute(name).toString() ; - pw.println("Attr: "+name + " = " + value) ; - } - - // Note that doing this on a form causes the forms content (body) to be read - // and parsed as form variables. -// en = req.getParameterNames() ; -// if ( en.hasMoreElements() ) -// pw.println(); -// for ( ; en.hasMoreElements() ; ) -// { -// String name = (String)en.nextElement() ; -// String value = req.getParameter(name) ; -// pw.println("Param: "+name + " = " + value) ; -// } - - - -// MultiMap<String, String> map = WebLib.parseQueryString(req) ; -// for ( String name : map.keys() ) -// for ( String value : map.get(name) ) -// pw.println("Param: "+name + " = " + value) ; - - Enumeration<Locale> en = req.getLocales() ; - if ( en.hasMoreElements() ) - pw.println(); - for ( ; en.hasMoreElements() ; ) - { - String name = en.nextElement().toString() ; - pw.println("Locale: "+name) ; - } - - pw.println() ; - pw.flush(); - //printBody(pw, req) ; - return sw.toString() ; - } - - } - - static void printBody(PrintWriter pw, HttpServletRequest req) throws IOException - { - BufferedReader in = req.getReader() ; - if ( req.getContentLength() > 0 ) - // Need +2 because last line may not have a CR/LF on it. - in.mark(req.getContentLength()+2) ; - else - // This is a dump - try to do something that works, even if inefficient. - in.mark(100*1024) ; - - while(true) - { - String x = in.readLine() ; - if ( x == null ) - break ; - x = x.replaceAll("&", "&") ; - x = x.replaceAll("<", "<") ; - x = x.replaceAll(">", ">") ; - pw.println(x) ; - } - try { in.reset() ;} catch (IOException e) { System.out.println("DumpServlet: Reset of content failed: "+e) ; } - } - - /** - * <code>dumpEnvironment</code> - * @return String that is the HTML of the System properties as name/value pairs. - * The values are with single quotes independent of whether or not the value has - * single quotes in it. - */ - static public String dumpEnvironment() - { - Properties properties = System.getProperties(); - - StringWriter sw = new StringWriter() ; - try(PrintWriter pw = new PrintWriter(sw) ) { - Enumeration<Object> en = properties.keys(); - while(en.hasMoreElements()) - { - String key = en.nextElement().toString(); - pw.println(key+": '"+properties.getProperty(key)+"'"); - } - pw.println() ; - pw.flush() ; - return sw.toString() ; - } - } - - public String dumpServletContext() - { - StringWriter sw = new StringWriter() ; - try(PrintWriter pw = new PrintWriter(sw)) { - - ServletContext sc = getServletContext(); - pw.println("majorVersion: '"+sc.getMajorVersion()+"'"); - pw.println("minorVersion: '"+sc.getMinorVersion()+"'"); - pw.println("contextName: '"+sc.getServletContextName()+"'"); - pw.println("servletInfo: '"+getServletInfo()+"'"); - pw.println("serverInfo: '"+sc.getServerInfo()+"'"); - - { - Enumeration<String> en = sc.getInitParameterNames(); - if (en != null) { - pw.println("initParameters: "); - while(en.hasMoreElements()) - { - String key = en.nextElement(); - pw.println(key+": '"+sc.getInitParameter(key)+"'"); - } - } - } - - { - Enumeration<String> en = sc.getAttributeNames(); - if (en != null) { - pw.println("attributes: "); - while(en.hasMoreElements()) - { - String key = en.nextElement(); - pw.println(key+": '"+sc.getAttribute(key)+"'"); - } - } - } - pw.println() ; - pw.close() ; - } - return sw.toString() ; - } - - - @Override - public void doPost(HttpServletRequest req, HttpServletResponse resp) - { - doGet(req, resp) ; - } - - - @Override - public String getServletInfo() - { - return "Dump"; - } -}
