Skip to content

Commit

Permalink
Support nested layouts for Text Cells.
Browse files Browse the repository at this point in the history
  • Loading branch information
robjg committed Oct 24, 2013
1 parent 3eedc27 commit b4c983e
Show file tree
Hide file tree
Showing 5 changed files with 252 additions and 4 deletions.
1 change: 1 addition & 0 deletions src/java/org/oddjob/dido/poi/data/PoiRowsIn.java
Expand Up @@ -138,6 +138,7 @@ public <T extends DataIn> T provideDataIn(Class<T> type) throws DataException {
throw new UnsupportedDataInException(this.getClass(), type);
}

@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public CellIn<?> inFor(Field column) {

Expand Down
64 changes: 60 additions & 4 deletions src/java/org/oddjob/dido/poi/layouts/DataCell.java
Expand Up @@ -128,7 +128,7 @@ public Object read() throws DataException {
logger.trace("[" + DataCell.this + "] value is [" +
field + "]");

nextReader = nextReaderFor(new VoidIn());
nextReader = nextReaderFor(childDataIn());

return read();
}
Expand All @@ -142,6 +142,10 @@ public void close() throws DataException {
}
}

protected DataIn childDataIn() {
return new VoidIn();
}

@SuppressWarnings("unchecked")
@Override
public DataReader readerFor(DataIn dataIn) throws DataException {
Expand Down Expand Up @@ -183,15 +187,35 @@ public String getDefaultStyle() {
return null;
}

/**
*
* @author rob
*
* @param <T>
*/
protected interface DataOutControl<T> {

public DataOut dataOut();

public boolean isWrittenTo();

public void resetWrittenTo();

public T value();
}

/**
* The Data Writer that writes to the cell.
*/
class MainWriter implements DataWriter {

private final DataWriter nextWriter;

private final DataOutControl<T> dataOutControl;

public MainWriter() throws DataException {
this.nextWriter = nextWriterFor(new VoidOut());
this.dataOutControl = childDataOut();
this.nextWriter = nextWriterFor(dataOutControl.dataOut());
}

@Override
Expand All @@ -201,14 +225,21 @@ public boolean write(Object object) throws DataException {
return true;
}

if (isWrittenTo()) {
if (isWrittenTo() || dataOutControl.isWrittenTo()) {

dataOutControl.resetWrittenTo();
resetWrittenTo();

return write(object);
}

T value = value();
T value = dataOutControl.value();
if (value == null) {
value = value();
}
else {
value(value);
}

columnOut.setData(value);

Expand All @@ -229,6 +260,31 @@ public void close() throws DataException {
}
}

protected DataOutControl<T> childDataOut() {

return new DataOutControl<T>() {

@Override
public T value() {
return null;
}

@Override
public boolean isWrittenTo() {
return false;
}

@Override
public void resetWrittenTo() {
}

@Override
public DataOut dataOut() {
return new VoidOut();
}
};
}

@SuppressWarnings("unchecked")
@Override
public DataWriter writerFor(DataOut dataOut) throws DataException {
Expand Down
40 changes: 40 additions & 0 deletions src/java/org/oddjob/dido/poi/layouts/TextCell.java
@@ -1,6 +1,11 @@
package org.oddjob.dido.poi.layouts;

import org.apache.poi.ss.usermodel.Cell;
import org.oddjob.dido.DataIn;
import org.oddjob.dido.DataOut;
import org.oddjob.dido.Layout;
import org.oddjob.dido.text.StringTextIn;
import org.oddjob.dido.text.StringTextOut;

public class TextCell extends DataCell<String> {

Expand All @@ -14,15 +19,50 @@ public int getCellType() {
return Cell.CELL_TYPE_STRING;
}

public void setOf(int index, Layout child) {
addOrRemoveChild(index, child);
}

@Override
public String extractCellValue(Cell cell) {
return cell.getStringCellValue();
}

@Override
protected DataIn childDataIn() {
return new StringTextIn(value());
}

@Override
public void insertValueInto(Cell cell, String value) {
cell.setCellValue(value);
}

@Override
public DataOutControl<String> childDataOut() {

return new DataOutControl<String>() {

StringTextOut textOut = new StringTextOut();

@Override
public DataOut dataOut() {
return textOut;
}
@Override
public boolean isWrittenTo() {
return textOut.isMultiLine();
}
@Override
public void resetWrittenTo() {
textOut.resetWrittenTo();
}
@Override
public String value() {
return textOut.toText();
}
};
}

public String getValue() {
return this.value();
Expand Down
110 changes: 110 additions & 0 deletions test/java/org/oddjob/dido/poi/layouts/TextCellOfNamedValues.xml
@@ -0,0 +1,110 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<oddjob>
<job>
<sequential>
<jobs>
<dido:read id="text-read" xmlns:dido="oddjob:dido">
<beans>
<list/>
</beans>
<data>
<dido:io>
<input>
<buffer><![CDATA[apple; colour=red, origin=france, shape=round
pear; colour=green, orgin=uk, shape=tear-drop
banana; colour=yellow, origin=jamacia, shape=bent-cylinder
]]></buffer>
</input>
</dido:io>
</data>
<layout>
<dido:delimited delimiter="; " name="data" regexp="\s*;\s*">
<of>
<dido:text name="fruit"/>
<dido:text>
<of>
<dido:delimited delimiter=", " regexp="\s*,\s*">
<of>
<dido:named-values name="description"/>
</of>
</dido:delimited>
</of>
</dido:text>
</of>
</dido:delimited>
</layout>
<bindings>
<dido:bean-binding key="data"/>
</bindings>
</dido:read>
<dido:write id="poi-write" xmlns:dido="oddjob:dido">
<beans>
<value value="${text-read.beans}"/>
</beans>
<data>
<dido-poi:workbook xmlns:dido-poi="oddjob:dido:poi">
<output>
<file file="work/TextCellWithNamedValues.xlsx"/>
</output>
</dido-poi:workbook>
</data>
<layout>
<dido-poi:rows name="data" withHeadings="true" xmlns:dido-poi="oddjob:dido:poi">
<of>
<dido-poi:text name="fruit"/>
<dido-poi:text>
<of>
<dido:delimited delimiter=", " regexp="\s*,\s*">
<of>
<dido:named-values name="description"/>
</of>
</dido:delimited>
</of>
</dido-poi:text>
</of>
</dido-poi:rows>
</layout>
<bindings>
<dido:bean-binding key="data"/>
</bindings>
</dido:write>
<dido:read id="poi-read" xmlns:dido="oddjob:dido">
<beans>
<list/>
</beans>
<data>
<dido-poi:workbook xmlns:dido-poi="oddjob:dido:poi">
<input>
<value value="${poi-write.data.output}"/>
</input>
</dido-poi:workbook>
</data>
<layout>
<value value="${poi-write.layout}"/>
</layout>
<bindings>
<dido:bean-binding key="data"/>
</bindings>
</dido:read>
<dido:write id="text-write" xmlns:dido="oddjob:dido">
<beans>
<value value="${poi-read.beans}"/>
</beans>
<data>
<dido:io>
<output>
<buffer/>
</output>
</dido:io>
</data>
<layout>
<value value="${text-read.layout}"/>
</layout>
<bindings>
<dido:bean-binding key="data"/>
</bindings>
</dido:write>
</jobs>
</sequential>
</job>
</oddjob>
41 changes: 41 additions & 0 deletions test/java/org/oddjob/dido/poi/layouts/TextCellTest.java
@@ -0,0 +1,41 @@
package org.oddjob.dido.poi.layouts;

import java.io.File;

import junit.framework.TestCase;

import org.oddjob.Oddjob;
import org.oddjob.OddjobLookup;
import org.oddjob.arooa.convert.ArooaConversionException;
import org.oddjob.arooa.reflect.ArooaPropertyException;
import org.oddjob.state.ParentState;

public class TextCellTest extends TestCase {

public void testWriteAndRead() throws ArooaPropertyException, ArooaConversionException {

File file = new File(getClass().getResource(
"TextCellOfNamedValues.xml").getFile());

Oddjob oddjob = new Oddjob();
oddjob.setFile(file);

oddjob.run();

assertEquals(ParentState.COMPLETE,
oddjob.lastStateEvent().getState());

OddjobLookup lookup = new OddjobLookup(oddjob);

String[] expected = lookup.lookup("text-read.data.input", String[].class);

String[] result = lookup.lookup("text-write.data.output", String[].class);

assertEquals(expected[0], result[0]);
assertEquals(expected[1], result[1]);
assertEquals(expected[2], result[2]);

assertEquals(expected.length, result.length);
}

}

0 comments on commit b4c983e

Please sign in to comment.