DumpByteArrayOutputStream_FastImpl.java
/*
* GovWay - A customizable API Gateway
* https://govway.org
*
* Copyright (c) 2005-2024 Link.it srl (https://link.it).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3, as published by
* the Free Software Foundation.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openspcoop2.utils.io;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import org.openspcoop2.utils.CopyStream;
import org.openspcoop2.utils.resources.FileSystemUtilities;
import org.springframework.util.FastByteArrayOutputStream;
/**
* DumpByteArrayOutputStream_FastImpl
*
* @author Andrea Poli (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class DumpByteArrayOutputStream_FastImpl extends FastByteArrayOutputStream implements IDumpByteArrayOutputStream {
private int soglia = -1; // -1 senza soglia
private int attuale = 0;
private File repositoryFile = null;
private String idTransazione;
private String tipoMessaggio;
private File f = null;
private boolean fLocked = false;
private FileOutputStream fout = null;
DumpByteArrayOutputStream_FastImpl() {
// non e' attivo alcun controllo di soglia
}
DumpByteArrayOutputStream_FastImpl(Integer soglia, File repositoryFile, String idTransazione, String tipoMessaggio) {
this.soglia = soglia;
this.repositoryFile = repositoryFile;
this.idTransazione = idTransazione;
this.tipoMessaggio = tipoMessaggio;
}
private void checkInitFile() throws Exception {
if(this.f==null) {
this._checkInitFile();
}
}
private synchronized void _checkInitFile() throws Exception {
if(this.f==null) {
this.f = DumpByteArrayOutputStream.newFile(this.repositoryFile, this.tipoMessaggio, this.idTransazione);
super.flush();
super.close();
this.fout = new FileOutputStream(this.f);
if(super.size()>0) {
// NOTA i metodi super.toString(), super.toByteArray() e super.toByteArrayUnsafe() non ritornano nulla.
super.writeTo(this.fout);
}
}
}
@Override
public boolean isSerializedOnFileSystem() {
return this.f!=null;
}
@Override
public File getSerializedFile() {
return this.f;
}
@Override
public void lock() {
this.fLocked = true;
}
@Override
public void unlock() {
this.fLocked = false;
}
@Override
public void writeInBuffer(int b) throws IOException {
if(this.soglia>0) {
if(this.attuale>this.soglia) {
try {
this.attuale++;
if(this.f==null) {
checkInitFile();
}
if(this.fout!=null) {
this.fout.write(b);
}
else {
throw new Exception("FileOutputStream '"+this.f.getAbsolutePath()+"' closed");
}
}catch(Throwable e) {
throw new RuntimeException(e.getMessage(),e);
}
return;
}
}
this.attuale++;
super.write(b);
}
@Override
public void writeInBuffer(byte[] b, int off, int len) throws IOException {
if(this.soglia>0) {
if( (this.attuale>this.soglia) || ((this.attuale+len)>this.soglia) ) {
try {
this.attuale=this.attuale+len;
if(this.f==null) {
checkInitFile();
}
if(this.fout!=null) {
this.fout.write(b, off, len);
}
else {
throw new Exception("FileOutputStream '"+this.f.getAbsolutePath()+"' closed");
}
}catch(Throwable e) {
throw new RuntimeException(e.getMessage(),e);
}
return;
}
}
this.attuale=this.attuale+len;
super.write(b, off, len);
}
@Override
public void writeInBuffer(byte[] b) throws IOException {
if(this.soglia>0) {
if( (this.attuale>this.soglia) || ((this.attuale+b.length)>this.soglia) ) {
try {
this.attuale=this.attuale+b.length;
if(this.f==null) {
checkInitFile();
}
if(this.fout!=null) {
this.fout.write(b);
}
else {
throw new Exception("FileOutputStream '"+this.f.getAbsolutePath()+"' closed");
}
}catch(Throwable e) {
throw new RuntimeException(e.getMessage(),e);
}
return;
}
}
this.attuale=this.attuale+b.length;
super.write(b);
}
@Override
public void reset() {
clearResources();
}
@Override
public void clearResources() {
if(this.f!=null) {
_clearResources();
}
}
private synchronized void _clearResources() {
if(this.f!=null && !this.fLocked) {
try {
if(this.fout!=null) {
this.fout.flush();
this.fout.close();
this.fout = null;
}
if(!this.f.delete()) {
// ignore
}
this.f = null;
}catch(Throwable e) {
throw new RuntimeException(e.getMessage(),e);
}
}
}
@Override
public int size() {
if(this.f!=null) {
try {
return (int) this.f.length();
}catch(Throwable e) {
throw new RuntimeException(e.getMessage(),e);
}
}
else {
return super.size();
}
}
@Override
public void writeTo(OutputStream out) throws IOException {
try {
this.close();
}catch(Throwable e) {
throw new RuntimeException(e.getMessage(),e);
}
if(this.f!=null) {
try {
CopyStream.copy(this.f, out);
}catch(Throwable e) {
throw new RuntimeException(e.getMessage(),e);
}
}
else {
super.writeTo(out);
}
}
private byte[] _toByteArrayFromFastStructure() {
// NOTA i metodi super.toString(), super.toByteArray() e super.toByteArrayUnsafe() non ritornano nulla.
try {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
super.writeTo(bout);
bout.flush();
bout.close();
return bout.toByteArray();
}catch(Throwable e) {
throw new RuntimeException(e.getMessage(),e);
}
}
@Override
public byte[] toByteArray() {
return serializeToByteArray();
}
@Override
public byte[] serializeToByteArray() {
try {
this.close();
}catch(Throwable e) {
throw new RuntimeException(e.getMessage(),e);
}
if(this.f!=null) {
try {
return FileSystemUtilities.readBytesFromFile(this.f);
}catch(Throwable e) {
throw new RuntimeException(e.getMessage(),e);
}
}
else {
// NOTA i metodi super.toString(), super.toByteArray() e super.toByteArrayUnsafe() non ritornano nulla.
//return super.toByteArray();
return _toByteArrayFromFastStructure();
}
}
@Override
public String toString() {
return this.serializeToString();
}
@Override
public String serializeToString() {
try {
this.close();
}catch(Throwable e) {
throw new RuntimeException(e.getMessage(),e);
}
if(this.f!=null) {
try {
return FileSystemUtilities.readFile(this.f);
}catch(Throwable e) {
throw new RuntimeException(e.getMessage(),e);
}
}
else {
// NOTA i metodi super.toString(), super.toByteArray() e super.toByteArrayUnsafe() non ritornano nulla.
//return super.toString();
return new String(this._toByteArrayFromFastStructure());
}
}
@Override
public String serializeToString(String charsetName) throws UnsupportedEncodingException {
try {
this.close();
}catch(Throwable e) {
throw new RuntimeException(e.getMessage(),e);
}
if(this.f!=null) {
try {
return FileSystemUtilities.readFile(this.f, charsetName);
}catch(Throwable e) {
throw new RuntimeException(e.getMessage(),e);
}
}
else {
// NOTA i metodi super.toString(), super.toByteArray() e super.toByteArrayUnsafe() non ritornano nulla.
//return new String(super.toByteArray(), charsetName);
return new String(this._toByteArrayFromFastStructure(), charsetName);
}
}
@Override
public String serializeToString(Charset charset) throws UnsupportedEncodingException {
try {
this.close();
}catch(Throwable e) {
throw new RuntimeException(e.getMessage(),e);
}
if(this.f!=null) {
try {
return FileSystemUtilities.readFile(this.f, charset);
}catch(Throwable e) {
throw new RuntimeException(e.getMessage(),e);
}
}
else {
// NOTA i metodi super.toString(), super.toByteArray() e super.toByteArrayUnsafe() non ritornano nulla.
//return new String(super.toByteArray(), charset.name());
return new String(this._toByteArrayFromFastStructure(), charset.name());
}
}
@Override
public void close() {
if(this.f!=null) {
try {
if(this.fout!=null) {
this.fout.flush();
this.fout.close();
this.fout = null;
}
}catch(Throwable e) {
throw new RuntimeException(e.getMessage(),e);
}
}
else {
try {
super.flush();
}catch(Throwable e) {
throw new RuntimeException(e.getMessage(),e);
}
super.close();
}
}
@Override
public void flush() throws IOException {
if(this.f!=null) {
try {
if(this.fout!=null) {
this.fout.flush();
}
}catch(Throwable e) {
throw new RuntimeException(e.getMessage(),e);
}
}
else {
super.flush();
}
}
@Override
public InputStream getInputStream() {
try {
this.close();
}catch(Throwable e) {
throw new RuntimeException(e.getMessage(),e);
}
if(this.f!=null) {
try {
return new FileInputStream(this.f);
}catch(Throwable e) {
throw new RuntimeException(e.getMessage(),e);
}
}
else {
// NOTA i metodi super.toString(), super.toByteArray() e super.toByteArrayUnsafe() non ritornano nulla.
//return new ByteArrayInputStream(super.toByteArray());
return super.getInputStream();
}
}
}