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 2010/10/06 14:32:26 UTC

svn commit: r1005006 [3/5] - in /incubator/chemistry/opencmis/trunk: ./ chemistry-opencmis-workbench/ chemistry-opencmis-workbench/chemistry-opencmis-workbench/ chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/ chemistry-opencmis-workbench...

Propchange: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/actions/DeleteContentStreamPanel.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/actions/DeletePanel.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/actions/DeletePanel.java?rev=1005006&view=auto
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/actions/DeletePanel.java (added)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/actions/DeletePanel.java Wed Oct  6 12:32:23 2010
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.chemistry.opencmis.workbench.actions;
+
+import javax.swing.JCheckBox;
+
+import org.apache.chemistry.opencmis.commons.enums.Action;
+import org.apache.chemistry.opencmis.workbench.model.ClientModel;
+import org.apache.chemistry.opencmis.workbench.swing.ActionPanel;
+
+public class DeletePanel extends ActionPanel {
+
+	private static final long serialVersionUID = 1L;
+
+	private JCheckBox allVersionsBox;
+
+	public DeletePanel(ClientModel model) {
+		super("Delete Object", "Delete", model);
+	}
+
+	@Override
+	protected void createActionComponents() {
+		allVersionsBox = new JCheckBox("delete all versions", true);
+		addActionComponent(allVersionsBox);
+	}
+
+	@Override
+	public boolean isAllowed() {
+		if (getObject() == null) {
+			return false;
+		}
+
+		if ((getObject().getAllowableActions() == null)
+				|| (getObject().getAllowableActions().getAllowableActions() == null)) {
+			return true;
+		}
+
+		return getObject().getAllowableActions().getAllowableActions()
+				.contains(Action.CAN_DELETE_OBJECT);
+	}
+
+	@Override
+	public void doAction() throws Exception {
+		getObject().delete(allVersionsBox.isSelected());
+	}
+}

Propchange: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/actions/DeletePanel.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/actions/DeleteTreePanel.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/actions/DeleteTreePanel.java?rev=1005006&view=auto
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/actions/DeleteTreePanel.java (added)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/actions/DeleteTreePanel.java Wed Oct  6 12:32:23 2010
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.chemistry.opencmis.workbench.actions;
+
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+
+import org.apache.chemistry.opencmis.client.api.Folder;
+import org.apache.chemistry.opencmis.commons.enums.Action;
+import org.apache.chemistry.opencmis.commons.enums.UnfileObject;
+import org.apache.chemistry.opencmis.workbench.model.ClientModel;
+import org.apache.chemistry.opencmis.workbench.swing.ActionPanel;
+
+public class DeleteTreePanel extends ActionPanel {
+
+	private static final long serialVersionUID = 1L;
+
+	private JCheckBox allVersionsBox;
+	private JComboBox unfileObjectsBox;
+	private JCheckBox continueOnFailureBox;
+
+	public DeleteTreePanel(ClientModel model) {
+		super("Delete Tree", "Delete", model);
+	}
+
+	@Override
+	protected void createActionComponents() {
+		allVersionsBox = new JCheckBox("delete all versions", true);
+		addActionComponent(allVersionsBox);
+
+		unfileObjectsBox = new JComboBox(new Object[] { UnfileObject.DELETE,
+				UnfileObject.DELETESINGLEFILED, UnfileObject.UNFILE });
+		unfileObjectsBox.setSelectedIndex(0);
+		addActionComponent(unfileObjectsBox);
+
+		continueOnFailureBox = new JCheckBox("continue on failure", true);
+		addActionComponent(allVersionsBox);
+	}
+
+	@Override
+	public boolean isAllowed() {
+		if ((getObject() == null) || !(getObject() instanceof Folder)) {
+			return false;
+		}
+
+		if ((getObject().getAllowableActions() == null)
+				|| (getObject().getAllowableActions().getAllowableActions() == null)) {
+			return true;
+		}
+
+		return getObject().getAllowableActions().getAllowableActions()
+				.contains(Action.CAN_DELETE_TREE);
+	}
+
+	@Override
+	public void doAction() throws Exception {
+		((Folder) getObject()).deleteTree(allVersionsBox.isSelected(),
+				(UnfileObject) unfileObjectsBox.getSelectedItem(),
+				continueOnFailureBox.isSelected());
+	}
+}

Propchange: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/actions/DeleteTreePanel.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/actions/MovePanel.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/actions/MovePanel.java?rev=1005006&view=auto
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/actions/MovePanel.java (added)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/actions/MovePanel.java Wed Oct  6 12:32:23 2010
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.chemistry.opencmis.workbench.actions;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+
+import org.apache.chemistry.opencmis.client.api.FileableCmisObject;
+import org.apache.chemistry.opencmis.client.api.ObjectId;
+import org.apache.chemistry.opencmis.client.runtime.ObjectIdImpl;
+import org.apache.chemistry.opencmis.commons.enums.Action;
+import org.apache.chemistry.opencmis.workbench.model.ClientModel;
+import org.apache.chemistry.opencmis.workbench.swing.ActionPanel;
+
+public class MovePanel extends ActionPanel {
+
+	private static final long serialVersionUID = 1L;
+
+	private JTextField targetFolderField;
+
+	public MovePanel(ClientModel model) {
+		super("Move Object", "Move", model);
+	}
+
+	@Override
+	protected void createActionComponents() {
+		JPanel targetFolderPanel = new JPanel(new BorderLayout());
+		targetFolderPanel.setBackground(Color.WHITE);
+
+		targetFolderPanel.add(new JLabel("Target Folder Id:"),
+				BorderLayout.LINE_START);
+
+		targetFolderField = new JTextField(30);
+		targetFolderPanel.add(targetFolderField, BorderLayout.CENTER);
+
+		addActionComponent(targetFolderPanel);
+	}
+
+	@Override
+	public boolean isAllowed() {
+		if ((getObject() == null)
+				|| !(getObject() instanceof FileableCmisObject)) {
+			return false;
+		}
+
+		if ((getObject().getAllowableActions() == null)
+				|| (getObject().getAllowableActions().getAllowableActions() == null)) {
+			return true;
+		}
+
+		return getObject().getAllowableActions().getAllowableActions()
+				.contains(Action.CAN_MOVE_OBJECT);
+	}
+
+	@Override
+	public void doAction() throws Exception {
+		ObjectId targetFolderId = new ObjectIdImpl(targetFolderField.getText());
+		((FileableCmisObject) getObject()).move(getClientModel()
+				.getCurrentFolder(), targetFolderId);
+	}
+}

