package org.jblooming.waf; import org.jblooming.ApplicationException; import org.jblooming.messaging.MailHelper; import org.jblooming.ontology.Identifiable; import org.jblooming.ontology.IdentifiableSupport; import org.jblooming.ontology.SerializedList; import org.jblooming.persistence.PersistenceHome; import org.jblooming.persistence.exceptions.PersistenceException; import org.jblooming.system.SystemConstants; import org.jblooming.tracer.Tracer; import org.jblooming.utilities.JSP; import org.jblooming.utilities.ReflectionUtilities; import org.jblooming.utilities.StringUtilities; import org.jblooming.waf.constants.Commands; import org.jblooming.waf.exceptions.ActionException; import org.jblooming.waf.html.container.Container; import org.jblooming.waf.html.core.JspIncluder; import org.jblooming.waf.html.input.SmartCombo; import org.jblooming.waf.html.state.ScreenElementStatus; import org.jblooming.waf.settings.I18n; import org.jblooming.waf.settings.businessLogic.I18nController; import org.jblooming.waf.view.ClientEntry; import org.jblooming.waf.view.PageState; import javax.mail.internet.MimeMultipart; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.HashSet; import java.util.List; import java.util.Set; /** * @author Roberto Bicchierai rbicchierai@open-lab.com * Date: 14-feb-2006 : 18.01.30 */ public class DefaultCommandController implements ActionController { PageState pageState; SessionState sm; String domId; public PageState perform(HttpServletRequest request, HttpServletResponse response) throws PersistenceException, ActionException, org.jblooming.security.SecurityException, ApplicationException, IOException { sm = SessionState.getSessionState(request); boolean debug = false; pageState = PageState.getCurrentPageState(); domId = pageState.getEntry(SystemConstants.DOM_ID).stringValueNullIfEmpty(); response.setContentType("text/html"); try { if (pageState != null && pageState.getCommand() != null) { String command = pageState.getCommand(); if (debug) { Tracer.platformLogger.info(" System.out commands.jsp: " + command + "\n" + pageState.getClientEntries().toString()); } if (command.equals(Commands.UPDATE_WIN_SIZE)) { cmdUpdateWinSize(); } else if (command.equals(Commands.CMD_MOVE)) { cmdMove(); } else if (command.equals(Commands.CMD_COLLAPSE)) { cmdCollapse(); } else if (command.equals(Commands.CMD_RESTORE)) { cmdRestore(); } else if (command.equals(Commands.CMD_HIDE)) { cmdHide(); } else if (command.equals(Commands.CMD_ICONIZE)) { cmdIconize(); } else if (command.equals(Commands.CMD_SHOW)) { cmdShow(); } else if (command.equals(Commands.CMD_RESIZE)) { cmdResize(); } else if (command.equals(I18n.CMD_STORE_LABEL)) { new I18nController().perform(request, response); // call generic controller } else if ("CALLCONTR".equals(command)) { cmdCallController(request, response); } else if ("SAVE_IN_OPT".equalsIgnoreCase(command)) { cmdSaveEntryInOptions(); } else if ("sendPdfByEmail".equalsIgnoreCase(command)) { cmdSendMail(); } } } catch (Throwable e) { Tracer.platformLogger.error(e); } return pageState; } private void cmdSaveEntryInOptions() throws PersistenceException { String name = pageState.getEntry("CEName").stringValueNullIfEmpty(); String value = pageState.getEntry("CEValue").stringValueNullIfEmpty(); if (JSP.ex(name)) { ClientEntry ce = pageState.getEntryOrDefault(name); if (JSP.ex(value)) { ce.setValue(value); pageState.saveEntriesInDefaults(); } } } private void cmdCallController(HttpServletRequest request, HttpServletResponse response) { //"executeCommand(\"CALLCONTR\",\"CTCL=" + controller.getName() + "&CTRM=" + command + "&OBID=" + objId + "\");"; //what if I have to pass more than one argument? Just set it as concainschifated value of OBID String className = pageState.getEntry("CTCL").stringValueNullIfEmpty(); String cmd = pageState.getEntry("CTRM").stringValueNullIfEmpty(); String obId = pageState.getEntry("OBID").stringValueNullIfEmpty(); if (JSP.ex(className) && JSP.ex(cmd)) { //&& JSP.ex(obId) try { Class<? extends ActionController> controllerCl = (Class<? extends ActionController>) Class.forName(className); Constructor cWithPageState = null; try { cWithPageState = controllerCl.getConstructor(PageState.class); } catch (NoSuchMethodException e) { } catch (SecurityException e) { } ActionController controller = null; if (cWithPageState != null) { controller = (ActionController) cWithPageState.newInstance(pageState); } else controller = controllerCl.newInstance(); pageState.command = cmd; pageState.mainObjectId = obId; controller.perform(request, response); } catch (Throwable e) { Tracer.platformLogger.error("DefaultCommandController: CallController. classname:" + className + " object id:" + obId, e); } } else { Tracer.platformLogger.error("DefaultCommandController: CallController. ControllerClass param missing, or command missing"); //or obj id missing, } } private void cmdResize() throws ApplicationException { if (!domId.startsWith(JspIncluder.DOM_ID)) { ScreenElementStatus cs = sm.screenElementsStatus.get(domId); if (cs == null) cs = new ScreenElementStatus(domId); String w = pageState.getEntry("W").stringValueNullIfEmpty(); String h = pageState.getEntry("H").stringValueNullIfEmpty(); cs.w = w; cs.h = h; sm.screenElementsStatus.put(domId, cs); } } private void cmdHide() throws ApplicationException { if (!domId.startsWith(JspIncluder.DOM_ID)) { ScreenElementStatus cs = sm.screenElementsStatus.get(domId); if (cs == null) cs = new ScreenElementStatus(domId); cs.status = Container.HIDDEN; sm.screenElementsStatus.put(domId, cs); } } private void cmdIconize() throws ApplicationException { if (!domId.startsWith(JspIncluder.DOM_ID)) { ScreenElementStatus cs = sm.screenElementsStatus.get(domId); if (cs == null) cs = new ScreenElementStatus(domId); cs.status = Container.ICONIZED; sm.screenElementsStatus.put(domId, cs); } } private void cmdCollapse() throws ApplicationException { if (!domId.startsWith(JspIncluder.DOM_ID)) { ScreenElementStatus cs = sm.screenElementsStatus.get(domId); if (cs == null) cs = new ScreenElementStatus(domId); cs.status = Container.COLLAPSED; sm.screenElementsStatus.put(domId, cs); } } private void cmdRestore() throws ApplicationException { if (!domId.startsWith(JspIncluder.DOM_ID)) { ScreenElementStatus cs = sm.screenElementsStatus.get(domId); if (cs == null) cs = new ScreenElementStatus(domId); cs.status = Container.DEFAULT; sm.screenElementsStatus.put(domId, cs); } } private void cmdShow() throws ApplicationException { if (!domId.startsWith(JspIncluder.DOM_ID)) { ScreenElementStatus cs = sm.screenElementsStatus.get(domId); if (cs == null) cs = new ScreenElementStatus(domId); cs.status = Container.DEFAULT ; sm.screenElementsStatus.put(domId, cs); } } private void cmdMove() throws ApplicationException { if (!domId.startsWith(JspIncluder.DOM_ID)) { int x = pageState.getEntry("X").intValueNoErrorCodeNoExc(); int y = pageState.getEntry("Y").intValueNoErrorCodeNoExc(); ScreenElementStatus cs = sm.screenElementsStatus.get(domId); if (cs == null) cs = new ScreenElementStatus(domId); cs.x = x; cs.y = y; sm.screenElementsStatus.put(domId, cs); } } private void cmdUpdateWinSize() throws ActionException { ClientEntry ceW = pageState.getEntry("PAGE_WIDTH"); ClientEntry ceH = pageState.getEntry("PAGE_HEIGHT"); if (ceW.stringValue() != null && ceH.stringValue() != null) { String width = ceW.stringValue(); String height = ceH.stringValue(); try { pageState.getSessionState().setPageHeight(Integer.parseInt(height)); pageState.getSessionState().setPageWidth(Integer.parseInt(width)); } catch (Exception e) { Tracer.platformLogger.warn(e); } } } private void cmdSendMail() throws ActionException { String args = pageState.getEntry("ARGS").stringValueNullIfEmpty(); if (JSP.ex(args)) { String filePath = pageState.getEntry("FILE_PATH").stringValue(); String from = pageState.getEntry("FROM").stringValue(); String subject = pageState.getEntry("SUBJECT").stringValue(); String body = pageState.getEntry("BODY").stringValue(); String objClassName = pageState.getEntry("OBJ_CLASS_NAME").stringValue(); String methodName = pageState.getEntry("METHOD_NAME").stringValue(); File filePdf = new File(filePath); try { byte[] bytesOfFile = new byte[(int) filePdf.length()]; DataInputStream dis = new DataInputStream(new FileInputStream(filePdf)); dis.readFully(bytesOfFile); dis.close(); Class objClass = Class.forName(objClassName); Method method = objClass.getMethod(methodName); String[] ids = args.split(";"); for (int i = 0; i < ids.length; i++) { String id = ids[i]; Object resource = PersistenceHome.findByPrimaryKey(objClass, id); if (resource != null) { String to = (String) method.invoke(resource);//resource.getDefaultEmail(); MailHelper.sendMailWithAttachFile(new MimeMultipart(), from, to, subject, body, filePdf.getName(), bytesOfFile, "UTF-8", "application/pdf"); } } } catch (Throwable e) { Tracer.platformLogger.error(e); pageState.addClientEntry("INFO_SEND_MAIL", "ERROR SENDING AN EMAIL: " + e.toString()); throw new ActionException("ERROR SENDING AN EMAIL: " + e); } finally { filePdf.deleteOnExit(); } pageState.addClientEntry("INFO_SEND_MAIL", "email sent correctly"); } } }