/*
* $Id: IWPresentationServlet.java,v 1.65.2.1 2007/01/12 19:32:47 idegaweb Exp $
*
* Copyright (C) 2001 Idega hf. All Rights Reserved.
*
* This software is the proprietary information of Idega hf.
* Use is subject to license terms.
*
*/
package com.idega.servlet;
import java.awt.AWTEvent;
import java.awt.ActiveEvent;
import java.io.IOException;
import java.rmi.RemoteException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.idega.business.IBOLookup;
import com.idega.event.IWEventMachine;
import com.idega.event.IWEventProcessor;
import com.idega.event.IWModuleEvent;
import com.idega.event.IWPresentationEvent;
import com.idega.idegaweb.IWBundle;
import com.idega.idegaweb.IWConstants;
import com.idega.idegaweb.IWException;
import com.idega.idegaweb.IWMainApplication;
import com.idega.idegaweb.IWResourceBundle;
import com.idega.presentation.ExceptionWrapper;
import com.idega.presentation.IWContext;
import com.idega.presentation.Page;
import com.idega.presentation.PresentationObject;
import com.idega.presentation.text.Text;
/**
* This is the base abstract servlet for presenting pages built with com.idega.presentation.PresentationObject objects and subclasses of that base class.
*@author <a href="mailto:tryggvi@idega.is">Tryggvi Larusson</a>
*@version 1.2
*/
public class IWPresentationServlet extends IWCoreServlet {
private static final String IW_BUNDLE_IDENTIFIER = "com.idega.core";
protected static final String IW_CONTEXT_KEY = "idegaweb_iwc";
private Boolean checkedCurrentAppContext = null;
/*
public void init(ServletConfig config)
throws ServletException{
super.init(config);
}*/
/*public void init()throws ServletException{
//System.out.println("Inside init() for "+getServletConfig().getServletName());
super.init();
String servletName = this.getServletConfig().getServletName();
System.out.println("Inside init for "+servletName);
initializePage();
}*/
protected boolean hasCheckedCurrentAppContext() {
if (this.checkedCurrentAppContext == null) {
synchronized (this) {
if (this.checkedCurrentAppContext == null) {
this.checkedCurrentAppContext = Boolean.TRUE;
return false;
}
else {
return true;
}
}
}
else {
return true;
}
}
protected void initializeIWContext(HttpServletRequest request, HttpServletResponse response) throws Exception {
//TODO: Find a better solution for this
IWContext iwc = getIWContext();
if(iwc==null) {
if (!hasCheckedCurrentAppContext()) {
this.getApplication().setApplicationContextURI(request.getContextPath());
}
iwc = new IWContext(request, response,getServletContext());
if (iwc.isMultipartFormData()) {
//writer.println("form is multipart");
handleMultipartFormData(iwc);
}
// else {
// writer.println("form is not multipart");
// writer.println("<br>type: "+iwc.getRequestContentType());
// }
String markup = iwc.getParameter("idega_special_markup");
if (markup != null) {
iwc.setMarkupLanguage(markup);
}
storeObject(IW_CONTEXT_KEY, iwc);
}
}
public void doGet(HttpServletRequest servReq, HttpServletResponse servRes) throws ServletException, IOException {
executeAllPhases(servReq, servRes);
}
public void doPost(HttpServletRequest servReq, HttpServletResponse servRes) throws ServletException, IOException {
executeAllPhases(servReq, servRes);
}
public void processBusinessEvent(IWContext iwc)
throws ClassNotFoundException, IllegalAccessException, IWException, InstantiationException {
IWEventProcessor.getInstance().processBusinessEvent(iwc);
/*
String eventClassEncr = iwc.getParameter(IWMainApplication.IdegaEventListenerClassParameter);
processIWEvent(iwc,eventClassEncr);
*/
}
private void processApplicationEvents(IWContext iwc) throws ClassNotFoundException, IllegalAccessException, IWException, InstantiationException{
IWEventProcessor.getInstance().processApplicationEvents(iwc);
}
public boolean processAWTEvent(IWContext iwc, HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
String sessionAddress = iwc.getParameter(IWMainApplication.IWEventSessionAddressParameter);
if (sessionAddress != null && !"".equals(sessionAddress)) {
Object obj = iwc.getSessionAttribute(sessionAddress);
if (obj != null) {
if (obj instanceof ActiveEvent && obj instanceof AWTEvent) {
if (Page.isRequestingTopPage(iwc)) {
__theService(request, response);
}
//theServiceDone = true;
if (obj instanceof IWModuleEvent) {
((IWModuleEvent) obj).setIWContext(iwc);
}
/*else {
this.getPage()._setIWContext(iwc);
}*/
((ActiveEvent) obj).dispatch();
return true;
/* Kommenta� �t �ar til kerfi� r��ur vi� �r��i
EventQueue q = Toolkit.getDefaultToolkit().getSystemEventQueue();
q.postEvent((AWTEvent)obj);
*/
}
}
}
return false;
}
public void executeAllPhases(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//PrintWriter writer = null;
try {
//long time1 = System.currentTimeMillis();
//com.idega.core.accesscontrol.business.AccessControl._COUNTER = 0;
initializeIWContext(request, response);
IWContext iwc = getIWContext();
com.idega.util.ThreadContext tc = getThreadContext();
tc.getAttribute("");
//try {
handleLocaleParameter(iwc);
//writer = iwc.getWriter(); //get the writer
try{
processBusinessEvent(iwc);
processApplicationEvents(iwc);
}
catch(Exception e){
e.printStackTrace();
}
initializePage();
processPresentationEvent(iwc);
//added by gummi@idega.is
//begin
boolean theServiceDone = processAWTEvent(iwc, request, response);
//end
// new Event system
increaseHistoryID(iwc);
handleEvent(iwc);
// event system end
//if (isActionPerformed(request,response)){
//actionPerformed(new ModuleEvent(request,response));
//actionPerformed(new ModuleEvent(iwc));
//}
//else{
if (!theServiceDone) //gummi@idega.is
{
if (Page.isRequestingTopPage(iwc)) {
__theService(request, response);
}
}
//}
// iwc.getWriter().println("\n");
executeMain(iwc);
//}
/*catch (IWPageInitializationException iwe) {
iwe.printStackTrace();
ErrorPage errorPage = new ErrorPage();
errorPage.setErrorMessage(iwe.getMessage());
this.setPage(errorPage);
}
catch (Exception e) {
e.printStackTrace();
ErrorPage errorPage = new ErrorPage();
errorPage.setErrorMessage("There was an error, your session is probably expired");
this.setPage(errorPage);
}*/
executeRender(iwc);
//long time2 = System.currentTimeMillis();
//writer.println("<!--" + (time2 - time1) + " ms-->");
//done
finished(iwc);
/*
writer.println("<!--");
writer.println("---------- Session Attributes -----------");
Enumeration enum = iwc.getSession().getAttributeNames();
if(enum != null){
writer.println("Session.hashCode() = "+ iwc.getSession().hashCode());
while (enum.hasMoreElements()) {
String item = (String)enum.nextElement();
writer.println("Attribute: "+item+" = "+iwc.getSession().getAttribute(item));
}
} else {
writer.println("Session empty");
}
writer.println("-->");
*/
//writer.println("<!-- viewpermission: "+com.idega.core.accesscontrol.business.AccessControl._COUNTER +" -->");
/*if (connectionRequested()){
freeConnection();
}*/
//getThreadContext().releaseThread(Thread.currentThread());
}
catch (Exception ex) {
if (ex instanceof java.io.IOException){
//throw (java.io.IOException) ex.fillInStackTrace();
throw (java.io.IOException)ex;
}
else if (ex instanceof javax.servlet.ServletException){
//throw (javax.servlet.ServletException) ex.fillInStackTrace();
throw (javax.servlet.ServletException)ex;
}
else{
ex.printStackTrace();
throw new javax.servlet.ServletException(ex);
/*writer.println("<H2>IWError</H2>");
writer.println("<pre>");
writer.println(ex.getMessage());
ex.printStackTrace(System.err);
writer.println("</pre>");*/
}
}
}
/**
* This method is called after everything is done
* @param iwc
*/
protected void finished(IWContext iwc) {
}
public void __theService(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
public void initializePage() throws Exception {
//String servletName = this.getServletConfig().getServletName();
//System.out.println("Inside initializePage for "+servletName);
setPage(Page.loadPage(getIWContext()));
}
public void setPage(Page myPage) {
//System.out.println("Inside setPage()");
//storeObject(Page.IW_PAGE_KEY,(Page)myPage.clone());
Page.setTopPage(myPage);
//storeObject(Page.IW_PAGE_KEY,myPage);
//this.page=page;
/*String servletName = this.getServletConfig().getServletName();
String attributeKey =servletName+"_idega_page";
//System.out.println("AttributeKey="+attributeKey+" for setPage()");
getServletContext().setAttribute(attributeKey,myPage);*/
}
public Page getPage() {
return Page.getPage(getIWContext());
}
public static IWContext getIWContext() {
return (IWContext) retrieveObject(IW_CONTEXT_KEY);
}
/**
* @deprecated
*/
public HttpServletRequest getRequest() {
return getIWContext().getRequest();
}
/**
* @deprecated
*/
public HttpSession getSession() {
return getIWContext().getSession();
}
/**
* @deprecated
*/
public HttpServletResponse getResponse() {
return getIWContext().getResponse();
}
public String getParameter(String parameterName) {
return getRequest().getParameter(parameterName);
}
public String[] getParameterValues(String parameterName) {
return getRequest().getParameterValues(parameterName);
}
public Object getSessionAttribute(String attributeName) {
return getSession().getAttribute(attributeName);
}
public void setSessionAttribute(String attributeName, Object attribute) {
getSession().setAttribute(attributeName, attribute);
}
public void removeSessionAttribute(String attributeName) {
getSession().removeAttribute(attributeName);
}
public void add(PresentationObject objectToAdd) {
getPage().add(objectToAdd);
}
public void add(String text) {
add(new Text(text));
}
public void addToTemplate(PresentationObject obj) {
}
public void executeMain(IWContext iwc) throws Exception {
//getPage().setTreeID("0");
//getPage().updateTreeIDs();
//String node = iwc.getParameter("idega_special_tree_node");
//if( node != null){
// PresentationObject obj = getPage().getContainedObject(node);
//iwc.getResponse().getWriter().println("klasi:"+obj.getClass().getName());
// if(obj!=null){
// obj._main(iwc);
// }
//}
getPage()._main(iwc);
//System.out.println("Inside _main() for: "+this.getClass().getName()+" - Tread: "+Thread.currentThread().toString());
}
public void executeRender(IWContext iwc) throws Exception {
String language = iwc.getMarkupLanguage();
if (language.equals(IWConstants.MARKUP_LANGUAGE_HTML)) {
iwc.setContentType("text/html");
}
else if (language.equals(IWConstants.MARKUP_LANGUAGE_WML)) {
iwc.setContentType("text/vnd.wap.wml");
}
else if (language.equals(IWConstants.MARKUP_LANGUAGE_PDF_XML)){
iwc.setContentType("application/pdf");
}
//getPage()._print(iwc);
//getPage()._initPrinting(iwc);
getPage().renderComponent(iwc);
//System.out.println("Inside __print() for: "+this.getClass().getName()+" - Tread: "+Thread.currentThread().toString());
}
//public void actionPerformed(ModuleEvent e)throws Exception{
//try{
// __theService(e.getRequest(),e.getResponse());
/*}
catch(IOException, ex){
throw new Exception(ex.getMessage());
}*/
//}
public void debug(String debugString) {
try {
//eiki commented out for testing
//getIWContext().getWriter().println(debugString);
}
catch (Exception ex) {
System.err.println("Error in IWPresentationServlet.debug() : " + ex.getMessage());
ex.printStackTrace(System.err);
}
}
public void setPageAttribute(String attributeName, Object object) {
setSessionAttribute(getServletConfig().getServletName() + attributeName, object);
}
public Object getPageAttribute(String attributeName) {
return getSessionAttribute(getServletConfig().getServletName() + attributeName);
}
public void removePageAttribute(String attributeName) {
removeSessionAttribute(getServletConfig().getServletName() + attributeName);
}
protected void handleException(Exception ex, Object thrower) {
Text text = new Text(thrower.getClass().getName());
add(new ExceptionWrapper(ex, text));
}
public String getBundleIdentifier() {
return IW_BUNDLE_IDENTIFIER;
}
public IWBundle getBundle(IWContext iwc) {
IWMainApplication iwma = iwc.getIWMainApplication();
return iwma.getBundle(getBundleIdentifier());
}
public IWResourceBundle getResourceBundle(IWContext iwc) {
IWBundle bundle = getBundle(iwc);
if (bundle != null) {
return bundle.getResourceBundle(iwc.getCurrentLocale());
}
return null;
}
public String getLocalizedString(String key, IWContext iwc) {
IWResourceBundle bundle = getResourceBundle(iwc);
if (bundle != null) {
return bundle.getLocalizedString(key);
}
return null;
}
public void increaseHistoryID(IWContext iwc) {
IWEventProcessor.getInstance().increaseHistoryID(iwc);
}
private void handleLocaleParameter(IWContext iwc) {
IWEventProcessor.getInstance().handleLocaleParameter(iwc);
}
public void handleEvent(IWContext iwc) {
IWEventProcessor.getInstance().handleEvent(iwc);
}
private void handleMultipartFormData(IWContext iwc) throws Exception {
IWEventProcessor.getInstance().handleMultipartFormData(iwc);
}
public void processPresentationEvent(IWContext iwc) throws RemoteException {
if (IWPresentationEvent.anyEvents(iwc)) {
IWEventMachine eventMachine = (IWEventMachine) IBOLookup.getSessionInstance(iwc, IWEventMachine.class);
eventMachine.processEvent(this.getPage(), iwc);
}
}
}