1 package net.sf.openrocket.file.motor;
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.util.ArrayList;
7 import java.util.zip.ZipEntry;
8 import java.util.zip.ZipInputStream;
10 import net.sf.openrocket.file.UnknownFileTypeException;
11 import net.sf.openrocket.logging.LogHelper;
12 import net.sf.openrocket.motor.Motor;
13 import net.sf.openrocket.startup.Application;
14 import net.sf.openrocket.util.UncloseableInputStream;
17 * A motor loader that loads motors from a ZIP file.
19 * @author Sampo Niskanen <sampo.niskanen@iki.fi>
21 public class ZipFileMotorLoader implements MotorLoader {
22 private static final LogHelper log = Application.getLogger();
24 private final MotorLoader loader;
28 * Construct a ZipFileMotorLoader that loads files using a
29 * {@link GeneralMotorLoader}.
31 public ZipFileMotorLoader() {
32 this(new GeneralMotorLoader());
36 * Constructs a ZipFileMotorLoader that loads files using the provided motor loader.
38 * @param loader the motor loader to use when loading.
40 public ZipFileMotorLoader(MotorLoader loader) {
46 public List<Motor> load(InputStream stream, String filename) throws IOException {
47 List<Motor> motors = new ArrayList<Motor>();
49 ZipInputStream is = new ZipInputStream(stream);
51 // SAX seems to close the input stream, prevent it
52 InputStream uncloseable = new UncloseableInputStream(is);
55 ZipEntry entry = is.getNextEntry();
59 if (entry.isDirectory())
62 // Get the file name of the entry
63 String name = entry.getName();
64 int index = name.lastIndexOf('/');
66 index = name.lastIndexOf('\\');
69 name = name.substring(index + 1);
73 List<Motor> m = loader.load(uncloseable, entry.getName());
75 log.info("Loaded " + m.size() + " motors from ZIP entry " + entry.getName());
76 } catch (UnknownFileTypeException e) {
77 log.info("Could not read ZIP entry " + entry.getName() + ": " + e.getMessage());