/*
* Copyright 2007-2010 JadaSite.
* This file is part of JadaSite.
* JadaSite is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* JadaSite 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 General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with JadaSite. If not, see <http://www.gnu.org/licenses/>.
*/
package com.jada.admin;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import org.apache.struts.action.*;
import javax.servlet.http.*;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.struts.actions.LookupDispatchAction;
import org.apache.struts.util.LabelValueBean;
import javax.persistence.Query;
import javax.persistence.EntityManager;
import com.jada.jpa.connection.JpaConnection;
import com.jada.jpa.entity.Site;
import com.jada.jpa.entity.SiteCurrencyClass;
import com.jada.jpa.entity.SiteProfileClass;
import com.jada.jpa.entity.User;
import com.jada.util.Constants;
import com.jada.util.Format;
import com.jada.util.Utility;
public abstract class AdminLookupDispatchAction
extends LookupDispatchAction {
Logger logger = Logger.getLogger(AdminLookupDispatchAction.class);
/*
* Landing method for LookupDispatchAction
*/
protected ActionForward dispatchMethod(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response, String name) {
return process(actionMapping, actionForm, request, response, name);
}
protected ActionForward process(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response, String name) {
ActionForward forward = null;
AdminBean adminBean = getAdminBean(request);
if (adminBean == null) {
Cookie cookies[] = request.getCookies();
if (cookies == null) {
return actionMapping.findForward("sessionexpire");
}
for (int i = 0; i < cookies.length; i++) {
if (cookies[i].getName().equals(Constants.SESSION_COOKIE_USER)) {
return actionMapping.findForward("sessionexpire");
}
}
return actionMapping.findForward("login");
}
EntityManager em = null;
try {
em = JpaConnection.getInstance().getCurrentEntityManager();
em.getTransaction().begin();
if (actionMapping instanceof AdminActionMapping) {
AdminActionMapping adminMapping = (AdminActionMapping) actionMapping;
String userTypes = adminMapping.getUserTypes();
String tokens[] = userTypes.split(",");
User user = adminBean.getUser();
String userType = user.getUserType();
boolean found = false;
for (int i = 0; i < tokens.length; i++) {
if (userType.equals(tokens[i])) {
found = true;
break;
}
}
if (!found) {
throw new com.jada.admin.SecurityException("user " + user.getUserId() + " is blocked from accessing " + actionMapping.getPath());
}
}
logger.debug("RequestURL > " + request.getRequestURL());
logger.debug("QueryString > " + request.getQueryString());
if (Utility.getLogLevel(logger).equals(Level.DEBUG)) {
logger.debug("Request Information ...");
Enumeration<?> enumeration = request.getParameterNames();
while (enumeration.hasMoreElements()) {
String key = (String) enumeration.nextElement();
String line = "";
line += "key=" + key + " value=";
String values[] = request.getParameterValues(key);
for (int i = 0; i < values.length; i++) {
if (i > 0) {
line += ",";
}
line += "[" + values[i] + "]";
}
logger.debug(line);
}
}
AdminMaintActionForm form = (AdminMaintActionForm) actionForm;
forward = customProcess(actionMapping, form, request, response, name);
em = JpaConnection.getInstance().getCurrentEntityManager();
if (em.isOpen()) {
if (em.getTransaction().isActive()) {
em.getTransaction().commit();
}
}
if (form != null) {
if (form.isStream) {
streamWebService(response, form.getStreamData());
}
else {
encodeForm(form);
}
}
}
catch (Throwable e) {
logger.error("Exception encountered in " + actionMapping.getName());
logger.error("Exception", e);
if (e instanceof com.jada.admin.SecurityException) {
forward = actionMapping.findForward("securityException");
}
else {
forward = actionMapping.findForward("exception");
}
}
finally {
try {
em = JpaConnection.getInstance().getCurrentEntityManager();
if (em.isOpen()) {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
}
em.close();
} catch (Throwable e1) {
logger.error("Could not rollback transaction after exception!", e1);
}
}
return forward;
}
/*
* Final dispatch routine
*/
protected ActionForward customProcess(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response, String name) throws Throwable {
return super.dispatchMethod(actionMapping, actionForm, request, response, name);
}
static public AdminBean getAdminBean(HttpServletRequest request) {
return (AdminBean) request.getSession().getAttribute("adminBean");
}
static public void setAdminBean(HttpServletRequest request, AdminBean adminBean) {
request.getSession().setAttribute("adminBean", adminBean);
}
protected Map<String, String> getKeyMethodMap() {
return null;
}
@SuppressWarnings("unchecked")
protected void encodeForm(ActionForm form) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, SecurityException, NoSuchMethodException, SecurityException, NoSuchFieldException {
Method methods[] = form.getClass().getDeclaredMethods();
String encodeFields[] = {};
try {
Field field = form.getClass().getField("encodeFields");
encodeFields = (String[]) field.get(form);
}
catch (java.lang.NoSuchFieldException e) {}
for (Method m : methods) {
if (!m.getName().startsWith("get")) {
continue;
}
if (m.getParameterTypes().length > 0) {
continue;
}
Class type = m.getReturnType();
if (type.isArray()) {
Object objects[] = (Object[]) m.invoke(form);
if (objects != null) {
for (Object object : objects) {
if (isActionForm(object.getClass())) {
encodeForm((ActionForm) object);
}
}
}
continue;
}
if (isActionForm(type)) {
ActionForm object = (ActionForm) m.invoke(form);
encodeForm((ActionForm) object);
continue;
}
if (type != String.class) {
continue;
}
String fieldname = m.getName().substring(3, 4).toLowerCase() + m.getName().substring(4);
boolean found = false;
for (String f : encodeFields) {
if (f.equals(fieldname)) {
found = true;
break;
}
}
if (!found) {
continue;
}
String value = (String) m.invoke(form);
value = StringEscapeUtils.escapeHtml(value);
String methodName = "set" + m.getName().substring(3);
Class[] args = new Class[] {String.class};
Method setMethod = form.getClass().getDeclaredMethod(methodName, args);
setMethod.invoke(form, value);
}
}
@SuppressWarnings("unchecked")
protected boolean isActionForm(Class c) {
while (c != null) {
if (c == ActionForm.class) {
return true;
}
c = c.getSuperclass();
}
return false;
}
protected void calcPage(AdminBean adminBean, AdminListingActionForm form, List<?> list, int pageNo) throws Exception {
form.setPageNo(pageNo);
int listingPageSize = adminBean.getListingPageSize();
/* Calc Page Count */
int pageCount = (list.size() - list.size() % listingPageSize) / listingPageSize;
if (list.size() % listingPageSize > 0) {
pageCount++;
}
form.setPageCount(pageCount);
int half = adminBean.getListingPageCount() / 2;
/* Calc Start Page */
int startPage = pageNo - half + 1;
if (startPage < 1) {
startPage = 1;
}
form.setStartPage(startPage);
/* Calc End Page */
/* Trying to make sure the maximum number of navigation is visible */
int endPage = startPage + adminBean.getListingPageCount() - 1;
while (endPage > pageCount && startPage > 1) {
endPage--;
startPage--;
}
/* Still not possible. Trimming navigation. */
if (endPage > pageCount) {
if (pageCount == 0) {
endPage = 1;
}
else {
endPage = pageCount;
}
}
form.setStartPage(startPage);
form.setEndPage(endPage);
}
protected void initSiteProfiles(AdminMaintActionForm form, Site site) throws Exception {
EntityManager em = JpaConnection.getInstance().getCurrentEntityManager();
Vector<LabelValueBean> vector = new Vector<LabelValueBean>();
Long siteProfileClassDefaultId = null;
SiteProfileClass siteProfileClassDefault = site.getSiteProfileClassDefault();
if (siteProfileClassDefault != null) {
siteProfileClassDefaultId = siteProfileClassDefault.getSiteProfileClassId();
form.setSiteProfileClassDefaultId(siteProfileClassDefaultId);
vector.add(new LabelValueBean(siteProfileClassDefault.getSiteProfileClassName(),
siteProfileClassDefault.getSiteProfileClassId().toString()));
}
String sql = "from SiteProfileClass siteProfileClass " +
"where siteProfileClass.site.siteId = :siteId " +
"order by siteProfileClassName ";
Query query = em.createQuery(sql);
query.setParameter("siteId", site.getSiteId());
Iterator<?> iterator = query.getResultList().iterator();
while (iterator.hasNext()) {
SiteProfileClass siteProfileClass = (SiteProfileClass) iterator.next();
if (siteProfileClassDefault != null) {
if (siteProfileClass.getSiteProfileClassId().equals(siteProfileClassDefaultId)) {
continue;
}
}
vector.add(new LabelValueBean(siteProfileClass.getSiteProfileClassName(),
siteProfileClass.getSiteProfileClassId().toString()));
}
LabelValueBean siteProfileClassBeans[] = new LabelValueBean[vector.size()];
vector.copyInto(siteProfileClassBeans);
form.setSiteProfileClassBeans(siteProfileClassBeans);
if (form.getSiteProfileClassId() != null) {
boolean found = false;
for (LabelValueBean bean : siteProfileClassBeans) {
if (bean.getValue().equals(form.getSiteProfileClassId().toString())) {
found = true;
break;
}
}
if (!found) {
form.setSiteProfileClassId(null);
}
}
if (form.getSiteProfileClassId() == null) {
if (siteProfileClassDefault != null) {
form.setSiteProfileClassId(siteProfileClassDefaultId);
}
form.setSiteProfileClassDefault(true);
}
else {
if (siteProfileClassDefault == null || form.getSiteProfileClassId().equals(siteProfileClassDefaultId)) {
form.setSiteProfileClassDefault(true);
}
else {
form.setSiteProfileClassDefault(false);
}
form.setTranslationEnable(false);
String fromLocale = "";
String toLocale = "";
fromLocale = siteProfileClassDefault.getLanguage().getGoogleTranslateLocale();
SiteProfileClass siteProfileClass = (SiteProfileClass) em.find(SiteProfileClass.class, form.getSiteProfileClassId());
toLocale = siteProfileClass.getLanguage().getGoogleTranslateLocale();
if (!Format.isNullOrEmpty(fromLocale) && !Format.isNullOrEmpty(toLocale) && !fromLocale.equals(toLocale)) {
form.setTranslationEnable(true);
form.setFromLocale(fromLocale);
form.setToLocale(toLocale);
}
}
vector = new Vector<LabelValueBean>();
Long siteCurrencyClassDefaultId = null;
SiteCurrencyClass siteCurrencyClassDefault = site.getSiteCurrencyClassDefault();
if (siteCurrencyClassDefault != null) {
siteCurrencyClassDefaultId = siteCurrencyClassDefault.getSiteCurrencyClassId();
form.setSiteCurrencyClassDefaultId(siteCurrencyClassDefaultId);
vector.add(new LabelValueBean(siteCurrencyClassDefault.getSiteCurrencyClassName(),
siteCurrencyClassDefault.getSiteCurrencyClassId().toString()));
}
sql = "from SiteCurrencyClass siteCurrencyClass " +
"where siteCurrencyClass.site.siteId = :siteId " +
"order by siteCurrencyClassName ";
query = em.createQuery(sql);
query.setParameter("siteId", site.getSiteId());
iterator = query.getResultList().iterator();
while (iterator.hasNext()) {
SiteCurrencyClass siteCurrencyClass = (SiteCurrencyClass) iterator.next();
if (siteProfileClassDefault != null) {
if (siteCurrencyClass.getSiteCurrencyClassId().equals(siteCurrencyClassDefaultId)) {
continue;
}
}
vector.add(new LabelValueBean(siteCurrencyClass.getSiteCurrencyClassName(),
siteCurrencyClass.getSiteCurrencyClassId().toString()));
}
LabelValueBean siteCurrencyClassBeans[] = new LabelValueBean[vector.size()];
vector.copyInto(siteCurrencyClassBeans);
form.setSiteCurrencyClassBeans(siteCurrencyClassBeans);
if (form.getSiteCurrencyClassId() == null) {
if (siteCurrencyClassDefault != null) {
form.setSiteCurrencyClassId(siteCurrencyClassDefaultId);
}
form.setSiteCurrencyClassDefault(true);
}
else {
if (siteCurrencyClassDefault == null || form.getSiteCurrencyClassId().equals(siteCurrencyClassDefaultId)) {
form.setSiteCurrencyClassDefault(true);
}
else {
form.setSiteCurrencyClassDefault(false);
}
}
}
/*
* This method should not be called directly from the action class.
* Should be calling setStream() and setStreamData()
*/
protected void streamWebService(HttpServletResponse response, String data) throws IOException {
response.setContentType("text/html; charset=UTF-8");
response.setContentLength(data.getBytes(Constants.SYSTEM_ENCODING).length);
OutputStream outputStream = response.getOutputStream();
outputStream.write(data.getBytes(Constants.SYSTEM_ENCODING));
outputStream.flush();
}
protected void commitAndRestartTransaction() throws Exception {
EntityManager em = JpaConnection.getInstance().getCurrentEntityManager();
em.getTransaction().commit();
em = JpaConnection.getInstance().getCurrentEntityManager();
em.getTransaction().begin();
}
}