/*
* $Id: IBMainServlet.java,v 1.29.2.2 2006/06/16 15:53:01 tryggvil 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.builder.servlet;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.idega.builder.business.BuilderLogic;
import com.idega.builder.business.CachedBuilderPage;
import com.idega.core.builder.business.BuilderService;
import com.idega.core.builder.business.BuilderServiceFactory;
import com.idega.idegaweb.IWApplicationContext;
import com.idega.presentation.IWContext;
import com.idega.servlet.IWJSPPresentationServlet;
/**
*@author <a href="mailto:tryggvi@idega.is">Tryggvi Larusson</a>
*@version 1.0
*/
public class IBMainServlet extends IWJSPPresentationServlet {
//needs to be static because there are at least 2 instances of IBMainServlet , /servlet/IBMainServlet and index.jsp
private static List initializedPageIDs;
public void initializePage()throws Exception{
setHandleJSPTags(false);
IWApplicationContext iwac = this.getApplication().getIWApplicationContext();
BuilderLogic blogic = BuilderLogic.getInstance();
BuilderService bs = BuilderServiceFactory.getBuilderService(iwac);
IWContext iwc = getIWContext();
/*boolean builderview = false;
if (iwc.isParameterSet("view")) {
if(blogic.isBuilderApplicationRunning(iwc)){
String view = iwc.getParameter("view");
if(view.equals("builder"))
builderview=true;
}
}*/
int i_page_id = bs.getCurrentPageId(iwc);
String sPageKey = Integer.toString(i_page_id);
setPage(blogic.getPage(sPageKey,iwc));
}
/* (non-Javadoc)
* @see com.idega.servlet.IWCoreServlet#getIfSyncronizeAccess(javax.servlet.ServletRequest, javax.servlet.ServletResponse)
*/
protected boolean getIfSyncronizeAccess(HttpServletRequest _req,HttpServletResponse _res) {
//if using a PageIncluder that calls a page on the same server and the pageincluder page is the first page loaded
//we will get a deadlock in the super impl of this method.
//However one will never create a pageincluder pointing to the page it is contained in so all we need to do is to
//keep track of what ibpages have been initilized and only synchronize a page when it is first being loaded and not lock out other
//pages at the same time.
//eiki@idega.is
if(initializedPageIDs==null) {
initializedPageIDs = new ArrayList();
}
try {
initializeIWContext(_req,_res);
IWContext iwc = getIWContext();
IWApplicationContext iwac = this.getApplication().getIWApplicationContext();
BuilderService bs = BuilderServiceFactory.getBuilderService(iwac);
Integer pageID = new Integer(bs.getCurrentPageId(iwc));
if(initializedPageIDs.contains(pageID)) {
//no need to synchronize
return false;
}
else {
//synchronize but add the id to memory so we don't do it again
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
//if all else failes, use the default
return super.getIfSyncronizeAccess(_req, _res);
}
/* (non-Javadoc)
* @see com.idega.servlet.IWCoreServlet#getObjectToSynchronizeOn(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
protected synchronized Object getObjectToSynchronizeOn(HttpServletRequest request,HttpServletResponse response) {
try {
IWContext iwc = getIWContext();
IWApplicationContext iwac = this.getApplication().getIWApplicationContext();
BuilderService bs = BuilderServiceFactory.getBuilderService(iwac);
Integer pageID = new Integer(bs.getCurrentPageId(iwc));
CachedBuilderPage page = BuilderLogic.getInstance().getCachedBuilderPage(pageID.toString());
//return pageID;
return page;
} catch (Exception e) {
e.printStackTrace();
}
//all else failes use default impl
return super.getObjectToSynchronizeOn(request,response);
}
/**
* This method can be overrided in sublcasses. Unsets syncronization for the current access to service.
* @param _req
* @param _res
* @return true if successfully unSet.
*/
protected boolean unSetSyncronizedAccess(HttpServletRequest _req, HttpServletResponse _res){
IWContext iwc = getIWContext();
IWApplicationContext iwac = this.getApplication().getIWApplicationContext();
BuilderService bs;
try {
bs = BuilderServiceFactory.getBuilderService(iwac);
Integer pageID = new Integer(bs.getCurrentPageId(iwc));
initializedPageIDs.add(pageID);
return true;
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
}