I am using Java Swing v2 by Robinson & Vorobiev as a framework to understand JTree's. I have redone the source code from [https://www.manning.com/books/swing-second-edition][1] Chapter17/4 to include better encapsulating and information hiding. The rename EditorListener (CellEditorListener) had a bug in that java.io.File.rename() did not work but java.nio.Files.move() does. I then included checks for an existing directory and for a failure to move.
The issue is that in these two failures the only thing needed is to update the GUI so that the original value of the node is displayed. The node data does not change and does not need to be updated. The display area update I know how to do. But I do not know how to update only the displayed node. The only thing that seems to work is to replace the tree node with a new version of itself.
Code is below. Any help will be greatly appreciated.
/**
* Copyright 1999-2002 Matthew Robinson and Pavel Vorobiev.
* All Rights Reserved.
*
* ===================================================
* This program contains code from the book "Swing"
* 2nd Edition by Matthew Robinson and Pavel Vorobiev
* http://www.spindoczine.com/sbe
* ===================================================
*
* The above paragraph must be included in full, unmodified
* and completely intact in the beginning of any source code
* file that references, copies or uses (in any way, shape
* or form) code contained in this file.
*/
/*
Source Code: https://www.manning.com/books/swing-second-edition Chapter17/4
*/
package ch17.v4;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import javax.swing.JTextField;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.JOptionPane;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellEditor;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
/**
*
* #author Java Swing vrs. 2
*/
public class EditorListener implements CellEditorListener {
protected Tree m_tree;
protected DefaultTreeCellEditor m_editor;
protected DefaultTreeModel m_model;
protected JTextField m_display;
public EditorListener( DefaultTreeCellEditor m_editor
, Tree m_tree
, DefaultTreeModel m_model
, JTextField m_display) {
this.m_editor = m_editor;
this.m_tree = m_tree;
this.m_model = m_model;
this.m_display = m_display;
} // EditorListener()
#Override
public void editingStopped(ChangeEvent e) {
if (m_tree.m_editingNode != null) {
String newName = m_editor.getCellEditorValue().toString();
File dir = m_tree.m_editingNode.getFile();
File newDir = new File(dir.getParentFile(), newName);
m_tree.m_editingNode = null; // moved
/******************************** New Code ********************************/
if(newDir.exists()) {
int value = JOptionPane.showConfirmDialog( null // parent
, "Do you wnat to overwrite>" // message
, newName // title
, JOptionPane.YES_NO_OPTION // optionType
, JOptionPane.WARNING_MESSAGE); // messageType
if (value == JOptionPane.NO_OPTION) {
update(dir);
return;
}
}
try {
Path move = Files.move( dir.toPath() // from
, newDir.toPath() // to
, StandardCopyOption.REPLACE_EXISTING);
} catch (IOException exception) {
JOptionPane.showConfirmDialog( null // parent
, "Unable to rename" // message
, newName // title
, JOptionPane.OK_OPTION // optionType
, JOptionPane.ERROR_MESSAGE); // messageType
System.out.println( "[ERROR] Unable to rename "
+ dir.toString() + " "
+ exception.getMessage());
update(dir);
return;
}
/**************************************************************************/
// dir.renameTo(newDir);
// Update tree
update(newDir);
}
}
private void update( File dir) { // correctly displays node
TreePath path = m_tree.getSelectionPath();
DefaultMutableTreeNode node = Tree.getTreeNode(path);
IconData idata = new IconData( DirTree.ICON_FOLDER
, DirTree.ICON_EXPANDEDFOLDER
, new FileNode(dir));
node.setUserObject(idata);
m_model.nodeStructureChanged(node);
m_display.setText(dir.getAbsolutePath());
} // void update( File dir)
#Override
public void editingCanceled(ChangeEvent e) {
m_tree.m_editingNode = null;
}
private void restoreName() {
} // void restoreName()
} // class EditorListener implements CellEditorListener
Related
Good Day,
I have a project to do where I have to create a database with Redis bit arrays data type and write a Java code to access the database with a GUI drop down menu. I was able to implement the code with sorted set commands but the specification I was given was with bit arrays data type and commands. From my understanding bit arrays operate on strings. Please how would I go about this? Kindly find attached my project below and images of the gui.
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
//MAIN PROJECT
package cen414dat;
import java.util.HashMap;
import java.util.Map;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import javax.swing.Icon;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Tuple;
/**
*
* #author ariel
*/
public class CEN414Dat {
static HashMap<Double, String> redisData = new HashMap<Double, String>();
/**
* #param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
Jedis jedis = new Jedis("localhost");
Info igr= new Info();
if (jedis.zcard("igr") == null || jedis.zcard("igr") == 0) {
jedis.zadd("igr", (Map) Info.map);}
for(Tuple t: jedis.zrangeByScoreWithScores("igr", 0, 100)){
System.out.println(t.getScore());
redisData.put(t.getScore(),t.getElement());
}
ArrayList<String> states = new ArrayList<String>();
for (Map.Entry m : redisData.entrySet()) {
states.add((String)m.getValue());
}
String[] statesArray = new String[states.size()];
states.toArray(statesArray);
JComboBox<String> stateList = new JComboBox<>(statesArray);
stateList.addItemListener(new Handler());
// stateList.addItemListener(null);
// add to the parent container (e.g. a JFrame):
JFrame jframe = new JFrame();
JLabel item1 = new JLabel("IGR STATISTICS FOR H1 2020");
item1.setToolTipText("Done by AJ");
jframe.add(item1);
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jframe.setLayout(new FlowLayout());
jframe.setSize(275,180);
jframe.setVisible(true);
jframe.add(stateList);
// get the selected item:
// String selectedBook = (String) stateList.getSelectedItem();
// check whether the server is running or not
System.out.println("Server is running: " + jedis.ping());
//getting the percentage for each state
//
// storing the data into redis database
System.out.println(jedis.zrange("igr", 0, 100));
for (Map.Entry m : Info.map.entrySet()) {
System.out.println(m.getKey() + " " + m.getValue());
//jedis.zadd("outofschool", M)
}
}
private static class Handler implements ItemListener{
//
// #Override
// public void actionPerformed(ActionEvent e) {
// JOptionPane.showMessageDialog(null, String.format("%s", e.getActionCommand()));
// }
#Override
public void itemStateChanged(ItemEvent e) {
for (Map.Entry m : redisData.entrySet()) {
if(e.getItem().toString() == m.getValue()&& e.getStateChange() == 1){
JOptionPane.showMessageDialog(null, m.getKey() , "Value in billions", 1);
System.out.println(m.getKey());
break;
}
}
}
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package cen414dat;
import static com.sun.org.apache.xalan.internal.lib.ExsltDynamic.map;
import java.util.HashMap;
/**
*
* #author ariel
*/
//Info project
public class Info {
public static HashMap<Double, String> map = new HashMap<Double, String>();
public Info(){
// IGR statistics in each state
map.put(4.27,"Q1 Abia");
map.put(1.92,"Q2 Abia");
map.put(1.63,"Q1 Adamawa");
map.put(2.12,"Q2 Adamawa");
map.put(12.00,"Q1 Akwa-Ibom");
map.put(4.26,"Q2 Akwa-Ibom");
map.put(4.53,"Q1 Anambra");
map.put(5.01,"Q2 Anambra");
map.put(4.39,"Q1 Bauchi");
map.put(1.37,"Q2 Bauchi");
map.put(2.88,"Q1 Bayelsa");
map.put(2.51,"Q2 Bayelsa");
map.put(3.62,"Q1 Benue");
map.put(1.73,"Q2 Benue");
map.put(3.59,"Q1 Borno");
map.put(1.79,"Q2 Borno");
map.put(3.99,"Q1 CrossRiver");
map.put(4.06,"Q2 CrossRiver");
map.put(19.3,"Q1 Delta");
map.put(11.5,"Q2 Delta");
map.put(4.65,"Q1 Ebonyi");
map.put(1.69,"Q2 Ebonyi");
map.put(9.51,"Q1 Edo");
map.put(4.50,"Q2 Edo");
map.put(1.65,"Q1 Ekiti");
map.put(1.55,"Q2 Ekiti");
map.put(5.95,"Q1 Enugu");
map.put(6.31,"Q2 Enugu");
map.put(20.7,"Q1 FCT");
map.put(14.5,"Q2 FCT");
map.put(11.1,"Q1 Gombe");
map.put(2.68,"Q2 Gombe");
map.put(3.08,"Q1 Imo");
map.put(4.65,"Q2 Imo");
map.put(1.91,"Q1 Jigawa");
map.put(1.10,"Q2 Jigawa");
map.put(10.2,"Q1 Kaduna");
map.put(4.36,"Q2 Kaduna");
map.put(7.85,"Q1 Kano");
map.put(9.66,"Q2 Kano");
map.put(2.10,"Q1 Katsina");
map.put(3.44,"Q2 Katsina");
map.put(2.21,"Q1 Kebbi");
map.put(2.18,"Q2 Kebbi");
map.put(5.42,"Q1 Kogi");
map.put(2.01,"Q2 Kogi");
map.put(7.22,"Q1 Kwara");
map.put(2.14,"Q2 Kwara");
map.put(114.00,"Q1 Lagos");
map.put(90.5,"Q2 Lagos");
map.put(3.03,"Q1 Nasawara");
map.put(2.87,"Q2 Nasawara");
map.put(1.90,"Q1 Niger");
map.put(2.12,"Q2 Niger");
map.put(14.6,"Q1 Ogun");
map.put(9.07,"Q2 Ogun");
map.put(8.16,"Q1 Ondo");
map.put(5.42,"Q2 Ondo ");
map.put(7.02,"Q1 Osun");
map.put(1.94,"Q2 Osun");
map.put(7.35,"Q1 Oyo");
map.put(10.4,"Q2 Oyo");
map.put(7.20,"Q1 Plateau");
map.put(2.20,"Q2 Plateau");
map.put(36.6,"Q1 Rivers");
map.put(27.9,"Q2 Rivers");
map.put(1.58,"Q1 Sokoto");
map.put(3.02,"Q2 Sokoto");
map.put(2.35,"Q1 Taraba");
map.put(1.71,"Q2 Taraba");
map.put(1.96,"Q1 Yobe");
map.put(1.96,"Q2 Yobe");
map.put(3.57,"Q1 Zamfara");
map.put(3.52,"Q2 Zamfara");
}
}
Image of the GUI
In my Java code I use a FileVisitor to traverse a filesystem and creating a structure of Paths, then later on this is converted to a json object for rendering in html.
Running on Windows it runs okay even against a linux filesystem, running on Linux against the same (now local) filesystem it fails to render special characters properly when call toString() on a path
i.e Windows debug output
CreateFolderTree:createJsonData:SEVERE: AddingNode(1):Duarte Lôbo- Requiem
and html displays ok as
Duarte Lôbo- Requiem
but linux debug output gives
CreateFolderTree:createJsonData:SEVERE: AddingNode(1):Duarte L??bo- Requiem
and html displays as two black diamond with question mark in them instead of the ô char
Why is this happening, the Paths are provided by the the FileVisitor class so must be getting constructed properly (i.e I am not hacking it myself) , and then i just call toString() on the path.
Is it a fonts problem, I have had some issues with fonts on the linux system but here I am just returning Strings to the html so cannot see a conection.
Probably an encoding issue, but I cant see a place where I am explicitly setting an encoding
Bulk of code below, debugging showing invalid output for linux is in the createJsonData() method
Edit:I have fixed the logging issue so that the output is written as UTF-8
FileHandler fe = new FileHandler(logFileName, LOG_SIZE_IN_BYTES, 10, true);
fe.setEncoding(StandardCharsets.UTF_8.name());
So we now see Windows is outputting correctly
CreateFolderTree:createJsonData:SEVERE: AddingNode(1):Duarte Lôbo- Requiem
but Linux is outputting
CreateFolderTree:createJsonData:SEVERE: AddingNode(1):Duarte L��bo- Requiem
and if I view this in HexEditor it gives this output for L��bo
4C EF BF BD EF BF BD 62 6F
Edit:Partial Solution
I came across What exactly is sun.jnu.encoding?
and found it was recommended to add this
-Dsun.jnu.encoding=UTF-8
and it worked files were now displayed okay
Unfortunately if user then clicked on such a file and sent back to server I now get this error
java.lang.NullPointerException
at java.base/sun.nio.fs.UnixPath.normalizeAndCheck(Unknown Source)
at java.base/sun.nio.fs.UnixPath.<init>(Unknown Source)
at java.base/sun.nio.fs.UnixFileSystem.getPath(Unknown Source)
at java.base/java.nio.file.Paths.get(Unknown Source)
at com.jthink.songkong.server.callback.ServerFixSongs.configureFileMapping(ServerFixSongs.java:59)
at com.jthink.songkong.server.callback.ServerFixSongs.startTask(ServerFixSongs.java:88)
at com.jthink.songkong.server.CmdRemote.lambda$null$36(CmdRemote.java:107)
I tried adding -Dfile.encoding=UTF-8 both in addtion or instead of the jnu option and that didnt help , the jnu option was the one I needed.
I shoudn't have to add this undocumented sun-jnu-encoding option so it seems to be that the server is broken in some way ?
Code
import com.google.common.base.Strings;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.jthink.songkong.analyse.analyser.Counters;
import com.jthink.songkong.analyse.general.Errors;
import com.jthink.songkong.cmdline.SongKong;
import com.jthink.songkong.fileloader.RecycleBinFolderNames;
import com.jthink.songkong.server.fs.Data;
import com.jthink.songkong.server.fs.PathWalker2;
import com.jthink.songkong.server.fs.State;
import com.jthink.songkong.ui.MainWindow;
import com.jthink.songkong.ui.progressdialog.FixSongsCounters;
import spark.Request;
import spark.Response;
import java.io.IOException;
import java.net.UnknownHostException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
/**
* Count the number of files that can be loaded, for information purposes only
*/
public class CreateFolderTree
{
private Path treeRoot;
Set<Path> keys = new HashSet<Path>();
public static class VisitFolder
extends SimpleFileVisitor<Path>
{
private Set<Path> keys;
private Integer maxDepth;
private int depth;
public VisitFolder(Set<Path> keys, Integer maxDepth)
{
this.keys=keys;
this.maxDepth = maxDepth;
}
/**
*
* #param dir
* #param attrs
* #return
* #throws IOException
*/
/*
* Ignore some dirs
* #param dir
* #param attrs
* #return
* #throws IOException
*/
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
throws IOException
{
try
{
if (dir.toFile().getName().equals(".AppleDouble"))
{
return FileVisitResult.SKIP_SUBTREE;
}
else if (dir.toString().equals("/proc"))
{
return FileVisitResult.SKIP_SUBTREE;
}
else if (dir.toString().equals("/dev"))
{
return FileVisitResult.SKIP_SUBTREE;
}
else if (RecycleBinFolderNames.isMatch(dir.toFile().getName()))
{
MainWindow.logger.log(Level.SEVERE, "Ignoring " + dir.toString());
return FileVisitResult.SKIP_SUBTREE;
}
else if (dir.toString().toLowerCase().endsWith(".tar"))
{
return FileVisitResult.SKIP_SUBTREE;
}
depth++;
if(depth > maxDepth)
{
depth--;
return FileVisitResult.SKIP_SUBTREE;
}
keys.add(dir);
return super.preVisitDirectory(dir, attrs);
}
catch(IOException e)
{
MainWindow.logger.warning("Unable visit dir:"+dir + ":"+e.getMessage());
return FileVisitResult.SKIP_SUBTREE;
}
}
/**
*
* Tar check due to http://stackoverflow.com/questions/14436032/why-is-java-7-files-walkfiletree-throwing-exception-on-encountering-a-tar-file-o/14446993#14446993
* SONGKONG-294:Ignore exceptions if file is not readable
*
* #param file
* #param exc
* #return
* #throws IOException
*/
#Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException
{
if (file.toString().endsWith(".tar")) {
//We dont log to reports as this is a bug in Java that we are handling not a problem in SongKong
MainWindow.logger.log(Level.SEVERE, exc.getMessage());
return FileVisitResult.CONTINUE;
}
try
{
FileVisitResult result = super.visitFileFailed(file, exc);
return result;
}
catch(IOException e)
{
MainWindow.logger.warning("Unable to visit file:"+file + ":"+e.getMessage());
return FileVisitResult.CONTINUE;
}
}
/**
* SONGKONG-294:Ignore exception if folder is not readable
*
* #param dir
* #param exc
* #return
* #throws IOException
*/
#Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc)
throws IOException
{
depth--;
try
{
FileVisitResult result = super.postVisitDirectory(dir, exc);
return result;
}
catch(IOException e)
{
MainWindow.logger.warning("Unable to count files in dir(2):"+dir);
return FileVisitResult.CONTINUE;
}
}
}
public CreateFolderTree(Path treeRoot)
{
this.treeRoot = treeRoot;
}
public String start(int depth)
{
VisitFolder visitFolder;
try
{
if(treeRoot==null)
{
for (Path path : FileSystems.getDefault().getRootDirectories())
{
visitFolder = new VisitFolder(keys, depth);
Files.walkFileTree(path, visitFolder);
}
}
else
{
visitFolder = new VisitFolder(keys, depth);
Files.walkFileTree(treeRoot, visitFolder);
}
PathWalker2 pw = new PathWalker2();
for (Path key : keys)
{
//SONGKONG-505: Illegal character in Filepath problem prevented reportFile creation
try
{
pw.addPath(key);
}
catch (InvalidPathException ipe)
{
MainWindow.logger.log(Level.SEVERE, ipe.getMessage(), ipe);
}
}
Gson gson = new GsonBuilder().create();
return gson.toJson(createJsonData(pw.getRoot()));
}
catch (Exception e)
{
handleException(e);
}
return "";
}
public void handleException(Exception e)
{
MainWindow.logger.log(Level.SEVERE, "Unable to count files:"+e.getMessage(), e);
Errors.addError("Unable to count files:"+e.getMessage());
MainWindow.logger.log(Level.SEVERE, e.getMessage());
Counters.getErrors().getCounter().incrementAndGet();
SongKong.refreshProgress(FixSongsCounters.SONGS_ERRORS);
}
/**
* Add this node and recursively its children, returning json data representing the tree
*
* #param node
* #return
*/
private Data createJsonData(PathWalker2.Node node)
{
Data data = new Data();
if(node.getFullPath()!=null)
{
data.setId(node.getFullPath().toString());
if(node.getFullPath().getFileName()!=null)
{
MainWindow.logger.severe("AddingNode(1):"+node.getFullPath().getFileName().toString());
data.setText(node.getFullPath().getFileName().toString());
}
else
{
MainWindow.logger.severe("AddingNode(2):"+node.getFullPath().toString());
data.setText(node.getFullPath().toString());
}
}
else
{
try
{
data.setText(java.net.InetAddress.getLocalHost().getHostName());
data.setId("#");
State state = new State();
state.setOpened(true);
data.setState(state);
}
catch(UnknownHostException uhe)
{
data.setText("Server");
}
}
//Recursively add each child folder of this node
Map<String, PathWalker2.Node> children = node.getChildren();
if(children.size()>0)
{
data.setChildren(new ArrayList<>());
for (Map.Entry<String, PathWalker2.Node> next : children.entrySet())
{
data.getChildren().add(createJsonData(next.getValue()));
}
}
else
{
data.setBooleanchildren(true);
}
return data;
}
public static String createFolderJsonData(Request request, Response response)
{
if(Strings.nullToEmpty(request.queryParams("id")).equals("#"))
{
CreateFolderTree cft = new CreateFolderTree(null);
String treeData = cft.start(1).replace("booleanchildren", "children");
return treeData;
}
else
{
CreateFolderTree cft = new CreateFolderTree(Paths.get(request.queryParams("id")));
String treeData = cft.start(2 ).replace("booleanchildren", "children");
return treeData;
}
}
}
import java.nio.file.Path;
import java.util.Collections;
import java.util.Map;
import java.util.TreeMap;
/** Constructs a tree of folders based on a list of filepaths
*
* i.e a give it a list if all folder that contain files that have been modified and it creates a hierachy
* that can then be used to generate a data structure for use by jstree
*
*/
public class PathWalker2
{
private final Node root;
public PathWalker2()
{
root = new Node();
}
public Node getRoot()
{
return root;
}
/**
* Represent a node on the tree (may/not have children)
*/
public static class Node
{
//Keyed on name and node
private final Map<String, Node> children = new TreeMap<>();
private Path fullPath;
public Node addChild(String name)
{
if (children.containsKey(name))
return children.get(name);
Node result = new Node();
children.put(name, result);
return result;
}
public Map<String, Node> getChildren()
{
return Collections.unmodifiableMap(children);
}
public void setFullPath(Path fullPath)
{
this.fullPath = fullPath;
}
public Path getFullPath()
{
return fullPath;
}
}
/**
* #param path
*/
public void addPath(Path path)
{
Node node = root.addChild((path.getRoot().toString().substring(0, path.getRoot().toString().length() - 1)));
//For each segment of the path add as child if not already added
for (int i = 0; i < path.getNameCount(); i++)
{
node = node.addChild(path.getName(i).toString());
}
//Set full path of this node
node.setFullPath(path);
}
}
So as always with encoding problems this has been a lot of work to debug. Not only are there a lot of different things that affect it, they also affect it at different times, so the first task is always to check where does it go wrong first.
As the deal with the � showed, once it goes wrong, it can then go more wrong and if you try to debug starting from the end result, it's like peeling layers from a rotten onion.
In this case the root of the problem was in the OS locale, which was set to POSIX. This old standard makes your OS act like it's from the 70's, with ASCII encoding and other outdated details. The ASCII encoding will prevent the OS from understanding filenames, text or anything containing more exotic characters. This causes weird issues because the JVM is doing just fine by itself, but any time it communicates with the OS (printing to a text file, asking to open a file with a certain name) there's a chance of corruption because the OS doesn't understand what the JVM is saying.
It's like someone is talking to you and every once in a while he puts a word of Chinese in there. You're writing down what he says in English, but every Chinese word you replace with "Didn't understand???".
The locale (in /etc/default/locale) usually contains sane defaults, but as we saw here, you can't always trust that. For any modern systems you'll want locale values like en_EN.UTF-8. You never want to see POSIX there in this day and age.
For html you either need to set a proper charset matching your needs or better stick with ASCII and use html-encoding for all non-ASCII characters.
This works even if no specific charset is defined for you html display.
https://en.wikipedia.org/wiki/Unicode_and_HTML
It seems that your debug output goes through multiple conversions between charsets. The text you send to the console seems to be converted to bytes using UTF-8 as encoding resulting into the conversion from ô to ô. Then there seems to be another conversion from the byte-data back into characters using the system's charset. Windows' console uses cp1252 as charset while Linux has different settings on a per installation basis. In your case it seems to be ASCII leading to the conversion to the two ? for the UTF-8 encoded data because these bytes have values that aren't defined in ASCII.
I don't know the logging framework you're using or what the specific setup of the Logger is you're using, so I can't tell you how to fix that, but for the Linux-variant, you might check the console's charset and change it to UTF-8 to see if that has the desired effect.
What I want: I have an editor plug-in for my custom DSL. I want to offer the user to set up a new DSL project with a project wizard. Normally these projects are Maven projects, so I want to provide setting up the project directly as a Maven project. To do that I want to extend the class MavenProjectWizardin the package org.eclipse.m2e.core.ui.internal.wizards.MavenProjectWizard and then add another wizard page with the details regarding the DSL project.
What I have: This is my try to do it at the moment:
/*
* Copyright (c) 2017 RWTH Aachen. All rights reserved.
*
* http://www.se-rwth.de/
*/
package de.se_rwth.transformationeditor.wizard;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.m2e.core.ui.internal.wizards.MavenProjectWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard;
import jline.internal.Log;
/**
* Offers a wizard to create a new Transformation project
*
* #author (last commit) $Philipp Nolte$
* #version $Revision$, $12.1.2017$
* #since 0.0.3
*/
#SuppressWarnings("restriction")
public class CDProjectWizard extends MavenProjectWizard{
protected CDWizardPageOne one;
protected WizardPage currentPage;
private IWorkbench workbench;
public CDProjectWizard() {
super();
}
/**
* #see org.eclipse.jface.wizard.IWizard#addPages()
*/
#Override
public void addPages() {
one = new CDWizardPageOne();
addPage(one);
super.addPages();
}
/**
* #see org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard#init(org.eclipse.ui.IWorkbench,
* org.eclipse.jface.viewers.IStructuredSelection)
*/
#Override
public void init(IWorkbench workbench, IStructuredSelection selection) {
super.init(workbench, selection);
this.workbench = workbench;
}
/**
* #see org.eclipse.jface.wizard.IWizard#getWindowTitle()
*/
#Override
public String getWindowTitle() {
return "New Class Diagram Transformation Project";
}
/**
* Creates a new Transformation project with the project name given in the
* wizard. Inside this project a new folder named "Transformations" is
* created. If a project with the same name already exists, an error window is
* shown. In addition to that, checks if user wants to create CD or MA xample
* files and creates them if wanted.
*
* #see org.eclipse.jface.wizard.IWizard#performFinish()
*/
#Override
public boolean performFinish() {
if (this.canFinish()) {
// Create new project
String projectName = this.one.getProjectNameText();
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IProject project = root.getProject(projectName);
try {
if (!project.exists()) {
project.create(null);
}
else {
project.refreshLocal(IResource.DEPTH_INFINITE, null);
MessageDialog.openError(this.workbench.getActiveWorkbenchWindow().getShell(),
"Project creation error", "Project with this name already exists");
return false;
}
if (!project.isOpen()) {
project.open(null);
}
String transformationFolderName = "Transformations";
// Check subfolder name
if (!one.getRootFolderText().isEmpty()) {
transformationFolderName = one.getRootFolderText();
}
IFolder binFolder = project.getFolder(transformationFolderName);
if (!binFolder.exists()) {
one.createNewFolder(binFolder, false, true, null);
// Checks if user wants to create a CD example file
if (one.createCDExampleFile()) {
InputStream demoFileContents = null;
try {
// If the user wants to, an example file is created
URL url = new URL("platform:/plugin/cdtrans-editor/src/main/resources/exampleFiles/RefactorCDs");
InputStream inputStream = url.openConnection().getInputStream();
binFolder.getFile("RefactorCDs.cdtr").create(inputStream, true, null);
}
catch (IOException e) {
Log.error("TransProjectWizard: Error while creating Demo file", e);
MessageDialog.openError(this.workbench.getActiveWorkbenchWindow().getShell(),
"Example file creation error", "There was an error while creating the example file");
}
finally {
if (demoFileContents != null) {
try {
demoFileContents.close();
}
catch (IOException e) {
Log.error("TransProjectWizard: Error while closing file stream", e);
}
}
}
}
BasicNewResourceWizard.selectAndReveal(binFolder, this.workbench.getActiveWorkbenchWindow());
}
}
catch (CoreException e) {
Log.error("TransProjectWizard: Error while creating new Project", e);
}
}
return true;
}
}
But if I start this there is a runtime error if I try to open the wizard which says:
I already tried to export the plug-in and install it in a fresh Eclipse installation, where the m2e package is installed, but with the same result.
Any thoughts on how to fix it?
I searched and searched over then internet and also on StackOverflow.
It is becoming a white beard.
I needed to process the contents of the clipboard copied from Excel and paste it into several text input by clicking a button on the webpage.
I do not need to do a CTRL-V in a hidden input and then every few seconds to look at the content, etc. etc.
Peremptory question:
There is no way to read the clipboard using "something"?
Tell me "NO" and I go to sleep
Carlo
Create a class file with this text
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.Toolkit;
import java.io.*;
public final class clipboardData implements ClipboardOwner {
public static void main(String... aArguments ){
clipboardData Clipboard = new clipboardData();
}
/**
* Empty implementation of the ClipboardOwner interface.
* #param aClipboard
* #param aContents
*/
#Override
public void lostOwnership(Clipboard aClipboard, Transferable aContents){
//do nothing
}
/**
* Place a String on the clipboard, and make this class the
* owner of the Clipboard's contents.
* #param aString
*/
public void setData(String aString){
StringSelection stringSelection = new StringSelection(aString);
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(stringSelection, this);
}
/**
* Get the String residing on the clipboard.
*
* #return any text found on the Clipboard; if none found, return an
* empty String.
*/
public String getData() {
String result = "";
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
//odd: the Object param of getContents is not currently used
Transferable contents = clipboard.getContents(null);
boolean hasTransferableText =
(contents != null) &&
contents.isDataFlavorSupported(DataFlavor.stringFlavor);
if (hasTransferableText) {
try {
result = (String)contents.getTransferData(DataFlavor.stringFlavor);
}
catch (UnsupportedFlavorException | IOException ex){
System.out.println(ex);
ex.printStackTrace();
}
}
return result;
}
}
The code above is accessible with this functions:
Create a new clipboard editor:
clipboardData clipboardData = new clipboardData()
setData function:
clipboardData.setData(Data)
getData function:
clipboardData.getData();
I'm using a rdf crawler, in that I had a class named as:
import edu.unika.aifb.rdf.crawler.*;
import com.hp.hpl.jena.rdf.model.*;
import com.hp.hpl.jena.util.FileManager;
These are class file termed as error, and I try with jena packages but I had attached, it does not make any changes.
Update:
Full SampleCrawl.java class content:
import java.util.*;
import edu.unika.aifb.rdf.crawler.*;
/**
* Call this class with 3 arguments - URL to crawl to,
* depth and time in seconds
*/
public class SampleCrawl {
/**
* #param uRI
* #param depth
* #param time
*/
#SuppressWarnings("rawtypes")
public SampleCrawl(Vector uRI, Vector hf, int depth, int time){
// Initialize Crawling parameters
CrawlConsole c = new CrawlConsole(uRI,hf,depth,time);
// get an ontology file from its local location
// (OPTIONAL)
c.setLocalNamespace("http://www.daml.org/2000/10/daml-ont","c:\\temp\\rdf\\schemas\\daml-ont.rdf");
// set all the paths to get all the results
c.setLogPath("c:\\temp\\crawllog.xml");
c.setCachePath("c:\\temp\\crawlcache.txt");
c.setModelPath("c:\\temp\\crawlmodel.rdf");
try{
// crawl and get RDF model
c.start();
// This writes all three result files out
c.writeResults();
}catch(Exception e){
}
}
/**
* #param args
* #throws Exception
*/
#SuppressWarnings({ "rawtypes", "unchecked" })
public static void main(String[] args) throws Exception {
if (args.length != 3) {
System.err.println("Usage: java -cp [JARs] SampleCrawl [URL] [depth:int] [time:int]");
System.exit(0);
}
Vector uris = new Vector();
uris.add(args[0]);
// no host filtering - crawl to all hosts
Vector hostfilter = null;
/* You may want to do something else to enable host filtering:
* Vector hostfilter = new Vector();
* hostfilter.add("http://www.w3.org");
*/
int depth = 2;
int time = 60;
try {
depth = Integer.parseInt(args[1]);
time = Integer.parseInt(args[2]);
}
catch (Exception e) {
System.err.println("Illegal argument types:");
System.err.println("Argument list: URI:String depth:int time(s):int");
System.exit(0);
}
new SampleCrawl(uris,hostfilter,depth,time);
}
}
Question:
How to add import edu.unika.aifb.rdf.crawler.; error occurs here
I googled the package that you're trying to import, and it appears that you're using Kaon. Assuming that's so, you have made an error in your import declaration. You have:
import edu.unika.aifb.rdf.crawler.*;
whereas the download available on SourceForge would require:
import edu.unika.aifb.rdf.rdfcrawler.*;
As an aside, it would be helpful if you would include information, such as "I'm trying to use Kaon's rdfcrawler from ..." in your question. Otherwise, we have to try to guess important details in your setup.