Propchange: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/actions/MovePanel.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/actions/SetContentStreamPanel.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/actions/SetContentStreamPanel.java?rev=1005006&view=auto
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/actions/SetContentStreamPanel.java (added)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/actions/SetContentStreamPanel.java Wed Oct  6 12:32:23 2010
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.chemistry.opencmis.workbench.actions;
+
+import javax.swing.JCheckBox;
+import javax.swing.JTextField;
+
+import org.apache.chemistry.opencmis.client.api.Document;
+import org.apache.chemistry.opencmis.commons.data.ContentStream;
+import org.apache.chemistry.opencmis.commons.enums.Action;
+import org.apache.chemistry.opencmis.workbench.model.ClientModel;
+import org.apache.chemistry.opencmis.workbench.swing.ActionPanel;
+
+public class SetContentStreamPanel extends ActionPanel {
+
+	private static final long serialVersionUID = 1L;
+
+	private JTextField filenameField;
+	private JCheckBox overwriteBox;
+
+	public SetContentStreamPanel(ClientModel model) {
+		super("Set Content Stream", "Set Content Stream", model);
+	}
+
+	@Override
+	protected void createActionComponents() {
+		filenameField = new JTextField(30);
+		addActionComponent(createFilenamePanel(filenameField));
+
+		overwriteBox = new JCheckBox("overwrite", true);
+		addActionComponent(overwriteBox);
+	}
+
+	@Override
+	public boolean isAllowed() {
+		if ((getObject() == null) || !(getObject() instanceof Document)) {
+			return false;
+		}
+
+		if ((getObject().getAllowableActions() == null)
+				|| (getObject().getAllowableActions().getAllowableActions() == null)) {
+			return true;
+		}
+
+		return getObject().getAllowableActions().getAllowableActions()
+				.contains(Action.CAN_SET_CONTENT_STREAM);
+	}
+
+	@Override
+	public void doAction() throws Exception {
+		ContentStream content = getClientModel().createContentStream(
+				filenameField.getText());
+		((Document) getObject()).setContentStream(content, overwriteBox
+				.isSelected());
+	}
+}
\ No newline at end of file

Propchange: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/actions/SetContentStreamPanel.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/ACLTable.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/ACLTable.java?rev=1005006&view=auto
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/ACLTable.java (added)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/ACLTable.java Wed Oct  6 12:32:23 2010
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.chemistry.opencmis.workbench.details;
+
+import java.util.Collection;
+
+import org.apache.chemistry.opencmis.commons.data.Ace;
+import org.apache.chemistry.opencmis.workbench.model.ClientModel;
+
+public class ACLTable extends AbstractDetailsTable {
+
+    private static final long serialVersionUID = 1L;
+
+    private static final String[] COLUMN_NAMES = { "Principal", "Permissions", "Direct" };
+    private static final int[] COLUMN_WIDTHS = { 200, 400, 50 };
+
+    public ACLTable(ClientModel model) {
+        super();
+        init(model, COLUMN_NAMES, COLUMN_WIDTHS);
+    }
+
+    public int getDetailRowCount() {
+        if ((getObject().getAcl() == null) || (getObject().getAcl().getAces() == null)) {
+            return 0;
+        }
+
+        return getObject().getAcl().getAces().size();
+    }
+
+    public Object getDetailValueAt(int rowIndex, int columnIndex) {
+        Ace ace = getObject().getAcl().getAces().get(rowIndex);
+
+        switch (columnIndex) {
+        case 0:
+            return ace.getPrincipalId();
+        case 1:
+            return ace.getPermissions();
+        case 2:
+            return ace.isDirect();
+        }
+
+        return null;
+    }
+
+    @Override
+    public Class<?> getDetailColumClass(int columnIndex) {
+        if (columnIndex == 1) {
+            return Collection.class;
+        } else if (columnIndex == 2) {
+            return Boolean.class;
+        }
+
+        return super.getDetailColumClass(columnIndex);
+    }
+}

Propchange: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/ACLTable.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/AbstractDetailsTable.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/AbstractDetailsTable.java?rev=1005006&view=auto
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/AbstractDetailsTable.java (added)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/AbstractDetailsTable.java Wed Oct  6 12:32:23 2010
@@ -0,0 +1,185 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.chemistry.opencmis.workbench.details;
+
+import java.awt.Toolkit;
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.StringSelection;
+import java.awt.datatransfer.Transferable;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.util.Collection;
+
+import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
+import javax.swing.JTable;
+import javax.swing.table.AbstractTableModel;
+import javax.swing.table.TableColumn;
+
+import org.apache.chemistry.opencmis.client.api.CmisObject;
+import org.apache.chemistry.opencmis.workbench.model.ClientModel;
+import org.apache.chemistry.opencmis.workbench.model.ClientModelEvent;
+import org.apache.chemistry.opencmis.workbench.model.ObjectListener;
+import org.apache.chemistry.opencmis.workbench.swing.CollectionRenderer;
+
+public abstract class AbstractDetailsTable extends JTable implements ObjectListener {
+
+    private static final long serialVersionUID = 1L;
+
+    private ClientModel model;
+    private String[] columnNames;
+
+    public void init(ClientModel model, String[] columnNames, int[] colummnWidths) {
+        this.model = model;
+        model.addObjectListener(this);
+
+        this.columnNames = columnNames;
+
+        setModel(new DetailsTableModel(this));
+
+        setDefaultRenderer(Collection.class, new CollectionRenderer());
+        setAutoResizeMode(AUTO_RESIZE_OFF);
+        setAutoCreateRowSorter(true);
+
+        for (int i = 0; i < colummnWidths.length; i++) {
+            TableColumn column = getColumnModel().getColumn(i);
+            column.setPreferredWidth(colummnWidths[i]);
+        }
+
+        setFillsViewportHeight(true);
+
+        final JPopupMenu popup = new JPopupMenu();
+        JMenuItem menuItem = new JMenuItem("Copy to clipboard");
+        popup.add(menuItem);
+
+        menuItem.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                StringBuilder sb = new StringBuilder();
+                int rows = getDetailRowCount();
+                for (int row = 0; row < rows; row++) {
+                    int cols = getColumnNames().length;
+                    for (int col = 0; col < cols; col++) {
+                        sb.append(getDetailValueAt(row, col));
+                        sb.append("|");
+                    }
+                    sb.append("\n");
+                }
+
+                Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
+                Transferable transferable = new StringSelection(sb.toString());
+                clipboard.setContents(transferable, null);
+            }
+        });
+
+        addMouseListener(new MouseListener() {
+            public void mouseExited(MouseEvent e) {
+            }
+
+            public void mouseEntered(MouseEvent e) {
+            }
+
+            public void mouseClicked(MouseEvent e) {
+                if (e.getClickCount() == 2) {
+                    int row = getSelectedRow();
+                    if ((row > -1) && (row < getModel().getRowCount())) {
+                        doubleClickAction(e, row);
+                    }
+                }
+            }
+
+            public void mousePressed(MouseEvent e) {
+                maybeShowPopup(e);
+            }
+
+            public void mouseReleased(MouseEvent e) {
+                maybeShowPopup(e);
+            }
+
+            private void maybeShowPopup(MouseEvent e) {
+                if (e.isPopupTrigger()) {
+                    popup.show(e.getComponent(), e.getX(), e.getY());
+                }
+            }
+        });
+    }
+
+    public void objectLoaded(ClientModelEvent event) {
+        ((DetailsTableModel) getModel()).fireTableDataChanged();
+    }
+
+    public CmisObject getObject() {
+        return model.getCurrentObject();
+    }
+
+    public String[] getColumnNames() {
+        return columnNames;
+    }
+
+    public abstract int getDetailRowCount();
+
+    public abstract Object getDetailValueAt(int rowIndex, int columnIndex);
+
+    public Class<?> getDetailColumClass(int columnIndex) {
+        return String.class;
+    }
+
+    public void doubleClickAction(MouseEvent e, int rowIndex) {
+    }
+
+    static class DetailsTableModel extends AbstractTableModel {
+
+        private AbstractDetailsTable table;
+
+        public DetailsTableModel(AbstractDetailsTable table) {
+            this.table = table;
+        }
+
+        private static final long serialVersionUID = 1L;
+
+        public String getColumnName(int columnIndex) {
+            return table.getColumnNames()[columnIndex];
+        }
+
+        public int getColumnCount() {
+            return table.getColumnNames().length;
+        }
+
+        public int getRowCount() {
+            if (table.getObject() == null) {
+                return 0;
+            }
+
+            return table.getDetailRowCount();
+        }
+
+        public Object getValueAt(int rowIndex, int columnIndex) {
+            if (table.getObject() == null) {
+                return null;
+            }
+
+            return table.getDetailValueAt(rowIndex, columnIndex);
+        }
+
+        public Class<?> getColumnClass(int columnIndex) {
+            return table.getDetailColumClass(columnIndex);
+        }
+    }
+}

