/**
* Licensed to the Austrian Association for Software Tool Integration (AASTI)
* under one or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information regarding copyright
* ownership. The AASTI 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.openengsb.core.api.model;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
/**
* The FileWrapper class is needed for the proper sending of File objects (with Jason).
*/
public class FileWrapper {
private File file;
private byte[] content;
private String filename;
private int buffer = 2048;
private String tempDir = System.getProperty("java.io.tmpdir") + File.separator + "OpenEngSBModelTemp";
public FileWrapper() {
}
public FileWrapper(File file) {
this.file = file;
}
public FileWrapper(byte[] content, String filename) {
this.content = content;
this.filename = filename;
}
public File returnFile() throws IOException {
if (file == null) {
deserialize();
}
return file;
}
public void setFile(File file) {
this.file = file;
content = null;
filename = null;
}
public byte[] getContent() throws IOException {
if (content == null) {
serialize();
}
return content;
}
public void setContent(byte[] content) {
this.content = content;
}
public void setFilename(String filename) {
this.filename = filename;
}
public String getFilename() {
if (filename == null) {
return file.getName();
}
return filename;
}
public void serialize() throws IOException {
File zipFile = zipFile(file);
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(zipFile);
byte[] data = new byte[(int) zipFile.length()];
fileInputStream.read(data);
this.filename = file.getName();
this.content = data;
FileUtils.forceDelete(zipFile);
} finally {
if (fileInputStream != null) {
IOUtils.closeQuietly(fileInputStream);
}
}
file = null;
}
public void deserialize() throws IOException {
File f = new File(tempDir + File.separator + filename + ".zip");
FileOutputStream stream = null;
try {
f.createNewFile();
stream = new FileOutputStream(f);
IOUtils.write(content, stream);
stream.flush();
} finally {
IOUtils.closeQuietly(stream);
}
file = unzipFile(f, filename);
content = null;
filename = null;
}
private File zipFile(File file) throws IOException {
File result = new File(tempDir + File.separator + file.getName() + ".zip");
result.getParentFile().mkdir();
ZipOutputStream out = null;
try {
out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(result)));
byte[] data = new byte[buffer];
File[] files;
if (file.isDirectory()) {
files = file.listFiles();
} else {
files = new File[1];
files[0] = file;
}
for (File f : files) {
FileInputStream fi = new FileInputStream(f);
BufferedInputStream bis = new BufferedInputStream(fi, buffer);
ZipEntry entry = new ZipEntry(f.getName());
out.putNextEntry(entry);
int count;
while ((count = bis.read(data, 0, buffer)) != -1) {
out.write(data, 0, count);
}
bis.close();
}
} finally {
IOUtils.closeQuietly(out);
}
return result;
}
private File unzipFile(File file, String fileName) throws IOException {
String parentPath = file.getParentFile().getAbsolutePath();
File result = new File(parentPath + File.separator + fileName);
BufferedOutputStream dest = null;
BufferedInputStream is = null;
ZipEntry entry;
ZipFile zipfile = new ZipFile(file);
int entryCount = zipfile.size();
@SuppressWarnings("rawtypes")
Enumeration e = zipfile.entries();
String elementPath = "";
if (entryCount == 1) {
elementPath = parentPath;
} else {
result.mkdir();
elementPath = parentPath + File.separator + fileName;
}
while (e.hasMoreElements()) {
entry = (ZipEntry) e.nextElement();
is = new BufferedInputStream(zipfile.getInputStream(entry));
int count;
byte[] data = new byte[buffer];
FileOutputStream fos = new FileOutputStream(elementPath + File.separator + entry.getName());
dest = new BufferedOutputStream(fos, buffer);
while ((count = is.read(data, 0, buffer)) != -1) {
dest.write(data, 0, count);
}
dest.flush();
dest.close();
is.close();
}
FileUtils.forceDelete(file);
return result;
}
}