You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by fm...@apache.org on 2016/08/05 15:43:06 UTC
svn commit: r1755354 -
/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/types/TypesFrame.java
Author: fmui
Date: Fri Aug 5 15:43:06 2016
New Revision: 1755354
URL: http://svn.apache.org/viewvc?rev=1755354&view=rev
Log:
Workbench: added context menu to types tree
Modified:
chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/types/TypesFrame.java
Modified: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/types/TypesFrame.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/types/TypesFrame.java?rev=1755354&r1=1755353&r2=1755354&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/types/TypesFrame.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/types/TypesFrame.java Fri Aug 5 15:43:06 2016
@@ -27,6 +27,8 @@ import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
@@ -71,6 +73,7 @@ import org.apache.chemistry.opencmis.com
import org.apache.chemistry.opencmis.commons.definitions.PropertyDefinition;
import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
import org.apache.chemistry.opencmis.commons.enums.CmisVersion;
+import org.apache.chemistry.opencmis.commons.exceptions.CmisObjectNotFoundException;
import org.apache.chemistry.opencmis.commons.impl.IOUtils;
import org.apache.chemistry.opencmis.tck.CmisTestGroup;
import org.apache.chemistry.opencmis.workbench.ClientHelper;
@@ -99,6 +102,10 @@ public class TypesFrame extends JFrame {
private static final int BUTTON_DELETE = 4;
private static final int BUTTON_CREATE = 5;
+ private enum TypeFormat {
+ XML, JSON
+ };
+
private final ClientModel model;
private RepositoryInfo repInfo;
private ObjectType currentType;
@@ -198,22 +205,7 @@ public class TypesFrame extends JFrame {
menuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
- JFileChooser fileChooser = createXmlFileChooser();
- fileChooser.setSelectedFile(new File(getFilename() + ".xml"));
-
- int chooseResult = fileChooser.showDialog(getRootPane(), "Save XML");
- if (chooseResult == JFileChooser.APPROVE_OPTION) {
- OutputStream out = null;
- try {
- out = new BufferedOutputStream(new FileOutputStream(fileChooser.getSelectedFile()));
- TypeUtils.writeToXML(currentType, out);
- out.flush();
- } catch (Exception e) {
- ClientHelper.showError(getRootPane(), e);
- } finally {
- IOUtils.closeQuietly(out);
- }
- }
+ saveTypeDefinition(TypeFormat.XML);
}
});
@@ -222,22 +214,7 @@ public class TypesFrame extends JFrame {
menuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
- JFileChooser fileChooser = createJsonFileChooser();
- fileChooser.setSelectedFile(new File(getFilename() + ".json"));
-
- int chooseResult = fileChooser.showDialog(getRootPane(), "Save JSON");
- if (chooseResult == JFileChooser.APPROVE_OPTION) {
- OutputStream out = null;
- try {
- out = new BufferedOutputStream(new FileOutputStream(fileChooser.getSelectedFile()));
- TypeUtils.writeToJSON(currentType, out);
- out.flush();
- } catch (Exception e) {
- ClientHelper.showError(getRootPane(), e);
- } finally {
- IOUtils.closeQuietly(out);
- }
- }
+ saveTypeDefinition(TypeFormat.JSON);
}
});
@@ -262,26 +239,7 @@ public class TypesFrame extends JFrame {
menuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
- JFileChooser fileChooser = createXmlFileChooser();
-
- int chooseResult = fileChooser.showDialog(getRootPane(), "Load XML");
- if (chooseResult == JFileChooser.APPROVE_OPTION) {
- InputStream in = null;
- try {
- in = new BufferedInputStream(new FileInputStream(fileChooser.getSelectedFile()), 64 * 1024);
- TypeDefinition type = TypeUtils.readFromXML(in);
-
- if (checkTypeDefinition(type)) {
- model.getClientSession().getSession().updateType(type);
- }
-
- loadData();
- } catch (Exception e) {
- ClientHelper.showError(getRootPane(), e);
- } finally {
- IOUtils.closeQuietly(in);
- }
- }
+ createOrUpdateTypeDefinition(TypeFormat.XML, false);
}
});
@@ -290,26 +248,7 @@ public class TypesFrame extends JFrame {
menuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
- JFileChooser fileChooser = createJsonFileChooser();
-
- int chooseResult = fileChooser.showDialog(getRootPane(), "Load JSON");
- if (chooseResult == JFileChooser.APPROVE_OPTION) {
- InputStream in = null;
- try {
- in = new BufferedInputStream(new FileInputStream(fileChooser.getSelectedFile()), 64 * 1024);
- TypeDefinition type = TypeUtils.readFromJSON(in);
-
- if (checkTypeDefinition(type)) {
- model.getClientSession().getSession().updateType(type);
- }
-
- loadData();
- } catch (Exception e) {
- ClientHelper.showError(getRootPane(), e);
- } finally {
- IOUtils.closeQuietly(in);
- }
- }
+ createOrUpdateTypeDefinition(TypeFormat.JSON, false);
}
});
@@ -335,19 +274,7 @@ public class TypesFrame extends JFrame {
toolbarButton[BUTTON_DELETE].addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
- int answer = JOptionPane.showConfirmDialog(getOwner(), "Do you really want to delete the type "
- + currentType.getId() + "?", "Delete Type", JOptionPane.YES_NO_OPTION,
- JOptionPane.WARNING_MESSAGE);
-
- if (answer == JOptionPane.YES_OPTION) {
- try {
- model.getClientSession().getSession().deleteType(currentType.getId());
- } catch (Exception e) {
- ClientHelper.showError(getRootPane(), e);
- }
-
- loadData();
- }
+ deleteType();
}
});
toolBar.add(toolbarButton[BUTTON_DELETE]);
@@ -361,25 +288,7 @@ public class TypesFrame extends JFrame {
menuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
- JFileChooser fileChooser = createXmlFileChooser();
-
- int chooseResult = fileChooser.showDialog(getRootPane(), "Load XML");
- if (chooseResult == JFileChooser.APPROVE_OPTION) {
- InputStream in = null;
- try {
- in = new BufferedInputStream(new FileInputStream(fileChooser.getSelectedFile()), 64 * 1024);
- TypeDefinition type = TypeUtils.readFromXML(in);
- if (checkTypeDefinition(type)) {
- model.getClientSession().getSession().createType(type);
- }
-
- loadData();
- } catch (Exception e) {
- ClientHelper.showError(getRootPane(), e);
- } finally {
- IOUtils.closeQuietly(in);
- }
- }
+ createOrUpdateTypeDefinition(TypeFormat.XML, true);
}
});
@@ -388,25 +297,7 @@ public class TypesFrame extends JFrame {
menuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
- JFileChooser fileChooser = createJsonFileChooser();
-
- int chooseResult = fileChooser.showDialog(getRootPane(), "Load JSON");
- if (chooseResult == JFileChooser.APPROVE_OPTION) {
- try {
- InputStream in = new BufferedInputStream(new FileInputStream(fileChooser.getSelectedFile()),
- 64 * 1024);
- TypeDefinition type = TypeUtils.readFromJSON(in);
- in.close();
-
- if (checkTypeDefinition(type)) {
- model.getClientSession().getSession().createType(type);
- }
-
- loadData();
- } catch (Exception e) {
- ClientHelper.showError(getRootPane(), e);
- }
- }
+ createOrUpdateTypeDefinition(TypeFormat.JSON, true);
}
});
@@ -430,6 +321,63 @@ public class TypesFrame extends JFrame {
typesTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
typesTree.setCellRenderer(new TreeCellRenderer());
+ // tree popup
+ final JPopupMenu treePopup = new JPopupMenu();
+
+ final JMenuItem saveXmlItem = new JMenuItem("Save Type Definition to XML");
+ saveXmlItem.setEnabled(false);
+ treePopup.add(saveXmlItem);
+
+ saveXmlItem.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ saveTypeDefinition(TypeFormat.XML);
+ }
+ });
+
+ final JMenuItem saveJsonItem = new JMenuItem("Save Type Definition to JSON");
+ saveJsonItem.setEnabled(false);
+ treePopup.add(saveJsonItem);
+
+ saveJsonItem.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ saveTypeDefinition(TypeFormat.JSON);
+ }
+ });
+
+ treePopup.addSeparator();
+
+ final JMenuItem deleteItem = new JMenuItem("Delete Type");
+ deleteItem.setEnabled(false);
+ treePopup.add(deleteItem);
+
+ deleteItem.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ deleteType();
+ }
+ });
+
+ typesTree.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mousePressed(MouseEvent e) {
+ maybeShowPopup(e);
+ }
+
+ @Override
+ public void mouseReleased(MouseEvent e) {
+ maybeShowPopup(e);
+ }
+
+ private void maybeShowPopup(MouseEvent e) {
+ if (e.isPopupTrigger()) {
+ treePopup.show(e.getComponent(), e.getX(), e.getY());
+ }
+ }
+ });
+
+ // tree selection
typesTree.addTreeSelectionListener(new TreeSelectionListener() {
@Override
public void valueChanged(TreeSelectionEvent e) {
@@ -437,18 +385,29 @@ public class TypesFrame extends JFrame {
.getLastSelectedPathComponent();
if (node == null) {
+ saveXmlItem.setEnabled(false);
+ saveJsonItem.setEnabled(false);
return;
}
currentType = ((TypeNode) node.getUserObject()).getType();
if (repInfo.getCmisVersion() != CmisVersion.CMIS_1_0) {
- toolbarButton[BUTTON_UPDATE].setEnabled(currentType.getTypeMutability() != null
- && Boolean.TRUE.equals(currentType.getTypeMutability().canUpdate()));
- toolbarButton[BUTTON_DELETE].setEnabled(currentType.getTypeMutability() != null
- && Boolean.TRUE.equals(currentType.getTypeMutability().canDelete()));
+ boolean updateEnabled = currentType.getTypeMutability() != null
+ && Boolean.TRUE.equals(currentType.getTypeMutability().canUpdate());
+
+ toolbarButton[BUTTON_UPDATE].setEnabled(updateEnabled);
+
+ boolean deleteEnabled = currentType.getTypeMutability() != null
+ && Boolean.TRUE.equals(currentType.getTypeMutability().canDelete());
+
+ toolbarButton[BUTTON_DELETE].setEnabled(deleteEnabled);
+ deleteItem.setEnabled(deleteEnabled);
}
+ saveXmlItem.setEnabled(true);
+ saveJsonItem.setEnabled(true);
+
typeDefinitionInfoPanel.setType(currentType);
propertyDefinitionsSplitPane.setType(currentType);
}
@@ -480,6 +439,121 @@ public class TypesFrame extends JFrame {
setVisible(true);
}
+ private void createOrUpdateTypeDefinition(TypeFormat format, boolean create) {
+ String name;
+ JFileChooser fileChooser;
+
+ switch (format) {
+ case XML:
+ name = "XML";
+ fileChooser = createXmlFileChooser();
+ break;
+ case JSON:
+ name = "JSON";
+ fileChooser = createJsonFileChooser();
+ break;
+ default:
+ throw new RuntimeException("Unknown format!");
+ }
+
+ int chooseResult = fileChooser.showDialog(getRootPane(), "Load " + name);
+ if (chooseResult == JFileChooser.APPROVE_OPTION) {
+ InputStream in = null;
+ try {
+ in = new BufferedInputStream(new FileInputStream(fileChooser.getSelectedFile()), 64 * 1024);
+
+ TypeDefinition type;
+
+ switch (format) {
+ case XML:
+ type = TypeUtils.readFromXML(in);
+ break;
+ case JSON:
+ type = TypeUtils.readFromJSON(in);
+ break;
+ default:
+ throw new RuntimeException("Unknown format!");
+ }
+
+ if (checkTypeDefinition(type, create)) {
+ if (create) {
+ model.getClientSession().getSession().createType(type);
+ } else {
+ model.getClientSession().getSession().updateType(type);
+ }
+ }
+
+ loadData();
+ } catch (Exception e) {
+ ClientHelper.showError(getRootPane(), e);
+ } finally {
+ IOUtils.closeQuietly(in);
+ }
+ }
+ }
+
+ private void saveTypeDefinition(TypeFormat format) {
+ String name;
+ String extension;
+
+ switch (format) {
+ case XML:
+ name = "XML";
+ extension = ".xml";
+ break;
+ case JSON:
+ name = "JSON";
+ extension = ".json";
+ break;
+ default:
+ throw new RuntimeException("Unknown format!");
+ }
+
+ JFileChooser fileChooser = createXmlFileChooser();
+ fileChooser.setSelectedFile(new File(getFilename() + extension));
+
+ int chooseResult = fileChooser.showDialog(getRootPane(), "Save " + name);
+ if (chooseResult == JFileChooser.APPROVE_OPTION) {
+ OutputStream out = null;
+ try {
+ out = new BufferedOutputStream(new FileOutputStream(fileChooser.getSelectedFile()));
+
+ switch (format) {
+ case XML:
+ TypeUtils.writeToXML(currentType, out);
+ break;
+ case JSON:
+ TypeUtils.writeToJSON(currentType, out);
+ break;
+ default:
+ throw new RuntimeException("Unknown format!");
+ }
+
+ out.flush();
+ } catch (Exception e) {
+ ClientHelper.showError(getRootPane(), e);
+ } finally {
+ IOUtils.closeQuietly(out);
+ }
+ }
+ }
+
+ private void deleteType() {
+ int answer = JOptionPane.showConfirmDialog(getOwner(),
+ "Do you really want to delete the type " + currentType.getId() + "?", "Delete Type",
+ JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
+
+ if (answer == JOptionPane.YES_OPTION) {
+ try {
+ model.getClientSession().getSession().deleteType(currentType.getId());
+ } catch (Exception e) {
+ ClientHelper.showError(getRootPane(), e);
+ }
+
+ loadData();
+ }
+ }
+
private JFileChooser createXmlFileChooser() {
JFileChooser fileChooser = new JFileChooser();
fileChooser.addChoosableFileFilter(new FileFilter() {
@@ -529,14 +603,28 @@ public class TypesFrame extends JFrame {
return "type";
}
- private boolean checkTypeDefinition(TypeDefinition type) {
+ private boolean checkTypeDefinition(TypeDefinition type, boolean isCreate) {
StringBuilder sb = new StringBuilder(128);
+ boolean typeExists = true;
+
+ try {
+ model.getClientSession().getSession().getTypeDefinition(type.getId(), false);
+ } catch (CmisObjectNotFoundException e) {
+ typeExists = false;
+ }
+
List<ValidationError> typeResult = TypeUtils.validateTypeDefinition(type);
- if (isNotEmpty(typeResult)) {
+ if (isNotEmpty(typeResult) || (isCreate && typeExists) || (!isCreate && !typeExists)) {
sb.append("\nType Definition:\n");
+ if (isCreate && typeExists) {
+ sb.append("- Type already exists");
+ } else if (!isCreate && !typeExists) {
+ sb.append("- Type does not exist");
+ }
+
for (ValidationError error : typeResult) {
sb.append("- ");
sb.append(error.toString());