/* * Copyright (C) 2012 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.services.jcr.impl.dataflow; import org.exoplatform.services.jcr.core.value.EditableBinaryValue; import java.io.IOException; import java.io.InputStream; import javax.jcr.RepositoryException; /** * @author <a href="abazko@exoplatform.com">Anatoliy Bazko</a> * @version $Id: ByteArrayNewEditableValueData.java 34360 2009-07-22 23:58:59Z tolusha $ */ public class ByteArrayNewEditableValueData extends ByteArrayNewValueData implements EditableBinaryValue { /** * ByteArrayNewEditableValueData constructor. */ public ByteArrayNewEditableValueData(int orderNumber, byte[] bytes) throws IOException { super(orderNumber, bytes); } /** * {@inheritDoc} */ public void update(InputStream stream, long length, long position) throws IOException, RepositoryException { validateAndAdjustLenght(length, position, Integer.MAX_VALUE); long newSize = Math.max(length + position, value.length); byte[] newBytes = new byte[(int)newSize]; if (position > 0) { // begin from the existed bytes System.arraycopy(value, 0, newBytes, 0, (int)(position < value.length ? position : value.length)); } // write new data long read; boolean doRead = true; byte[] buff = new byte[2048]; while (doRead && (read = stream.read(buff)) >= 0) { if (position + read > newBytes.length) { // given length reached read = newBytes.length - position; doRead = false; } System.arraycopy(buff, 0, newBytes, (int)position, (int)read); position += read; } if (position < value.length) { // write the rest of existed data System.arraycopy(value, (int)position, newBytes, (int)position, (int)(value.length - position)); } value = newBytes; } /** * {@inheritDoc} */ public void setLength(long size) throws IOException, RepositoryException { if (size < 0) { throw new IOException("Size must be higher or equals 0. But given " + size); } byte[] newBytes = new byte[(int)size]; System.arraycopy(value, 0, newBytes, 0, Math.min(value.length, newBytes.length)); value = newBytes; } }