More HPBF stuff, and some tests
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@687423 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
cfe2045c5d
commit
13d66be83c
@ -18,9 +18,12 @@ package org.apache.poi.hpbf;
|
|||||||
|
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
import org.apache.poi.POIDocument;
|
import org.apache.poi.POIDocument;
|
||||||
|
import org.apache.poi.hpbf.model.EscherDelayStm;
|
||||||
|
import org.apache.poi.hpbf.model.EscherStm;
|
||||||
import org.apache.poi.hpbf.model.MainContents;
|
import org.apache.poi.hpbf.model.MainContents;
|
||||||
import org.apache.poi.hpbf.model.QuillContents;
|
import org.apache.poi.hpbf.model.QuillContents;
|
||||||
import org.apache.poi.poifs.filesystem.DirectoryNode;
|
import org.apache.poi.poifs.filesystem.DirectoryNode;
|
||||||
@ -34,6 +37,8 @@ import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
|||||||
public class HPBFDocument extends POIDocument {
|
public class HPBFDocument extends POIDocument {
|
||||||
private MainContents mainContents;
|
private MainContents mainContents;
|
||||||
private QuillContents quillContents;
|
private QuillContents quillContents;
|
||||||
|
private EscherStm escherStm;
|
||||||
|
private EscherDelayStm escherDelayStm;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Opens a new publisher document
|
* Opens a new publisher document
|
||||||
@ -41,6 +46,9 @@ public class HPBFDocument extends POIDocument {
|
|||||||
public HPBFDocument(POIFSFileSystem fs) throws IOException {
|
public HPBFDocument(POIFSFileSystem fs) throws IOException {
|
||||||
this(fs.getRoot(), fs);
|
this(fs.getRoot(), fs);
|
||||||
}
|
}
|
||||||
|
public HPBFDocument(InputStream inp) throws IOException {
|
||||||
|
this(new POIFSFileSystem(inp));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Opens an embeded publisher document,
|
* Opens an embeded publisher document,
|
||||||
@ -54,12 +62,24 @@ public class HPBFDocument extends POIDocument {
|
|||||||
try {
|
try {
|
||||||
mainContents = new MainContents(dir);
|
mainContents = new MainContents(dir);
|
||||||
} catch(FileNotFoundException e) {
|
} catch(FileNotFoundException e) {
|
||||||
throw new IllegalArgumentException("File invalid - missing required main Contents part");
|
throw new IllegalArgumentException("File invalid - missing required main Contents part", e);
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
quillContents = new QuillContents(dir);
|
quillContents = new QuillContents(dir);
|
||||||
} catch(FileNotFoundException e) {
|
} catch(FileNotFoundException e) {
|
||||||
throw new IllegalArgumentException("File invalid - missing required Quill CONTENTS part");
|
throw new IllegalArgumentException("File invalid - missing required Quill CONTENTS part", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now the Escher bits
|
||||||
|
try {
|
||||||
|
escherStm = new EscherStm(dir);
|
||||||
|
} catch(FileNotFoundException e) {
|
||||||
|
throw new IllegalArgumentException("File invalid - missing required EscherStm part", e);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
escherDelayStm = new EscherDelayStm(dir);
|
||||||
|
} catch(FileNotFoundException e) {
|
||||||
|
throw new IllegalArgumentException("File invalid - missing required EscherDelayStm part", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,6 +89,12 @@ public class HPBFDocument extends POIDocument {
|
|||||||
public QuillContents getQuillContents() {
|
public QuillContents getQuillContents() {
|
||||||
return quillContents;
|
return quillContents;
|
||||||
}
|
}
|
||||||
|
public EscherStm getEscherStm() {
|
||||||
|
return escherStm;
|
||||||
|
}
|
||||||
|
public EscherDelayStm getEscherDelayStm() {
|
||||||
|
return escherDelayStm;
|
||||||
|
}
|
||||||
|
|
||||||
public void write(OutputStream out) throws IOException {
|
public void write(OutputStream out) throws IOException {
|
||||||
throw new IllegalStateException("Writing is not yet implemented, see http://poi.apache.org/hpbf/");
|
throw new IllegalStateException("Writing is not yet implemented, see http://poi.apache.org/hpbf/");
|
||||||
|
@ -0,0 +1,35 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
package org.apache.poi.hpbf.model;
|
||||||
|
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.apache.poi.poifs.filesystem.DirectoryNode;
|
||||||
|
|
||||||
|
public class EscherDelayStm extends EscherPart {
|
||||||
|
public EscherDelayStm(DirectoryNode baseDir) throws FileNotFoundException,
|
||||||
|
IOException {
|
||||||
|
super(baseDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getPath() {
|
||||||
|
return new String[] {
|
||||||
|
"Escher", "EscherDelayStm"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
81
src/scratchpad/src/org/apache/poi/hpbf/model/EscherPart.java
Normal file
81
src/scratchpad/src/org/apache/poi/hpbf/model/EscherPart.java
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
package org.apache.poi.hpbf.model;
|
||||||
|
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import org.apache.poi.ddf.DefaultEscherRecordFactory;
|
||||||
|
import org.apache.poi.ddf.EscherRecord;
|
||||||
|
import org.apache.poi.poifs.filesystem.DirectoryNode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parent class of all Escher parts
|
||||||
|
*/
|
||||||
|
public abstract class EscherPart extends HPBFPart {
|
||||||
|
private EscherRecord[] records;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the Escher Part, and finds our child
|
||||||
|
* escher records
|
||||||
|
*/
|
||||||
|
public EscherPart(DirectoryNode baseDir) throws FileNotFoundException,
|
||||||
|
IOException {
|
||||||
|
super(baseDir);
|
||||||
|
|
||||||
|
// Now create our Escher children
|
||||||
|
DefaultEscherRecordFactory erf =
|
||||||
|
new DefaultEscherRecordFactory();
|
||||||
|
|
||||||
|
ArrayList ec = new ArrayList();
|
||||||
|
int left = data.length;
|
||||||
|
while(left > 0) {
|
||||||
|
EscherRecord er = erf.createRecord(data, 0);
|
||||||
|
er.fillFields(data, 0, erf);
|
||||||
|
left -= er.getRecordSize();
|
||||||
|
|
||||||
|
ec.add(er);
|
||||||
|
}
|
||||||
|
|
||||||
|
records = (EscherRecord[])
|
||||||
|
ec.toArray(new EscherRecord[ec.size()]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public EscherRecord[] getEscherRecords() {
|
||||||
|
return records;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Serialises our Escher children back
|
||||||
|
* into bytes.
|
||||||
|
*/
|
||||||
|
protected void generateData() {
|
||||||
|
int size = 0;
|
||||||
|
for(int i=0; i<records.length; i++) {
|
||||||
|
size += records[i].getRecordSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
data = new byte[size];
|
||||||
|
size = 0;
|
||||||
|
for(int i=0; i<records.length; i++) {
|
||||||
|
int thisSize =
|
||||||
|
records[i].serialize(size, data);
|
||||||
|
size += thisSize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
35
src/scratchpad/src/org/apache/poi/hpbf/model/EscherStm.java
Normal file
35
src/scratchpad/src/org/apache/poi/hpbf/model/EscherStm.java
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
package org.apache.poi.hpbf.model;
|
||||||
|
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.apache.poi.poifs.filesystem.DirectoryNode;
|
||||||
|
|
||||||
|
public class EscherStm extends EscherPart {
|
||||||
|
public EscherStm(DirectoryNode baseDir) throws FileNotFoundException,
|
||||||
|
IOException {
|
||||||
|
super(baseDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getPath() {
|
||||||
|
return new String[] {
|
||||||
|
"Escher", "EscherStm"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
@ -16,6 +16,7 @@
|
|||||||
==================================================================== */
|
==================================================================== */
|
||||||
package org.apache.poi.hpbf.model;
|
package org.apache.poi.hpbf.model;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
@ -51,8 +52,32 @@ public abstract class HPBFPart {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void writeOut(DirectoryNode baseDir) throws IOException {
|
public void writeOut(DirectoryNode baseDir) throws IOException {
|
||||||
|
String[] path = getPath();
|
||||||
|
|
||||||
|
// Ensure that all parent directories exist
|
||||||
|
DirectoryNode dir = baseDir;
|
||||||
|
for(int i=0; i<path.length-1; i++) {
|
||||||
|
try {
|
||||||
|
dir = (DirectoryNode)dir.getEntry(path[i]);
|
||||||
|
} catch(FileNotFoundException e) {
|
||||||
|
dir.createDirectory(path[i]);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update the byte array with the latest data
|
||||||
|
generateData();
|
||||||
|
|
||||||
|
// Write out
|
||||||
|
ByteArrayInputStream bais = new ByteArrayInputStream(data);
|
||||||
|
dir.createDocument(path[path.length-1], bais);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called just before writing out, to trigger
|
||||||
|
* the data byte array to be updated with the
|
||||||
|
* latest contents.
|
||||||
|
*/
|
||||||
|
protected abstract void generateData();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the raw data that makes up
|
* Returns the raw data that makes up
|
||||||
|
@ -33,4 +33,9 @@ public class MainContents extends HPBFPart {
|
|||||||
public String[] getPath() {
|
public String[] getPath() {
|
||||||
return new String[] { "Contents" };
|
return new String[] { "Contents" };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void generateData() {
|
||||||
|
// We don't parse the contents, so
|
||||||
|
// nothing will have changed
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -33,6 +33,11 @@ public class QuillContents extends HPBFPart {
|
|||||||
// all our bits
|
// all our bits
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void generateData() {
|
||||||
|
// TODO
|
||||||
|
throw new IllegalStateException("Not done yet!");
|
||||||
|
}
|
||||||
|
|
||||||
public String[] getPath() {
|
public String[] getPath() {
|
||||||
return new String[] {
|
return new String[] {
|
||||||
"Quill", "QuillSub", "CONTENTS"
|
"Quill", "QuillSub", "CONTENTS"
|
||||||
|
@ -0,0 +1,60 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
package org.apache.poi.hpbf;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
public class TestHPBFDocument extends TestCase {
|
||||||
|
private String dir;
|
||||||
|
|
||||||
|
protected void setUp() throws Exception {
|
||||||
|
dir = System.getProperty("HPBF.testdata.path");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testOpen() throws Exception {
|
||||||
|
File f = new File(dir, "Sample.pub");
|
||||||
|
HPBFDocument doc = new HPBFDocument(
|
||||||
|
new FileInputStream(f)
|
||||||
|
);
|
||||||
|
|
||||||
|
assertNotNull(doc);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testBits() throws Exception {
|
||||||
|
File f = new File(dir, "Sample.pub");
|
||||||
|
HPBFDocument doc = new HPBFDocument(
|
||||||
|
new FileInputStream(f)
|
||||||
|
);
|
||||||
|
|
||||||
|
assertNotNull(doc.getMainContents());
|
||||||
|
assertNotNull(doc.getQuillContents());
|
||||||
|
assertNotNull(doc.getEscherStm());
|
||||||
|
assertNotNull(doc.getEscherDelayStm());
|
||||||
|
|
||||||
|
assertTrue(doc.getMainContents().getData().length > 0);
|
||||||
|
assertTrue(doc.getQuillContents().getData().length > 0);
|
||||||
|
assertTrue(doc.getEscherStm().getData().length > 0);
|
||||||
|
assertTrue(doc.getEscherDelayStm().getData().length == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
// public void testWrite() throws Exception {
|
||||||
|
// }
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user