List of usage examples for org.apache.poi.poifs.filesystem DirectoryEntry createDirectory
public DirectoryEntry createDirectory(final String name) throws IOException;
From source file:org.elasticwarehouse.core.parsers.FileEmbeddedDocumentExtractor.java
License:Apache License
protected void copy(DirectoryEntry sourceDir, DirectoryEntry destDir) throws IOException { for (org.apache.poi.poifs.filesystem.Entry entry : sourceDir) { if (entry instanceof DirectoryEntry) { // Need to recurse DirectoryEntry newDir = destDir.createDirectory(entry.getName()); copy((DirectoryEntry) entry, newDir); } else {/*w ww . j a va 2 s. c om*/ // Copy entry InputStream contents = new DocumentInputStream((DocumentEntry) entry); try { destDir.createDocument(entry.getName(), contents); } finally { contents.close(); } } } }
From source file:tv.amwa.maj.io.aaf.AAFBuilder.java
License:Apache License
final static int processPropertyValue(PropertyDefinition property, PropertyValue value, DirectoryEntry classDir, AAFWriterListener aafWriter, String path) throws IOException { int propertySize = 0; TypeDefinition propertyType = value.getType(); String dirName = null;//w w w .ja v a 2s .c o m if (property.getAUID().equals(AAFConstants.ParametersID)) { // TypeDefinition setRefType = ((TypeDefinitionVariableArray) propertyType).getType(); List<PropertyValue> setElements = ((TypeDefinitionVariableArray) propertyType).getElements(value); dirName = makeAAFPathPartReference(property, aafWriter.getLocalID(property.getAUID())); propertySize += dirName.length() * 2 + 2; int elementCount = 0; byte identificationSize = 16; classDir.createDocument(dirName + " index", 15 + ((8 + identificationSize) * setElements.size()), aafWriter); aafWriter.addIndexValue(path + File.separator + dirName + " index", value); for (PropertyValue setElement : setElements) { DirectoryEntry newSetDir = classDir .createDirectory(dirName + "{" + Integer.toHexString(elementCount) + "}"); generateAAFStructure(newSetDir, aafWriter, (MetadataObject) setElement.getValue()); elementCount++; } return propertySize; } switch (propertyType.getTypeCategory()) { case WeakObjRef: propertySize += 21; aafWriter.registerWeakType((TypeDefinitionWeakObjectReference) propertyType); break; case StrongObjRef: MetadataObject propertyValue = (MetadataObject) value.getValue(); dirName = makeAAFPathPartName(property, aafWriter.getLocalID(property.getAUID())); propertySize += dirName.length() * 2 + 2; DirectoryEntry newDir = classDir.createDirectory(dirName); generateAAFStructure(newDir, aafWriter, propertyValue); break; case Set: TypeDefinition setRefType = ((TypeDefinitionSet) propertyType).getElementType(); Set<PropertyValue> setElements = ((TypeDefinitionSet) propertyType).getElements(value); if (property.getAUID().equals(PropertiesID)) { PropertyValue toRemove = null; for (PropertyValue element : setElements) { if (((PropertyDefinition) element.getValue()).getAUID().equals(ApplicationPluginsID)) { toRemove = element; break; } } if (toRemove != null) { setElements.remove(toRemove); aafWriter.setInterchangePath(path); } } if ((setRefType.getTypeCategory() != TypeCategory.StrongObjRef) && (setRefType.getTypeCategory() != TypeCategory.WeakObjRef)) { if (setElements.size() == 0) break; PropertyValue sampleValue = null; for (PropertyValue findMeASample : setElements) { sampleValue = findMeASample; break; } propertySize += setElements.size() * setRefType.lengthAsBytes(sampleValue); break; } dirName = makeAAFPathPartReference(property, aafWriter.getLocalID(property.getAUID())); propertySize += dirName.length() * 2 + 2; int elementCount = 0; if (setRefType.getTypeCategory() == TypeCategory.StrongObjRef) { PropertyValue sampleValue = null; for (PropertyValue findMeASample : setElements) { sampleValue = findMeASample; break; } ClassDefinition referencedValueClass = ((TypeDefinitionStrongObjectReference) setRefType) .getObjectType(); byte identificationSize = 0; PropertyDefinition uniqueProperty = null; if ((setElements.size() > 0) && (referencedValueClass.isUniquelyIdentified())) { uniqueProperty = referencedValueClass.getUniqueIdentifierProperty(); PropertyValue sampleIDValue = uniqueProperty .getPropertyValue((MetadataObject) sampleValue.getValue()); identificationSize = (byte) uniqueProperty.getTypeDefinition().lengthAsBytes(sampleIDValue); } else { identificationSize = 0; } classDir.createDocument(dirName + " index", 15 + ((8 + identificationSize) * setElements.size()), aafWriter); aafWriter.addIndexValue(path + File.separator + dirName + " index", value); } if (setRefType.getTypeCategory() == TypeCategory.WeakObjRef) { classDir.createDocument(dirName + " index", 9 + 16 * setElements.size(), aafWriter); aafWriter.addIndexValue(path + File.separator + dirName + " index", value); } for (PropertyValue setElement : setElements) { switch (setRefType.getTypeCategory()) { case StrongObjRef: DirectoryEntry newSetDir = classDir .createDirectory(dirName + "{" + Integer.toHexString(elementCount) + "}"); generateAAFStructure(newSetDir, aafWriter, (MetadataObject) setElement.getValue()); break; case WeakObjRef: aafWriter.registerWeakType((TypeDefinitionWeakObjectReference) setRefType); break; default: break; } elementCount++; } break; case VariableArray: TypeDefinition arrayRefType = ((TypeDefinitionVariableArray) propertyType).getType(); List<PropertyValue> listElements = ((TypeDefinitionVariableArray) propertyType).getElements(value); // if ((arrayRefType.getTypeCategory() != TypeCategory.StrongObjRef) && // (arrayRefType.getTypeCategory() != TypeCategory.WeakObjRef)) { // // if (listElements.size() == 0) return; // // propertiesSize += listElements.size() * arrayRefType.lengthAsBytes(listElements.get(0)); // break; // } if (arrayRefType.getTypeCategory() == TypeCategory.StrongObjRef) { dirName = makeAAFPathPartReference(property, aafWriter.getLocalID(property.getAUID())); propertySize += dirName.length() * 2 + 2; classDir.createDocument(dirName + " index", 12 + 4 * listElements.size(), aafWriter); // TODO size aafWriter.addIndexValue(path + File.separator + dirName + " index", value); } if (arrayRefType.getTypeCategory() == TypeCategory.WeakObjRef) { dirName = makeAAFPathPartReference(property, aafWriter.getLocalID(property.getAUID())); propertySize += dirName.length() * 2 + 2; classDir.createDocument(dirName + " index", 9 + 16 * listElements.size(), aafWriter); aafWriter.addIndexValue(path + File.separator + dirName + " index", value); } for (int x = 0; x < listElements.size(); x++) { PropertyValue listElement = listElements.get(x); switch (arrayRefType.getTypeCategory()) { case StrongObjRef: DirectoryEntry newArrayDir = classDir .createDirectory(dirName + "{" + Integer.toHexString(x) + "}"); generateAAFStructure(newArrayDir, aafWriter, (MetadataObject) listElement.getValue()); break; case WeakObjRef: aafWriter.registerWeakType((TypeDefinitionWeakObjectReference) arrayRefType); break; case Character: // TODO Assuming UTF16String propertySize += ((String) listElement.getValue()).length() * 2 + 2; break; default: propertySize += listElement.getType().lengthAsBytes(listElement); break; } // switch } // for break; case Indirect: propertySize += value.getType().lengthAsBytes(value) + 1; // for the mystery 4c break; case Stream: dirName = makeAAFPathPartName(property, aafWriter.getLocalID(property.getAUID())); Stream stream = (Stream) value.getValue(); DocumentEntry streamDocument = classDir.createDocument(dirName, (int) stream.getLength(), aafWriter); aafWriter.registerStreamDocument(streamDocument, stream); propertySize += dirName.length() * 2 + 2 + 1; break; default: if (property.getAUID().equals(ByteOrderPropertyID)) propertySize += 2; else propertySize += value.getType().lengthAsBytes(value); break; } return propertySize; }
From source file:tv.amwa.maj.io.aaf.AAFBuilder.java
License:Apache License
/** * @param args// w w w . j a v a 2 s . co m */ public static void main(String[] args) throws IOException { if (args.length != 2) System.exit(1); final String inputFilename = args[0]; final String outputFilename = args[1]; POIFSReader r = new AAFReader(); LocalAAFEventReader eventReader = new LocalAAFEventReader(); r.registerListener(eventReader); AvidFactory.registerAvidExtensions(); FileInputStream fis = null; long startTime = System.nanoTime(); try { fis = new FileInputStream(inputFilename); r.read(new FileInputStream(inputFilename)); eventReader.resolveEntries(); } finally { if (fis != null) try { fis.close(); } catch (Exception e) { } } long endTime = System.nanoTime(); System.out.println("AAF file read in " + (endTime - startTime) + "ns."); ((PrefaceImpl) eventReader.getPreface()).setByteOrder(tv.amwa.maj.enumeration.ByteOrder.Big); System.out.println(eventReader.getPreface().getByteOrder()); POIFSFileSystem outputFileSystem = new POIFSFileSystem(); DirectoryEntry rootDir = outputFileSystem.getRoot(); AAFWriterListener aafWriter = makeAAFWriterListener(); DirectoryEntry metaDictionaryDir = rootDir.createDirectory(META_DICTIONARY_DIRNAME); DirectoryEntry prefaceDir = rootDir.createDirectory(PREFACE_DIRNAME); generateAAFStructure(prefaceDir, aafWriter, eventReader.getPreface()); generateMetaDictionary(metaDictionaryDir, aafWriter, eventReader.getPreface()); rootDir.createDocument(PROPERTIES_STREAMNAME, 70, aafWriter); rootDir.createDocument(REFERENCED_PROPERTIES_STREAMNAME, aafWriter.getReferencedPropertiesSize(), aafWriter); // rootDir.setStorageClsid( // (outputFileSystem.getBigBlockSize() == 4096) ? // new AAFClassID(AAFSignatureSSBin4K) : // new AAFClassID(AAFSignatureSSBinary)); rootDir.setStorageClsid(new ClassID(rootEntryClassID, 0)); FileOutputStream fos = null; try { fos = new FileOutputStream(outputFilename); outputFileSystem.writeFilesystem(fos); } finally { if (fos != null) try { fos.close(); } catch (Exception e) { } } // AAF puts a signature in bytes 8-23 of the file // POIFS cannot write this RandomAccessFile fixFile = null; FileChannel fixChannel = null; try { fixFile = new RandomAccessFile(outputFilename, "rw"); fixChannel = fixFile.getChannel(); fixChannel.position(8); if (outputFileSystem.getBigBlockSize() == 4096) fixChannel.write(ByteBuffer.wrap(AAFSignatureSSBin4KBytes)); else fixChannel.write(ByteBuffer.wrap(AAFSignatureSSBinaryBytes)); } finally { if (fixChannel != null) fixChannel.close(); } }
From source file:tv.amwa.maj.io.aaf.AAFFactory.java
License:Apache License
/** * <p>Write an AAF file with the given filename that is constructed from the given {@linkplain Preface preface}.<p> * //from w w w. j a v a2 s .c o m * <p>Note that this version of MAJ only supports writing metadata-only files.</p> * * @param preface Preface to use to construct an AAF file from. * @param outputFilename File path specification for the file to write the preface to. * * @throws IOException An error occurred when writing the AAF file. * * @see #readPreface(String) */ public final static void writePreface(Preface preface, String outputFilename) throws IOException { POIFSFileSystem outputFileSystem = new POIFSFileSystem(); DirectoryEntry rootDir = outputFileSystem.getRoot(); preface.updateDictionaries(); // System.out.println(preface); AAFWriterListener aafWriter = AAFBuilder.makeAAFWriterListener(); DirectoryEntry metaDictionaryDir = rootDir.createDirectory(META_DICTIONARY_DIRNAME); DirectoryEntry prefaceDir = rootDir.createDirectory(PREFACE_DIRNAME); AAFBuilder.generateAAFStructure(prefaceDir, aafWriter, preface); AAFBuilder.generateMetaDictionary(metaDictionaryDir, aafWriter, preface); rootDir.createDocument(PROPERTIES_STREAMNAME, 70, aafWriter); rootDir.createDocument(REFERENCED_PROPERTIES_STREAMNAME, aafWriter.getReferencedPropertiesSize(), aafWriter); // rootDir.setStorageClsid( // (outputFileSystem.getBigBlockSize() == 4096) ? // new AAFClassID(AAFSignatureSSBin4K) : // new AAFClassID(AAFSignatureSSBinary)); rootDir.setStorageClsid(new ClassID(rootEntryClassID, 0)); FileOutputStream fos = null; try { fos = new FileOutputStream(outputFilename); outputFileSystem.writeFilesystem(fos); } finally { if (fos != null) try { fos.close(); } catch (Exception e) { } } // AAF puts a signature in bytes 8-23 of the file // POIFS cannot write this RandomAccessFile fixFile = null; FileChannel fixChannel = null; try { fixFile = new RandomAccessFile(outputFilename, "rw"); fixChannel = fixFile.getChannel(); fixChannel.position(8); if (outputFileSystem.getBigBlockSize() == 4096) fixChannel.write(ByteBuffer.wrap(AAFSignatureSSBin4KBytes)); else fixChannel.write(ByteBuffer.wrap(AAFSignatureSSBinaryBytes)); } finally { if (fixChannel != null) fixChannel.close(); } }