/*
* JBoss, Home of Professional Open Source.
* Copyright 2011, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.as.test.clustering.cluster.ejb.xpc.servlet;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLEncoder;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.jboss.as.test.clustering.cluster.ejb.xpc.bean.Employee;
import org.jboss.as.test.clustering.cluster.ejb.xpc.bean.Stateful;
import org.jboss.as.test.clustering.cluster.ejb.xpc.bean.StatefulBean;
import org.jboss.as.test.clustering.ejb.LocalEJBDirectory;
import org.jboss.logging.Logger;
/**
* @author Paul Ferraro
*/
@WebServlet(urlPatterns = { StatefulServlet.SERVLET_PATH })
public class StatefulServlet extends HttpServlet {
private static final long serialVersionUID = -592774116315946908L;
private static final String SERVLET_NAME = "count";
static final String SERVLET_PATH = "/" + SERVLET_NAME;
public static final String ANSWER = "answer";
private static final String COMMAND = "command";
private static final String BEAN = "bean";
private static final String MESSAGE = "message";
private static enum Command {
CREATE_EMPLOYEE,
GET_EMPLOYEE,
DELETE_EMPLOYEE,
GET_EMPLOYEES_IN_2LC,
GET_2ND_BEAN_EMPLOYEE,
DESTROY,
FLUSH,
ECHO,
CLEAR,
DELETE_EMPLOYEE_DIRECT,
;
}
private static final Logger log = Logger.getLogger(StatefulServlet.class);
private static URI createURI(URL baseURL, Command command) throws URISyntaxException {
return baseURL.toURI().resolve(buildCommandQuery(command).toString());
}
private static StringBuilder buildCommandQuery(Command command) {
return new StringBuilder(SERVLET_NAME).append('?').append(COMMAND).append('=').append(command);
}
public static URI createEmployeeURI(URL baseURL) throws URISyntaxException {
return createURI(baseURL, Command.CREATE_EMPLOYEE);
}
public static URI getEmployeeURI(URL baseURL) throws URISyntaxException {
return createURI(baseURL, Command.GET_EMPLOYEE);
}
public static URI deleteEmployeeURI(URL baseURL) throws URISyntaxException {
return createURI(baseURL, Command.DELETE_EMPLOYEE);
}
public static URI getEmployeesIn2LCURI(URL baseURL) throws URISyntaxException {
return createURI(baseURL, Command.GET_EMPLOYEES_IN_2LC);
}
public static URI get2ndBeanEmployeeURI(URL baseURL) throws URISyntaxException {
return createURI(baseURL, Command.GET_2ND_BEAN_EMPLOYEE);
}
public static URI destroyURI(URL baseURL) throws URISyntaxException {
return createURI(baseURL, Command.DESTROY);
}
public static URI flushURI(URL baseURL) throws URISyntaxException {
return createURI(baseURL, Command.FLUSH);
}
public static URI echoURI(URL baseURL, String message) throws URISyntaxException, UnsupportedEncodingException {
StringBuilder builder = buildCommandQuery(Command.ECHO);
builder.append('&').append(MESSAGE).append('=').append(URLEncoder.encode(message, "UTF-8"));
return baseURL.toURI().resolve(builder.toString());
}
public static URI clearURI(URL baseURL) throws URISyntaxException {
return createURI(baseURL, Command.CLEAR);
}
public static URI deleteEmployeeDirectURI(URL baseURL) throws URISyntaxException {
return createURI(baseURL, Command.DELETE_EMPLOYEE_DIRECT);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession(true);
Stateful bean = (Stateful) session.getAttribute(BEAN);
if (bean == null) {
try (LocalEJBDirectory directory = new LocalEJBDirectory(StatefulBean.MODULE)) {
bean = directory.lookupStateful(StatefulBean.class, Stateful.class);
} catch (NamingException e) {
throw new ServletException(e);
}
}
Command command = Command.valueOf(req.getParameter(COMMAND));
log.info(StatefulServlet.class.getName() + ": command = " + command);
String answer = null;
switch (command) {
case CREATE_EMPLOYEE: {
bean.createEmployee("Tom Brady", "New England Patriots", 1);
answer = bean.getEmployee(1).getName();
break;
}
case GET_EMPLOYEE: {
Employee employee = bean.getEmployee(1);
if (employee == null) {
throw new ServletException("couldn't load Employee entity (with id=1) from database");
}
answer = employee.getName();
break;
}
case DELETE_EMPLOYEE: {
bean.deleteEmployee(1);
answer = command.toString();
break;
}
case GET_EMPLOYEES_IN_2LC: {
long count = bean.getEmployeesInMemory();
if (count == -1) {
throw new ServletException("couldn't get number of employees in second level cache");
}
answer = String.valueOf(count);
break;
}
case GET_2ND_BEAN_EMPLOYEE: {
Employee employee = bean.getSecondBeanEmployee(1);
answer = employee.getName();
break;
}
case DESTROY: {
bean.destroy();
answer = command.toString();
break;
}
case FLUSH: {
bean.flush();
break;
}
case ECHO: {
bean.echo(req.getParameter(MESSAGE));
break;
}
case CLEAR: {
bean.clear();
break;
}
case DELETE_EMPLOYEE_DIRECT: {
// delete all employees in db
int deleted = bean.executeNativeSQL("delete from Employee where id=1");
if (deleted < 1) {
throw new ServletException("couldn't delete entity in database, deleted row count =" + deleted);
}
break;
}
}
if (answer != null) {
resp.setHeader(ANSWER, answer);
}
resp.getWriter().write("Success");
session.setAttribute(BEAN, bean);
log.info(StatefulServlet.class.getName() + ": command = " + command + " finished");
}
}