com.enonic.cms.core.resource.ResourceKey.java Source code

Java tutorial

Introduction

Here is the source code for com.enonic.cms.core.resource.ResourceKey.java

Source

/*
 * 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);
    }
}