This project has retired. For details please refer to its Attic page.
CreateDocumentDialog xref

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   * http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.chemistry.opencmis.workbench;
20  
21  import java.awt.BorderLayout;
22  import java.awt.Cursor;
23  import java.awt.Dimension;
24  import java.awt.FlowLayout;
25  import java.awt.Frame;
26  import java.awt.event.ActionEvent;
27  import java.awt.event.ActionListener;
28  import java.awt.event.ItemEvent;
29  import java.awt.event.ItemListener;
30  import java.io.BufferedInputStream;
31  import java.io.File;
32  import java.io.InputStream;
33  import java.text.NumberFormat;
34  
35  import javax.swing.Box;
36  import javax.swing.BoxLayout;
37  import javax.swing.ButtonGroup;
38  import javax.swing.JButton;
39  import javax.swing.JCheckBox;
40  import javax.swing.JComboBox;
41  import javax.swing.JFileChooser;
42  import javax.swing.JFormattedTextField;
43  import javax.swing.JOptionPane;
44  import javax.swing.JPanel;
45  import javax.swing.JRadioButton;
46  import javax.swing.JTextField;
47  import javax.swing.event.DocumentEvent;
48  import javax.swing.event.DocumentListener;
49  
50  import org.apache.chemistry.opencmis.client.api.Document;
51  import org.apache.chemistry.opencmis.client.api.ObjectId;
52  import org.apache.chemistry.opencmis.commons.data.ContentStream;
53  import org.apache.chemistry.opencmis.commons.definitions.DocumentTypeDefinition;
54  import org.apache.chemistry.opencmis.commons.enums.BaseTypeId;
55  import org.apache.chemistry.opencmis.commons.enums.VersioningState;
56  import org.apache.chemistry.opencmis.workbench.model.ClientModel;
57  import org.apache.chemistry.opencmis.workbench.model.ClientSession;
58  import org.apache.chemistry.opencmis.workbench.swing.CreateDialog;
59  
60  public class CreateDocumentDialog extends CreateDialog {
61  
62      private static final long serialVersionUID = 1L;
63  
64      private JRadioButton unfiledButton;
65      private JRadioButton currentPathButton;
66      private JTextField nameField;
67      private JComboBox typeBox;
68      private JTextField filenameField;
69      private JFormattedTextField generateContentSizeField;
70      private JComboBox generateContentUnitField;
71      private JRadioButton versioningStateNoneButton;
72      private JRadioButton versioningStateMajorButton;
73      private JRadioButton versioningStateMinorButton;
74      private JRadioButton versioningStateCheckedoutButton;
75  
76      private JCheckBox verifyAfterUploadButton;
77  
78      public CreateDocumentDialog(Frame owner, ClientModel model) {
79          this(owner, model, null);
80      }
81  
82      public CreateDocumentDialog(Frame owner, ClientModel model, File file) {
83          super(owner, "Create Document", model);
84          createGUI(file);
85      }
86  
87      private void createGUI(File file) {
88          final CreateDocumentDialog thisDialog = this;
89  
90          unfiledButton = new JRadioButton("create unfiled");
91          unfiledButton.setSelected(false);
92  
93          currentPathButton = new JRadioButton("create in the current folder: "
94                  + getClientModel().getCurrentFolder().getPath());
95          currentPathButton.setSelected(true);
96  
97          ButtonGroup filedGroup = new ButtonGroup();
98          filedGroup.add(unfiledButton);
99          filedGroup.add(currentPathButton);
100 
101         JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
102         buttonPanel.add(unfiledButton);
103         buttonPanel.add(currentPathButton);
104 
105         createRow("", buttonPanel, 0);
106 
107         nameField = new JTextField(60);
108         createRow("Name:", nameField, 1);
109 
110         Object[] types = getTypes(BaseTypeId.CMIS_DOCUMENT.value());
111         if (types.length == 0) {
112             JOptionPane.showMessageDialog(this, "No creatable type!", "Creatable Types", JOptionPane.ERROR_MESSAGE);
113             thisDialog.dispose();
114             return;
115         }
116 
117         typeBox = new JComboBox(types);
118         typeBox.setSelectedIndex(0);
119         typeBox.addItemListener(new ItemListener() {
120             public void itemStateChanged(ItemEvent e) {
121                 DocumentTypeDefinition type = (DocumentTypeDefinition) ((ObjectTypeItem) typeBox.getSelectedItem())
122                         .getObjectType();
123                 if (type.isVersionable()) {
124                     versioningStateMajorButton.setSelected(true);
125                 } else {
126                     versioningStateNoneButton.setSelected(true);
127                 }
128             }
129         });
130 
131         createRow("Type:", typeBox, 2);
132 
133         JPanel filePanel = new JPanel(new BorderLayout());
134 
135         filenameField = new JTextField(30);
136         filenameField.getDocument().addDocumentListener(new DocumentListener() {
137             @Override
138             public void removeUpdate(DocumentEvent e) {
139                 adjustGenerateContentComponents();
140             }
141 
142             @Override
143             public void insertUpdate(DocumentEvent e) {
144                 adjustGenerateContentComponents();
145             }
146 
147             @Override
148             public void changedUpdate(DocumentEvent e) {
149             }
150 
151             private void adjustGenerateContentComponents() {
152                 if (filenameField.getText().length() == 0) {
153                     generateContentSizeField.setEnabled(true);
154                     generateContentUnitField.setEnabled(true);
155                 } else {
156                     generateContentSizeField.setEnabled(false);
157                     generateContentUnitField.setEnabled(false);
158                 }
159             }
160         });
161 
162         filePanel.add(filenameField, BorderLayout.CENTER);
163 
164         JButton browseButton = new JButton("Browse");
165         browseButton.addActionListener(new ActionListener() {
166             public void actionPerformed(ActionEvent event) {
167                 JFileChooser fileChooser = new JFileChooser();
168                 int chooseResult = fileChooser.showDialog(filenameField, "Select");
169                 if (chooseResult == JFileChooser.APPROVE_OPTION) {
170                     if (fileChooser.getSelectedFile().isFile()) {
171                         setFile(fileChooser.getSelectedFile());
172                     }
173                 }
174             }
175         });
176         filePanel.add(browseButton, BorderLayout.LINE_END);
177 
178         createRow("File:", filePanel, 3);
179 
180         JPanel generateContentPanel = new JPanel();
181         generateContentPanel.setLayout(new BoxLayout(generateContentPanel, BoxLayout.X_AXIS));
182 
183         generateContentSizeField = new JFormattedTextField(NumberFormat.getIntegerInstance());
184         generateContentSizeField.setValue(0L);
185         generateContentSizeField.setColumns(8);
186         generateContentSizeField.setHorizontalAlignment(JTextField.RIGHT);
187         generateContentSizeField.setMaximumSize(generateContentSizeField.getPreferredSize());
188         generateContentPanel.add(generateContentSizeField);
189 
190         generateContentUnitField = new JComboBox(new String[] { "Bytes", "KiB", "MiB", "GiB" });
191         generateContentUnitField.setMaximumSize(new Dimension((int) generateContentUnitField.getPreferredSize()
192                 .getWidth() + 200, (int) generateContentUnitField.getPreferredSize().getHeight()));
193         generateContentPanel.add(generateContentUnitField);
194 
195         generateContentPanel.add(Box.createHorizontalGlue());
196 
197         createRow("Generate content:", generateContentPanel, 4);
198 
199         versioningStateNoneButton = new JRadioButton("none");
200         versioningStateMajorButton = new JRadioButton("major");
201         versioningStateMinorButton = new JRadioButton("minor");
202         versioningStateCheckedoutButton = new JRadioButton("checked out");
203 
204         ButtonGroup versioningStateGroup = new ButtonGroup();
205         versioningStateGroup.add(versioningStateNoneButton);
206         versioningStateGroup.add(versioningStateMajorButton);
207         versioningStateGroup.add(versioningStateMinorButton);
208         versioningStateGroup.add(versioningStateCheckedoutButton);
209 
210         JPanel versioningStatePanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
211         versioningStatePanel.add(versioningStateNoneButton);
212         versioningStatePanel.add(versioningStateMajorButton);
213         versioningStatePanel.add(versioningStateMinorButton);
214         versioningStatePanel.add(versioningStateCheckedoutButton);
215 
216         if (((DocumentTypeDefinition) ((ObjectTypeItem) typeBox.getSelectedItem()).getObjectType()).isVersionable()) {
217             versioningStateMajorButton.setSelected(true);
218         } else {
219             versioningStateNoneButton.setSelected(true);
220         }
221         createRow("Versioning State:", versioningStatePanel, 5);
222 
223         verifyAfterUploadButton = new JCheckBox("Verify content after upload");
224         createRow("", verifyAfterUploadButton, 6);
225 
226         JButton createButton = new JButton("Create Document");
227         createButton.addActionListener(new ActionListener() {
228             public void actionPerformed(ActionEvent event) {
229                 String name = nameField.getText();
230                 String type = ((ObjectTypeItem) typeBox.getSelectedItem()).getObjectType().getId();
231                 String filename = filenameField.getText();
232 
233                 try {
234                     setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
235 
236                     VersioningState versioningState = VersioningState.NONE;
237                     if (versioningStateMajorButton.isSelected()) {
238                         versioningState = VersioningState.MAJOR;
239                     } else if (versioningStateMinorButton.isSelected()) {
240                         versioningState = VersioningState.MINOR;
241                     } else if (versioningStateCheckedoutButton.isSelected()) {
242                         versioningState = VersioningState.CHECKEDOUT;
243                     }
244 
245                     ObjectId objectId = null;
246                     if (filename.length() > 0) {
247                         // create a document from a file
248                         objectId = getClientModel().createDocument(name, type, filename, versioningState,
249                                 unfiledButton.isSelected());
250 
251                         if (verifyAfterUploadButton.isSelected()) {
252                             ContentStream contentStream = getClientModel().createContentStream(filename);
253                             verifyContentStreams(contentStream, objectId);
254                         }
255                     } else {
256                         // create a document with random data
257                         long seed = System.currentTimeMillis();
258                         long length = ((Number) generateContentSizeField.getValue()).longValue();
259                         if (length < 0) {
260                             length = 0;
261                         } else {
262                             for (int i = 0; i < generateContentUnitField.getSelectedIndex(); i++) {
263                                 length = length * 1024;
264                             }
265                         }
266 
267                         objectId = getClientModel().createDocument(name, type, length, seed, versioningState,
268                                 unfiledButton.isSelected());
269 
270                         if (verifyAfterUploadButton.isSelected()) {
271                             ContentStream contentStream = getClientModel().createContentStream("", length, seed);
272                             verifyContentStreams(contentStream, objectId);
273                         }
274                     }
275 
276                     if (objectId != null) {
277                         getClientModel().loadObject(objectId.getId());
278                     }
279 
280                     thisDialog.setVisible(false);
281                     thisDialog.dispose();
282                 } catch (Exception e) {
283                     ClientHelper.showError(null, e);
284                 } finally {
285                     setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
286 
287                     try {
288                         getClientModel().reloadFolder();
289                     } catch (Exception e) {
290                         ClientHelper.showError(null, e);
291                     }
292                 }
293             }
294         });
295         createRow("", createButton, 7);
296 
297         if (file != null) {
298             setFile(file);
299         }
300 
301         getRootPane().setDefaultButton(createButton);
302 
303         showDialog();
304     }
305 
306     private void setFile(File file) {
307         filenameField.setText(file.getAbsolutePath());
308         if (nameField.getText().trim().length() == 0) {
309             nameField.setText(file.getName());
310         }
311     }
312 
313     private void verifyContentStreams(ContentStream sourceContentStream, ObjectId objectId) {
314         // download content from repository
315         ClientSession clientSession = getClientModel().getClientSession();
316         Document doc = (Document) clientSession.getSession().getObject(objectId,
317                 clientSession.getObjectOperationContext());
318         ContentStream docContentStream = doc.getContentStream();
319 
320         // compare
321         if (docContentStream == null) {
322             if (sourceContentStream.getLength() == 0) {
323                 JOptionPane.showMessageDialog(getOwner(), "Source file and document content are both empty.",
324                         "Verification successful", JOptionPane.INFORMATION_MESSAGE);
325             } else {
326                 JOptionPane.showMessageDialog(getOwner(), "Document has no conent but the source file is not empty!",
327                         "Verification failed", JOptionPane.ERROR_MESSAGE);
328             }
329             return;
330         }
331 
332         InputStream sourceContent = null;
333         InputStream docContent = null;
334         try {
335             sourceContent = new BufferedInputStream(sourceContentStream.getStream());
336             docContent = new BufferedInputStream(docContentStream.getStream());
337 
338             int fb = 0;
339             int db = 0;
340             long pos = 0;
341             while (fb > -1 && db > -1) {
342                 fb = sourceContent.read();
343                 db = docContent.read();
344 
345                 if (fb != db) {
346                     if (fb == -1) {
347                         JOptionPane.showMessageDialog(getOwner(),
348                                 "The document content is bigger than the source file!", "Verification failed",
349                                 JOptionPane.ERROR_MESSAGE);
350                     } else if (db == -1) {
351                         JOptionPane.showMessageDialog(getOwner(),
352                                 "The source file is bigger than the document content!", "Verification failed",
353                                 JOptionPane.ERROR_MESSAGE);
354                     } else {
355                         JOptionPane.showMessageDialog(getOwner(), "Contents differ at byte " + pos + "!",
356                                 "Verification failed", JOptionPane.ERROR_MESSAGE);
357                     }
358 
359                     return;
360                 }
361 
362                 pos++;
363             }
364 
365             JOptionPane.showMessageDialog(getOwner(), "Source file and document content are identical.",
366                     "Verification successful", JOptionPane.INFORMATION_MESSAGE);
367         } catch (Exception e) {
368             JOptionPane.showMessageDialog(getOwner(), "Content test exception: " + e.getMessage(),
369                     "Verification failed", JOptionPane.ERROR_MESSAGE);
370         } finally {
371             try {
372                 sourceContent.close();
373             } catch (Exception e) {
374             }
375             try {
376                 while (docContent.read() > -1) {
377                 }
378 
379                 docContent.close();
380             } catch (Exception e) {
381             }
382         }
383     }
384 }