1 package org
.argeo
.cms
.tabular
;
3 import java
.io
.ByteArrayInputStream
;
4 import java
.io
.ByteArrayOutputStream
;
5 import java
.io
.InputStream
;
8 import javax
.jcr
.Binary
;
10 import javax
.jcr
.Property
;
11 import javax
.jcr
.PropertyType
;
12 import javax
.jcr
.RepositoryException
;
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
.ArgeoJcrException
;
19 import org
.argeo
.jcr
.JcrUtils
;
20 import org
.argeo
.util
.CsvWriter
;
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
;
28 @SuppressWarnings("unused")
29 private final List
<TabularColumn
> columns
;
31 /** Creates a table node */
32 public JcrTabularWriter(Node tableNode
, List
<TabularColumn
> columns
,
33 String contentNodeType
) {
35 this.columns
= columns
;
36 for (TabularColumn column
: columns
) {
37 String normalized
= JcrUtils
.replaceInvalidChars(column
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()));
46 columnNode
.setProperty(Property
.JCR_REQUIRED_TYPE
,
47 PropertyType
.TYPENAME_STRING
);
49 contentNode
= tableNode
.addNode(Property
.JCR_CONTENT
,
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
);
57 } catch (RepositoryException e
) {
58 throw new ArgeoJcrException("Cannot create table node " + tableNode
, e
);
62 public void appendRow(Object
[] row
) {
63 csvWriter
.writeLine(row
);
68 InputStream in
= null;
70 // TODO parallelize with pipes and writing from another thread
71 in
= new ByteArrayInputStream(out
.toByteArray());
72 binary
= contentNode
.getSession().getValueFactory()
74 contentNode
.setProperty(Property
.JCR_DATA
, binary
);
75 } catch (RepositoryException e
) {
76 throw new ArgeoJcrException("Cannot store data in " + contentNode
, e
);
78 IOUtils
.closeQuietly(in
);
79 JcrUtils
.closeQuietly(binary
);