/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.xslt.lib; import java.util.Date; import org.apache.commons.codec.digest.DigestUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.google.common.base.Strings; import com.enonic.cms.core.content.ContentKey; import com.enonic.cms.core.content.binary.BinaryDataKey; import com.enonic.cms.core.portal.rendering.portalfunctions.PortalFunctionException; import com.enonic.cms.core.portal.rendering.portalfunctions.PortalFunctions; import com.enonic.cms.core.portal.rendering.portalfunctions.PortalFunctionsContext; import com.enonic.cms.core.portal.rendering.portalfunctions.PortalFunctionsFactory; import com.enonic.cms.core.search.query.IndexValueConverter; import com.enonic.cms.core.structure.SiteEntity; import com.enonic.cms.core.structure.menuitem.MenuItemEntity; import com.enonic.cms.core.structure.menuitem.MenuItemKey; import com.enonic.cms.core.structure.page.WindowKey; @Component public final class PortalFunctionsMediatorImpl implements PortalFunctionsMediator { public static final String UNDEFINED = "[undefined]"; private static final Logger LOG = LoggerFactory.getLogger( PortalFunctionsMediatorImpl.class ); private PortalFunctionsFactory portalFunctionsFactory; @Autowired public void setPortalFunctionsFactory( final PortalFunctionsFactory portalFunctionsFactory ) { this.portalFunctionsFactory = portalFunctionsFactory; } private PortalFunctions createPortalFunctions() { return this.portalFunctionsFactory.createPortalFunctions(); } @Override public String getInstanceKey() { try { return createPortalFunctions().getInstanceKey(); } catch ( final Exception e ) { return handleException( "getInstanceKey", e ); } } @Override public boolean isWindowEmpty( final String windowKey, final String[] params ) { try { return createPortalFunctions().isWindowEmpty( windowKey, params ); } catch ( final Exception e ) { handleException( "isWindowEmpty", e ); return false; } } @Override public boolean isWindowInline() { try { return createPortalFunctions().isWindowInline(); } catch ( final Exception e ) { handleException( "isWindowInline", e ); return false; } } @Override public String getPageKey() { try { return createPortalFunctions().getPageKey(); } catch ( final Exception e ) { return handleException( "getPageKey", e ); } } @Override public String getWindowKey() { try { return createPortalFunctions().getWindowKey(); } catch ( final Exception e ) { return handleException( "getWindowKey", e ); } } @Override public String createWindowPlaceholder( final String windowKey, final String[] params ) { try { return createPortalFunctions().createWindowPlaceholder( windowKey, params ); } catch ( final Exception e ) { return handleException( "createWindowPlaceholder", e ); } } @Override public String createUrl( final String local, final String[] params ) { try { return createPortalFunctions().createUrl( local, params ); } catch ( final Exception e ) { return handleException( "createUrl", e ); } } @Override public String createWindowUrl( final String windowKey, final String[] params, final String outputFormat ) { final boolean windowKeyGiven = !Strings.isNullOrEmpty( windowKey ); final boolean paramsGiven = params != null && params.length > 0; final boolean outputFormatGiven = !Strings.isNullOrEmpty( outputFormat ); try { if ( !windowKeyGiven ) { if ( !paramsGiven ) { return createPortalFunctions().createWindowUrl(); } else { return createPortalFunctions().createWindowUrl( params ); } } else { if ( outputFormatGiven ) { return createPortalFunctions().createWindowUrl( new WindowKey( windowKey ), params, outputFormat ); } else { return createPortalFunctions().createWindowUrl( new WindowKey( windowKey ), params ); } } } catch ( final Exception e ) { return handleException( "createWindowUrl", e ); } } @Override public String createPageUrl( final String menuItemKey, final String[] params ) { try { if ( menuItemKey == null ) { return createPortalFunctions().createPageUrl( params ); } return createPortalFunctions().createPageUrl( new MenuItemKey( menuItemKey ), params ); } catch ( final Exception e ) { return handleException( "createPageUrl", e ); } } @Override public String createContentUrl( final String contentKey, final String[] params ) { try { return createPortalFunctions().createContentUrl( new ContentKey( contentKey ), params ); } catch ( final Exception e ) { return handleException( "createContentUrl", e ); } } @Override public String createPermalink( final String contentKey, final String[] params ) { try { return createPortalFunctions().createPermalink( new ContentKey( contentKey ), params ); } catch ( final Exception e ) { return handleException( "createPermalink", e ); } } @Override public String createServicesUrl( final String handler, final String operation, final String[] params, final String redirect ) { try { return createPortalFunctions().createServicesUrl( handler, operation, redirect, params ); } catch ( final Exception e ) { return handleException( "createServicesUrl", e ); } } @Override public String createBinaryUrl( final String binaryKey, final String[] params ) { try { return createPortalFunctions().createBinaryUrl( new BinaryDataKey( binaryKey ), params ); } catch ( final Exception e ) { return handleException( "createBinaryUrl", e ); } } @Override public String createAttachmentUrl( final String nativeLinkKey, final String[] params ) { try { return createPortalFunctions().createAttachmentUrl( nativeLinkKey, params ); } catch ( final Exception e ) { return handleException( "createAttachmentUrl", e ); } } @Override public String createResourceUrl( final String resourcePath, final String[] params ) { try { return createPortalFunctions().createResourceUrl( resourcePath, params ); } catch ( final Exception e ) { return handleException( "createResourceUrl", e ); } } @Override public String createCaptchaImageUrl() { try { return createPortalFunctions().createCaptchaImageUrl(); } catch ( final Exception e ) { return handleException( "createCaptchaImageUrl", e ); } } @Override public String createCaptchaFormInputName() { try { return createPortalFunctions().createCaptchaFormInputName(); } catch ( final Exception e ) { return handleException( "createCaptchaFormInputName", e ); } } @Override public boolean isCaptchaEnabled( final String handler, final String operation ) { try { return createPortalFunctions().isCaptchaEnabled( handler, operation ); } catch ( final Exception e ) { handleException( "isCaptchaEnabled", e ); return false; } } @Override public String localize( final String phrase, final String[] params, final String locale ) { try { if ( ( params == null ) && ( locale == null ) ) { return createPortalFunctions().localize( phrase ); } else if ( locale != null ) { return createPortalFunctions().localize( phrase, params, locale ); } else { return createPortalFunctions().localize( phrase, params ); } } catch ( final Exception e ) { return handleException( "localize", e ); } } @Override public String getLocale() { try { return createPortalFunctions().getLocale(); } catch ( final Exception e ) { return handleException( "getLocale", e ); } } @Override public String createImageUrl( final String key, final String filter, final String background, final String format, final String quality ) { try { return createPortalFunctions().createImageUrl( key, filter, background, format, quality ); } catch ( final Exception e ) { return handleException( "createImageUrl", e ); } } @Override public boolean imageExists( final String key ) { try { return createPortalFunctions().imageExists( key ); } catch ( final Exception e ) { handleException( "imageExists", e ); return false; } } @Override public String md5( final String value ) { return DigestUtils.md5Hex( value ); } @Override public String sha( final String value ) { return DigestUtils.shaHex( value ); } @Override public Date dateTime( final String date ) { return IndexValueConverter.toDate( date ).toDateTime().toDate(); } private static String buildFailureMessage( String functionName, String failureReason ) { final PortalFunctionsContext portalFunctionsContext = PortalFunctionsFactory.get().getContext(); final StringBuilder message = new StringBuilder(); message.append( "Failure calling function " ).append( functionName ); MenuItemEntity menuItem = portalFunctionsContext.getMenuItem(); if ( menuItem != null ) { message.append( " during request to [" ); message.append( menuItem.getPathAsString() ).append( "]" ); } SiteEntity site = portalFunctionsContext.getSite(); if ( site != null ) { message.append( " in site [" ); message.append( site.getName() ).append( "]" ); } message.append( ". Reason: " ); message.append( failureReason ); return message.toString(); } private static String handleException( final String functionName, final Exception e ) { final String failureReason = resolveFailureReason( e ); final String failureMessage = buildFailureMessage( functionName, failureReason ); LOG.warn( failureMessage, e ); return UNDEFINED + ": " + failureReason; } private static String resolveFailureReason( final Exception e ) { final String failureReason; if ( e instanceof PortalFunctionException ) { PortalFunctionException pfe = (PortalFunctionException) e; failureReason = pfe.getFailureReason(); } else { failureReason = e.getMessage(); } return failureReason; } }