/*
* ====================================================================
* Copyright (c) 2004-2012 TMate Software Ltd. All rights reserved.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
* are also available at http://svnkit.com/license.html
* If newer versions of this license are posted there, you may use a
* newer version instead, at your option.
* ====================================================================
*/
package org.tmatesoft.svn.core;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
* The <b>SVNNodeKind</b> class is used to describe the kind of a
* directory entry (node, in other words). This can be:
* <ul>
* <li>a directory - the node is a directory
* <li>a file - the node is a file
* <li>none - the node is missing (does not exist)
* <li>unknown - the node kind can not be recognized
* </ul>
*
* @version 1.3
* @author TMate Software Ltd.
* @since 1.2
* @see SVNDirEntry
*/
public final class SVNNodeKind implements Comparable, Serializable {
private static final long serialVersionUID = 5851L;
/**
* This node kind is used to say that a node is missing
*/
public static final SVNNodeKind NONE = new SVNNodeKind(2);
/**
* Defines the file node kind
*/
public static final SVNNodeKind FILE = new SVNNodeKind(1);
/**
* Defines the directory node kind
*/
public static final SVNNodeKind DIR = new SVNNodeKind(0);
/**
* This node kind is used to say that the kind of a node is
* actually unknown
*/
public static final SVNNodeKind UNKNOWN = new SVNNodeKind(3);
private int myID;
private SVNNodeKind(int id) {
myID = id;
}
public static SVNNodeKind getNodeKindById(int id) {
if (id == FILE.getID()) {
return FILE;
} else if (id == DIR.getID()) {
return DIR;
} else if (id == NONE.getID()) {
return NONE;
}
return UNKNOWN;
}
/**
* Parses the passed string and finds out the node kind. For instance,
* <code>parseKind(<span class="javastring">"dir"</span>)</code> will return
* {@link #DIR}.
*
* @param kind a node kind as a string
* @return an <b>SVNNodeKind</b> representation
*/
public static SVNNodeKind parseKind(String kind) {
if ("file".equals(kind)) {
return FILE;
} else if ("dir".equals(kind)) {
return DIR;
} else if ("none".equals(kind) || kind == null) {
return NONE;
}
return UNKNOWN;
}
/**
* Represents the current <b>SVNNodeKind</b> object as a string.
*
* @return a string representation of this object.
*/
public String toString() {
if (this == NONE) {
return "none";
} else if (this == FILE) {
return "file";
} else if (this == DIR) {
return "dir";
}
return "unknown";
}
/**
* Compares this object with another one.
* Each <b>SVNNodeKind</b> constant has got its own unique id.
*
* @param o an object to compare with
* @return <ul>
* <li>-1 - if <code>o</code> is either <span class="javakeyword">null</span>,
* or is not an instance of <b>SVNNodeKind</b>, or the id of
* this object is smaller than the id of <code>o</code>;
* </li>
* <li>1 - if the id of this object is bigger than the id of
* <code>o</code>;
* </li>
* <li>0 - if and only if <code>o</code> is the same constant
* value as this one (has the same id)
* </li>
* </ul>
*/
public int compareTo(Object o) {
if (o == null || o.getClass() != SVNNodeKind.class) {
return -1;
}
int otherID = ((SVNNodeKind) o).myID;
return myID > otherID ? 1 : myID < otherID ? -1 : 0;
}
private void writeObject(ObjectOutputStream os) throws IOException {
os.writeInt(myID);
}
private void readObject(ObjectInputStream is) throws IOException {
myID = is.readInt();
}
private Object readResolve() {
return fromID(myID);
}
private static SVNNodeKind fromID(int id) {
if (DIR.myID == id) {
return DIR;
} else if (FILE.myID == id) {
return FILE;
} else if (NONE.myID == id) {
return NONE;
}
return UNKNOWN;
}
public int getID() {
return myID;
}
}