]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/tabular/JcrTabularWriter.java
Close release cycle
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / tabular / JcrTabularWriter.java
1 package org.argeo.cms.tabular;
2
3 import java.io.ByteArrayInputStream;
4 import java.io.ByteArrayOutputStream;
5 import java.io.InputStream;
6 import java.util.List;
7
8 import javax.jcr.Binary;
9 import javax.jcr.Node;
10 import javax.jcr.Property;
11 import javax.jcr.PropertyType;
12 import javax.jcr.RepositoryException;
13
14 import org.apache.commons.io.IOUtils;
15 import org.argeo.api.tabular.TabularColumn;
16 import org.argeo.api.tabular.TabularWriter;
17 import org.argeo.cms.ArgeoTypes;
18 import org.argeo.jcr.JcrException;
19 import org.argeo.jcr.JcrUtils;
20 import org.argeo.util.CsvWriter;
21
22 /** Write / reference tabular content in a JCR repository. */
23 public class JcrTabularWriter implements TabularWriter {
24 private Node contentNode;
25 private ByteArrayOutputStream out;
26 private CsvWriter csvWriter;
27
28 @SuppressWarnings("unused")
29 private final List<TabularColumn> columns;
30
31 /** Creates a table node */
32 public JcrTabularWriter(Node tableNode, List<TabularColumn> columns,
33 String contentNodeType) {
34 try {
35 this.columns = columns;
36 for (TabularColumn column : columns) {
37 String normalized = JcrUtils.replaceInvalidChars(column
38 .getName());
39 Node columnNode = tableNode.addNode(normalized,
40 ArgeoTypes.ARGEO_COLUMN);
41 columnNode.setProperty(Property.JCR_TITLE, column.getName());
42 if (column.getType() != null)
43 columnNode.setProperty(Property.JCR_REQUIRED_TYPE,
44 PropertyType.nameFromValue(column.getType()));
45 else
46 columnNode.setProperty(Property.JCR_REQUIRED_TYPE,
47 PropertyType.TYPENAME_STRING);
48 }
49 contentNode = tableNode.addNode(Property.JCR_CONTENT,
50 contentNodeType);
51 if (contentNodeType.equals(ArgeoTypes.ARGEO_CSV)) {
52 contentNode.setProperty(Property.JCR_MIMETYPE, "text/csv");
53 contentNode.setProperty(Property.JCR_ENCODING, "UTF-8");
54 out = new ByteArrayOutputStream();
55 csvWriter = new CsvWriter(out);
56 }
57 } catch (RepositoryException e) {
58 throw new JcrException("Cannot create table node " + tableNode, e);
59 }
60 }
61
62 public void appendRow(Object[] row) {
63 csvWriter.writeLine(row);
64 }
65
66 public void close() {
67 Binary binary = null;
68 InputStream in = null;
69 try {
70 // TODO parallelize with pipes and writing from another thread
71 in = new ByteArrayInputStream(out.toByteArray());
72 binary = contentNode.getSession().getValueFactory()
73 .createBinary(in);
74 contentNode.setProperty(Property.JCR_DATA, binary);
75 } catch (RepositoryException e) {
76 throw new JcrException("Cannot store data in " + contentNode, e);
77 } finally {
78 IOUtils.closeQuietly(in);
79 JcrUtils.closeQuietly(binary);
80 }
81 }
82 }