001: /* ====================================================================
002: Licensed to the Apache Software Foundation (ASF) under one or more
003: contributor license agreements. See the NOTICE file distributed with
004: this work for additional information regarding copyright ownership.
005: The ASF licenses this file to You under the Apache License, Version 2.0
006: (the "License"); you may not use this file except in compliance with
007: the License. You may obtain a copy of the License at
008:
009: http://www.apache.org/licenses/LICENSE-2.0
010:
011: Unless required by applicable law or agreed to in writing, software
012: distributed under the License is distributed on an "AS IS" BASIS,
013: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: See the License for the specific language governing permissions and
015: limitations under the License.
016: ==================================================================== */
017:
018: package org.apache.poi.poifs.filesystem;
019:
020: import java.util.*;
021:
022: import java.io.*;
023:
024: import org.apache.poi.poifs.eventfilesystem.POIFSReader;
025: import org.apache.poi.poifs.eventfilesystem.POIFSReaderEvent;
026: import org.apache.poi.poifs.eventfilesystem.POIFSReaderListener;
027:
028: /**
029: * Test (Proof of concept) program that employs the
030: * POIFSReaderListener and POIFSWriterListener interfaces
031: *
032: * @author Marc Johnson (mjohnson at apache dot org)
033: */
034:
035: public class ReaderWriter implements POIFSReaderListener,
036: POIFSWriterListener {
037: private POIFSFileSystem filesystem;
038: private DirectoryEntry root;
039:
040: // keys are DocumentDescriptors, values are byte[]s
041: private Map dataMap;
042:
043: /**
044: * Constructor ReaderWriter
045: *
046: *
047: * @param filesystem
048: *
049: */
050:
051: ReaderWriter(final POIFSFileSystem filesystem) {
052: this .filesystem = filesystem;
053: root = this .filesystem.getRoot();
054: dataMap = new HashMap();
055: }
056:
057: /**
058: * Method main
059: *
060: *
061: * @param args
062: *
063: * @exception IOException
064: *
065: */
066:
067: public static void main(String[] args) throws IOException {
068: if (args.length != 2) {
069: System.err
070: .println("two arguments required: one input file name and one output file name");
071: } else {
072: POIFSReader reader = new POIFSReader();
073: POIFSFileSystem filesystem = new POIFSFileSystem();
074:
075: reader.registerListener(new ReaderWriter(filesystem));
076: FileInputStream istream = new FileInputStream(args[0]);
077:
078: reader.read(istream);
079: istream.close();
080: FileOutputStream ostream = new FileOutputStream(args[1]);
081:
082: filesystem.writeFilesystem(ostream);
083: ostream.close();
084: }
085: }
086:
087: /* ********** START implementation of POIFSReaderListener ********** */
088:
089: /**
090: * Process a POIFSReaderEvent that this listener had registered
091: * for
092: *
093: * @param event the POIFSReaderEvent
094: */
095:
096: public void processPOIFSReaderEvent(final POIFSReaderEvent event) {
097: DocumentInputStream istream = event.getStream();
098: POIFSDocumentPath path = event.getPath();
099: String name = event.getName();
100:
101: try {
102: int size = istream.available();
103: byte[] data = new byte[istream.available()];
104:
105: istream.read(data);
106: DocumentDescriptor descriptor = new DocumentDescriptor(
107: path, name);
108:
109: System.out.println("adding document: " + descriptor + " ("
110: + size + " bytes)");
111: dataMap.put(descriptor, data);
112: int pathLength = path.length();
113: DirectoryEntry entry = root;
114:
115: for (int k = 0; k < path.length(); k++) {
116: String componentName = path.getComponent(k);
117: Entry nextEntry = null;
118:
119: try {
120: nextEntry = entry.getEntry(componentName);
121: } catch (FileNotFoundException ignored) {
122: try {
123: nextEntry = entry
124: .createDirectory(componentName);
125: } catch (IOException e) {
126: System.out
127: .println("Unable to create directory");
128: e.printStackTrace();
129: System.exit(1);
130: }
131: }
132: entry = (DirectoryEntry) nextEntry;
133: }
134: entry.createDocument(name, size, this );
135: } catch (IOException ignored) {
136: }
137: }
138:
139: /* ********** END implementation of POIFSReaderListener ********** */
140: /* ********** START implementation of POIFSWriterListener ********** */
141:
142: /**
143: * Process a POIFSWriterEvent that this listener had registered
144: * for
145: *
146: * @param event the POIFSWriterEvent
147: */
148:
149: public void processPOIFSWriterEvent(final POIFSWriterEvent event) {
150: try {
151: DocumentDescriptor descriptor = new DocumentDescriptor(
152: event.getPath(), event.getName());
153:
154: System.out.println("looking up document: " + descriptor
155: + " (" + event.getLimit() + " bytes)");
156: event.getStream().write((byte[]) dataMap.get(descriptor));
157: } catch (IOException e) {
158: System.out.println("Unable to write document");
159: e.printStackTrace();
160: System.exit(1);
161: }
162: }
163:
164: /* ********** END implementation of POIFSWriterListener ********** */
165: } // end public class ReaderWriter
|