org.apache.openjpa.persistence.jest.JESTServlet Maven / Gradle / Ivy
The newest version!
/*
* 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.openjpa.persistence.jest;
import java.io.IOException;
import jakarta.persistence.Persistence;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.openjpa.kernel.AbstractBrokerFactory;
import org.apache.openjpa.kernel.BrokerFactory;
import org.apache.openjpa.lib.util.Localizer;
import org.apache.openjpa.persistence.JPAFacadeHelper;
import org.apache.openjpa.persistence.OpenJPAEntityManagerFactory;
import org.apache.openjpa.persistence.OpenJPAPersistence;
/**
* A specialized HTTP servlet to interpret HTTP requests as Java Persistent API commands
* on a running persistence unit. The persistence unit is identified by the name of the
* unit and is supplied to this servlet during its initialization. The component using
* the persistent unit and this servlet must be within the same module scope.
*
* The syntax of the request URL is described in
* OpenJPA web site.
*
* The response to a resource request is represented in various format, namely
* XML, JSON or a JavaScript that will dynamically render in the browser. The format
* can be controlled via the initialization parameter response.format
in
* <init-param>
clause or per request basis via format=xml|dojo|json
* encoded in the path expression of the Request URI.
*
* Servlet initialization parameter
*
* Parameter Value
* persistence.unit Name of the persistence unit. Mandatory
* response.format Default format used for representation. Defaults to xml
.
*
*
* @author Pinaki Poddar
*
*/
public class JESTServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* Servlet initialization parameter monikers
*/
public static final String INIT_PARA_UNIT = "persistence.unit";
public static final String INIT_PARA_STANDALONE = "standalone";
private String _unit;
private boolean _debug;
private OpenJPAEntityManagerFactory _emf;
protected static Localizer _loc = Localizer.forPackage(JESTServlet.class);
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
_debug = "true".equalsIgnoreCase(config.getInitParameter("debug"));
_unit = config.getInitParameter(INIT_PARA_UNIT);
if (_unit == null) {
throw new ServletException(_loc.get("no-persistence-unit-param").toString());
}
boolean standalone = "true".equalsIgnoreCase(config.getInitParameter(INIT_PARA_STANDALONE));
// START - ALLOW PRINT STATEMENTS
System.err.println("Standalone Deployment Mode " + standalone);
// STOP - ALLOW PRINT STATEMENTS
if (standalone) {
createPersistenceUnit();
}
if (findPersistenceUnit()) {
config.getServletContext().log(_loc.get("servlet-init", _unit).toString());
} else {
config.getServletContext().log(_loc.get("servlet-not-init", _unit).toString());
}
}
/**
* Peeks into the servlet path of the request to create appropriate {@link JESTCommand JEST command}.
* Passes the request on to the command which is responsible for generating a response.
*/
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
debug(request);
if (findPersistenceUnit()) {
JESTContext ctx = new JESTContext(_unit, _emf, request, response);
try {
ctx.execute();
} catch (Exception e) {
handleError(ctx, e);
}
} else {
throw new ServletException(_loc.get("no-persistence-unit", _unit).toString());
}
}
protected void createPersistenceUnit() throws ServletException {
// START - ALLOW PRINT STATEMENTS
try {
System.err.println("Creating Standalone Persistent Unit " + _unit);
_emf = OpenJPAPersistence.cast(Persistence.createEntityManagerFactory(_unit));
System.err.println("Created Standalone Persistent Unit " + _unit + ":" + _emf);
} catch (Exception e) {
System.err.println("Can not creating Standalone Persistent Unit " + _unit);
e.printStackTrace();
throw new ServletException(_loc.get("no-persistence-unit-standalone", _unit).toString(), e);
}
// STOP - ALLOW PRINT STATEMENTS
}
protected boolean findPersistenceUnit() {
// START - ALLOW PRINT STATEMENTS
if (_emf == null) {
System.err.println("Discovering auxiliary Persistent Unit " + _unit);
BrokerFactory bf = AbstractBrokerFactory.getPooledFactoryForKey(_unit);
if (bf != null) {
_emf = (OpenJPAEntityManagerFactory)bf.getUserObject(JPAFacadeHelper.EMF_KEY);
}
System.err.println("Discovered auxiliary Persistent Unit " + _unit + ":" + _emf);
}
// STOP - ALLOW PRINT STATEMENTS
return _emf != null;
}
protected void handleError(JPAServletContext ctx, Throwable t) throws IOException {
if (t instanceof ProcessingException) {
((ProcessingException)t).printStackTrace();
} else {
new ProcessingException(ctx, t).printStackTrace();
}
}
@Override
public void destroy() {
_emf = null;
_unit = null;
}
private void debug(HttpServletRequest r) {
if (!_debug) return;
// log("-----------------------------------------------------------");
log(r.getRemoteUser() + "@" + r.getRemoteHost() + ":" + r.getRemotePort() + "[" + r.getPathInfo() + "]");
// log("Request URL = [" + request.getRequestURL() + "]");
// log("Request URI = [" + request.getRequestURI() + "]");
// log("Servlet Path = [" + request.getServletPath() + "]");
// log("Context Path = [" + request.getContextPath() + "]");
// log("Path Info = [" + request.getPathInfo() + "]");
// log("Path Translated = [" + request.getPathTranslated() + "]");
}
@Override
public void log(String s) {
// START - ALLOW PRINT STATEMENTS
System.err.println(s);
// STOP - ALLOW PRINT STATEMENTS
super.log(s);
}
}