protected static File createRelativePath(File absolute) throws Exception {
        File userDir = new File(System.getProperty("user.dir"));
        String userPath = userDir.getAbsolutePath() + File.separator;
        String targetPath = (new File(absolute.getParent())).getPath()
                + File.separator;
        String fileName = absolute.getName();
        StringBuffer relativePath = new StringBuffer();
        //    relativePath.append("."+File.separator);
        //    System.err.println("User dir "+userPath);
        //    System.err.println("Target path "+targetPath);

        // file is in user dir (or subdir)
        int subdir = targetPath.indexOf(userPath);
        if (subdir == 0) {
            if (userPath.length() == targetPath.length()) {
                relativePath.append(fileName);
            } else {
                int ll = userPath.length();
                relativePath.append(targetPath.substring(ll));
                relativePath.append(fileName);
            }
        } else {
            int sepCount = 0;
            String temp = new String(userPath);
            while (temp.indexOf(File.separator) != -1) {
                int ind = temp.indexOf(File.separator);
                sepCount++;
                temp = temp.substring(ind + 1, temp.length());
            }

            String targetTemp = new String(targetPath);
            String userTemp = new String(userPath);
            int tcount = 0;
            while (targetTemp.indexOf(File.separator) != -1) {
                int ind = targetTemp.indexOf(File.separator);
                int ind2 = userTemp.indexOf(File.separator);
                String tpart = targetTemp.substring(0, ind + 1);
                String upart = userTemp.substring(0, ind2 + 1);
                if (tpart.compareTo(upart) != 0) {
                    if (tcount == 0) {
                        tcount = -1;
                    }
                    break;
                }
                tcount++;
                targetTemp = targetTemp.substring(ind + 1, targetTemp.length());
                userTemp = userTemp.substring(ind2 + 1, userTemp.length());
            }
            if (tcount == -1) {
                // then target file is probably on another drive (under windows)
                throw new Exception("Can't construct a path to file relative to user "
                        + "dir.");
            }
            if (targetTemp.indexOf(File.separator) == -1) {
                targetTemp = "";
            }
            for (int i = 0; i < sepCount - tcount; i++) {
                relativePath.append(".." + File.separator);
            }
            relativePath.append(targetTemp + fileName);
        }
        //    System.err.println("new path : "+relativePath.toString());
        return new File(relativePath.toString());
    }