package com.idega.idegaweb.egov.bpm.presentation; import java.io.BufferedReader; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.security.Principal; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Random; import javax.el.ELContext; import javax.el.ELContextEvent; import javax.el.ELContextListener; import javax.faces.application.Application; import javax.faces.component.UIViewRoot; import javax.faces.context.ExternalContext; import javax.faces.context.ResponseWriter; import javax.servlet.RequestDispatcher; import javax.servlet.ServletInputStream; import javax.servlet.ServletOutputStream; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.myfaces.context.servlet.ServletExternalContextImpl; import org.apache.myfaces.el.unified.FacesELContext; import org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlResponseWriterImpl; import org.chiba.web.WebFactory; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import com.idega.chiba.web.session.impl.IdegaXFormHttpSession; import com.idega.core.builder.data.ICDomain; import com.idega.core.file.util.MimeTypeUtil; import com.idega.core.localisation.business.ICLocaleBusiness; import com.idega.idegaweb.IWMainApplication; import com.idega.jbpm.identity.BPMUserImpl; import com.idega.presentation.IWContext; import com.idega.user.data.User; import com.idega.util.CoreConstants; import com.idega.util.RequestUtil; public class IWContextMockUp extends IWContext { private static final long serialVersionUID = -4508560923047512886L; private Map<String, Object> contextAttributes = new HashMap<String, Object>(); private HttpServletRequest request; private HttpServletResponse response; private HttpSession session; private ResponseWriter writer; private UIViewRoot viewRoot; private ExternalContext externalContext; private ELContext elContext; public IWContextMockUp() { setCurrentInstance(this); } @Override public ELContext getELContext() { if (elContext != null) return elContext; elContext = new FacesELContext(getApplication().getELResolver(), this); ELContextEvent event = new ELContextEvent(elContext); for (ELContextListener listener : getApplication().getELContextListeners()) listener.contextCreated(event); return elContext; } @Override public ExternalContext getExternalContext() { if (externalContext == null) { IWMainApplication iwma = IWMainApplication.getDefaultIWMainApplication(); externalContext = new ServletExternalContextImpl(iwma.getServletContext(), getRequest(), getResponse()); } return externalContext; } @Override public Locale getCurrentLocale() { Locale locale = IWMainApplication.getDefaultIWMainApplication().getDefaultLocale(); return locale == null ? ICLocaleBusiness.getLocaleFromLocaleString("is_IS") : locale; } @Override public String getUserAgent() { Object agent = getRequest().getAttribute(RequestUtil.HEADER_USER_AGENT); if (agent == null) return "Request mock-up"; return agent.toString(); } @Override public void setViewRoot(UIViewRoot viewRoot) { this.viewRoot = viewRoot; } @Override public UIViewRoot getViewRoot() { return this.viewRoot; } @Override public ResponseWriter getResponseWriter() { if (writer == null) { writer = new HtmlResponseWriterImpl(new StringWriter(), MimeTypeUtil.MIME_TYPE_HTML, CoreConstants.ENCODING_UTF8); } return writer; } @Override public void setResponseWriter(ResponseWriter writer) { this.writer = writer; } @Override public void setSessionAttribute(String key, Object value) { contextAttributes.put(key, value); } @Override public Object getSessionAttribute(String key) { return contextAttributes.get(key); } @Override public void removeSessionAttribute(String key) { contextAttributes.remove(key); } @Override public Application getApplication() { return IWMainApplication.getDefaultIWMainApplication(); } @Override public HttpSession getSession() { if (session == null) { session = new IdegaXFormHttpSession( IWMainApplication.getDefaultIWMainApplication().getServletContext(), String.valueOf(new Random().nextInt(Integer.MAX_VALUE)), System.currentTimeMillis() ); } return session; } @Override public HttpServletResponse getResponse() { if (response == null) { response = new HttpServletResponse() { @Override public void setLocale(Locale loc) { } @Override public void setContentType(String type) { } @Override public void setContentLength(int len) { } @Override public void setCharacterEncoding(String charset) { } @Override public void setBufferSize(int size) { } @Override public void resetBuffer() { } @Override public void reset() { } @Override public boolean isCommitted() { return false; } @Override public PrintWriter getWriter() throws IOException { return null; } @Override public ServletOutputStream getOutputStream() throws IOException { return null; } @Override public Locale getLocale() { return null; } @Override public String getContentType() { return null; } @Override public String getCharacterEncoding() { return null; } @Override public int getBufferSize() { return 0; } @Override public void flushBuffer() throws IOException { } @Override public void setStatus(int sc, String sm) { } @Override public void setStatus(int sc) { } @Override public void setIntHeader(String name, int value) { } @Override public void setHeader(String name, String value) { } @Override public void setDateHeader(String name, long date) { } @Override public void sendRedirect(String location) throws IOException { } @Override public void sendError(int sc, String msg) throws IOException { } @Override public void sendError(int sc) throws IOException { } @Override public String encodeUrl(String url) { try { return URLEncoder.encode(url, CoreConstants.ENCODING_UTF8); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return url; } @Override public String encodeURL(String url) { return encodeUrl(url); } @Override public String encodeRedirectUrl(String url) { return null; } @Override public String encodeRedirectURL(String url) { return null; } @Override public boolean containsHeader(String name) { return false; } @Override public void addIntHeader(String name, int value) { } @Override public void addHeader(String name, String value) { } @Override public void addDateHeader(String name, long date) { } @Override public void addCookie(Cookie cookie) { } }; } return response; } @Override public HttpServletRequest getRequest() { if (request == null) { request = new HttpServletRequestMockUp(new HttpServletRequest() { @Override public void setCharacterEncoding(String env) throws UnsupportedEncodingException { } @Override public void setAttribute(String name, Object o) { } @Override public void removeAttribute(String name) { } @Override public boolean isSecure() { return false; } @Override public int getServerPort() { return 0; } @Override public String getServerName() { return null; } @Override public String getScheme() { return null; } @Override public RequestDispatcher getRequestDispatcher(String path) { return null; } @Override public int getRemotePort() { return 0; } @Override public String getRemoteHost() { return null; } @Override public String getRemoteAddr() { return null; } @Override public String getRealPath(String path) { return null; } @Override public BufferedReader getReader() throws IOException { return null; } @Override public String getProtocol() { return null; } @Override public String[] getParameterValues(String name) { return null; } private List<?> parameterNames = new ArrayList<Object>(); @Override public Enumeration<?> getParameterNames() { return Collections.enumeration(parameterNames); } @Override public Map<?, ?> getParameterMap() { return null; } @Override public String getParameter(String name) { return null; } @Override public Enumeration<?> getLocales() { return null; } @Override public Locale getLocale() { return null; } @Override public int getLocalPort() { return 0; } @Override public String getLocalName() { return null; } @Override public String getLocalAddr() { return null; } @Override public ServletInputStream getInputStream() throws IOException { return null; } @Override public String getContentType() { return null; } @Override public int getContentLength() { return 0; } @Override public String getCharacterEncoding() { return null; } @Override public Enumeration<?> getAttributeNames() { return null; } @Override public Object getAttribute(String name) { return null; } @Override public boolean isUserInRole(String role) { return false; } @Override public boolean isRequestedSessionIdValid() { return false; } @Override public boolean isRequestedSessionIdFromUrl() { return false; } @Override public boolean isRequestedSessionIdFromURL() { return false; } @Override public boolean isRequestedSessionIdFromCookie() { return false; } @Override public Principal getUserPrincipal() { return null; } @Override public HttpSession getSession(boolean create) { return null; } @Override public HttpSession getSession() { return null; } @Override public String getServletPath() { return null; } @Override public String getRequestedSessionId() { return null; } @Override public StringBuffer getRequestURL() { return new StringBuffer(CoreConstants.PAGES_URI_PREFIX); } @Override public String getRequestURI() { return null; } @Override public String getRemoteUser() { return null; } @Override public String getQueryString() { return null; } @Override public String getPathTranslated() { return null; } @Override public String getPathInfo() { return null; } @Override public String getMethod() { return null; } @Override public int getIntHeader(String name) { return 0; } @Override public Enumeration<?> getHeaders(String name) { return null; } @Override public Enumeration<?> getHeaderNames() { return null; } @Override public String getHeader(String name) { return null; } @Override public long getDateHeader(String name) { return 0; } @Override public Cookie[] getCookies() { return null; } @Override public String getContextPath() { return null; } @Override public String getAuthType() { return null; } }); request.setAttribute(WebFactory.SCRIPTED, Boolean.TRUE.toString()); request.setAttribute(RequestUtil.HEADER_USER_AGENT, "Request mock-up"); setBPMUser(((HttpServletRequestMockUp) request).requestAttributes); RequestContextHolder.setRequestAttributes(new RequestAttributes() { @Override public void setAttribute(String name, Object value, int scope) { } @Override public void removeAttribute(String name, int scope) { } @Override public void registerDestructionCallback(String name, Runnable callback, int scope) { } @Override public Object getSessionMutex() { return getSession(); } @Override public String getSessionId() { return null; } @Override public String[] getAttributeNames(int scope) { return null; } @Override public Object getAttribute(String name, int scope) { return null; } }); } return request; } private class HttpServletRequestMockUp extends HttpServletRequestWrapper { private Map<String, Object> requestAttributes = new HashMap<String, Object>(); private HttpServletRequestMockUp(HttpServletRequest request) { super(request); } @Override public String getScheme() { ICDomain domain = IWMainApplication.getDefaultIWApplicationContext().getDomain(); return domain.getServerProtocol(); } @Override public String getServerName() { ICDomain domain = IWMainApplication.getDefaultIWApplicationContext().getDomain(); return domain.getServerName(); } @Override public int getServerPort() { ICDomain domain = IWMainApplication.getDefaultIWApplicationContext().getDomain(); return domain.getServerPort(); } @Override public String getContextPath() { return CoreConstants.PAGES_URI_PREFIX; } @Override public void setAttribute(String key, Object value) { requestAttributes.put(key, value); } @Override public Object getAttribute(String key) { return requestAttributes.get(key); } @Override public void removeAttribute(String key) { requestAttributes.remove(key); } } @SuppressWarnings("unchecked") private <V extends Object> void setBPMUser(Map<String, V> attributes) { try { User admin = IWMainApplication.getDefaultIWMainApplication().getAccessController().getAdministratorUser(); attributes.put(BPMUserImpl.bpmUsrParam, (V) admin.getUniqueId()); } catch (Exception e) { e.printStackTrace(); } } }