001 package com.thaiopensource.util;
002
003 import java.net.URL;
004 import java.net.MalformedURLException;
005 import java.io.File;
006
007 public class UriOrFile {
008 private UriOrFile() {
009 }
010
011 public static String toUri(String uriOrFile) {
012 if (!hasScheme(uriOrFile)) {
013 try {
014 return fileToUri(uriOrFile);
015 }
016 catch (MalformedURLException e) { }
017 }
018 return uriOrFile;
019 }
020
021 private static boolean hasScheme(String str) {
022 int len = str.length();
023 if (len == 0)
024 return false;
025 if (!isAlpha(str.charAt(0)))
026 return false;
027 for (int i = 1; i < len; i++) {
028 char c = str.charAt(i);
029 switch (c) {
030 case ':':
031 // Don't recognize single letters as schemes
032 return i == 1 ? false : true;
033 case '+':
034 case '-':
035 break;
036 default:
037 if (!isAlnum(c))
038 return false;
039 break;
040 }
041 }
042 return false;
043 }
044
045 private static boolean isAlpha(char c) {
046 return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z');
047 }
048
049 private static boolean isAlnum(char c) {
050 return isAlpha(c) || ('0' <= c && c <= '9');
051 }
052
053 public static String fileToUri(String file) throws MalformedURLException {
054 return fileToUri(new File(file));
055 }
056
057 public static String fileToUri(File file) throws MalformedURLException {
058 String path = file.getAbsolutePath().replace(File.separatorChar, '/');
059 if (path.length() > 0 && path.charAt(0) != '/')
060 path = '/' + path;
061 return new URL("file", "", path).toString();
062 }
063
064 public static String uriToUriOrFile(String uri) {
065 if (!uri.startsWith("file:"))
066 return uri;
067 uri = uri.substring(5);
068 int nSlashes = 0;
069 while (nSlashes < uri.length() && uri.charAt(nSlashes) == '/')
070 nSlashes++;
071 File f = new File(uri.substring(nSlashes).replace('/', File.separatorChar));
072 if (f.isAbsolute())
073 return f.toString();
074 return uri.replace('/', File.separatorChar);
075 }
076
077 static public void main(String[] args) {
078 System.err.println(uriToUriOrFile(args[0]));
079 }
080 }