package org.docear.plugin.core.util;
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.StringTokenizer;
import org.freeplane.core.util.LogUtils;
import org.freeplane.core.util.TextUtils;
import org.freeplane.features.attribute.AttributeController;
import org.freeplane.features.attribute.NodeAttributeTableModel;
import org.freeplane.features.link.NodeLinks;
import org.freeplane.features.map.MapModel;
import org.freeplane.features.map.NodeModel;
import org.freeplane.features.mode.Controller;
import org.freeplane.features.mode.mindmapmode.MModeController;
import org.freeplane.plugin.workspace.WorkspaceUtils;
import org.freeplane.view.swing.map.MapView;
import org.freeplane.view.swing.map.attribute.AttributeView;
import sun.net.www.ParseUtil;
import sun.net.www.protocol.file.FileURLConnection;
public class Tools {
//TODO: check if URI refers to a local file !!
public static File getFilefromUri(URI uri){
if(uri == null) return null;
try {
return WorkspaceUtils.resolveURI(uri);
}
catch (IllegalArgumentException e) {
LogUtils.warn(e);
return null;
}
}
public static URI getAbsoluteUri(NodeModel node){
URI uri = NodeLinks.getValidLink(node);
return WorkspaceUtils.absoluteURI(uri, node.getMap());
}
public static URI getAbsoluteUri(NodeModel node, MapModel map){
URI uri = NodeLinks.getValidLink(node);
return WorkspaceUtils.absoluteURI(uri, map);
}
public static URI getAbsoluteUri(URI uri){
return Tools.getAbsoluteUri(uri, Controller.getCurrentController().getMap());
}
public static URI getAbsoluteUri(URI uri, MapModel map){
return WorkspaceUtils.absoluteURI(uri, map);
}
public static boolean isFile(URI uri) {
final String scheme = uri.getScheme();
return scheme != null && scheme.equalsIgnoreCase("file");
}
public static boolean hasHost(URI uri) {
String host = uri.getHost();
return host != null && !"".equals(host);
}
public static List<File> textURIListToFileList(String data) {
List<File> list = new ArrayList<File>();
StringTokenizer stringTokenizer = new StringTokenizer(data, "\r\n");
while(stringTokenizer.hasMoreTokens()) {
String string = stringTokenizer.nextToken();
// the line is a comment (as per the RFC 2483)
if (string.startsWith("#")) continue;
try {
URI uri = new URI(string);
File file = new File(uri);
list.add(file);
} catch (URISyntaxException e) {
LogUtils.warn("DocearNodeDropListener could not parse uri to file because an URISyntaxException occured. URI: " + string);
} catch (IllegalArgumentException e) {
LogUtils.warn("DocearNodeDropListener could not parse uri to file because an IllegalArgumentException occured. URI: " + string);
}
}
return list;
}
public static String reshapeString(String s, int i) {
s = s.trim();
if(s.length() > i){
s = s.substring(0, i - 4);
s = s + "...";
}
return s;
}
public static boolean exists(URI uri) {
if(Controller.getCurrentController() != null && Controller.getCurrentController().getMap() != null){
return Tools.exists(uri, Controller.getCurrentController().getMap());
}
else{
return Tools.exists(uri, null);
}
}
public static boolean exists(URI uri, MapModel map) {
uri = Tools.getAbsoluteUri(uri, map);
try {
URLConnection conn = uri.toURL().openConnection();
if(conn instanceof FileURLConnection) {
File file = new File(ParseUtil.decode(conn.getURL().getFile()));
if(file.exists()
&& file.length() > 0) {
return true;
}
} else {
if(conn.getContentLength() > 0) {
return true;
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
public static boolean FileIsLocatedInDir(URI absoluteFile, URI absoluteDir, boolean readSubDirectories){
if(!absoluteFile.isAbsolute() || !absoluteDir.isAbsolute()) return false;
final File file = Tools.getFilefromUri(absoluteFile);
File dir = Tools.getFilefromUri(absoluteDir);
if(file == null || dir == null) return false;
File[] matchingFiles = dir.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.equals(file.getName());
}
});
if(matchingFiles.length > 0){
return true;
}
else if(readSubDirectories){
File[] subDirs = dir.listFiles(new DirectoryFileFilter());
if(subDirs != null && subDirs.length > 0){
for(File subDir : subDirs){
if(Tools.FileIsLocatedInDir(file.toURI(), subDir.toURI(), readSubDirectories)){
return true;
}
}
}
}
return false;
}
public static List<URI> getFilteredFileList(URI absoluteURI, FileFilter fileFilter, boolean readSubDirectories) {
List<URI> result = new ArrayList<URI>();
Collection<File> tempResult = new ArrayList<File>();
if(!absoluteURI.isAbsolute()) return result;
File monitoringDir = Tools.getFilefromUri(absoluteURI);
File[] monitorFiles = monitoringDir.listFiles(fileFilter);
if(monitorFiles != null && monitorFiles.length > 0){
tempResult.addAll(Arrays.asList(monitorFiles));
}
for(File file : tempResult){
result.add(file.toURI());
}
if(readSubDirectories){
File[] subDirs = monitoringDir.listFiles(new DirectoryFileFilter());
if(subDirs != null && subDirs.length > 0){
for(File subDir : subDirs){
result.addAll(Tools.getFilteredFileList(subDir.toURI(), fileFilter, readSubDirectories));
}
}
}
return result;
}
public static List<String> getStringList(String property) {
List<String> result = new ArrayList<String>();
if(property == null || property.length() <= 0) return result;
property = property.trim();
String[] list = property.split("\\|");
for(String s : list){
if(s != null && s.length() > 0){
result.add(s);
}
}
return result;
}
public static boolean setAttributeValue(NodeModel target, String attributeKey, Object value){
if(target == null || attributeKey == null || value == null) return false;
NodeAttributeTableModel attributes = AttributeController.getController(MModeController.getMModeController()).createAttributeTableModel(target);
if(attributes != null){
if(attributes.getAttributeKeyList().contains(TextUtils.getText(attributeKey))){
//attributes.getAttribute(attributes.getAttributePosition(TextUtils.getText(attributeKey))).setValue(value);
AttributeController.getController(MModeController.getMModeController()).performSetValueAt(attributes, value, attributes.getAttributePosition(attributeKey), 1);
AttributeView attributeView = (((MapView) Controller.getCurrentController().getViewController().getMapView()).getSelected()).getAttributeView();
attributeView.setOptimalColumnWidths();
return true;
}
else{
AttributeController.getController(MModeController.getMModeController()).performInsertRow(attributes, attributes.getRowCount(), TextUtils.getText(attributeKey), value);
AttributeView attributeView = (((MapView) Controller.getCurrentController().getViewController().getMapView()).getSelected()).getAttributeView();
attributeView.setOptimalColumnWidths();
return true;
}
}
return false;
}
public static Object getAttributeValue(NodeModel target, String attributeKey) {
if(target == null || attributeKey == null) return null;
NodeAttributeTableModel attributes = AttributeController.getController(MModeController.getMModeController()).createAttributeTableModel(target);
if(attributes != null){
if(attributes.getAttributeKeyList().contains(TextUtils.getText(attributeKey))){
return attributes.getAttribute(attributes.getAttributePosition(TextUtils.getText(attributeKey))).getValue();
}
}
return null;
}
public static void removeAttributeValue(NodeModel target, String attributeKey) {
if(target == null || attributeKey == null) return;
NodeAttributeTableModel attributes = AttributeController.getController(MModeController.getMModeController()).createAttributeTableModel(target);
if(attributes != null){
if(attributes.getAttributeKeyList().contains(TextUtils.getText(attributeKey))){
AttributeController.getController(MModeController.getMModeController()).performRemoveRow(attributes, attributes.getAttributePosition(attributeKey));
AttributeView attributeView = (((MapView) Controller.getCurrentController().getViewController().getMapView()).getSelected()).getAttributeView();
attributeView.setOptimalColumnWidths();
}
}
}
public static List<String> getAllAttributeKeys(NodeModel target){
if(target == null) return new ArrayList<String>();
NodeAttributeTableModel attributes = AttributeController.getController(MModeController.getMModeController()).createAttributeTableModel(target);
if(attributes != null){
return attributes.getAttributeKeyList();
}
return new ArrayList<String>();
}
public static String getStackTraceAsString(Exception exception){
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
pw.print(" [ ");
pw.print(exception.getClass().getName());
pw.print(" ] ");
pw.print(exception.getMessage());
exception.printStackTrace(pw);
return sw.toString();
}
}