This project has retired. For details please refer to its
Attic page.
CreateDocumentDialog xref
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
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
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
315 ClientSession clientSession = getClientModel().getClientSession();
316 Document doc = (Document) clientSession.getSession().getObject(objectId,
317 clientSession.getObjectOperationContext());
318 ContentStream docContentStream = doc.getContentStream();
319
320
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 }