Propchange: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/AbstractDetailsTable.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/ActionsPanel.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/ActionsPanel.java?rev=1005006&view=auto
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/ActionsPanel.java (added)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/ActionsPanel.java Wed Oct  6 12:32:23 2010
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.chemistry.opencmis.workbench.details;
+
+import javax.swing.BorderFactory;
+import javax.swing.BoxLayout;
+import javax.swing.JPanel;
+
+import org.apache.chemistry.opencmis.client.api.CmisObject;
+import org.apache.chemistry.opencmis.workbench.actions.CancelCheckOutPanel;
+import org.apache.chemistry.opencmis.workbench.actions.CheckInPanel;
+import org.apache.chemistry.opencmis.workbench.actions.CheckOutPanel;
+import org.apache.chemistry.opencmis.workbench.actions.DeleteContentStreamPanel;
+import org.apache.chemistry.opencmis.workbench.actions.DeletePanel;
+import org.apache.chemistry.opencmis.workbench.actions.DeleteTreePanel;
+import org.apache.chemistry.opencmis.workbench.actions.MovePanel;
+import org.apache.chemistry.opencmis.workbench.actions.SetContentStreamPanel;
+import org.apache.chemistry.opencmis.workbench.model.ClientModel;
+import org.apache.chemistry.opencmis.workbench.model.ClientModelEvent;
+import org.apache.chemistry.opencmis.workbench.model.ObjectListener;
+
+public class ActionsPanel extends JPanel implements ObjectListener {
+
+	private static final long serialVersionUID = 1L;
+
+	private ClientModel model;
+
+	private DeletePanel deletePanel;
+	private DeleteTreePanel deleteTreePanel;
+	private MovePanel movePanel;
+	private CheckOutPanel checkOutPanel;
+	private CancelCheckOutPanel cancelCheckOutPanel;
+	private CheckInPanel checkInPanel;
+	private SetContentStreamPanel setContentStreamPanel;
+	private DeleteContentStreamPanel deleteContentStreamPanel;
+
+	public ActionsPanel(ClientModel model) {
+		super();
+
+		this.model = model;
+		model.addObjectListener(this);
+
+		createGUI();
+	}
+
+	public void objectLoaded(ClientModelEvent event) {
+		CmisObject object = model.getCurrentObject();
+
+		deletePanel.setObject(object);
+		deletePanel.setVisible(deletePanel.isAllowed());
+
+		deleteTreePanel.setObject(object);
+		deleteTreePanel.setVisible(deleteTreePanel.isAllowed());
+
+		movePanel.setObject(object);
+		movePanel.setVisible(movePanel.isAllowed());
+
+		checkOutPanel.setObject(object);
+		checkOutPanel.setVisible(checkOutPanel.isAllowed());
+
+		cancelCheckOutPanel.setObject(object);
+		cancelCheckOutPanel.setVisible(cancelCheckOutPanel.isAllowed());
+
+		checkInPanel.setObject(object);
+		checkInPanel.setVisible(checkInPanel.isAllowed());
+
+		setContentStreamPanel.setObject(object);
+		setContentStreamPanel.setVisible(setContentStreamPanel.isAllowed());
+
+		deleteContentStreamPanel.setObject(object);
+		deleteContentStreamPanel.setVisible(deleteContentStreamPanel
+				.isAllowed());
+	}
+
+	private void createGUI() {
+		setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
+		setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
+
+		deletePanel = new DeletePanel(model);
+		add(deletePanel);
+
+		deleteTreePanel = new DeleteTreePanel(model);
+		add(deleteTreePanel);
+
+		movePanel = new MovePanel(model);
+		add(movePanel);
+
+		checkOutPanel = new CheckOutPanel(model);
+		add(checkOutPanel);
+
+		cancelCheckOutPanel = new CancelCheckOutPanel(model);
+		add(cancelCheckOutPanel);
+
+		checkInPanel = new CheckInPanel(model);
+		add(checkInPanel);
+
+		setContentStreamPanel = new SetContentStreamPanel(model);
+		add(setContentStreamPanel);
+
+		deleteContentStreamPanel = new DeleteContentStreamPanel(model);
+		add(deleteContentStreamPanel);
+	}
+}

