/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.portal; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.lang.StringUtils; import com.enonic.cms.core.Path; import com.enonic.cms.core.content.ContentKey; public class ContentPathResolver { private final static Pattern CONTENT_PATH_PATTERN = Pattern.compile( "^(.*/+)?(.*)--(\\d+)(/_window/.*)?$" ); private final static Pattern OLD_STYLE_CONTENT_PATH_PATTERN = Pattern.compile( "[0-9]+\\.cms(/_window/.*)?$" ); public static ContentPath resolveContentPath( final Path localPath ) { String localPathWithoutFragment = localPath.getPathWithoutFragmentAsString(); Matcher matcher = CONTENT_PATH_PATTERN.matcher( localPathWithoutFragment ); if ( !matcher.matches() ) { return tryResolveOldTypeContentPath( localPath ); } final Path menuItemPath = resolveMenuItemPath( localPath ); String contentTitle = matcher.group( 2 ); ContentKey contentKey = new ContentKey( matcher.group( 3 ) ); return new ContentPath( contentKey, contentTitle, menuItemPath ); } private static ContentPath tryResolveOldTypeContentPath( final Path localPath ) { Matcher cmsMatcher = OLD_STYLE_CONTENT_PATH_PATTERN.matcher( localPath.getPathAsString() ); if ( !cmsMatcher.find() ) { return null; } final Path menuItemPath = resolveMenuItemPath( localPath ); String contentTitleAndKey = resolveContentTitleAndKeyPart( localPath ); int dotPosition = contentTitleAndKey.lastIndexOf( '.' ); ContentKey contentKey = resolveContentKey( contentTitleAndKey, dotPosition ); String contentTitle = resolveContentTitle( contentTitleAndKey, dotPosition ); if ( contentKey == null ) { return null; } ContentPath oldStyleContentPath = new ContentPath( contentKey, contentTitle, menuItemPath ); oldStyleContentPath.setOldStyleContentPath( true ); return oldStyleContentPath; } private static Path resolveMenuItemPath( final Path localPath ) { final int numberOfPathElements = localPath.getPathElementsCount(); if ( numberOfPathElements == 1 ) { return Path.ROOT; } int index = localPath.getPathAsString().contains( "/" + WindowReference.WINDOW_PATH_PREFIX + "/" ) ? 3 : 1; return new Path( "/" + localPath.subPath( 0, numberOfPathElements - index ) ); } private static String resolveContentTitleAndKeyPart( final Path localPath ) { String cmsPathElement = localPath.getPathElement( localPath.getPathElementsCount() - 1 ); return cmsPathElement.substring( 0, cmsPathElement.lastIndexOf( '.' ) ); } private static String resolveContentTitle( String contentNameAndKey, int dotPosition ) { if ( dotPosition < 0 ) { return null; } return contentNameAndKey.substring( 0, dotPosition ); } private static ContentKey resolveContentKey( String contentNameAndKey, int dotPosition ) { String contentKeyString; if ( dotPosition < 0 ) { contentKeyString = contentNameAndKey; } else { contentKeyString = contentNameAndKey.substring( dotPosition + 1 ); } return StringUtils.isNumeric( contentKeyString ) ? new ContentKey( contentKeyString ) : null; } }