/*- * Copyright (C) 2009 Erik Larsson * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.catacombae.storage.fs; /** * @author <a href="http://www.catacombae.org/" target="_top">Erik Larsson</a> */ public abstract class BasicFSEntry implements FSEntry { /** * Implementations of this abstract class must always retain a reference to * the parent file system of the entry. */ protected final FileSystemHandler parentFileSystem; /** * Implementations of this abstract class must always retain a reference to * the parent file system of the entry. */ protected BasicFSEntry(FileSystemHandler iParentFileSystem) { this.parentFileSystem = iParentFileSystem; } /** * Gets the internal ID of this file in the context of the associated * file system. This may be an internal node ID that has no relevance * except for uniquely identifying an entry in a file system. * @return the internal ID of this file. */ /*public byte[] getFileSystemID() { return Util.createCopy(fsId); }*/ protected FileSystemHandler getParentFileSystem() { return parentFileSystem; } /* * The methods below are for convenience purposes. Code involving a lot of * instanceof statements tend to get a bit ugly... */ /** * Returns whether or not this FSEntry denotes a file. If this method * returns true, you can safely call the <code>asFile()</code> method in * order to get the full file object. * * @return whether or not this FSEntry denotes a file. */ public boolean isFile() { return this instanceof FSFile; } /** * Returns whether or not this FSEntry denotes a folder (directory). If this * method returns true, you can safely call the <code>asFolder()</code> * method in order to get the full folder object. * * @return whether or not this FSEntry denotes a folder (directory). */ public boolean isFolder() { return this instanceof FSFolder; } /** * Returns this object as an FSFile object, if it can be casted, and throws * a <code>RuntimeException</code> otherwise. You should call the isFile() * method first to make sure the cast is valid. * * @return this object as an FSFile object, if possible. */ public FSFile asFile() { if(this instanceof FSFile) return (FSFile) this; else throw new RuntimeException("Not a file!"); } /** * Returns this object as an FSFolder object, if it can be casted, and * throws a <code>RuntimeException</code> otherwise. You should call the * isFolder() method first to make sure the cast is valid. * * @return this object as an FSFolder object, if possible. */ public FSFolder asFolder() { if(this instanceof FSFolder) return (FSFolder) this; else throw new RuntimeException("Not a folder!"); } /** * Returns the absolute path to this entry in the context of its file system. * @return the absolute path to this entry in the context of its file system. */ /* public String[] getAbsolutePath() { LinkedList<String> pathBuilder = new LinkedList<String>(); getCanonicalPathInternal(pathBuilder); return pathBuilder.toArray(new String[pathBuilder.size()]); } void getCanonicalPathInternal(LinkedList<String> components) { FSFolder parentFolder = getParent(); if(parentFolder != null) parentFolder.getCanonicalPathInternal(components); components.addLast(getName()); } * */ /* public String getAbsolutePosixPath() { String[] fsPath = getAbsolutePath(); StringBuilder sb = new StringBuilder(); for(String s : fsPath) { sb.append("/"); sb.append(parentFileSystem.generatePosixPathnameComponent(s)); } return sb.toString(); } * */ }