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 2011/11/19 18:30:17 UTC
svn commit: r1204025 - in
/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench:
./ details/ model/ swing/
Author: fmui
Date: Sat Nov 19 17:30:17 2011
New Revision: 1204025
URL: http://svn.apache.org/viewvc?rev=1204025&view=rev
Log:
Workbench: added option to generate and verify content to the Create Document dialog
Added:
chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/RandomInputStream.java
Modified:
chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/CreateDocumentDialog.java
chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/VersionTable.java
chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/model/ClientModel.java
chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/model/ClientSession.java
chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/swing/IdRenderer.java
Modified: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/CreateDocumentDialog.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/CreateDocumentDialog.java?rev=1204025&r1=1204024&r2=1204025&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/CreateDocumentDialog.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/CreateDocumentDialog.java Sat Nov 19 17:30:17 2011
@@ -19,23 +19,38 @@
package org.apache.chemistry.opencmis.workbench;
import java.awt.BorderLayout;
+import java.awt.Dimension;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
+import java.io.BufferedInputStream;
import java.io.File;
+import java.io.InputStream;
+import java.text.NumberFormat;
+import javax.swing.Box;
+import javax.swing.BoxLayout;
import javax.swing.JButton;
+import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
+import javax.swing.JFormattedTextField;
+import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import org.apache.chemistry.opencmis.client.api.Document;
+import org.apache.chemistry.opencmis.client.api.ObjectId;
+import org.apache.chemistry.opencmis.commons.data.ContentStream;
import org.apache.chemistry.opencmis.commons.definitions.DocumentTypeDefinition;
import org.apache.chemistry.opencmis.commons.enums.BaseTypeId;
import org.apache.chemistry.opencmis.commons.enums.VersioningState;
import org.apache.chemistry.opencmis.workbench.model.ClientModel;
+import org.apache.chemistry.opencmis.workbench.model.ClientSession;
import org.apache.chemistry.opencmis.workbench.swing.CreateDialog;
public class CreateDocumentDialog extends CreateDialog {
@@ -45,7 +60,10 @@ public class CreateDocumentDialog extend
private JTextField nameField;
private JComboBox typeBox;
private JTextField filenameField;
+ private JFormattedTextField generateContentSizeField;
+ private JComboBox generateContentUnitField;
private JComboBox versioningStateBox;
+ private JCheckBox verifyAfterUploadButton;
public CreateDocumentDialog(Frame owner, ClientModel model) {
this(owner, model, null);
@@ -81,6 +99,32 @@ public class CreateDocumentDialog extend
JPanel filePanel = new JPanel(new BorderLayout());
filenameField = new JTextField(30);
+ filenameField.getDocument().addDocumentListener(new DocumentListener() {
+ @Override
+ public void removeUpdate(DocumentEvent e) {
+ adjustGenerateContentComponents();
+ }
+
+ @Override
+ public void insertUpdate(DocumentEvent e) {
+ adjustGenerateContentComponents();
+ }
+
+ @Override
+ public void changedUpdate(DocumentEvent e) {
+ }
+
+ private void adjustGenerateContentComponents() {
+ if (filenameField.getText().length() == 0) {
+ generateContentSizeField.setEnabled(true);
+ generateContentUnitField.setEnabled(true);
+ } else {
+ generateContentSizeField.setEnabled(false);
+ generateContentUnitField.setEnabled(false);
+ }
+ }
+ });
+
filePanel.add(filenameField, BorderLayout.CENTER);
JButton browseButton = new JButton("Browse");
@@ -99,6 +143,25 @@ public class CreateDocumentDialog extend
createRow("File:", filePanel, 2);
+ JPanel generateContentPanel = new JPanel();
+ generateContentPanel.setLayout(new BoxLayout(generateContentPanel, BoxLayout.X_AXIS));
+
+ generateContentSizeField = new JFormattedTextField(NumberFormat.getIntegerInstance());
+ generateContentSizeField.setValue(0L);
+ generateContentSizeField.setColumns(8);
+ generateContentSizeField.setHorizontalAlignment(JTextField.RIGHT);
+ generateContentSizeField.setMaximumSize(generateContentSizeField.getPreferredSize());
+ generateContentPanel.add(generateContentSizeField);
+
+ generateContentUnitField = new JComboBox(new String[] { "Bytes", "KiB", "MiB", "GiB" });
+ generateContentUnitField.setMaximumSize(new Dimension((int) generateContentUnitField.getPreferredSize()
+ .getWidth() + 200, (int) generateContentUnitField.getPreferredSize().getHeight()));
+ generateContentPanel.add(generateContentUnitField);
+
+ generateContentPanel.add(Box.createHorizontalGlue());
+
+ createRow("Generate content:", generateContentPanel, 3);
+
versioningStateBox = new JComboBox(new Object[] { VersioningState.NONE, VersioningState.MAJOR,
VersioningState.MINOR, VersioningState.CHECKEDOUT });
if (((DocumentTypeDefinition) ((ObjectTypeItem) typeBox.getSelectedItem()).getObjectType()).isVersionable()) {
@@ -106,7 +169,10 @@ public class CreateDocumentDialog extend
} else {
versioningStateBox.setSelectedItem(VersioningState.NONE);
}
- createRow("Versioning State:", versioningStateBox, 3);
+ createRow("Versioning State:", versioningStateBox, 4);
+
+ verifyAfterUploadButton = new JCheckBox("Verify content after upload");
+ createRow("", verifyAfterUploadButton, 5);
JButton createButton = new JButton("Create Document");
createButton.addActionListener(new ActionListener() {
@@ -116,25 +182,57 @@ public class CreateDocumentDialog extend
String filename = filenameField.getText();
try {
- getClientModel().createDocument(name, type, filename,
- (VersioningState) versioningStateBox.getSelectedItem());
- getClientModel().reloadFolder();
+ if (filename.length() > 0) {
+ // create a document from a file
+ ObjectId objectId = getClientModel().createDocument(name, type, filename,
+ (VersioningState) versioningStateBox.getSelectedItem());
+
+ if (verifyAfterUploadButton.isSelected()) {
+ ContentStream contentStream = getClientModel().createContentStream(filename);
+ verifyContentStreams(contentStream, objectId);
+ }
+ } else {
+ // create a document with random data
+ long seed = System.currentTimeMillis();
+ long length = ((Number) generateContentSizeField.getValue()).longValue();
+ if (length < 0) {
+ length = 0;
+ } else {
+ for (int i = 0; i < generateContentUnitField.getSelectedIndex(); i++) {
+ length = length * 1024;
+ }
+ }
+
+ ObjectId objectId = getClientModel().createDocument(name, type, length, seed,
+ (VersioningState) versioningStateBox.getSelectedItem());
+
+ if (verifyAfterUploadButton.isSelected()) {
+ ContentStream contentStream = getClientModel().createContentStream("", length, seed);
+ verifyContentStreams(contentStream, objectId);
+ }
+ }
thisDialog.setVisible(false);
thisDialog.dispose();
} catch (Exception e) {
ClientHelper.showError(null, e);
+ } finally {
+ try {
+ getClientModel().reloadFolder();
+ } catch (Exception e) {
+ ClientHelper.showError(null, e);
+ }
}
}
});
- createRow("", createButton, 4);
+ createRow("", createButton, 6);
if (file != null) {
setFile(file);
}
getRootPane().setDefaultButton(createButton);
-
+
showDialog();
}
@@ -144,4 +242,76 @@ public class CreateDocumentDialog extend
nameField.setText(file.getName());
}
}
+
+ private void verifyContentStreams(ContentStream sourceContentStream, ObjectId objectId) {
+ // download content from repository
+ ClientSession clientSession = getClientModel().getClientSession();
+ Document doc = (Document) clientSession.getSession().getObject(objectId,
+ clientSession.getObjectOperationContext());
+ ContentStream docContentStream = doc.getContentStream();
+
+ // compare
+ if (docContentStream == null) {
+ if (sourceContentStream.getLength() == 0) {
+ JOptionPane.showMessageDialog(getOwner(), "Source file and document content are both empty.",
+ "Verification successful", JOptionPane.INFORMATION_MESSAGE);
+ } else {
+ JOptionPane.showMessageDialog(getOwner(), "Document has no conent but the source file is not empty!",
+ "Verification failed", JOptionPane.ERROR_MESSAGE);
+ }
+ return;
+ }
+
+ InputStream sourceContent = null;
+ InputStream docContent = null;
+ try {
+ sourceContent = new BufferedInputStream(sourceContentStream.getStream());
+ docContent = new BufferedInputStream(docContentStream.getStream());
+
+ int fb = 0;
+ int db = 0;
+ long pos = 0;
+ while (fb > -1 && db > -1) {
+ fb = sourceContent.read();
+ db = docContent.read();
+
+ if (fb != db) {
+ if (fb == -1) {
+ JOptionPane.showMessageDialog(getOwner(),
+ "The document content is bigger than the source file!", "Verification failed",
+ JOptionPane.ERROR_MESSAGE);
+ } else if (db == -1) {
+ JOptionPane.showMessageDialog(getOwner(),
+ "The source file is bigger than the document content!", "Verification failed",
+ JOptionPane.ERROR_MESSAGE);
+ } else {
+ JOptionPane.showMessageDialog(getOwner(), "Contents differ at byte " + pos + "!",
+ "Verification failed", JOptionPane.ERROR_MESSAGE);
+ }
+
+ return;
+ }
+
+ pos++;
+ }
+
+ JOptionPane.showMessageDialog(getOwner(), "Source file and document content are identical.",
+ "Verification successful", JOptionPane.INFORMATION_MESSAGE);
+ } catch (Exception e) {
+ JOptionPane.showMessageDialog(getOwner(), "Content test exception: " + e.getMessage(),
+ "Verification failed", JOptionPane.ERROR_MESSAGE);
+ } finally {
+ try {
+ sourceContent.close();
+ } catch (Exception e) {
+ }
+ try {
+ while (docContent.read() > -1) {
+ }
+
+ docContent.close();
+ } catch (Exception e) {
+ }
+ }
+ }
}
Added: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/RandomInputStream.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/RandomInputStream.java?rev=1204025&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/RandomInputStream.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/RandomInputStream.java Sat Nov 19 17:30:17 2011
@@ -0,0 +1,95 @@
+/*
+ * 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;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Random;
+
+public class RandomInputStream extends InputStream {
+
+ private final Random random;
+ private final long length;
+ private long pos;
+
+ public RandomInputStream(long length) {
+ this(length, System.currentTimeMillis());
+ }
+
+ public RandomInputStream(long length, long seed) {
+ random = new Random(seed);
+ this.length = length;
+ pos = 0;
+ }
+
+ @Override
+ public int available() throws IOException {
+ return (int) Math.min(Integer.MAX_VALUE, length - pos);
+ }
+
+ @Override
+ public long skip(long n) throws IOException {
+ if (n <= 0) {
+ return 0;
+ }
+
+ for (long l = 0; l < n; l++) {
+ if (read() == -1) {
+ return l;
+ }
+ }
+
+ return n;
+ }
+
+ @Override
+ public int read() throws IOException {
+ if (pos == length) {
+ return -1;
+ }
+
+ pos++;
+
+ return random.nextInt(256);
+ }
+
+ @Override
+ public int read(byte[] b) throws IOException {
+ return read(b, 0, b.length);
+ }
+
+ @Override
+ public int read(byte[] b, int off, int len) throws IOException {
+ if (b == null) {
+ throw new NullPointerException();
+ } else if ((off < 0) || (len < 0) || (len > b.length - off)) {
+ throw new IndexOutOfBoundsException();
+ }
+
+ for (int i = 0; i < len; i++) {
+ int r = read();
+ if (r == -1) {
+ return i;
+ }
+ b[off + i] = (byte) r;
+ }
+
+ return len;
+ }
+}
\ No newline at end of file
Modified: 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/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/VersionTable.java?rev=1204025&r1=1204024&r2=1204025&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/VersionTable.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/VersionTable.java Sat Nov 19 17:30:17 2011
@@ -71,7 +71,7 @@ public class VersionTable extends Abstra
try {
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
List<Document> newVersions = doc.getAllVersions(getClientModel().getClientSession()
- .geVersionOperationContext());
+ .getVersionOperationContext());
lock.writeLock().lock();
try {
Modified: 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/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/model/ClientModel.java?rev=1204025&r1=1204024&r2=1204025&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/model/ClientModel.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/model/ClientModel.java Sat Nov 19 17:30:17 2011
@@ -18,6 +18,7 @@
*/
package org.apache.chemistry.opencmis.workbench.model;
+import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
@@ -34,6 +35,7 @@ import org.apache.chemistry.opencmis.cli
import org.apache.chemistry.opencmis.client.api.FileableCmisObject;
import org.apache.chemistry.opencmis.client.api.Folder;
import org.apache.chemistry.opencmis.client.api.ItemIterable;
+import org.apache.chemistry.opencmis.client.api.ObjectId;
import org.apache.chemistry.opencmis.client.api.ObjectType;
import org.apache.chemistry.opencmis.client.api.OperationContext;
import org.apache.chemistry.opencmis.client.api.QueryResult;
@@ -50,6 +52,7 @@ import org.apache.chemistry.opencmis.com
import org.apache.chemistry.opencmis.commons.enums.VersioningState;
import org.apache.chemistry.opencmis.commons.exceptions.CmisObjectNotFoundException;
import org.apache.chemistry.opencmis.commons.impl.MimeTypes;
+import org.apache.chemistry.opencmis.workbench.RandomInputStream;
public class ClientModel {
@@ -220,7 +223,7 @@ public class ClientModel {
ContentStream content = null;
if ((filename != null) && (filename.length() > 0)) {
File file = new File(filename);
- InputStream stream = new FileInputStream(file);
+ InputStream stream = new BufferedInputStream(new FileInputStream(file));
content = clientSession.getSession().getObjectFactory()
.createContentStream(file.getName(), file.length(), MimeTypes.getMIMEType(file), stream);
@@ -229,23 +232,39 @@ public class ClientModel {
return content;
}
- public synchronized void createDocument(String name, String type, String filename, VersioningState versioningState)
- throws Exception {
+ public synchronized ObjectId 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);
+ return clientSession.getSession().createDocument(properties, currentFolder, content, versioningState, null,
+ null, null);
+ }
+
+ public ContentStream createContentStream(String name, long length, long seed) throws Exception {
+ return clientSession.getSession().getObjectFactory()
+ .createContentStream(name, length, "application/octet-stream", new RandomInputStream(length, seed));
+ }
+
+ public synchronized ObjectId createDocument(String name, String type, long length, long seed,
+ 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(name, length, seed);
+ return clientSession.getSession().createDocument(properties, currentFolder, content, versioningState, null,
+ null, null);
}
- public synchronized void createFolder(String name, String type) throws Exception {
+ public synchronized ObjectId 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);
+ return clientSession.getSession().createFolder(properties, currentFolder, null, null, null);
}
public synchronized List<ObjectType> getCreateableTypes(String rootTypeId) {
Modified: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/model/ClientSession.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/model/ClientSession.java?rev=1204025&r1=1204024&r2=1204025&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/model/ClientSession.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/model/ClientSession.java Sat Nov 19 17:30:17 2011
@@ -199,7 +199,7 @@ public class ClientSession {
return folderOperationContext;
}
- public OperationContext geVersionOperationContext() {
+ public OperationContext getVersionOperationContext() {
return versionOperationContext;
}
Modified: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/swing/IdRenderer.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/swing/IdRenderer.java?rev=1204025&r1=1204024&r2=1204025&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/swing/IdRenderer.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/swing/IdRenderer.java Sat Nov 19 17:30:17 2011
@@ -46,7 +46,7 @@ public class IdRenderer extends DefaultT
String text = "";
if (value instanceof ObjectId) {
if (((ObjectId) value).getId() != null) {
- text = ((ObjectId) value).getId();
+ text = "<html><u>" + ((ObjectId) value).getId() + "</u></html>";
}
}