/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.content.binary;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import com.enonic.cms.core.Path;
import com.enonic.cms.core.content.ContentKey;
/**
* Feb 15, 2010
*/
public class AttachmentNativeLinkKeyParser
{
public static AttachmentNativeLinkKey parse( Path path )
throws InvalidAttachmentNativeLinkKeyException
{
if ( path == null )
{
throw new IllegalArgumentException( "Given path cannot be null" );
}
List<String> pathElements = path.getPathElements();
if ( pathElements.size() == 0 )
{
throw new InvalidAttachmentNativeLinkKeyException( path.getPathAsString(), "Path is empty" );
}
final String firstPathElement = pathElements.get( 0 );
final ContentKey contentKey = parseContentKey( firstPathElement );
if ( pathElements.size() == 1 )
{
// handling: <contentkey>*
String extension = parseExtension( firstPathElement );
//AttachmentNativeLinkKey linkKey = new AttachmentNativeLinkKeyWithLabel( contentKey, "source" );
AttachmentNativeLinkKey linkKey = new AttachmentNativeLinkKey( contentKey );
if ( extension != null )
{
linkKey.setExtension( extension );
}
return linkKey;
}
final String secondPathElement = pathElements.get( 1 );
final boolean hasLabelPathElement = secondPathElement.equals( "label" );
final boolean hasBinaryPathElement = secondPathElement.equals( "binary" );
if ( hasLabelPathElement )
{
// handling: <contentkey>*/label/<label>
return parseWithLabel( pathElements, contentKey, path );
}
else if ( hasBinaryPathElement )
{
// handling: <contentkey>*/binary/<binarydatakey>
return parseWithBinaryDataKey( pathElements, contentKey, path );
}
throw new InvalidAttachmentNativeLinkKeyException( path.getPathAsString(), "Unknown format" );
}
private static AttachmentNativeLinkKey parseWithBinaryDataKey( final List<String> pathElements, final ContentKey contentKey, Path path )
{
if ( pathElements.size() < 3 )
{
throw new InvalidAttachmentNativeLinkKeyException( path.getPathAsString(), "Missing binary key" );
}
BinaryDataKey binaryDataKey = null;
String extension = null;
final String thirdPathElement = pathElements.get( 2 );
binaryDataKey = parseBinaryDataKey( thirdPathElement );
extension = parseExtension( thirdPathElement );
AttachmentNativeLinkKeyWithBinaryKey linkKey = new AttachmentNativeLinkKeyWithBinaryKey( contentKey, binaryDataKey );
if ( extension != null )
{
linkKey.setExtension( extension );
}
return linkKey;
}
private static AttachmentNativeLinkKey parseWithLabel( final List<String> pathElements, final ContentKey contentKey, Path path )
{
if ( pathElements.size() < 3 )
{
throw new InvalidAttachmentNativeLinkKeyException( path.getPathAsString(), "Missing label" );
}
String label = null;
String extension = null;
final String thirdPathElement = pathElements.get( 2 );
label = parseStringBeforeDot( thirdPathElement );
extension = parseExtension( thirdPathElement );
if ( StringUtils.isBlank( label ) )
{
label = "source";
}
AttachmentNativeLinkKeyWithLabel linkKey = new AttachmentNativeLinkKeyWithLabel( contentKey, label );
if ( extension != null )
{
linkKey.setExtension( extension );
}
return linkKey;
}
private static ContentKey parseContentKey( final String pathElement )
{
return new ContentKey( parseStringBeforeDot( pathElement ) );
}
private static BinaryDataKey parseBinaryDataKey( final String pathElement )
{
return new BinaryDataKey( parseStringBeforeDot( pathElement ) );
}
private static String parseStringBeforeDot( final String pathElement )
{
String extension = null;
final int dotPos = pathElement.indexOf( "." );
if ( dotPos == -1 )
{
return pathElement;
}
return pathElement.substring( 0, dotPos );
}
private static String parseExtension( final String pathElement )
{
final int dotPos = pathElement.indexOf( "." );
if ( dotPos == -1 )
{
return null;
}
return pathElement.substring( dotPos + 1, pathElement.length() );
}
}