package org.freeplane.plugin.workspace.mindmapmode;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLConnection;
import org.freeplane.core.util.Compat;
import org.freeplane.core.util.LogUtils;
import org.freeplane.features.map.MapModel;
import org.freeplane.features.mode.Controller;
import org.freeplane.features.mode.ModeController;
import org.freeplane.features.url.UrlManager;
import org.freeplane.features.url.mindmapmode.MFileManager;
public class MModeWorkspaceUrlManager extends MFileManager {
//WORKSPACE - test: implementation of workspace/project relative uri resolving
public static MModeWorkspaceUrlManager getController() {
final ModeController modeController = Controller.getCurrentModeController();
return (MModeWorkspaceUrlManager) modeController.getExtension(UrlManager.class);
}
protected void init() {
}
public URI getAbsoluteUri(final MapModel map, final URI uri) throws MalformedURLException {
if(uri == null) {
return null;
}
URL url = null;
try {
url = getAbsoluteUrl(map, uri);
if(url == null) {
return null;
}
return url.toURI();
} catch (URISyntaxException e) {
try {
return new URI(url.getProtocol(), url.getHost(), url.getPath(), url.getQuery(), null);
}
catch (Exception ex) {
throw new MalformedURLException(e.getMessage());
}
}
}
public File getAbsoluteFile(final MapModel map, final URI uri) {
if(uri == null) {
return null;
}
if (uri.getFragment() != null) {
return null;
}
try {
URLConnection urlConnection;
// windows drive letters are interpreted as uri schemes -> make a file from the scheme-less uri string and use this to resolve the path
if(Compat.isWindowsOS() && (uri.getScheme() != null && uri.getScheme().length() == 1)) {
urlConnection = (new File(uri.toString())).toURI().toURL().openConnection();
}
else if(uri.getScheme() == null && !uri.getPath().startsWith(File.separator)) {
if(map == null) {
urlConnection = (new File(uri.toString())).toURI().toURL().openConnection();
}
else {
urlConnection = getAbsoluteUri(map, uri).toURL().openConnection();
}
}
else {
urlConnection = uri.toURL().openConnection();
}
if (urlConnection == null) {
return null;
}
else {
URL url = urlConnection.getURL();
URI absoluteUri = url.toURI();
if("file".equalsIgnoreCase(absoluteUri.getScheme())) {
File file = new File(absoluteUri);
try {
file = file.getCanonicalFile();
}
catch(IOException ignore) {
LogUtils.info("Exception in org.freeplane.plugin.workspace.mindmapmode.MModeWorkspaceUrlManager.getAbsoluteFile(map, uri) while canonicalizing the file " + file);
//can be ignored because it's just done to clear the path of unnecessary slashes etc.
}
return file;
}
}
}
catch (URISyntaxException e) {
LogUtils.warn(e);
}
catch (IOException e) {
LogUtils.warn(e);
}
catch (Exception e){
LogUtils.warn(e);
}
return null;
}
public URL getAbsoluteUrl(final MapModel map, final URI uri) throws MalformedURLException {
try {
URI baseUri = null;
if(map != null && map.getURL() != null) {
baseUri = Compat.urlToFile(map.getURL()).toURI();
}
return getAbsoluteUrl(baseUri, uri);
} catch (URISyntaxException e) {
LogUtils.warn(e);
}
return null;
}
public URL getAbsoluteUrl(final URI base, final URI uri) throws MalformedURLException {
if(uri == null) {
if(base == null) {
return null;
}
return base.toURL();
}
URI preResolved = getAbsoluteURI(uri);
if(base == null || preResolved == null) {
if(preResolved != null) {
try {
if (uri.isAbsolute()) {
return preResolved.toURL();
}
}
catch(Exception e) {
LogUtils.warn(e);
}
}
return null;
}
return super.getAbsoluteUrl(base, preResolved);
}
public URI getAbsoluteURI(final URI uri) {
try {
if(uri.getScheme() == null) {
return uri;
}
return uri.toURL().openConnection().getURL().toURI();
} catch (IOException ex) {
LogUtils.warn("Exception in org.freeplane.plugin.workspace.mindmapmode.MModeWorkspaceUrlManager.getAbsoluteURI(uri) for \""+uri+"\": "+ex.getMessage());
return null;
} catch (URISyntaxException ex) {
LogUtils.warn(ex);
return null;
}
}
}