http://git-wip-us.apache.org/repos/asf/jena/blob/2fb788d3/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/2fb788d3/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/2fb788d3/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/2fb788d3/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/2fb788d3/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/2fb788d3/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/2fb788d3/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"; - } -} http://git-wip-us.apache.org/repos/asf/jena/blob/2fb788d3/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java ---------------------------------------------------------------------- diff --git a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java b/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java deleted file mode 100644 index 39663dd..0000000 --- a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java +++ /dev/null @@ -1,290 +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 static com.hp.hpl.jena.query.ReadWrite.READ ; -import static com.hp.hpl.jena.query.ReadWrite.WRITE ; - -import java.util.HashMap ; -import java.util.Map ; - -import javax.servlet.http.HttpServletRequest ; -import javax.servlet.http.HttpServletResponse ; - -import org.apache.jena.atlas.logging.Log ; -import org.apache.jena.atlas.web.MediaType ; -import org.apache.jena.fuseki.DEF ; -import org.apache.jena.fuseki.conneg.ConNeg ; -import org.apache.jena.fuseki.server.DatasetRef ; -import org.apache.jena.fuseki.server.ServiceRef ; - -import com.hp.hpl.jena.query.ReadWrite ; -import com.hp.hpl.jena.sparql.SystemARQ ; -import com.hp.hpl.jena.sparql.core.DatasetGraph ; -import com.hp.hpl.jena.sparql.core.DatasetGraphWithLock ; -import com.hp.hpl.jena.sparql.core.DatasetGraphWrapper ; -import com.hp.hpl.jena.sparql.core.Transactional ; - -/** - * HTTP action that represents the user request lifecycle. Its state is handled in the - * {@link SPARQL_ServletBase#executeLifecycle(HttpAction)} method. - */ -public class HttpAction -{ - public final long id ; - public final boolean verbose ; - - // Phase two items - set and valida after the datasetRef is known. - private DatasetGraph dsg ; // The data - public DatasetRef dsRef ; - public ServiceRef srvRef ; - - private Transactional transactional ; - private boolean isTransactional; - private DatasetGraph activeDSG ; // Set when inside begin/end. - private ReadWrite activeMode ; // Set when inside begin/end. - - private boolean startTimeIsSet = false ; - private boolean finishTimeIsSet = false ; - - private long startTime = -2 ; - private long finishTime = -2 ; - - // Incoming - //public final - - // Outcome. - int statusCode = -1 ; - String message = null ; - int contentLength = -1 ; - String contentType = null ; - - // Cleared to archive: - Map <String, String> headers = new HashMap<String, String>() ; - public HttpServletRequest request; - public HttpServletResponseTracker response ; - - /** - * Creates a new HTTP Action, using the HTTP request and response, and a given ID. - * - * @param id given ID - * @param request HTTP request - * @param response HTTP response - * @param verbose verbose flag - */ - public HttpAction(long id, HttpServletRequest request, HttpServletResponse response, boolean verbose) { - this.id = id ; - this.request = request ; - this.response = new HttpServletResponseTracker(this, response) ; - // Should this be set when setDataset is called from the dataset context? - // Currently server-wide, e.g. from the command line. - this.verbose = verbose ; - } - - /** - * <p>Sets the action dataset. Setting a {@link DatasetRef} will replace any existing DatasetRef, as well as - * as the {@link DatasetGraph} of the current HTTP Action.</p> - * - * <p>Once it has updated its members, the HTTP Action will change its transactional state and - * {@link Transactional} instance according to its base dataset graph.</p> - * - * @param desc {@link DatasetRef} - * @see Transactional - * @see DatasetGraphWrapper - */ - public void setDataset(DatasetRef desc) { - this.dsRef = desc ; - this.dsg = desc.dataset ; - DatasetGraph basedsg = unwrap(dsg) ; - - if ( isTransactional(basedsg) && isTransactional(dsg) ) { - // Use transactional if it looks safe - abort is necessary. - transactional = (Transactional)dsg ; - isTransactional = true ; - } else { - // Unsure if safe - transactional = new DatasetGraphWithLock(dsg) ; - // No real abort. - isTransactional = false ; - } - } - - /** - * Returns <code>true</code> iff the given {@link DatasetGraph} is an instance of {@link Transactional}, - * <code>false otherwise</code>. - * - * @param dsg a {@link DatasetGraph} - * @return <code>true</code> iff the given {@link DatasetGraph} is an instance of {@link Transactional}, - * <code>false otherwise</code> - */ - private static boolean isTransactional(DatasetGraph dsg) { - return (dsg instanceof Transactional) ; - } - - /** - * A {@link DatasetGraph} may contain other <strong>wrapped DatasetGraph's</strong>. This method will return - * the first instance (including the argument to this method) that <strong>is not</strong> an instance of - * {@link DatasetGraphWrapper}. - * - * @param dsg a {@link DatasetGraph} - * @return the first found {@link DatasetGraph} that is not an instance of {@link DatasetGraphWrapper} - */ - private static DatasetGraph unwrap(DatasetGraph dsg) { - while (dsg instanceof DatasetGraphWrapper) { - dsg = ((DatasetGraphWrapper)dsg).getWrapped() ; - } - return dsg ; - } - - /** - * Sets the {@link ServiceRef}. - * - * @param srvRef a {@link ServiceRef} - */ - public void setService(ServiceRef srvRef) { - this.srvRef = srvRef ; - } - - /** - * Returns whether or not the underlying DatasetGraph is fully transactional (supports rollback). - * @return <code>true</code> if the underlying DatasetGraph is fully transactional (supports rollback), - * <code>false</code> otherwise. - */ - public boolean isTransactional() { - return isTransactional ; - } - - public void beginRead() { - activeMode = READ ; - transactional.begin(READ) ; - activeDSG = dsg ; - dsRef.startTxn(READ) ; - } - - public void endRead() { - dsRef.finishTxn(READ) ; - activeMode = null ; - transactional.end() ; - activeDSG = null ; - } - - public void beginWrite() { - transactional.begin(WRITE) ; - activeMode = WRITE ; - activeDSG = dsg ; - dsRef.startTxn(WRITE) ; - } - - public void commit() { - transactional.commit() ; - activeDSG = null ; - } - - public void abort() { - try { transactional.abort() ; } - catch (Exception ex) { - // Some datasets claim to be transactional but - // don't provide a real abort. We tried to avoid - // them earlier but even if they sneek through, - // we try to continue server operation. - Log.warn(this, "Exception during abort (operation attempts to continue): "+ex.getMessage()) ; - } - activeDSG = null ; - } - - public void endWrite() { - dsRef.finishTxn(WRITE) ; - activeMode = null ; - - if ( transactional.isInTransaction() ) { - Log.warn(this, "Transaction still active in endWriter - no commit or abort seen (forced abort)") ; - try { - transactional.abort() ; - } catch (RuntimeException ex) { - Log.warn(this, "Exception in forced abort (trying to continue)", ex) ; - } - } - transactional.end() ; - activeDSG = null ; - } - - public final DatasetGraph getActiveDSG() { - return activeDSG ; - } - - public final DatasetRef getDatasetRef() { - return dsRef ; - } - - /** Reduce to a size that can be kept around for sometime */ - public void minimize() { - this.request = null ; - this.response = null ; - } - - public void setStartTime() { - if ( startTimeIsSet ) - Log.warn(this, "Start time reset") ; - startTimeIsSet = true ; - this.startTime = System.nanoTime() ; - } - - public void setFinishTime() { - if ( finishTimeIsSet ) - Log.warn(this, "Finish time reset") ; - finishTimeIsSet = true ; - this.finishTime = System.nanoTime() ; - } - - public HttpServletRequest getRequest() { return request ; } - - public HttpServletResponseTracker getResponse() { return response ; } - - /** Return the recorded time taken in milliseconds. - * {@linkplain #setStartTime} and {@linkplain #setFinishTime} - * must have been called. - */ - public long getTime() - { - if ( ! startTimeIsSet ) - Log.warn(this, "Start time not set") ; - if ( ! finishTimeIsSet ) - Log.warn(this, "Finish time not set") ; - return (finishTime-startTime)/(1000*1000) ; - } - - public void sync() { - SystemARQ.sync(dsg) ; - } - - public static MediaType contentNegotationRDF(HttpAction action) { - MediaType mt = ConNeg.chooseContentType(action.request, DEF.rdfOffer, DEF.acceptRDFXML) ; - if ( mt == null ) - return null ; - if ( mt.getContentType() != null ) - action.response.setContentType(mt.getContentType()) ; - if ( mt.getCharset() != null ) - action.response.setCharacterEncoding(mt.getCharset()) ; - return mt ; - } - - public static MediaType contentNegotationQuads(HttpAction action) { - return ConNeg.chooseContentType(action.request, DEF.quadsOffer, DEF.acceptNQuads) ; - } -} http://git-wip-us.apache.org/repos/asf/jena/blob/2fb788d3/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/HttpServletResponseTracker.java ---------------------------------------------------------------------- diff --git a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/HttpServletResponseTracker.java b/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/HttpServletResponseTracker.java deleted file mode 100644 index c39e728..0000000 --- a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/HttpServletResponseTracker.java +++ /dev/null @@ -1,140 +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.io.IOException ; - -import javax.servlet.http.HttpServletResponse ; -import javax.servlet.http.HttpServletResponseWrapper ; - -import org.apache.jena.atlas.logging.Log ; - -/** Intercepting wrapper so we can track the response settings for logging purposes */ - -public class HttpServletResponseTracker extends HttpServletResponseWrapper -{ - private final HttpAction action ; - - public HttpServletResponseTracker(HttpAction action, HttpServletResponse response) - { - super(response) ; - this.action = action ; - } - - @Override - public void sendError(int sc, String msg) throws IOException - { - action.statusCode = sc ; - action.message = msg ; - super.sendError(sc, msg) ; - } - - @Override - public void sendError(int sc) throws IOException - { - action.statusCode = sc ; - action.message = null ; - super.sendError(sc) ; - } - - @Override - public void setHeader(String name, String value) - { - super.setHeader(name, value) ; - action.headers.put(name, value) ; - } - - @Override - public void addHeader(String name, String value) - { - Log.warn(this, "Unexpected addHeader - not recorded in log") ; - super.addHeader(name, value) ; - } - @Override - public void setStatus(int sc) - { - action.statusCode = sc ; - action.message = null ; - super.setStatus(sc) ; - } - - @Override - @Deprecated - public void setStatus(int sc, String sm) - { - action.statusCode = sc ; - action.message = sm ; - super.setStatus(sc, sm) ; - } - - @Override - public void setContentLength(int len) - { - action.contentLength = len ; - super.setContentLength(len) ; - } - - @Override - public void setContentType(String type) - { - action.contentType = type ; - super.setContentType(type) ; - } - - // From HttpServletResponse -// public void addCookie(Cookie cookie) {} -// public boolean containsHeader(String name) {} -// public String encodeURL(String url) { } -// public String encodeRedirectURL(String url) {} -// public String encodeUrl(String url) {} -// public String encodeRedirectUrl(String url) {} -// public void sendError(int sc, String msg) throws IOException -// public void sendError(int sc) throws IOException -// public void sendRedirect(String location) throws IOException {} -// public void setDateHeader(String name, long date) {} -// public void addDateHeader(String name, long date) {} -// public void setHeader(String name, String value) -// public void addHeader(String name, String value) -// public void setIntHeader(String name, int value) {} -// public void addIntHeader(String name, int value) {} -// public void setStatus(int sc) -// public void setStatus(int sc, String sm) -// public void sendRedirect(String location) throws IOException {} -// public void setDateHeader(String name, long date) {} -// public void addDateHeader(String name, long date) {} - - // From ServletResponse. -// public ServletResponse getResponse() {} -// public void setResponse(ServletResponse response) {} -// public void setCharacterEncoding(String charset) {} -// public String getCharacterEncoding() {} -// public ServletOutputStream getOutputStream() throws IOException {} -// public PrintWriter getWriter() throws IOException {} -// public void setContentLength(int len) {} -// public void setContentType(String type) {} -// public String getContentType() { -// public void setBufferSize(int size) {} -// public int getBufferSize() {} -// public void flushBuffer() throws IOException {} -// public boolean isCommitted() {} -// public void reset() {} -// public void resetBuffer() {} -// public void setLocale(Locale loc) {} -// public Locale getLocale() {} -} http://git-wip-us.apache.org/repos/asf/jena/blob/2fb788d3/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/NullOutputStream.java ---------------------------------------------------------------------- diff --git a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/NullOutputStream.java b/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/NullOutputStream.java deleted file mode 100644 index 63e6562..0000000 --- a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/NullOutputStream.java +++ /dev/null @@ -1,53 +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.io.* ; - -/** -* Code needed to implement an OutputStream that does nothing. -*/ - - -public class NullOutputStream extends /*Filter*/OutputStream -{ - public NullOutputStream() - { - } - - // The OutputStream operations - @Override - public void close() { /* .close() ;*/ } - @Override - public void flush() { /* .flush() ;*/ } - - // Need to implement this one. - @Override - public void write(int b) { /* .write(b) ;*/ } - @Override - public void write(byte b[]) { /* this.write(b, 0, b.length) ; */} - - // Good to implement this one. - @Override - public void write(byte[] b, int off, int len) - { - // Work function - } - -} http://git-wip-us.apache.org/repos/asf/jena/blob/2fb788d3/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/REST_Quads.java ---------------------------------------------------------------------- diff --git a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/REST_Quads.java b/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/REST_Quads.java deleted file mode 100644 index 06c38b7..0000000 --- a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/REST_Quads.java +++ /dev/null @@ -1,211 +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 static java.lang.String.format ; - -import java.io.IOException ; - -import javax.servlet.ServletOutputStream ; - -import org.apache.jena.atlas.web.MediaType ; -import org.apache.jena.atlas.web.TypedOutputStream ; -import org.apache.jena.fuseki.Fuseki ; -import org.apache.jena.fuseki.HttpNames ; -import org.apache.jena.riot.Lang ; -import org.apache.jena.riot.RDFDataMgr ; -import org.apache.jena.riot.RDFLanguages ; -import org.apache.jena.riot.ReaderRIOT ; -import org.apache.jena.riot.system.StreamRDF ; -import org.apache.jena.riot.system.StreamRDFLib ; - -import com.hp.hpl.jena.graph.Graph ; -import com.hp.hpl.jena.graph.Node ; -import com.hp.hpl.jena.graph.NodeFactory ; -import com.hp.hpl.jena.sparql.core.DatasetGraph ; - -/** - * Servlet that serves up quads for a dataset. - */ - -public class REST_Quads extends SPARQL_REST -{ - public REST_Quads() { super(); } - - @Override - protected void validate(HttpAction action) - { - // already checked? - } - - @Override - protected void doGet(HttpAction action) - { - MediaType mediaType = HttpAction.contentNegotationQuads(action) ; - ServletOutputStream output ; - try { output = action.response.getOutputStream() ; } - catch (IOException ex) { errorOccurred(ex) ; output = null ; } - - TypedOutputStream out = new TypedOutputStream(output, mediaType) ; - Lang lang = RDFLanguages.contentTypeToLang(mediaType.getContentType()) ; - if ( lang == null ) - lang = RDFLanguages.TRIG ; - - if ( action.verbose ) - log.info(format("[%d] Get: Content-Type=%s, Charset=%s => %s", - action.id, mediaType.getContentType(), mediaType.getCharset(), lang.getName())) ; - if ( ! RDFLanguages.isQuads(lang) ) - errorBadRequest("Not a quads format: "+mediaType) ; - - action.beginRead() ; - try { - DatasetGraph dsg = action.getActiveDSG() ; - RDFDataMgr.write(out, dsg, lang) ; - success(action) ; - } finally { action.endRead() ; } - } - - @Override - protected void doOptions(HttpAction action) - { - action.response.setHeader(HttpNames.hAllow, "GET, HEAD, OPTIONS") ; - action.response.setHeader(HttpNames.hContentLengh, "0") ; - success(action) ; - } - - @Override - protected void doHead(HttpAction action) - { - action.beginRead() ; - try { - MediaType mediaType = HttpAction.contentNegotationQuads(action) ; - success(action) ; - } finally { action.endRead() ; } - } - - static int counter = 0 ; - @Override - protected void doPost(HttpAction action) - { - if ( ! action.getDatasetRef().allowDatasetUpdate ) - errorMethodNotAllowed("POST") ; - - // Graph Store Protocol mode - POST triples to dataset causes - // a new graph to be created and the new URI returned via Location. - // Normally off. - // When off, POST of triples goes to default graph. - boolean gspMode = Fuseki.graphStoreProtocolPostCreate ; - - // Code to pass the GSP test suite. - // Not necessarily good code. - String x = action.request.getContentType() ; - if ( x == null ) - errorBadRequest("Content-type required for data format") ; - - MediaType mediaType = MediaType.create(x) ; - Lang lang = RDFLanguages.contentTypeToLang(mediaType.getContentType()) ; - if ( lang == null ) - lang = RDFLanguages.TRIG ; - - if ( action.verbose ) - log.info(format("[%d] Post: Content-Type=%s, Charset=%s => %s", - action.id, mediaType.getContentType(), mediaType.getCharset(), lang.getName())) ; - - if ( RDFLanguages.isQuads(lang) ) - doPostQuads(action, lang) ; - else if ( gspMode && RDFLanguages.isTriples(lang) ) - doPostTriplesGSP(action, lang) ; - else if ( RDFLanguages.isTriples(lang) ) - doPostTriples(action, lang) ; - else - errorBadRequest("Not a triples or quads format: "+mediaType) ; - } - - protected void doPostQuads(HttpAction action, Lang lang) - { - action.beginWrite() ; - try { - String name = action.request.getRequestURL().toString() ; - DatasetGraph dsg = action.getActiveDSG() ; - StreamRDF dest = StreamRDFLib.dataset(dsg) ; - ReaderRIOT reader = RDFDataMgr.createReader(lang) ; - reader.read(action.request.getInputStream(), name, null, dest, null); - action.commit(); - success(action) ; - } catch (IOException ex) { action.abort() ; } - finally { action.endWrite() ; } - } - - - // POST triples to dataset -- send to default graph. - protected void doPostTriples(HttpAction action, Lang lang) - { - action.beginWrite() ; - try { - DatasetGraph dsg = action.getActiveDSG() ; - // This should not be anythign other than the datasets name via this route. - String name = action.request.getRequestURL().toString() ; - //log.info(format("[%d] ** Content-length: %d", action.id, action.request.getContentLength())) ; - Graph g = dsg.getDefaultGraph() ; - StreamRDF dest = StreamRDFLib.graph(g) ; - ReaderRIOT reader = RDFDataMgr.createReader(lang) ; - reader.read(action.request.getInputStream(), name, null, dest, null); - action.commit(); - success(action) ; - } catch (IOException ex) { action.abort() ; } - finally { action.endWrite() ; } - } - - protected void doPostTriplesGSP(HttpAction action, Lang lang) - { - action.beginWrite() ; - try { - DatasetGraph dsg = action.getActiveDSG() ; - //log.info(format("[%d] ** Content-length: %d", action.id, action.request.getContentLength())) ; - - String name = action.request.getRequestURL().toString() ; - if ( ! name.endsWith("/") ) - name = name+ "/" ; - name = name+(++counter) ; - Node gn = NodeFactory.createURI(name) ; - Graph g = dsg.getGraph(gn) ; - StreamRDF dest = StreamRDFLib.graph(g) ; - ReaderRIOT reader = RDFDataMgr.createReader(lang) ; - reader.read(action.request.getInputStream(), name, null, dest, null); - log.info(format("[%d] Location: %s", action.id, name)) ; - action.response.setHeader("Location", name) ; - action.commit(); - successCreated(action) ; - } catch (IOException ex) { action.abort() ; } - finally { action.endWrite() ; } - } - - @Override - protected void doDelete(HttpAction action) - { errorMethodNotAllowed("DELETE") ; } - - @Override - protected void doPut(HttpAction action) - { errorMethodNotAllowed("PUT") ; } - - @Override - protected void doPatch(HttpAction action) - { errorMethodNotAllowed("PATCH") ; } -} - http://git-wip-us.apache.org/repos/asf/jena/blob/2fb788d3/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/ResponseCallback.java ---------------------------------------------------------------------- diff --git a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/ResponseCallback.java b/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/ResponseCallback.java deleted file mode 100644 index 1a78627..0000000 --- a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/ResponseCallback.java +++ /dev/null @@ -1,24 +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 ; - -public interface ResponseCallback -{ - public void callback(boolean successfulOperation) ; -} http://git-wip-us.apache.org/repos/asf/jena/blob/2fb788d3/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/ResponseModel.java ---------------------------------------------------------------------- diff --git a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/ResponseModel.java b/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/ResponseModel.java deleted file mode 100644 index f2172f0..0000000 --- a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/ResponseModel.java +++ /dev/null @@ -1,143 +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 static org.apache.jena.fuseki.servlets.ServletBase.error ; -import static org.apache.jena.fuseki.servlets.ServletBase.errorBadRequest ; -import static org.apache.jena.fuseki.servlets.ServletBase.errorOccurred ; - -import java.util.HashMap ; -import java.util.Map ; - -import javax.servlet.ServletOutputStream ; -import javax.servlet.http.HttpServletRequest ; -import javax.servlet.http.HttpServletResponse ; - -import org.apache.jena.atlas.web.MediaType ; -import org.apache.jena.fuseki.DEF ; -import org.apache.jena.fuseki.Fuseki ; -import org.apache.jena.fuseki.conneg.ConNeg ; -import org.apache.jena.fuseki.conneg.WebLib ; -import org.apache.jena.riot.Lang ; -import org.apache.jena.riot.RDFDataMgr ; -import org.apache.jena.riot.RDFLanguages ; -import org.apache.jena.riot.WebContent ; -import org.apache.jena.web.HttpSC ; -import org.slf4j.Logger ; - -import com.hp.hpl.jena.rdf.model.Model ; - -public class ResponseModel -{ - private static Logger slog = ServletBase.log ; - - // Short names for "output=" - private static final String contentOutputJSONLD = "json-ld" ; - private static final String contentOutputJSONRDF = "json-rdf" ; - private static final String contentOutputJSON = "json" ; - private static final String contentOutputXML = "xml" ; - private static final String contentOutputText = "text" ; - private static final String contentOutputTTL = "ttl" ; - private static final String contentOutputNT = "nt" ; - - public static Map<String,String> shortNamesModel = new HashMap<String, String>() ; - static { - - // Some short names. keys are lowercase. - ResponseOps.put(shortNamesModel, contentOutputJSONLD, WebContent.contentTypeJSONLD) ; - ResponseOps.put(shortNamesModel, contentOutputJSONRDF, WebContent.contentTypeRDFJSON) ; - ResponseOps.put(shortNamesModel, contentOutputJSON, WebContent.contentTypeJSONLD) ; - ResponseOps.put(shortNamesModel, contentOutputXML, WebContent.contentTypeRDFXML) ; - ResponseOps.put(shortNamesModel, contentOutputText, WebContent.contentTypeTurtle) ; - ResponseOps.put(shortNamesModel, contentOutputTTL, WebContent.contentTypeTurtle) ; - ResponseOps.put(shortNamesModel, contentOutputNT, WebContent.contentTypeNTriples) ; - } - - public static void doResponseModel(HttpAction action, Model model) - { - HttpServletRequest request = action.request ; - HttpServletResponse response = action.response ; - - String mimeType = null ; // Header request type - - // TODO Use MediaType throughout. - MediaType i = ConNeg.chooseContentType(request, DEF.rdfOffer, DEF.acceptRDFXML) ; - if ( i != null ) - mimeType = i.getContentType() ; - - String outputField = ResponseOps.paramOutput(request, shortNamesModel) ; - if ( outputField != null ) - mimeType = outputField ; - - String writerMimeType = mimeType ; - - if ( mimeType == null ) - { - Fuseki.requestLog.warn("Can't find MIME type for response") ; - String x = WebLib.getAccept(request) ; - String msg ; - if ( x == null ) - msg = "No Accept: header" ; - else - msg = "Accept: "+x+" : Not understood" ; - error(HttpSC.NOT_ACCEPTABLE_406, msg) ; - } - - String contentType = mimeType ; - String charset = WebContent.charsetUTF8 ; - - String forceAccept = ResponseOps.paramForceAccept(request) ; - if ( forceAccept != null ) - { - contentType = forceAccept ; - charset = WebContent.charsetUTF8 ; - } - - Lang lang = RDFLanguages.contentTypeToLang(contentType) ; - if ( lang == null ) - errorBadRequest("Can't determine output content type: "+contentType) ; - -// if ( rdfw instanceof RDFXMLWriterI ) -// rdfw.setProperty("showXmlDeclaration", "true") ; - - // // Write locally to check it's possible. - // // Time/space tradeoff. - // try { - // OutputStream out = new NullOutputStream() ; - // RDFDataMgr.write(out, model, lang) ; - // IO.flush(out) ; - // } catch (JenaException ex) - // { - // SPARQL_ServletBase.errorOccurred(ex) ; - // } - - try { - ResponseResultSet.setHttpResponse(request, response, contentType, charset) ; - response.setStatus(HttpSC.OK_200) ; - ServletOutputStream out = response.getOutputStream() ; - RDFDataMgr.write(out, model, lang) ; - out.flush() ; - } - catch (Exception ex) { - slog.info("Exception while writing the response model: "+ex.getMessage(), ex) ; - errorOccurred("Exception while writing the response model: "+ex.getMessage(), ex) ; - } - } -} - http://git-wip-us.apache.org/repos/asf/jena/blob/2fb788d3/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/ResponseOps.java ---------------------------------------------------------------------- diff --git a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/ResponseOps.java b/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/ResponseOps.java deleted file mode 100644 index 62ad6d5..0000000 --- a/jena-fuseki/src/main/java/org/apache/jena/fuseki/servlets/ResponseOps.java +++ /dev/null @@ -1,94 +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.io.IOException ; -import java.util.Locale ; -import java.util.Map ; - -import javax.servlet.http.HttpServletRequest ; - -import org.apache.jena.fuseki.HttpNames ; - -public class ResponseOps -{ - // Helpers - public static void put(Map<String, String> map, String key, String value) - { - map.put(key.toLowerCase(Locale.ROOT), value) ; - } - - public static boolean isEOFexception(IOException ioEx) - { - if ( ioEx.getClass().getName().equals("org.mortbay.jetty.EofException eofEx") ) - return true ; - if ( ioEx instanceof java.io.EOFException ) - return true ; - return false ; - } - - public static String paramForceAccept(HttpServletRequest request) - { - String x = fetchParam(request, HttpNames.paramForceAccept) ; - return x ; - } - - public static String paramStylesheet(HttpServletRequest request) - { return fetchParam(request, HttpNames.paramStyleSheet) ; } - - public static String paramOutput(HttpServletRequest request, Map<String,String> map) - { - // Two names. - String x = fetchParam(request, HttpNames.paramOutput1) ; - if ( x == null ) - x = fetchParam(request, HttpNames.paramOutput2) ; - return expandShortName(x, map) ; - } - - public static String expandShortName(String str, Map<String,String> map) - { - if ( str == null ) - return null ; - // Force keys to lower case. See put() above. - String key = str.toLowerCase(Locale.ROOT) ; - String str2 = map.get(key) ; - if ( str2 == null ) - return str ; - return str2 ; - } - - public static String paramCallback(HttpServletRequest request) - { - return fetchParam(request, HttpNames.paramCallback) ; - } - - public static String fetchParam(HttpServletRequest request, String parameterName) - { - String value = request.getParameter(parameterName) ; - if ( value != null ) - { - value = value.trim() ; - if ( value.length() == 0 ) - value = null ; - } - return value ; - } - -} -
