/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.portal.processor;
import java.util.Map;
import com.enonic.cms.core.Path;
import com.enonic.cms.core.RequestParameters;
import com.enonic.cms.core.RequestParametersMerger;
import com.enonic.cms.core.structure.SitePath;
import com.enonic.cms.core.structure.menuitem.MenuItemEntity;
import com.enonic.cms.core.structure.menuitem.MenuItemType;
/**
* Sep 28, 2009
*/
public class DirectiveRequestProcessor
extends AbstractBasePortalRequestProcessor
{
private DirectiveRequestProcessorContext context;
public DirectiveRequestProcessor( DirectiveRequestProcessorContext context )
{
this.context = context;
}
public DirectiveRequestProcessorResult process()
{
SitePath sitePath = context.getOriginalSitePath();
portalAccessService.checkAccessToPage( context.getMenuItem(), sitePath, context.getRequester() );
MenuItemType type = context.getMenuItem().getType();
if ( type.equals( MenuItemType.SHORTCUT ) )
{
return processMenuItemShortcutRequest();
}
else if ( type.equals( MenuItemType.URL ) )
{
return processMenuItemUrlRequest();
}
else
{
throw new IllegalStateException( "Directive is of illegal menuitem type: " + type );
}
}
private DirectiveRequestProcessorResult processMenuItemShortcutRequest()
{
SitePath sitePath = context.getSitePath();
MenuItemEntity shortcuttedMenuItem = context.getMenuItem().getMenuItemShortcut();
Path pathToShortcuttedMenuItem = shortcuttedMenuItem.getPath();
SitePath shortcutSitePath;
if ( context.getMenuItem().getIncludeRequestParameters() )
{
RequestParameters mergedRequestParameters =
RequestParametersMerger.mergeWithMenuItemRequestParameters( sitePath.getRequestParameters(),
context.getMenuItem().getRequestParameters() );
shortcutSitePath =
sitePath.createNewInSameSite( pathToShortcuttedMenuItem, mergedRequestParameters.getAsMapWithStringValues() );
}
else
{
shortcutSitePath = sitePath.createNewInSameSite( pathToShortcuttedMenuItem, sitePath.getParams() );
}
shortcutSitePath.removeParam( "id" );
// Check for eternal shortcut loop that can occurs when you have menuitems with equals names
SitePath originalSitePath = context.getOriginalSitePath();
String originalPath = originalSitePath.getLocalPath().toString();
if ( originalSitePath.getLocalPath().toString().equalsIgnoreCase( pathToShortcuttedMenuItem.toString() ) )
{
throw new RuntimeException( "Eternal shortcut loop prevented. " + "Shortcut '" + originalPath + "' points to the menuitem '" +
pathToShortcuttedMenuItem.toString() +
"' which have equal name (case ignored). Shortcut must be deleted!" );
}
if ( context.getMenuItem().isShortcutForward() )
{
return DirectiveRequestProcessorResult.createForwardToSitePath( shortcutSitePath );
}
else
{
Map shortcutParams = context.getRequestParams();
if ( context.getMenuItem().getKey().toString().equals( shortcutParams.get( "id" ) ) )
{
shortcutParams.remove( "id" );
}
// String redirectUrl = resolveRedirectToPageUrl( shortcuttedMenuItem, request.getSite(), httpRequest,
// shortcutParams );
return DirectiveRequestProcessorResult.createRedirectToSitePath( shortcutSitePath );
}
}
private DirectiveRequestProcessorResult processMenuItemUrlRequest()
{
return DirectiveRequestProcessorResult.createRedirectToAbsoluteURL( context.getMenuItem().getUrl() );
}
}