/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.resource;
import java.io.Serializable;
import java.util.LinkedList;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.io.Files;
public final class ResourceKey
implements Serializable
{
private final String[] parts;
private final String path;
private ResourceKey( final String path )
{
this( split( path ) );
}
private ResourceKey( final String[] parts )
{
this.parts = normalize( parts );
this.path = join( this.parts );
}
public boolean equals( final Object o )
{
return ( o instanceof ResourceKey ) && ( (ResourceKey) o ).path.equals( this.path );
}
public int hashCode()
{
return this.path.hashCode();
}
public String toString()
{
return this.path;
}
public boolean startsWith( final String prefix )
{
return this.path.startsWith( prefix );
}
public boolean isRoot()
{
return this.parts.length == 0;
}
public String getName()
{
if ( this.parts.length == 0 )
{
return "";
}
return this.parts[this.parts.length - 1];
}
public String getExtension()
{
return Files.getFileExtension( getName() );
}
public ResourceKey getParent()
{
if ( this.parts.length > 0 )
{
String[] tmp = new String[this.parts.length - 1];
System.arraycopy( this.parts, 0, tmp, 0, tmp.length );
return new ResourceKey( tmp );
}
else
{
return null;
}
}
public static ResourceKey from( final String path )
{
if ( path == null )
{
return null;
}
if ( path.trim().length() == 0 )
{
return null;
}
return new ResourceKey( path );
}
private static String[] split( final String path )
{
final Iterable<String> result = Splitter.on( "/" ).omitEmptyStrings().trimResults().split( path );
return Iterables.toArray( result, String.class );
}
private static String join( final String[] parts )
{
return "/" + Joiner.on( "/" ).join( parts );
}
private static String[] normalize( final String[] parts )
{
final LinkedList<String> normalized = Lists.newLinkedList();
for ( final String part : parts )
{
if ( part.equals( "." ) )
{
continue;
}
if ( part.equals( ".." ) )
{
if ( !normalized.isEmpty() )
{
normalized.removeLast();
}
continue;
}
normalized.add( part );
}
return Iterables.toArray( normalized, String.class );
}
}