package org.openntf.domino.xsp.adapter; import java.util.logging.Logger; import javax.faces.FacesException; import javax.faces.context.FacesContext; import javax.faces.context.FacesContextFactory; import javax.faces.lifecycle.Lifecycle; import org.openntf.domino.utils.Factory; import org.openntf.domino.utils.Factory.SessionType; import org.openntf.domino.xsp.ODAPlatform; import org.openntf.domino.xsp.session.XPageCurrentSessionFactory; import org.openntf.domino.xsp.session.XPageSignerSessionFactory; import com.ibm.xsp.FacesExceptionEx; import com.ibm.xsp.context.FacesContextEx; import com.ibm.xsp.context.FacesContextFactoryImpl; import com.ibm.xsp.domino.context.DominoFacesContextFactoryImpl; import com.ibm.xsp.event.FacesContextListener; public class ODAFacesContextFactory extends FacesContextFactory { @SuppressWarnings("unused") private static final Logger log_ = Logger.getLogger(ODAFacesContextFactory.class.getName()); private final FacesContextFactory _delegate; private ContextListener _contextListener; /** * The contextListener terminates the factory on context-release. */ public static class ContextListener implements FacesContextListener { @Override public void beforeContextReleased(final FacesContext arg0) { Factory.termThread(); } @Override public void beforeRenderingPhase(final FacesContext arg0) { } } public ODAFacesContextFactory() { Object inst; try { @SuppressWarnings("rawtypes") Class delegateClass = DominoFacesContextFactoryImpl.class; inst = delegateClass.newInstance(); } catch (Exception e) { e.printStackTrace(); throw new FacesExceptionEx(e); } if (inst instanceof FacesContextFactory) { _delegate = (FacesContextFactory) inst; } else { _delegate = null; } } public ODAFacesContextFactory(final FacesContextFactory delegate) { if (delegate instanceof FacesContextFactoryImpl) { _delegate = ((FacesContextFactoryImpl) delegate).getDelegate(); } else { _delegate = delegate; } } @Override public FacesContext getFacesContext(final Object context, final Object request, final Object response, final Lifecycle lifecycle) throws FacesException { FacesContext ctx = _delegate.getFacesContext(context, request, response, lifecycle); Factory.initThread(ODAPlatform.getAppThreadConfig(null)); Factory.setSessionFactory(new XPageCurrentSessionFactory(), SessionType.CURRENT); Factory.setSessionFactory(new XPageSignerSessionFactory(false), SessionType.SIGNER); Factory.setSessionFactory(new XPageSignerSessionFactory(true), SessionType.SIGNER_FULL_ACCESS); // TODO RPr: This is probably the wrong locale. See ViewHandler.calculateLocale Factory.setUserLocale(ctx.getExternalContext().getRequestLocale()); Factory.setClassLoader(ctx.getContextClassLoader()); // NotesContext ntx = NotesContext.getCurrent(); if (ODAPlatform.isAppGodMode(null)) { ODAFacesContext localContext = new ODAFacesContext(ctx); attachListener(localContext); return localContext; } else { attachListener((FacesContextEx) ctx); return ctx; } } private void attachListener(final FacesContextEx ctx) { if (_contextListener == null) _contextListener = new ContextListener(); ctx.addRequestListener(_contextListener); } }