| /* ==================================================================== |
| 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.openxml4j.opc.internal; |
| |
| import java.io.ByteArrayInputStream; |
| import java.io.ByteArrayOutputStream; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.OutputStream; |
| |
| import org.apache.poi.openxml4j.exceptions.InvalidFormatException; |
| import org.apache.poi.openxml4j.exceptions.OpenXML4JException; |
| import org.apache.poi.openxml4j.opc.OPCPackage; |
| import org.apache.poi.openxml4j.opc.PackagePart; |
| import org.apache.poi.openxml4j.opc.PackagePartName; |
| import org.apache.poi.openxml4j.opc.internal.marshallers.ZipPartMarshaller; |
| import org.apache.poi.util.IOUtils; |
| |
| /** |
| * Memory version of a package part. Use to |
| * |
| * @author Julien Chable |
| * @version 1.0 |
| */ |
| public final class MemoryPackagePart extends PackagePart { |
| |
| /** |
| * Storage for the part data. |
| */ |
| protected byte[] data; |
| |
| /** |
| * Constructor. |
| * |
| * @param pack |
| * The owner package. |
| * @param partName |
| * The part name. |
| * @param contentType |
| * The content type. |
| * @throws InvalidFormatException |
| * If the specified URI is not OPC compliant. |
| */ |
| public MemoryPackagePart(OPCPackage pack, PackagePartName partName, |
| String contentType) throws InvalidFormatException { |
| super(pack, partName, contentType); |
| } |
| |
| /** |
| * Constructor. |
| * |
| * @param pack |
| * The owner package. |
| * @param partName |
| * The part name. |
| * @param contentType |
| * The content type. |
| * @param loadRelationships |
| * Specify if the relationships will be loaded. |
| * @throws InvalidFormatException |
| * If the specified URI is not OPC compliant. |
| */ |
| public MemoryPackagePart(OPCPackage pack, PackagePartName partName, |
| String contentType, boolean loadRelationships) |
| throws InvalidFormatException { |
| super(pack, partName, new ContentType(contentType), loadRelationships); |
| } |
| |
| @Override |
| protected InputStream getInputStreamImpl() { |
| // If this part has been created from scratch and/or the data buffer is |
| // not |
| // initialize, so we do it now. |
| if (data == null) { |
| data = new byte[0]; |
| } |
| return new ByteArrayInputStream(data); |
| } |
| |
| @Override |
| protected OutputStream getOutputStreamImpl() { |
| return new MemoryPackagePartOutputStream(this); |
| } |
| |
| @Override |
| public long getSize() { |
| return data == null ? 0 : data.length; |
| } |
| |
| @Override |
| public void clear() { |
| data = null; |
| } |
| |
| @Override |
| public boolean save(OutputStream os) throws OpenXML4JException { |
| return new ZipPartMarshaller().marshall(this, os); |
| } |
| |
| @Override |
| public boolean load(InputStream ios) throws InvalidFormatException { |
| // Grab the data |
| ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
| try { |
| IOUtils.copy(ios, baos); |
| } catch(IOException e) { |
| throw new InvalidFormatException(e.getMessage()); |
| } |
| |
| // Save it |
| data = baos.toByteArray(); |
| |
| // All done |
| return true; |
| } |
| |
| @Override |
| public void close() { |
| // Do nothing |
| } |
| |
| @Override |
| public void flush() { |
| // Do nothing |
| } |
| } |