fr.acxio.tools.agia.io.FilePath.java Source code

Java tutorial

Introduction

Here is the source code for fr.acxio.tools.agia.io.FilePath.java

Source

package fr.acxio.tools.agia.io;

/*
 * Copyright 2014 Acxio
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import java.io.File;

import org.apache.commons.io.FilenameUtils;

/**
 * <p>Path manipulation utilies.</p>
 * <p>The main purpose of FilePath is to be used into an
 * {@code EvaluationContextFactory} to handle paths easier.</p>
 * <p>FilePath can extract path elements and return each element by its index,
 * or return a sub-path, but it can do so with positive and negative index.</p>
 * <p>The elements of a path can be accessed by their index like in an array.
 * FilePath also accept negative index, starting from -1 which is the index
 * of the last element of the path, for example the file name. The index -2
 * will then reference the parent of the file, and so on.</p>
 * <p>The sub-paths can also be extract with negative index, starting from the
 * end of the path. For example, {@code getSubpath(-1, -2)} will return 
 * something like {@code "parentFolder/filename.ext"}.</p>
 * <p>The start and end index used in {@code getSubpath} can be independently
 * positive or negative, and they are not bound to the number of path elements:
 * if the path has 4 elements, the index 4 is equivalent to the index 0.</p>
 * 
 * @author pcollardez
 *
 */
public class FilePath {

    private static final String UNIX_SEPARATOR = "/";

    private String[] pathElements;

    public FilePath() {
    }

    public FilePath(String sPath) {
        if (sPath != null) {
            extractElements(sPath);
        }
    }

    public FilePath(File sFile) {
        if (sFile != null) {
            extractElements(sFile.getAbsolutePath());
        }
    }

    private void extractElements(String sPath) {
        pathElements = FilenameUtils.separatorsToUnix(sPath).split(UNIX_SEPARATOR);
    }

    public String getElement(int sIndex) {
        String aResult = null;
        if (pathElements != null) {
            int aRollingIndex = sIndex % pathElements.length;
            aResult = (aRollingIndex < 0) ? pathElements[aRollingIndex + pathElements.length]
                    : pathElements[aRollingIndex];
        }
        return aResult;
    }

    public static FilePath valueOf(String sPath) {
        return new FilePath(sPath);
    }

    public static FilePath valueOf(File sFile) {
        return new FilePath(sFile);
    }

    public String getSubpath(int sStart, int sEnd) {
        return getSubpath(sStart, sEnd, UNIX_SEPARATOR);
    }

    public String getSubpath(int sStart, int sEnd, String sPathSeparator) {
        String aResult = null;
        if (pathElements != null) {
            int aStartIndex = sStart % pathElements.length;
            aStartIndex = (aStartIndex < 0) ? aStartIndex + pathElements.length : aStartIndex;
            int aEndIndex = sEnd % pathElements.length;
            aEndIndex = (aEndIndex < 0) ? aEndIndex + pathElements.length : aEndIndex;
            if (aEndIndex < aStartIndex) {
                int aIndex = aStartIndex;
                aStartIndex = aEndIndex;
                aEndIndex = aIndex;
            }
            StringBuilder aStringBuilder = new StringBuilder();
            for (int i = aStartIndex; i <= aEndIndex; i++) {
                aStringBuilder.append(pathElements[i]);
                if (i < aEndIndex) {
                    aStringBuilder.append(sPathSeparator);
                }
            }
            aResult = aStringBuilder.toString();
        }
        return aResult;
    }
}