/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is NetBeans. The Initial Developer of the Original
* Code is Sun Microsystems, Inc. Portions Copyright 1997-2003 Sun
* Microsystems, Inc. All Rights Reserved.
*/
/*
* DefaultResolver.java
*
* Created on July 11, 2001, 11:24 AM
*/
package org.openide.loaders;
import org.openide.filesystems.FileObject;
import java.util.LinkedList;
import java.util.Iterator;
import java.util.StringTokenizer;
import java.io.IOException;
import java.beans.PropertyChangeListener;
import java.net.URL;
import java.net.MalformedURLException;
import org.openide.filesystems.URLMapper;
/** Default implementation of references resolver. It recognizes
*
* @author Svatopluk Dedic, Vita Stejskal
*/
class DefaultResolver extends Object implements ReferencesResolver {
private static final String NAME_DELIMITER = "/"; // NOI18N
private static final String DOT = "."; // NOI18N
private static final String DOUBLE_DOT = ".."; // NOI18N
public FileObject find (URL ref, FileObject base) {
if ("nbfs".equals (ref.getProtocol ())) { // NOI18N
FileObject[] f = URLMapper.findFileObjects(ref);
if (f.length > 0) {
return f[0];
}
}
return resolveRelativeName (ref.getPath (), base);
}
public URL translateURL (URL ref, FileObject base) {
if (!"nbfs".equals (ref.getProtocol ())) { // NOI18N
return ref;
}
FileObject[] f = URLMapper.findFileObjects(ref);
if (f.length == 0) {
return ref;
}
try {
return createRelativeURL (f[0], base);
} catch (MalformedURLException e) {
org.openide.ErrorManager.getDefault().notify(e);
}
return ref;
}
private FileObject resolveRelativeName(String relPath, FileObject base) {
if (relPath.length() == 0) {
// relative point to the base file itself.
return base;
}
if (relPath.startsWith (NAME_DELIMITER)) {
try {
base = base.getFileSystem().getRoot();
} catch (IOException ex) {
return null;
}
} else {
base = base.getParent ();
}
StringTokenizer t = new StringTokenizer (relPath, NAME_DELIMITER);
while (t.hasMoreElements () && base != null) {
String token = t.nextToken ();
// ignore double delimiters
if (token.length () == 0)
continue;
if (token.equals (DOT))
continue;
if (token.equals (DOUBLE_DOT)) {
base = base.getParent ();
} else {
int index = token.lastIndexOf (DOT);
if (index != -1)
base = base.getFileObject (token.substring (0, index), token.substring (index + 1));
else
base = base.getFileObject (token);
}
}
return base;
}
private URL createRelativeURL (FileObject to, FileObject from) throws MalformedURLException {
if (to.equals(from))
return new URL ("file:."); // NOI18N
LinkedList l1 = new LinkedList();
LinkedList l2 = new LinkedList();
createPath(from, l1);
createPath(to, l2);
int s1 = l1.size();
//int s2 = l2.size();
int skip = 0;
Iterator it1 = l1.iterator();
Iterator it2 = l2.iterator();
FileObject f1 = null;
FileObject f2 = null;
for (;it1.hasNext() && it2.hasNext(); skip++) {
f1 = (FileObject)it1.next();
f2 = (FileObject)it2.next();
if (f1 != f2)
break;
}
StringBuffer relName = new StringBuffer(50);
while (skip < s1 - 1) {
relName.append("../"); // NOI18N
skip++;
}
if (f2 != null) {
relName.append(f2.getNameExt());
}
while (it2.hasNext()) {
f2 = (FileObject)it2.next();
relName.append('/');
relName.append(f2.getNameExt());
}
return new URL ("file:" + relName.toString()); // NOI18N
}
private void createPath(FileObject f, LinkedList l) {
while (!f.isRoot()) {
l.addFirst(f);
f = f.getParent();
}
}
public void addPropertyChangeListener (PropertyChangeListener l) {
}
public void removePropertyChangeListener (PropertyChangeListener l) {
}
}