/*
* $Id: IWUrlRedirector.java,v 1.26 2009/04/20 09:47:56 valdas Exp $
* Created on 30.12.2004
*
* Copyright (C) 2004 Idega Software hf. All Rights Reserved.
*
* This software is the proprietary information of Idega hf.
* Use is subject to license terms.
*/
package com.idega.servlet.filter;
import java.io.IOException;
import java.rmi.RemoteException;
import java.util.Iterator;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.component.UIComponent;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.idega.core.builder.business.BuilderPageException;
import com.idega.core.builder.business.BuilderService;
import com.idega.core.builder.business.BuilderServiceFactory;
import com.idega.core.view.ViewManager;
import com.idega.core.view.ViewNode;
import com.idega.idegaweb.IWMainApplication;
import com.idega.presentation.DefaultErrorHandlingUriWindow;
import com.idega.util.CoreConstants;
import com.idega.util.RequestUtil;
import com.idega.util.StringUtil;
/**
* Filter that detects incoming urls and redirects to another url. <br>
* Now used for mapping old idegaWeb urls to the new appropriate ones.<br><br>
*
* Last modified: $Date: 2009/04/20 09:47:56 $ by $Author: valdas $
*
* @author <a href="mailto:tryggvil@idega.com">tryggvil</a>
* @version $Revision: 1.26 $
*/
public class IWUrlRedirector extends BaseFilter implements Filter {
private static final Logger LOGGER = Logger.getLogger(IWUrlRedirector.class.getName());
@Override
public void init(FilterConfig arg0) throws ServletException {
}
@Override
public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) srequest;
HttpServletResponse response = (HttpServletResponse) sresponse;
setApplicationContext(request);
try {
boolean doRedirect = getIfDoRedirect(request);
if (doRedirect) {
String newUrl = getNewRedirectURL(request);
response.sendRedirect(newUrl);
} else if (isCorrectPath(request)) {
chain.doFilter(srequest,sresponse);
} else {
String newUrl = getFixedSlashURL(request);
response.sendRedirect(newUrl);
}
} catch (BuilderPageException pe) {
if (pe.getCode().equals(BuilderPageException.CODE_NOT_FOUND)) {
String redirectUri = RequestUtil.getRedirectUriByApplicationProperty(request, HttpServletResponse.SC_NOT_FOUND);
if (StringUtil.isEmpty(redirectUri)) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
LOGGER.warning("Found default page for error 404, redirecting to: " + redirectUri);
response.sendRedirect(redirectUri);
return;
} else {
throw pe;
}
}
removeApplicationContext(request);
}
String getFixedSlashURL(HttpServletRequest request) {
String queryString = request.getQueryString();
if(queryString!=null){
return request.getRequestURI() + "/?"+queryString;
}
else{
return request.getRequestURI() + CoreConstants.SLASH;
}
}
boolean isCorrectPath(HttpServletRequest request) {
String requestUri = getURIMinusContextPath(request);
if(requestUri.startsWith(NEW_WORKSPACE_URI_MINUSSLASH) || requestUri.startsWith(PAGES_URI_MINUSSLASH)) {
int lastSlashIndex = requestUri.lastIndexOf(CoreConstants.SLASH);
if(lastSlashIndex == requestUri.length() - 1) {
return true;
}
int lastDotIndex = requestUri.lastIndexOf(CoreConstants.DOT);
if(lastSlashIndex < lastDotIndex) {
return true;
} else {
return false;
}
}
return true;
}
/**
* @param request
* @return
*/
String getNewRedirectURL(HttpServletRequest request) {
//TODO: Make this logic support regular expressions
String requestUri = getURIMinusContextPath(request);
if(getIWMainApplication(request).isInSetupMode()){
return getSetupUri(request);
}
else if(requestUri.startsWith(OLD_BUILDER_SERVLET_URI) || requestUri.equals(OLD_BUILDER_INDEX_JSP_URI)){
String pageId = request.getParameter(OLD_BUILDER_PAGE_PARAMETER);
IWMainApplication iwma = getIWMainApplication(request);
BuilderService bs;
try {
bs = BuilderServiceFactory.getBuilderService(iwma.getIWApplicationContext());
if(pageId==null){
pageId=bs.getRootPageKey();
}
String newPageUri = bs.getPageURI(pageId);
Map<?, ?> pMap = request.getParameterMap();
StringBuffer newUri = new StringBuffer(newPageUri);
if (pMap != null) {
Iterator<?> keys = pMap.keySet().iterator();
boolean first = true;
while (keys.hasNext()) {
String key = (String) keys.next();
if (!key.equals(OLD_BUILDER_PAGE_PARAMETER)) {
String[] values = (String[]) pMap.get(key);
if (values != null) {
for (int i = 0; i < values.length; i++) {
if (first) {
newUri.append("?");
first = false;
} else {
newUri.append("&");
}
newUri.append(key).append("=").append(values[i]);
}
}
}
}
}
return newUri.toString();
}
catch (RemoteException e) {
LOGGER.log(Level.WARNING, "Error getting uri for page: " + pageId , e);
}
}
else if(requestUri.startsWith(OLD_IDEGAWEB_LOGIN)){
if(requestUri.equals(OLD_IDEGAWEB_LOGIN) || requestUri.equals(OLD_IDEGAWEB_LOGIN_WITHSLASH)){
return getNewLoginUri(request);
}
}
else if(requestUri.equals(NEW_IDEGAWEB_LOGIN_MINUSSLASH)){
return getNewLoginUri(request);
}
else if(requestUri.equals(NEW_WORKSPACE_URI_MINUSSLASH)){
return getNewWorkspaceUri(request);
}
else if(requestUri.equals(PAGES_URI_MINUSSLASH)){
return getPagesUri(request);
}
else if (requestUri.startsWith(OLD_OBJECT_INSTANCIATOR)) {
String classParam = IWMainApplication.decryptClassName(request.getParameter(IWMainApplication.classToInstanciateParameter));
Class<?> classToInstanciate = null;
try {
classToInstanciate = Class.forName(classParam);
} catch (Exception e) {
LOGGER.warning(classParam + " is not class name or such class can not be found!");
}
if (classToInstanciate != null) {
try {
Class<? extends UIComponent> uiComponentToInstanciate = classToInstanciate.asSubclass(UIComponent.class);
Map<?, ?> pMap = request.getParameterMap();
StringBuffer newUri = new StringBuffer(getIWMainApplication(request).getPublicObjectInstanciatorURI(uiComponentToInstanciate));
if (pMap != null) {
Iterator<?> keys = pMap.keySet().iterator();
boolean first = true;
while (keys.hasNext()) {
String key = (String) keys.next();
if (!key.equals(IWMainApplication.classToInstanciateParameter)) {
String[] values = (String[]) pMap.get(key);
if (values != null) {
for (int i = 0; i < values.length; i++) {
if (first) {
newUri.append("?");
first = false;
} else {
newUri.append("&");
}
newUri.append(key).append("=").append(values[i]);
}
}
}
}
}
return newUri.toString();
}
catch(ClassCastException e) {
LOGGER.log(Level.WARNING, "Error resolving " + UIComponent.class.getSimpleName() + " from: " + classToInstanciate.getName(), e);
}
catch (Exception e) {
LOGGER.log(Level.WARNING, "Error resolving " + UIComponent.class.getSimpleName() + " from: " + classToInstanciate.getName(), e);
}
}
}
else if (requestUri.startsWith(BUILDER_APPLICATION_URI)) {
BuilderService builder = null;
try {
builder = BuilderServiceFactory.getBuilderService(getIWMainApplication(request).getIWApplicationContext());
} catch (RemoteException e) {
LOGGER.log(Level.WARNING, "Error getting " + BuilderService.class.getSimpleName(), e);
}
if (builder.isFirstBuilderRun()) {
return new StringBuffer(NEW_WORKSPACE_URI).append(CoreConstants.CONTENT_VIEW_MANAGER_ID).toString();
}
else {
return new StringBuffer(NEW_WORKSPACE_URI).append(CoreConstants.BUILDER).toString();
}
}
else{
ViewManager viewManager = ViewManager.getInstance(getIWMainApplication(request));
ViewNode node = viewManager.getViewNodeForRequest(request);
if(node!=null){
if(node.getRedirectsToResourceUri()){
IWMainApplication iwma = getIWMainApplication(request);
String resourceUri = node.getResourceURI();
resourceUri = iwma.getTranslatedURIWithContext(resourceUri);
return resourceUri;
}
}
}
String referer = request.getHeader("Referer");
System.err.println("[IWUrlRedirector] Referer = "+referer);
System.err.println("Error handling redirect Url");
return getIWMainApplication(request).getPublicObjectInstanciatorURI(DefaultErrorHandlingUriWindow.class);
}
/**
* @param request
* @return
*/
boolean getIfDoRedirect(HttpServletRequest request) {
if(IWMainApplication.useNewURLScheme){
String requestUri = getURIMinusContextPath(request);
String oldIdegaWebUriWithSlash = OLD_IDEGAWEB_LOGIN_WITHSLASH;
ViewManager viewManager = ViewManager.getInstance(getIWMainApplication(request));
ViewNode node = viewManager.getViewNodeForRequest(request);
if(node!=null){
if(node.getRedirectsToResourceUri()){
return true;
}
}
if(getIWMainApplication(request).isInSetupMode()){
String fullRequestUri = request.getRequestURI();
//this is a small hack to force the bundles load:
getIWMainApplication(request).registerBundle("com.idega.core",false);
getIWMainApplication(request).registerBundle("com.idega.faces",false);
getIWMainApplication(request).registerBundle("com.idega.webface",false);
getIWMainApplication(request).registerBundle("com.idega.setup",false);
if(!fullRequestUri.equals(getSetupUri(request))){
return true;
}
}
if(requestUri.startsWith(OLD_BUILDER_SERVLET_URI)){
return true;
}
else if(requestUri.equals(OLD_BUILDER_INDEX_JSP_URI)){
return true;
}
else if(requestUri.equals(oldIdegaWebUriWithSlash)){
return true;
}
else if(requestUri.equals(OLD_IDEGAWEB_LOGIN)){
return true;
}
else if(requestUri.equals(NEW_IDEGAWEB_LOGIN_MINUSSLASH)){
return true;
}
else if(requestUri.equals(NEW_WORKSPACE_URI_MINUSSLASH)){
return true;
}
else if(requestUri.equals(PAGES_URI_MINUSSLASH)){
return true;
}
else if(requestUri.equals(OLD_OBJECT_INSTANCIATOR)){
return true;
}
else if (requestUri.startsWith(BUILDER_APPLICATION_URI)) {
return true;
}
}
return false;
}
@Override
public void destroy() {
}
}