package org.jetbrains.ether.dependencyView;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
/**
* Created by IntelliJ IDEA.
* User: db
* Date: 02.04.11
* Time: 17:12
* To change this template use File | Settings | File Templates.
*/
public class PackageNameSelector {
String buffer = null;
int index = 0;
BufferedReader reader = null;
char saved;
boolean isSaved = false;
private void read() {
try {
buffer = reader.readLine();
index = 0;
} catch (IOException e) {
e.printStackTrace();
}
}
private char get() {
if (buffer == null) {
return 0;
} else if (index == buffer.length()) {
read();
return '\r';
}
final char c = buffer.charAt(index++);
if (c == 0) {
return ' ';
}
return c;
}
private char symbol() {
if (isSaved) {
isSaved = false;
return saved;
}
final char c = get();
switch (c) {
case '"': {
loop:
while (true) {
switch (get()) {
case 0:
return 0;
case '"':
case '\r':
break loop;
case '\\':
switch (get()) {
case 0:
return 0;
case '\r':
break loop;
}
}
}
return ' ';
}
case '\'': {
loop:
while (true) {
switch (get()) {
case 0:
return 0;
case '\'':
case '\r':
break loop;
case '\\':
switch (get()) {
case 0:
return 0;
case '\r':
break loop;
}
}
}
return ' ';
}
case '/': {
final char d = get();
if (d == '/') {
loop:
while (true) {
switch (get()) {
case 0:
return 0;
case '\r':
break loop;
}
}
return ' ';
} else if (d == '*') {
loop:
while (true) {
switch (get()) {
case 0:
return 0;
case '*':
inner:
while (true) {
switch (get()) {
case 0:
return 0;
case '/':
break loop;
case '*':
continue;
default:
break inner;
}
}
}
}
return ' ';
} else {
saved = d;
isSaved = true;
return c;
}
}
default: {
return c;
}
}
}
private void open(final String fileName) {
try {
reader = new BufferedReader(new FileReader(new File(fileName)));
read();
} catch (IOException e) {
e.printStackTrace();
}
}
private void close() {
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private String parse() {
final StringBuilder b = new StringBuilder();
int state = 0;
while (true) {
final char c = symbol();
switch (c) {
case 0: {
return "";
}
default: {
switch (state) {
case 0: // Initial state
if (Character.isLetter(c)) {
b.append(c);
state = 1;
}
break;
case 1: // Identifier
if (Character.isLetter(c)) {
b.append(c);
} else if (Character.isWhitespace(c)) {
final String ident = b.toString();
b.setLength(0);
if (ident.equals("package")) {
state = 2;
} else if (ident.equals("import")) {
return "";
}
} else {
state = 0;
}
break;
case 2: // Post "package<whitespace>
if (Character.isWhitespace(c)) {
} else if (c == '.') {
b.append(File.separatorChar);
} else if (c == ';') {
return b.toString();
} else {
b.append(c);
}
}
}
}
}
}
public String get(final String fileName) {
open(fileName);
final String result = parse();
close();
return result;
}
//
// final private static String whiteSpacePattern = "(/\\*.*?\\*/|//[^\\r\\n\\f\\x0B]*)";
// final private static String stringLiteralPattern = "(\"([^\\\\\"]|\\\\.)*\")";
// final private static String charLiteralPattern = "('([^\\\\']|\\\\.)*')";
// final private static Pattern skipPattern = Pattern.compile(whiteSpacePattern + "|" + stringLiteralPattern + "|" + charLiteralPattern, Pattern.DOTALL);
// final private static Pattern packagePattern = Pattern.compile("\\bpackage\\s+([^;]+);");
// final private static Pattern spacePattern = Pattern.compile("\\s+");
// final private static Pattern dotPattern = Pattern.compile("\\.");
//
// public static String get (final String fileName) throws Exception {
// //try {
// final FileChannel channel = new FileInputStream(fileName).getChannel();
//
// final Matcher skipMatcher = skipPattern.matcher(Charset.forName("ISO-8859-1").newDecoder().decode(channel.map(FileChannel.MapMode.READ_ONLY, 0, (int) channel.size())));
// final String cleared = skipMatcher.replaceAll(" ");
//
// System.out.println(cleared);
//
// final Matcher selecting = packagePattern.matcher(cleared);
//
// if (selecting.find()) {
// final String qualifiedName = selecting.group(1);
// final Matcher spaceRemover = spacePattern.matcher(qualifiedName);
// final String spaceRemoved = spaceRemover.replaceAll("");
// final Matcher dotReplacer = dotPattern.matcher(spaceRemoved);
//
// return dotReplacer.replaceAll("/");
// } else {
// return null;
// }
// //} catch (IOException e) {
// // e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
//
// // return null;
// //}
// }
}