package com.github.marschall.memoryfilesystem;
import static com.github.marschall.memoryfilesystem.MemoryFileSystemProvider.SCHEME;
import java.net.URI;
import java.net.URISyntaxException;
import java.text.CollationKey;
import java.text.Collator;
import java.util.Arrays;
class NamedRoot extends Root {
private final char letter;
private final String stringValue;
NamedRoot(MemoryFileSystem fileSystem, String name) {
super(fileSystem);
this.letter = name.charAt(0);
this.stringValue = Character.toString(this.letter) + ':' + fileSystem.getSeparator();
}
@Override
String getKey() {
return Character.toString(this.letter);
}
@Override
boolean isNamed() {
return true;
}
@Override
public boolean startsWith(String other) {
return this.samePathAs(other);
}
@Override
public boolean endsWith(String other) {
return this.samePathAs(other);
}
@Override
boolean startsWith(AbstractPath other) {
return this.samePathAs(other);
}
@Override
boolean endsWith(AbstractPath other) {
return this.samePathAs(other);
}
private boolean samePathAs(AbstractPath other) {
if (!(other instanceof NamedRoot)) {
return false;
}
NamedRoot otherRoot = (NamedRoot) other;
//TODO safe collator key
Collator collator = this.getMemoryFileSystem().getCollator();
return collator.equals(Character.toString(this.letter), Character.toString(otherRoot.letter));
}
private boolean samePathAs(String other) {
if (other.length() != 3) {
return false;
}
if (other.charAt(1) != ':') {
return false;
}
char otherLast = other.charAt(2);
if (otherLast != '/' && otherLast != this.getMemoryFileSystem().getSeparator().charAt(0)) {
return false;
}
//TODO safe collator key
Collator collator = this.getMemoryFileSystem().getCollator();
return collator.equals(Character.toString(this.letter), Character.toString(other.charAt(0)));
}
@Override
public String toString() {
return this.stringValue;
}
@Override
public URI toUri() {
try {
return new URI(SCHEME, this.getMemoryFileSystem().getKey() + "://" + this.letter + ':', null);
} catch (URISyntaxException e) {
throw new AssertionError("could not create URI");
}
}
@Override
int compareTo(AbstractPath other) {
if (!other.isRoot()) {
return -1;
}
// method is only invoked on methods of the same file system
NamedRoot otherRoot = (NamedRoot) other;
//TODO safe collator key
Collator collator = this.getMemoryFileSystem().getCollator();
return collator.compare(Character.toString(this.letter), Character.toString(otherRoot.letter));
}
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof NamedRoot)) {
return false;
}
NamedRoot other = (NamedRoot) obj;
if (!this.getFileSystem().equals(other.getFileSystem())) {
return false;
}
//TODO safe collator key
Collator collator = this.getMemoryFileSystem().getCollator();
return collator.equals(Character.toString(this.letter), Character.toString(other.letter));
}
@Override
public int hashCode() {
// TODO safe expensive
MemoryFileSystem memoryFileSystem = this.getMemoryFileSystem();
Collator collator = memoryFileSystem.getCollator();
int result = 17;
result = 31 * result + memoryFileSystem.hashCode();
CollationKey collationKey = collator.getCollationKey(Character.toString(this.letter));
result = 31 * result + Arrays.hashCode(collationKey.toByteArray());
return result;
}
}