create changelog entry
[debian/openrocket] / core / src / net / sf / openrocket / file / motor / ZipFileMotorLoader.java
1 package net.sf.openrocket.file.motor;
2
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.util.ArrayList;
6 import java.util.List;
7 import java.util.zip.ZipEntry;
8 import java.util.zip.ZipInputStream;
9
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;
15
16 /**
17  * A motor loader that loads motors from a ZIP file.
18  * 
19  * @author Sampo Niskanen <sampo.niskanen@iki.fi>
20  */
21 public class ZipFileMotorLoader implements MotorLoader {
22         private static final LogHelper log = Application.getLogger();
23         
24         private final MotorLoader loader;
25         
26         
27         /**
28          * Construct a ZipFileMotorLoader that loads files using a 
29          * {@link GeneralMotorLoader}.
30          */
31         public ZipFileMotorLoader() {
32                 this(new GeneralMotorLoader());
33         }
34         
35         /**
36          * Constructs a ZipFileMotorLoader that loads files using the provided motor loader.
37          * 
38          * @param loader        the motor loader to use when loading.
39          */
40         public ZipFileMotorLoader(MotorLoader loader) {
41                 this.loader = loader;
42         }
43         
44         
45         @Override
46         public List<Motor> load(InputStream stream, String filename) throws IOException {
47                 List<Motor> motors = new ArrayList<Motor>();
48                 
49                 ZipInputStream is = new ZipInputStream(stream);
50                 
51                 // SAX seems to close the input stream, prevent it
52                 InputStream uncloseable = new UncloseableInputStream(is);
53                 
54                 while (true) {
55                         ZipEntry entry = is.getNextEntry();
56                         if (entry == null)
57                                 break;
58                         
59                         if (entry.isDirectory())
60                                 continue;
61                         
62                         // Get the file name of the entry
63                         String name = entry.getName();
64                         int index = name.lastIndexOf('/');
65                         if (index < 0) {
66                                 index = name.lastIndexOf('\\');
67                         }
68                         if (index >= 0) {
69                                 name = name.substring(index + 1);
70                         }
71                         
72                         try {
73                                 List<Motor> m = loader.load(uncloseable, entry.getName());
74                                 motors.addAll(m);
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());
78                         }
79                         
80                 }
81                 
82                 return motors;
83         }
84         
85 }