package org.xmind.core.tests;
import static org.junit.Assert.*;
import java.io.*;
import java.util.*;
import org.junit.*;
import org.xmind.core.*;
import org.xmind.core.io.*;
import org.xmind.core.util.*;
public class WorkbookTestCase {
@Test
public void testWorkbookCreation() throws Exception {
IWorkbook workbook = Core.getWorkbookBuilder().createWorkbook();
assertNotNull(workbook);
ISheet sheet = workbook.getPrimarySheet();
assertNotNull(sheet);
assertEquals("", sheet.getTitleText());
ITopic rootTopic = sheet.getRootTopic();
assertNotNull(rootTopic);
assertEquals("", rootTopic.getTitleText());
}
@Test
public void testWorkbookSerializing() throws Exception {
IWorkbook workbook = Core.getWorkbookBuilder().createWorkbook();
/// 1. Save to an output target
IOutputTarget target = new ByteArrayStorage().getOutputTarget();
ISerializer serializer1 = Core.getWorkbookBuilder().newSerializer();
serializer1.setWorkbook(workbook);
serializer1.setOutputTarget(target);
serializer1.serialize(null);
/// 2. Save to an output stream
OutputStream targetStream = new ByteArrayOutputStream();
ISerializer serializer2 = Core.getWorkbookBuilder().newSerializer();
serializer2.setWorkbook(workbook);
serializer2.setOutputStream(targetStream);
serializer2.serialize(null);
/// 3. Save to workbook's own temp storage
ISerializer serializer3 = Core.getWorkbookBuilder().newSerializer();
serializer3.setWorkbook(workbook);
serializer3.setWorkbookStorageAsOutputTarget();
serializer3.serialize(null);
}
@Test
public void testWorkbookDeserializing() throws Exception {
IWorkbook sourceWorkbook = Core.getWorkbookBuilder().createWorkbook();
sourceWorkbook.getPrimarySheet().setTitleText(UUID.randomUUID().toString());
sourceWorkbook.getPrimarySheet().getRootTopic().setTitleText(UUID.randomUUID().toString());
IComment sourceComment1 = sourceWorkbook.getCommentManager().createComment(UUID.randomUUID().toString(),
System.currentTimeMillis(), sourceWorkbook.getPrimarySheet().getRootTopic().getId());
sourceComment1.setContent(UUID.randomUUID().toString());
sourceWorkbook.getCommentManager().addComment(sourceComment1);
ByteArrayOutputStream byteOutput = new ByteArrayOutputStream();
ISerializer serializer = Core.getWorkbookBuilder().newSerializer();
serializer.setWorkbook(sourceWorkbook);
serializer.setOutputStream(byteOutput);
serializer.serialize(null);
byte[] fileData = byteOutput.toByteArray();
IDeserializer deserializer = Core.getWorkbookBuilder().newDeserializer();
deserializer.setInputStream(new ByteArrayInputStream(fileData));
deserializer.deserialize(null);
IWorkbook workbook = deserializer.getWorkbook();
assertNotNull(workbook);
ISheet sheet = workbook.getPrimarySheet();
assertNotNull(sheet);
assertEquals(sourceWorkbook.getPrimarySheet().getId(), sheet.getId());
assertEquals(sourceWorkbook.getPrimarySheet().getTitleText(), sheet.getTitleText());
ITopic rootTopic = sheet.getRootTopic();
assertNotNull(rootTopic);
assertEquals(sourceWorkbook.getPrimarySheet().getRootTopic().getId(), rootTopic.getId());
assertEquals(sourceWorkbook.getPrimarySheet().getRootTopic().getTitleText(), rootTopic.getTitleText());
Set<IComment> comments = workbook.getCommentManager().getComments(rootTopic.getId());
assertEquals(1, comments.size());
IComment comment1 = comments.iterator().next();
assertEquals(sourceComment1.getContent(), comment1.getContent());
assertEquals(sourceComment1.getAuthor(), comment1.getAuthor());
assertEquals(sourceComment1.getTime(), comment1.getTime());
}
private static class TestEncodedOutputStream extends FilterOutputStream {
public TestEncodedOutputStream(OutputStream out) {
super(out);
}
@Override
public void write(int b) throws IOException {
if (b == 0xff) {
b = 0;
} else {
b = b + 1;
}
super.write(b);
}
}
private static class TestDecodedInputStream extends FilterInputStream {
public TestDecodedInputStream(InputStream in) {
super(in);
}
@Override
public int read() throws IOException {
int b = super.read();
if (b < 0)
return -1;
if (b == 0)
return 0xff;
return b - 1;
}
@Override
public int read(byte[] b, int off, int len) throws IOException {
int i;
for (i = 0; i < len; i++) {
int r = read();
if (r < 0) {
return i == 0 ? -1 : i;
}
b[off + i] = (byte) r;
}
return i;
}
}
@Test
public void testNormalization() throws Exception {
IWorkbook workbook = Core.getWorkbookBuilder().createWorkbook();
workbook.getPrimarySheet().setTitleText(UUID.randomUUID().toString());
workbook.getPrimarySheet().getRootTopic().setTitleText(UUID.randomUUID().toString());
byte[] attachment1 = "foo bar is ok".getBytes();
IFileEntry attEntry1 = workbook.getManifest().createAttachmentFromStream(new ByteArrayInputStream(attachment1),
"a.txt");
String attPath1 = attEntry1.getPath();
workbook.getPrimarySheet().getRootTopic().setHyperlink(HyperlinkUtils.toAttachmentURL(attPath1));
assertArrayEquals(attachment1, toBytes(workbook.getManifest().getFileEntry(attPath1).openInputStream()));
assertEquals(IEntryStreamNormalizer.NULL, workbook.getAdapter(IEntryStreamNormalizer.class));
IEntryStreamNormalizer encoder = new IEntryStreamNormalizer() {
@Override
public OutputStream normalizeOutputStream(OutputStream stream, IFileEntry fileEntry)
throws IOException, CoreException {
return new TestEncodedOutputStream(stream);
}
@Override
public InputStream normalizeInputStream(InputStream stream, IFileEntry fileEntry)
throws IOException, CoreException {
return new TestDecodedInputStream(stream);
}
};
/// 1. Save to external target with this encoding
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ISerializer serializer1 = Core.getWorkbookBuilder().newSerializer();
serializer1.setWorkbook(workbook);
serializer1.setOutputStream(outputStream);
serializer1.setEntryStreamNormalizer(encoder);
serializer1.serialize(null);
assertArrayEquals(attachment1, toBytes(workbook.getManifest().getFileEntry(attPath1).openInputStream()));
assertEquals(IEntryStreamNormalizer.NULL, workbook.getAdapter(IEntryStreamNormalizer.class));
// IDeserializer deserializer1 = Core.getSerializationProvider().newDeserializer();
// deserializer1.setEntryStreamNormalizer(encoder);
// deserializer1.setInputStream(new ByteArrayInputStream(outputStream.toByteArray()));
// deserializer1.setWorkbookStorage(new ByteArrayStorage());
// deserializer1.deserialize(null);
//
// IWorkbook workbook2 = deserializer1.getWorkbook();
// assertEquals(workbook.getPrimarySheet().getId(), workbook2.getPrimarySheet().getId());
// assertEquals(workbook.getPrimarySheet().getTitleText(), workbook2.getPrimarySheet().getTitleText());
// assertEquals(workbook.getPrimarySheet().getRootTopic().getId(),
// workbook2.getPrimarySheet().getRootTopic().getId());
// assertEquals(workbook.getPrimarySheet().getRootTopic().getTitleText(),
// workbook2.getPrimarySheet().getRootTopic().getTitleText());
// assertArrayEquals(attachment1, toBytes(workbook2.getManifest().getFileEntry(attPath1).openInputStream()));
/// 2. Save to internal storage with new encoding/encryption
ISerializer serializer2 = Core.getWorkbookBuilder().newSerializer();
serializer2.setWorkbook(workbook);
serializer2.setWorkbookStorageAsOutputTarget();
serializer2.setEntryStreamNormalizer(encoder);
assertEquals(IEntryStreamNormalizer.NULL, workbook.getAdapter(IEntryStreamNormalizer.class));
serializer2.serialize(null);
assertEquals(encoder, workbook.getAdapter(IEntryStreamNormalizer.class));
assertArrayEquals(attachment1, toBytes(workbook.getManifest().getFileEntry(attPath1).openInputStream()));
}
private static byte[] toBytes(InputStream source) throws IOException {
try {
ByteArrayOutputStream target = new ByteArrayOutputStream();
try {
FileUtils.transfer(source, target, false);
} finally {
target.close();
}
return target.toByteArray();
} finally {
source.close();
}
}
}