package net.sf.openrocket.file.motor;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.sf.openrocket.file.UnknownFileTypeException;
import net.sf.openrocket.motor.Motor;
import net.sf.openrocket.util.UncloseableInputStream;
/**
* A motor loader that loads motors from a ZIP file.
*
* @author Sampo Niskanen <sampo.niskanen@iki.fi>
*/
public class ZipFileMotorLoader implements MotorLoader {
private static final Logger log = LoggerFactory.getLogger(ZipFileMotorLoader.class);
private final MotorLoader loader;
/**
* Construct a ZipFileMotorLoader that loads files using a
* {@link GeneralMotorLoader}.
*/
public ZipFileMotorLoader() {
this(new GeneralMotorLoader());
}
/**
* Constructs a ZipFileMotorLoader that loads files using the provided motor loader.
*
* @param loader the motor loader to use when loading.
*/
public ZipFileMotorLoader(MotorLoader loader) {
this.loader = loader;
}
@Override
public List<Motor> load(InputStream stream, String filename) throws IOException {
List<Motor> motors = new ArrayList<Motor>();
ZipInputStream is = new ZipInputStream(stream);
// SAX seems to close the input stream, prevent it
InputStream uncloseable = new UncloseableInputStream(is);
while (true) {
ZipEntry entry = is.getNextEntry();
if (entry == null)
break;
if (entry.isDirectory())
continue;
// Get the file name of the entry
String name = entry.getName();
int index = name.lastIndexOf('/');
if (index < 0) {
index = name.lastIndexOf('\\');
}
if (index >= 0) {
name = name.substring(index + 1);
}
try {
List<Motor> m = loader.load(uncloseable, entry.getName());
motors.addAll(m);
log.info("Loaded " + m.size() + " motors from ZIP entry " + entry.getName());
} catch (UnknownFileTypeException e) {
log.info("Could not read ZIP entry " + entry.getName() + ": " + e.getMessage());
}
}
return motors;
}
}