Propchange: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/ActionsPanel.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/DetailsTabs.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/DetailsTabs.java?rev=1005006&view=auto
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/DetailsTabs.java (added)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/DetailsTabs.java Wed Oct  6 12:32:23 2010
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.chemistry.opencmis.workbench.details;
+
+import javax.swing.JScrollPane;
+import javax.swing.JTabbedPane;
+
+import org.apache.chemistry.opencmis.workbench.model.ClientModel;
+
+public class DetailsTabs extends JTabbedPane {
+
+    private static final long serialVersionUID = 1L;
+
+    private ClientModel model;
+
+    private ObjectPanel objectPanel;
+    private ActionsPanel actionsPanel;
+    private PropertyTable propertyTable;
+    private RelationshipTable relationshipTable;
+    private RenditionTable renditionTable;
+    private ACLTable aclTable;
+    private PolicyTable policyTable;
+    private VersionTable versionTable;
+    private ExtensionsPanel extensionsPanel;
+
+    public DetailsTabs(ClientModel model) {
+        super(JTabbedPane.TOP, JTabbedPane.SCROLL_TAB_LAYOUT);
+
+        this.model = model;
+        createGUI();
+    }
+
+    private void createGUI() {
+        objectPanel = new ObjectPanel(model);
+        actionsPanel = new ActionsPanel(model);
+        propertyTable = new PropertyTable(model);
+        relationshipTable = new RelationshipTable(model);
+        renditionTable = new RenditionTable(model);
+        aclTable = new ACLTable(model);
+        policyTable = new PolicyTable(model);
+        versionTable = new VersionTable(model);
+        extensionsPanel = new ExtensionsPanel(model);
+
+        addTab("Object", objectPanel);
+        addTab("Actions", new JScrollPane(actionsPanel));
+        addTab("Properties", new JScrollPane(propertyTable));
+        addTab("Relationships", new JScrollPane(relationshipTable));
+        addTab("Renditions", new JScrollPane(renditionTable));
+        addTab("ACL", new JScrollPane(aclTable));
+        addTab("Policies", new JScrollPane(policyTable));
+        addTab("Versions", new JScrollPane(versionTable));
+        addTab("Extensions", new JScrollPane(extensionsPanel));
+    }
+}

Propchange: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/DetailsTabs.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/ExtensionsPanel.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/ExtensionsPanel.java?rev=1005006&view=auto
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/ExtensionsPanel.java (added)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/ExtensionsPanel.java Wed Oct  6 12:32:23 2010
@@ -0,0 +1,159 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.chemistry.opencmis.workbench.details;
+
+import java.awt.Color;
+import java.util.List;
+
+import javax.swing.BorderFactory;
+import javax.swing.BoxLayout;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTree;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.DefaultTreeModel;
+import javax.swing.tree.TreeSelectionModel;
+
+import org.apache.chemistry.opencmis.client.api.CmisObject;
+import org.apache.chemistry.opencmis.commons.data.CmisExtensionElement;
+import org.apache.chemistry.opencmis.commons.enums.ExtensionLevel;
+import org.apache.chemistry.opencmis.workbench.model.ClientModel;
+import org.apache.chemistry.opencmis.workbench.model.ClientModelEvent;
+import org.apache.chemistry.opencmis.workbench.model.ObjectListener;
+
+public class ExtensionsPanel extends JPanel implements ObjectListener {
+
+    private static final long serialVersionUID = 1L;
+
+    private ClientModel model;
+
+    private JTree extensionsTree;
+
+    public ExtensionsPanel(ClientModel model) {
+        super();
+
+        this.model = model;
+        model.addObjectListener(this);
+
+        createGUI();
+    }
+
+    @Override
+    public void objectLoaded(ClientModelEvent event) {
+        CmisObject object = model.getCurrentObject();
+
+        DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode();
+
+        if (object != null) {
+            List<CmisExtensionElement> extensions;
+
+            // object extensions
+            extensions = object.getExtensions(ExtensionLevel.OBJECT);
+            if ((extensions != null) && (!extensions.isEmpty())) {
+                DefaultMutableTreeNode objectRootNode = new DefaultMutableTreeNode("Object");
+                addExtension(objectRootNode, extensions);
+                rootNode.add(objectRootNode);
+            }
+
+            // property extensions
+            extensions = object.getExtensions(ExtensionLevel.PROPERTIES);
+            if ((extensions != null) && (!extensions.isEmpty())) {
+                DefaultMutableTreeNode propertiesRootNode = new DefaultMutableTreeNode("Properties");
+                addExtension(propertiesRootNode, extensions);
+                rootNode.add(propertiesRootNode);
+            }
+
+            // allowable actions extensions
+            extensions = object.getExtensions(ExtensionLevel.ALLOWABLE_ACTIONS);
+            if ((extensions != null) && (!extensions.isEmpty())) {
+                DefaultMutableTreeNode allowableActionsRootNode = new DefaultMutableTreeNode("Allowable Actions");
+                addExtension(allowableActionsRootNode, extensions);
+                rootNode.add(allowableActionsRootNode);
+            }
+
+            // ACL extensions
+            extensions = object.getExtensions(ExtensionLevel.ACL);
+            if ((extensions != null) && (!extensions.isEmpty())) {
+                DefaultMutableTreeNode aclRootNode = new DefaultMutableTreeNode("ACL");
+                addExtension(aclRootNode, extensions);
+                rootNode.add(aclRootNode);
+            }
+
+            // policies extensions
+            extensions = object.getExtensions(ExtensionLevel.POLICIES);
+            if ((extensions != null) && (!extensions.isEmpty())) {
+                DefaultMutableTreeNode policiesRootNode = new DefaultMutableTreeNode("Policies");
+                addExtension(policiesRootNode, extensions);
+                rootNode.add(policiesRootNode);
+            }
+        }
+
+        DefaultTreeModel treeModel = new DefaultTreeModel(rootNode);
+
+        extensionsTree.setModel(treeModel);
+    }
+
+    private void addExtension(DefaultMutableTreeNode parent, List<CmisExtensionElement> extensions) {
+        if ((extensions == null) || (extensions.isEmpty())) {
+            return;
+        }
+
+        for (CmisExtensionElement ext : extensions) {
+            DefaultMutableTreeNode node = new DefaultMutableTreeNode(new ExtensionNode(ext));
+            parent.add(node);
+
+            if (ext.getChildren().size() > 0) {
+                addExtension(node, ext.getChildren());
+            }
+        }
+    }
+
+    private void createGUI() {
+        setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
+        setBorder(BorderFactory.createEmptyBorder());
+        setBackground(Color.WHITE);
+
+        extensionsTree = new JTree();
+        extensionsTree.setRootVisible(false);
+        extensionsTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
+        extensionsTree.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
+
+        extensionsTree.setModel(new DefaultTreeModel(null));
+
+        JScrollPane pane = new JScrollPane(extensionsTree);
+        pane.setBorder(BorderFactory.createEmptyBorder());
+
+        add(pane);
+    }
+
+    static class ExtensionNode {
+        private CmisExtensionElement extension;
+
+        public ExtensionNode(CmisExtensionElement extension) {
+            this.extension = extension;
+        }
+
+        @Override
+        public String toString() {
+            return (extension.getNamespace() == null ? "" : "{" + extension.getNamespace() + "}") + extension.getName()
+                    + (!extension.getAttributes().isEmpty() ? " " + extension.getAttributes() : "")
+                    + (extension.getChildren().isEmpty() ? ": " + extension.getValue() : "");
+        }
+    }
+}

