1 package net.trajano.twiff.internal.servlet;
2
3 import static net.trajano.twiff.Twiff.TOKEN_RESUBMIT_FIELD_NAME;
4 import java.io.Serializable;
5 import java.lang.reflect.InvocationTargetException;
6 import javax.servlet.ServletException;
7 import javax.servlet.http.HttpServletRequest;
8 import javax.servlet.http.HttpSession;
9 import net.trajano.twiff.MissingSessionException;
10 import net.trajano.twiff.adapter.RequestAdapter;
11 import net.trajano.twiff.internal.ServletContextAdapterImpl;
12 import net.trajano.twiff.internal.token.dao.SessionTokenDao;
13 import net.trajano.twiff.internal.util.InitParamUtil;
14 import org.apache.commons.beanutils.BeanUtils;
15 import org.hibernate.Session;
16 import org.hibernate.Transaction;
17
18 /***
19 * This adapts a request so {@link net.trajano.twiff.web.ViewServlet} and
20 * {@link net.trajano.twiff.web.AttachmentServlet} can use it in a more type
21 * safe manner.
22 *
23 * @author Archimedes Trajano
24 */
25 public class ViewServletRequestAdapter extends RequestAdapter {
26 /***
27 * Constructs the adapter.
28 *
29 * @param request
30 * servlet request.
31 * @param tokenFieldName
32 * the name of the field that contains the token ID.
33 */
34 public ViewServletRequestAdapter(final HttpServletRequest request, final String tokenFieldName) {
35 super(request);
36 this.request = request;
37 tokenId = request.getParameter(tokenFieldName);
38 tokenExist = (tokenId != null);
39 }
40
41 /***
42 * Token Id.
43 */
44 private final String tokenId;
45
46 /***
47 * The servlet request.
48 */
49 private final HttpServletRequest request;
50
51 /***
52 * Existence of the token Id.
53 */
54 private final boolean tokenExist;
55
56 /***
57 * @return Returns the tokenExist.
58 */
59 public final boolean isTokenExist() {
60 return tokenExist;
61 }
62
63 /***
64 * @return Returns the tokenId.
65 */
66 public final String getTokenId() {
67 return tokenId;
68 }
69
70 /***
71 * Registeres the class into the {@link org.picocontainer.PicoContainer}
72 * stored in the request.
73 *
74 * @param pageBeanClass
75 * the page bean class.
76 * @throws ServletException
77 */
78 public void registerComponentImplementation(final Class pageBeanClass) throws ServletException {
79 if (isTokenExist()) {
80 final HttpSession httpSession = request.getSession(false);
81 if (httpSession == null) {
82 throw new MissingSessionException();
83 }
84 ServletContextAdapterImpl servletContextAdapter = new ServletContextAdapterImpl(httpSession.getServletContext());
85 Session session = null;
86 try {
87 session = servletContextAdapter.getSessionFactory().openSession();
88 Transaction tx = session.beginTransaction();
89 SessionTokenDao dao = new SessionTokenDao(session);
90 final Serializable pageBean = dao.getPageBean(request.getSession().getId(), getTokenId());
91 if (dao.getRequestCount(request.getSession().getId(), getTokenId()) > 1) {
92 request.setAttribute(InitParamUtil.getInitParam(request.getSession(false).getServletContext(), TOKEN_RESUBMIT_FIELD_NAME), true);
93 }
94 if (pageBean.getClass() == pageBeanClass) {
95 getContainer().registerComponentInstance(pageBean);
96 } else {
97 getContainer().registerComponentImplementation(pageBeanClass);
98 final Object object = getContainer().getComponentInstanceOfType(pageBeanClass);
99 BeanUtils.copyProperties(object, pageBean);
100 getContainer().unregisterComponent(pageBeanClass);
101 getContainer().registerComponentInstance(pageBeanClass, object);
102 }
103 tx.commit();
104 } catch (IllegalAccessException e) {
105 throw new ServletException(e);
106 } catch (InvocationTargetException e) {
107 throw new ServletException(e);
108 } finally {
109 if (session != null) {
110 session.close();
111 }
112 }
113 } else {
114 getContainer().registerComponentImplementation(pageBeanClass);
115 }
116 }
117 }