package org.freeplane.plugin.workspace.features;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import org.apache.commons.io.IOExceptionWithCause;
import org.freeplane.plugin.workspace.WorkspaceController;
import org.freeplane.plugin.workspace.model.project.AWorkspaceProject;
import org.osgi.service.url.AbstractURLStreamHandlerService;
public class ProjectURLHandler extends AbstractURLStreamHandlerService {
public URLConnection openConnection(URL url) throws IOException {
String projectID = url.getAuthority();
AWorkspaceProject project = WorkspaceController.getCachedProjectByID(projectID);
if(project == null) {
throw new IOException("project with id="+projectID+" is missing");
}
URL absolutePath = resolve(project, url);
return absolutePath.openConnection();
}
/**
* resolve a project-relative path
* @param project
* @param url
* @return
* @throws IOException
*/
public static URL resolve(AWorkspaceProject project, URL url) throws IOException {
if(project == null) {
throw new IOException("project is NULL");
}
URL absolutePath = url;
try {
String projectUrl = project.getProjectHome().toURL().toExternalForm();
absolutePath = createAbsoluteURL(projectUrl, url);
} catch (Exception e) {
throw new IOExceptionWithCause(e);
}
return absolutePath;
}
private static URL createAbsoluteURL(String projectBase, URL projectRelativeURL) throws MalformedURLException {
URL absolutePath;
String urlFile = projectRelativeURL.getFile();
urlFile = urlFile.startsWith("/") ? urlFile.substring(1): urlFile;
projectBase = projectBase.endsWith("/") ? projectBase.substring(0, projectBase.length()-1): projectBase;
absolutePath = new URL(projectBase+"/"+urlFile);
return absolutePath;
}
}