Propchange: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/ExtensionsPanel.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/ObjectPanel.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/ObjectPanel.java?rev=1005006&view=auto
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/ObjectPanel.java (added)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/ObjectPanel.java Wed Oct  6 12:32:23 2010
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.chemistry.opencmis.workbench.details;
+
+import java.awt.Cursor;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.lang.reflect.Method;
+
+import javax.swing.JButton;
+import javax.swing.JList;
+import javax.swing.JTextField;
+
+import org.apache.chemistry.opencmis.client.api.CmisObject;
+import org.apache.chemistry.opencmis.client.api.Session;
+import org.apache.chemistry.opencmis.client.bindings.spi.atompub.AbstractAtomPubService;
+import org.apache.chemistry.opencmis.client.bindings.spi.atompub.AtomPubParser;
+import org.apache.chemistry.opencmis.client.bindings.spi.atompub.ObjectServiceImpl;
+import org.apache.chemistry.opencmis.workbench.ClientHelper;
+import org.apache.chemistry.opencmis.workbench.model.ClientModel;
+import org.apache.chemistry.opencmis.workbench.model.ClientModelEvent;
+import org.apache.chemistry.opencmis.workbench.model.ObjectListener;
+import org.apache.chemistry.opencmis.workbench.swing.InfoPanel;
+
+public class ObjectPanel extends InfoPanel implements ObjectListener {
+
+    private static final long serialVersionUID = 1L;
+
+    private ClientModel model;
+
+    private JTextField nameField;
+    private JTextField idField;
+    private JTextField typeField;
+    private JTextField basetypeField;
+    // private JTextField contentUrlField;
+    private JList allowableActionsList;
+    private JButton refreshButton;
+
+    public ObjectPanel(ClientModel model) {
+        super();
+
+        this.model = model;
+        model.addObjectListener(this);
+
+        createGUI();
+    }
+
+    public void objectLoaded(ClientModelEvent event) {
+        CmisObject object = model.getCurrentObject();
+
+        if (object == null) {
+            nameField.setText("");
+            idField.setText("");
+            typeField.setText("");
+            basetypeField.setText("");
+            // contentUrlField.setText("");
+            allowableActionsList.removeAll();
+            refreshButton.setEnabled(false);
+        } else {
+            try {
+                nameField.setText(object.getName());
+                idField.setText(object.getId());
+                typeField.setText(object.getType().getId());
+                basetypeField.setText(object.getBaseTypeId().toString());
+                // String docUrl = getDocumentURL(object,
+                // model.getClientSession().getSession());
+                // contentUrlField.setText(docUrl == null ? "" : docUrl);
+                if (object.getAllowableActions() != null) {
+                    allowableActionsList.setListData(object.getAllowableActions().getAllowableActions().toArray());
+                } else {
+                    allowableActionsList.setListData(new String[] { "(missing)" });
+                }
+                refreshButton.setEnabled(true);
+            } catch (Exception e) {
+                ClientHelper.showError(this, e);
+            }
+        }
+    }
+
+    private void createGUI() {
+        setupGUI();
+
+        nameField = addLine("Name:", true);
+        idField = addLine("Id:");
+        typeField = addLine("Type:");
+        basetypeField = addLine("Base Type:");
+        // contentUrlField = addLine("Content URL:");
+        allowableActionsList = addComponent("Allowable Actions:", new JList());
+        refreshButton = addComponent("", new JButton("Refresh"));
+        refreshButton.setEnabled(false);
+
+        refreshButton.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                try {
+                    setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+                    model.reloadObject();
+                } catch (Exception ex) {
+                    ClientHelper.showError(null, ex);
+                } finally {
+                    setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
+                }
+            }
+        });
+    }
+
+    public String getDocumentURL(final CmisObject document, final Session session) {
+        String link = null;
+
+        if (!(session.getBinding().getObjectService() instanceof ObjectServiceImpl)) {
+            return null;
+        }
+
+        try {
+            Method loadLink = AbstractAtomPubService.class.getDeclaredMethod("loadLink", new Class[] { String.class,
+                    String.class, String.class, String.class });
+            loadLink.setAccessible(true);
+            link = (String) loadLink.invoke(session.getBinding().getObjectService(), session.getRepositoryInfo()
+                    .getId(), document.getId(), AtomPubParser.LINK_REL_CONTENT, null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return link;
+    }
+}

Propchange: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/ObjectPanel.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/PolicyTable.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/PolicyTable.java?rev=1005006&view=auto
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/PolicyTable.java (added)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/PolicyTable.java Wed Oct  6 12:32:23 2010
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.chemistry.opencmis.workbench.details;
+
+import org.apache.chemistry.opencmis.client.api.Policy;
+import org.apache.chemistry.opencmis.workbench.model.ClientModel;
+
+public class PolicyTable extends AbstractDetailsTable {
+
+	private static final long serialVersionUID = 1L;
+
+	private static final String[] COLUMN_NAMES = { "Name", "Id" };
+	private static final int[] COLUMN_WIDTHS = { 200, 400 };
+
+	public PolicyTable(ClientModel model) {
+		super();
+		init(model, COLUMN_NAMES, COLUMN_WIDTHS);
+	}
+
+	public int getDetailRowCount() {
+		if (getObject().getPolicies() == null) {
+			return 0;
+		}
+
+		return getObject().getPolicies().size();
+	}
+
+	public Object getDetailValueAt(int rowIndex, int columnIndex) {
+		Policy policy = getObject().getPolicies().get(rowIndex);
+
+		switch (columnIndex) {
+		case 0:
+			return policy.getName();
+		case 1:
+			return policy.getId();
+		}
+
+		return null;
+	}
+}

Propchange: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/PolicyTable.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/PropertyTable.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/PropertyTable.java?rev=1005006&view=auto
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/PropertyTable.java (added)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/PropertyTable.java Wed Oct  6 12:32:23 2010
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.chemistry.opencmis.workbench.details;
+
+import java.util.Collection;
+
+import org.apache.chemistry.opencmis.client.api.Property;
+import org.apache.chemistry.opencmis.workbench.model.ClientModel;
+
+public class PropertyTable extends AbstractDetailsTable {
+
+    private static final long serialVersionUID = 1L;
+
+    private static final String[] COLUMN_NAMES = { "Name", "Id", "Type", "Value" };
+    private static final int[] COLUMN_WIDTHS = { 200, 200, 80, 300 };
+
+    public PropertyTable(ClientModel model) {
+        super();
+        init(model, COLUMN_NAMES, COLUMN_WIDTHS);
+    }
+
+    public int getDetailRowCount() {
+        return getObject().getProperties().size();
+    }
+
+    public Object getDetailValueAt(int rowIndex, int columnIndex) {
+        Property<?> property = getObject().getProperties().get(rowIndex);
+
+        switch (columnIndex) {
+        case 0:
+            return property.getDefinition().getDisplayName();
+        case 1:
+            return property.getId();
+        case 2:
+            return property.getDefinition().getPropertyType().value();
+        case 3:
+            return property.getValues();
+        }
+
+        return null;
+    }
+
+    @Override
+    public Class<?> getDetailColumClass(int columnIndex) {
+        if (columnIndex == 3) {
+            return Collection.class;
+        }
+
+        return super.getDetailColumClass(columnIndex);
+    }
+}

Propchange: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/PropertyTable.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/RelationshipTable.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/RelationshipTable.java?rev=1005006&view=auto
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/RelationshipTable.java (added)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/RelationshipTable.java Wed Oct  6 12:32:23 2010
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.chemistry.opencmis.workbench.details;
+
+import org.apache.chemistry.opencmis.client.api.Relationship;
+import org.apache.chemistry.opencmis.workbench.model.ClientModel;
+
+public class RelationshipTable extends AbstractDetailsTable {
+
+	private static final long serialVersionUID = 1L;
+
+	private static final String[] COLUMN_NAMES = { "Name", "Type", "Source",
+			"Target" };
+	private static final int[] COLUMN_WIDTHS = { 200, 200, 200, 200 };
+
+	public RelationshipTable(ClientModel model) {
+		super();
+		init(model, COLUMN_NAMES, COLUMN_WIDTHS);
+	}
+
+	@Override
+	public int getDetailRowCount() {
+		if (getObject().getRelationships() == null) {
+			return 0;
+		}
+
+		return getObject().getRelationships().size();
+	}
+
+	@Override
+	public Object getDetailValueAt(int rowIndex, int columnIndex) {
+		Relationship relationship = getObject().getRelationships()
+				.get(rowIndex);
+
+		switch (columnIndex) {
+		case 0:
+			return relationship.getName();
+		case 1:
+			return relationship.getType().getId();
+		case 2:
+			return relationship.getSourceId();
+		case 3:
+			return relationship.getTargetId();
+		}
+
+		return null;
+	}
+}

Propchange: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/RelationshipTable.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/RenditionTable.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/RenditionTable.java?rev=1005006&view=auto
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/RenditionTable.java (added)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/RenditionTable.java Wed Oct  6 12:32:23 2010
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.chemistry.opencmis.workbench.details;
+
+import java.awt.event.MouseEvent;
+
+import org.apache.chemistry.opencmis.client.api.Document;
+import org.apache.chemistry.opencmis.client.api.Rendition;
+import org.apache.chemistry.opencmis.workbench.ClientHelper;
+import org.apache.chemistry.opencmis.workbench.model.ClientModel;
+
+public class RenditionTable extends AbstractDetailsTable {
+
+    private static final long serialVersionUID = 1L;
+
+    private static final String[] COLUMN_NAMES = { "Title", "Kind", "MIME Type", "Size", "Stream Id" };
+    private static final int[] COLUMN_WIDTHS = { 200, 200, 80, 80, 200 };
+
+    public RenditionTable(ClientModel model) {
+        super();
+        init(model, COLUMN_NAMES, COLUMN_WIDTHS);
+    }
+
+    @Override
+    public void doubleClickAction(MouseEvent e, int rowIndex) {
+        String streamId = getObject().getRenditions().get(rowIndex).getStreamId();
+        ClientHelper.download(this, (Document) getObject(), streamId);
+    }
+
+    @Override
+    public int getDetailRowCount() {
+        if (getObject().getRenditions() == null) {
+            return 0;
+        }
+
+        return getObject().getRenditions().size();
+    }
+
+    @Override
+    public Object getDetailValueAt(int rowIndex, int columnIndex) {
+        Rendition rendition = getObject().getRenditions().get(rowIndex);
+
+        switch (columnIndex) {
+        case 0:
+            return rendition.getTitle();
+        case 1:
+            return rendition.getKind();
+        case 2:
+            return rendition.getMimeType();
+        case 3:
+            return rendition.getLength();
+        case 4:
+            return rendition.getStreamId();
+        }
+
+        return null;
+    }
+}

Propchange: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/RenditionTable.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/VersionTable.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/VersionTable.java?rev=1005006&view=auto
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/VersionTable.java (added)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/VersionTable.java Wed Oct  6 12:32:23 2010
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.chemistry.opencmis.workbench.details;
+
+import java.awt.Cursor;
+import java.awt.event.MouseEvent;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.chemistry.opencmis.client.api.Document;
+import org.apache.chemistry.opencmis.commons.exceptions.CmisNotSupportedException;
+import org.apache.chemistry.opencmis.workbench.ClientHelper;
+import org.apache.chemistry.opencmis.workbench.model.ClientModel;
+
+public class VersionTable extends AbstractDetailsTable {
+
+    private static final long serialVersionUID = 1L;
+
+    private static final String[] COLUMN_NAMES = { "Name", "Label", "Major", "Id" };
+    private static final int[] COLUMN_WIDTHS = { 200, 200, 80, 400 };
+
+    private static final int OLD = 60 * 1000;
+
+    private List<Document> versions;
+    private String lastId;
+    private long lastTimestamp;
+
+    public VersionTable(ClientModel model) {
+        super();
+
+        versions = Collections.emptyList();
+        lastId = null;
+        lastTimestamp = System.currentTimeMillis();
+        init(model, COLUMN_NAMES, COLUMN_WIDTHS);
+    }
+
+    @Override
+    public void doubleClickAction(MouseEvent e, int rowIndex) {
+        if (e.isShiftDown()) {
+            ClientHelper.download(this.getParent(), getVersions().get(rowIndex), null);
+        } else {
+            ClientHelper.open(this.getParent(), getVersions().get(rowIndex), null);
+        }
+
+    }
+
+    @Override
+    public int getDetailRowCount() {
+        if (!(getObject() instanceof Document)) {
+            return 0;
+        }
+
+        return getVersions().size();
+    }
+
+    @Override
+    public Object getDetailValueAt(int rowIndex, int columnIndex) {
+        Document version = getVersions().get(rowIndex);
+
+        switch (columnIndex) {
+        case 0:
+            return version.getName();
+        case 1:
+            return version.getVersionLabel();
+        case 2:
+            return version.isMajorVersion();
+        case 3:
+            return version.getId();
+        }
+
+        return null;
+    }
+
+    private List<Document> getVersions() {
+        // not a document -> no versions
+        if (!(getObject() instanceof Document)) {
+            versions = Collections.emptyList();
+            lastId = null;
+
+            return versions;
+        }
+
+        // if the versions have been fetched recently, don't reload
+        Document doc = (Document) getObject();
+        if (doc.getId().equals(lastId)) {
+            if (lastTimestamp + OLD > System.currentTimeMillis()) {
+                return versions;
+            }
+        }
+
+        // reset everything
+        lastId = doc.getId();
+        lastTimestamp = System.currentTimeMillis();
+        versions = Collections.emptyList();
+
+        // get versions
+        try {
+            setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+            versions = doc.getAllVersions();
+        } catch (Exception ex) {
+            if (!(ex instanceof CmisNotSupportedException)) {
+                ClientHelper.showError(null, ex);
+            }
+        } finally {
+            setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
+        }
+
+        return versions;
+    }
+}

Propchange: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/VersionTable.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/model/ClientModel.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/model/ClientModel.java?rev=1005006&view=auto
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/model/ClientModel.java (added)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/model/ClientModel.java Wed Oct  6 12:32:23 2010
@@ -0,0 +1,314 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.chemistry.opencmis.workbench.model;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.swing.event.EventListenerList;
+
+import org.apache.chemistry.opencmis.client.api.CmisObject;
+import org.apache.chemistry.opencmis.client.api.Folder;
+import org.apache.chemistry.opencmis.client.api.ItemIterable;
+import org.apache.chemistry.opencmis.client.api.ObjectType;
+import org.apache.chemistry.opencmis.client.api.OperationContext;
+import org.apache.chemistry.opencmis.client.api.QueryResult;
+import org.apache.chemistry.opencmis.client.api.Session;
+import org.apache.chemistry.opencmis.client.api.Tree;
+import org.apache.chemistry.opencmis.client.runtime.OperationContextImpl;
+import org.apache.chemistry.opencmis.commons.PropertyIds;
+import org.apache.chemistry.opencmis.commons.data.ContentStream;
+import org.apache.chemistry.opencmis.commons.data.RepositoryCapabilities;
+import org.apache.chemistry.opencmis.commons.data.RepositoryInfo;
+import org.apache.chemistry.opencmis.commons.enums.CapabilityQuery;
+import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships;
+import org.apache.chemistry.opencmis.commons.enums.VersioningState;
+
+public class ClientModel {
+
+    // object details must not be older than 60 seconds
+    private static final long OLD = 60 * 1000;
+
+    private ClientSession clientSession;
+
+    private Folder currentFolder = null;
+    private List<CmisObject> currentChildren = Collections.emptyList();
+    private CmisObject currentObject = null;
+
+    private EventListenerList listenerList = new EventListenerList();
+
+    public ClientModel() {
+    }
+
+    public void addFolderListener(FolderListener listener) {
+        listenerList.add(FolderListener.class, listener);
+    }
+
+    public void removeFolderListener(FolderListener listener) {
+        listenerList.remove(FolderListener.class, listener);
+    }
+
+    public void addObjectListener(ObjectListener listener) {
+        listenerList.add(ObjectListener.class, listener);
+    }
+
+    public void removeObjectListener(ObjectListener listener) {
+        listenerList.remove(ObjectListener.class, listener);
+    }
+
+    public synchronized void setClientSession(ClientSession clientSession) {
+        this.clientSession = clientSession;
+    }
+
+    public synchronized ClientSession getClientSession() {
+        return clientSession;
+    }
+
+    public synchronized RepositoryInfo getRepositoryInfo() throws Exception {
+        Session session = clientSession.getSession();
+        return session.getRepositoryInfo();
+    }
+
+    public synchronized String getRepositoryName() {
+        try {
+            return getRepositoryInfo().getName();
+        } catch (Exception e) {
+            return "?";
+        }
+    }
+
+    public synchronized boolean supportsQuery() {
+        try {
+            RepositoryCapabilities cap = getRepositoryInfo().getCapabilities();
+            if (cap == null) {
+                return true;
+            }
+
+            return (cap.getQueryCapability() != null) && (cap.getQueryCapability() != CapabilityQuery.NONE);
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+    public synchronized boolean supportsChangeLog() {
+        try {
+            return (getRepositoryInfo().getChangesOnType() != null)
+                    && (!getRepositoryInfo().getChangesOnType().isEmpty());
+        } catch (Exception e) {
+            return false;
+        }
+
+    }
+
+    public synchronized void loadFolder(String folderId, boolean byPath) throws Exception {
+        try {
+            Session session = clientSession.getSession();
+            CmisObject folderObject = null;
+
+            if (byPath) {
+                folderObject = session.getObjectByPath(folderId);
+            } else {
+                folderObject = session.getObject(session.createObjectId(folderId));
+            }
+
+            if (!(folderObject instanceof Folder)) {
+                throw new Exception("Not a folder!");
+            }
+
+            List<CmisObject> children = new ArrayList<CmisObject>();
+            ItemIterable<CmisObject> iter = ((Folder) folderObject).getChildren(clientSession
+                    .getFolderOperationContext());
+            for (CmisObject child : iter) {
+                children.add(child);
+            }
+
+            setCurrentFolder((Folder) folderObject, children);
+        } catch (Exception ex) {
+            setCurrentFolder(null, new ArrayList<CmisObject>(0));
+            throw ex;
+        }
+    }
+
+    public synchronized void reloadFolder() throws Exception {
+        loadFolder(currentFolder.getId(), false);
+    }
+
+    public synchronized void loadObject(String objectId) throws Exception {
+        try {
+            Session session = clientSession.getSession();
+            CmisObject object = session.getObject(session.createObjectId(objectId),
+                    clientSession.getObjectOperationContext());
+            object.refreshIfOld(OLD);
+
+            setCurrentObject(object);
+        } catch (Exception ex) {
+            setCurrentObject(null);
+            throw ex;
+        }
+    }
+
+    public synchronized void reloadObject() throws Exception {
+        if (currentObject == null) {
+            return;
+        }
+
+        try {
+            Session session = clientSession.getSession();
+            CmisObject object = session.getObject(currentObject, clientSession.getObjectOperationContext());
+            object.refresh();
+
+            setCurrentObject(object);
+        } catch (Exception ex) {
+            setCurrentObject(null);
+            throw ex;
+        }
+    }
+
+    public synchronized ItemIterable<QueryResult> query(String q, boolean searchAllVersions, int maxHits)
+            throws Exception {
+        OperationContext queryContext = new OperationContextImpl(null, false, false, false, IncludeRelationships.NONE,
+                null, false, null, false, maxHits);
+
+        Session session = clientSession.getSession();
+        return session.query(q, searchAllVersions, queryContext);
+    }
+
+    public synchronized List<Tree<ObjectType>> getTypeDescendants() throws Exception {
+        Session session = clientSession.getSession();
+        return session.getTypeDescendants(null, -1, true);
+    }
+
+    public ContentStream createContentStream(String filename) throws Exception {
+        ContentStream content = null;
+        if ((filename != null) && (filename.length() > 0)) {
+            File file = new File(filename);
+            InputStream stream = new FileInputStream(file);
+
+            content = clientSession.getSession().getObjectFactory()
+                    .createContentStream(file.getName(), file.length(), MIMETypes.getMIMEType(file), stream);
+        }
+
+        return content;
+    }
+
+    public synchronized void createDocument(String name, String type, String filename, VersioningState versioningState)
+            throws Exception {
+        Map<String, Object> properties = new HashMap<String, Object>();
+        properties.put(PropertyIds.NAME, name);
+        properties.put(PropertyIds.OBJECT_TYPE_ID, type);
+
+        ContentStream content = createContentStream(filename);
+        clientSession.getSession()
+                .createDocument(properties, currentFolder, content, versioningState, null, null, null);
+    }
+
+    public synchronized void createFolder(String name, String type) throws Exception {
+        Map<String, Object> properties = new HashMap<String, Object>();
+        properties.put(PropertyIds.NAME, name);
+        properties.put(PropertyIds.OBJECT_TYPE_ID, type);
+
+        clientSession.getSession().createFolder(properties, currentFolder, null, null, null);
+    }
+
+    public synchronized List<ObjectType> getCreateableTypes(String rootTypeId) {
+        List<ObjectType> result = new ArrayList<ObjectType>();
+
+        List<Tree<ObjectType>> types = clientSession.getSession().getTypeDescendants(rootTypeId, -1, false);
+        addType(types, result);
+
+        ObjectType rootType = clientSession.getSession().getTypeDefinition(rootTypeId);
+        boolean isCreatable = (rootType.isCreatable() == null ? true : rootType.isCreatable().booleanValue());
+        if (isCreatable) {
+            result.add(rootType);
+        }
+
+        Collections.sort(result, new Comparator<ObjectType>() {
+            public int compare(ObjectType ot1, ObjectType ot2) {
+                return ot1.getDisplayName().compareTo(ot2.getDisplayName());
+            }
+        });
+
+        return result;
+    }
+
+    private void addType(List<Tree<ObjectType>> types, List<ObjectType> resultList) {
+        for (Tree<ObjectType> tt : types) {
+            if (tt.getItem() != null) {
+                boolean isCreatable = (tt.getItem().isCreatable() == null ? true : tt.getItem().isCreatable()
+                        .booleanValue());
+
+                if (isCreatable) {
+                    resultList.add(tt.getItem());
+                }
+
+                addType(tt.getChildren(), resultList);
+            }
+        }
+    }
+
+    public synchronized Folder getCurrentFolder() {
+        return currentFolder;
+    }
+
+    public synchronized List<CmisObject> getCurrentChildren() {
+        return currentChildren;
+    }
+
+    public synchronized CmisObject getFromCurrentChildren(String id) {
+        if ((currentChildren == null) || (currentChildren.isEmpty())) {
+            return null;
+        }
+
+        for (CmisObject o : currentChildren) {
+            if (o.getId().equals(id)) {
+                return o;
+            }
+        }
+
+        return null;
+    }
+
+    private synchronized void setCurrentFolder(Folder folder, List<CmisObject> children) {
+        currentFolder = folder;
+        currentChildren = children;
+
+        for (FolderListener fl : listenerList.getListeners(FolderListener.class)) {
+            fl.folderLoaded(new ClientModelEvent(this));
+        }
+    }
+
+    public synchronized CmisObject getCurrentObject() {
+        return currentObject;
+    }
+
+    private synchronized void setCurrentObject(CmisObject object) {
+        currentObject = object;
+
+        for (ObjectListener ol : listenerList.getListeners(ObjectListener.class)) {
+            ol.objectLoaded(new ClientModelEvent(this));
+        }
+    }
+}

Propchange: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/model/ClientModel.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/model/ClientModelEvent.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/model/ClientModelEvent.java?rev=1005006&view=auto
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/model/ClientModelEvent.java (added)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/model/ClientModelEvent.java Wed Oct  6 12:32:23 2010
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.chemistry.opencmis.workbench.model;
+
+import java.util.EventObject;
+
+public class ClientModelEvent extends EventObject {
+
+	private static final long serialVersionUID = 1L;
+
+	public ClientModelEvent(Object source) {
+		super(source);
+	}
+
+	public ClientModel getClientModel() {
+		if (getSource() instanceof ClientModel) {
+			return (ClientModel) getSource();
+		}
+
+		return null;
+	}
+}

Propchange: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/model/ClientModelEvent.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/model/ClientOperationContext.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/model/ClientOperationContext.java?rev=1005006&view=auto
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/model/ClientOperationContext.java (added)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/model/ClientOperationContext.java Wed Oct  6 12:32:23 2010
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.chemistry.opencmis.workbench.model;
+
+import java.util.Map;
+
+import org.apache.chemistry.opencmis.client.runtime.OperationContextImpl;
+import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships;
+
+public class ClientOperationContext extends OperationContextImpl {
+
+    private static final long serialVersionUID = 1L;
+
+    public static final String FILTER = "filter";
+    public static final String INCLUDE_ACLS = "includeAcls";
+    public static final String INCLUDE_ALLOWABLE_ACTIONS = "includeAllowableActions";
+    public static final String INCLUDE_POLICIES = "includePolicies";
+    public static final String INCLUDE_RELATIONSHIPS = "includeRelationships";
+    public static final String RENDITION_FILTER = "renditionFilter";
+    public static final String ORDER_BY = "orderBy";
+    public static final String MAX_ITEMS_PER_PAGE = "maxItemsPerPage";
+
+    public ClientOperationContext(String prefix, Map<String, String> map) {
+        loadContext(prefix, map);
+        setIncludePathSegments(false);
+        setCacheEnabled(true);
+    }
+
+    public void loadContext(String prefix, Map<String, String> map) {
+        setFilterString(map.get(prefix + FILTER));
+        setIncludeAcls(parseBoolean(map.get(prefix + INCLUDE_ACLS), false));
+        setIncludeAllowableActions(parseBoolean(map.get(prefix + INCLUDE_ALLOWABLE_ACTIONS), false));
+        setIncludePolicies(parseBoolean(map.get(prefix + INCLUDE_POLICIES), false));
+        setIncludeRelationships(parseIncludeRelationships(map.get(prefix + INCLUDE_RELATIONSHIPS),
+                IncludeRelationships.NONE));
+        setRenditionFilterString(map.get(prefix + RENDITION_FILTER));
+        setOrderBy(map.get(prefix + ORDER_BY));
+        setMaxItemsPerPage(parseInteger(map.get(prefix + MAX_ITEMS_PER_PAGE), 1000));
+    }
+
+    private boolean parseBoolean(String s, boolean defaultValue) {
+        return (s == null ? defaultValue : Boolean.parseBoolean(s));
+    }
+
+    private IncludeRelationships parseIncludeRelationships(String s, IncludeRelationships defaultValue) {
+        if (s == null) {
+            return defaultValue;
+        }
+
+        try {
+            return IncludeRelationships.fromValue(s);
+        } catch (Exception e) {
+            return defaultValue;
+        }
+    }
+
+    private int parseInteger(String s, int defaultValue) {
+        if (s == null) {
+            return defaultValue;
+        }
+
+        try {
+            return Integer.parseInt(s);
+        } catch (NumberFormatException e) {
+            return defaultValue;
+        }
+    }
+}

Propchange: incubator/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/model/ClientOperationContext.java
------------------------------------------------------------------------------
    svn:eol-style = native