Implement a multithreaded pipeline to load the component preset files. This greatly...
[debian/openrocket] / core / src / net / sf / openrocket / database / ComponentPresetDatabase.java
1 package net.sf.openrocket.database;
2
3 import java.io.InputStream;
4 import java.io.InputStreamReader;
5 import java.util.ArrayList;
6 import java.util.Collection;
7 import java.util.Collections;
8 import java.util.List;
9 import java.util.Set;
10
11 import javax.xml.bind.JAXBException;
12
13 import net.sf.openrocket.file.Loader;
14 import net.sf.openrocket.logging.LogHelper;
15 import net.sf.openrocket.preset.ComponentPreset;
16 import net.sf.openrocket.preset.InvalidComponentPresetException;
17 import net.sf.openrocket.preset.xml.OpenRocketComponentSaver;
18 import net.sf.openrocket.startup.Application;
19 import net.sf.openrocket.util.BugException;
20
21 public class ComponentPresetDatabase extends Database<ComponentPreset> implements ComponentPresetDao {
22
23         private static final LogHelper log = Application.getLogger();
24
25         public static class ComponentPresetLoader implements Loader<ComponentPreset> {
26
27                 @Override
28                 public Collection<ComponentPreset> load(InputStream stream,     String filename) {
29
30                         log.debug("Loading presets from file " + filename);
31
32                         Set<String> favorites = Application.getPreferences().getComponentFavorites();
33
34                         try {
35                                 List<ComponentPreset> presets;
36                                 presets = new OpenRocketComponentSaver().unmarshalFromOpenRocketComponent( new InputStreamReader (stream));
37                                 for( ComponentPreset preset : presets ) {
38                                         if ( favorites.contains(preset.preferenceKey())) {
39                                                 preset.setFavorite(true);
40                                         }
41                                 }                               
42                                 log.debug("ComponentPreset file " + filename + " contained " + presets.size() + " presets");
43                                 return presets;
44                         } catch (JAXBException e) {
45                                 throw new BugException("Unable to parser file: "+ filename, e);
46                         } catch (InvalidComponentPresetException e) {
47                                 throw new BugException("Unable to parser file: "+ filename, e);
48                         }
49
50                 }
51
52         }
53
54         public ComponentPresetDatabase() {
55                 super(new ComponentPresetLoader());
56         }
57
58         @Override
59         public List<ComponentPreset> listAll() {
60                 return list;
61         }
62
63         @Override
64         public void insert( ComponentPreset preset ) {
65                 list.add(preset);
66         }
67
68         @Override
69         public List<ComponentPreset> listForType( ComponentPreset.Type type ) {
70                 if ( type == null ) {
71                         return Collections.<ComponentPreset>emptyList();
72                 }
73
74                 List<ComponentPreset> result = new ArrayList<ComponentPreset>(list.size()/6);
75
76                 for( ComponentPreset preset : list ) {
77                         if ( preset.get(ComponentPreset.TYPE).equals(type) ) {
78                                 result.add(preset);
79                         }
80                 }
81                 return result;
82
83         }
84
85         /**
86          * Return a list of component presets based on the type.
87          * All components returned will be of Type type.
88          * 
89          * @param type  
90          * @param favorite if true, only return the favorites.  otherwise return all matching.
91          * @return
92          */
93         @Override
94         public List<ComponentPreset> listForType( ComponentPreset.Type type, boolean favorite ) {
95
96                 if ( !favorite ) {
97                         return listForType(type);
98                 }
99
100                 List<ComponentPreset> result = new ArrayList<ComponentPreset>(list.size()/6);
101
102                 for( ComponentPreset preset : list ) {
103                         if ( preset.isFavorite() && preset.get(ComponentPreset.TYPE).equals(type) ) {
104                                 result.add(preset);
105                         }
106                 }
107                 return result;
108         }
109
110         @Override
111         public List<ComponentPreset> listForTypes( ComponentPreset.Type ... type ) {
112
113                 if( type == null || type.length == 0 ) {
114                         return Collections.<ComponentPreset>emptyList();
115                 }
116
117                 if (type.length == 1 ) {
118                         return listForType(type[0]);
119                 }
120
121                 List<ComponentPreset> result = new ArrayList<ComponentPreset>(list.size()/6);
122
123                 for( ComponentPreset preset : list ) {
124                         ComponentPreset.Type presetType = preset.get(ComponentPreset.TYPE);
125                         typeLoop: for( int i=0; i<type.length; i++ ) {
126                                 if ( presetType.equals(type[i]) ) {
127                                         result.add(preset);
128                                         break typeLoop; // from inner loop.
129                                 }
130                         }
131
132                 }
133                 return result;
134         }
135
136         @Override
137         public List<ComponentPreset> listForTypes( List<ComponentPreset.Type> types ) {
138                 return listForTypes( (ComponentPreset.Type[]) types.toArray() );
139         }
140
141         @Override
142         public List<ComponentPreset> find(String manufacturer, String partNo) {
143                 List<ComponentPreset> presets = new ArrayList<ComponentPreset>();
144                 for( ComponentPreset preset : list ) {
145                         if ( preset.getManufacturer().getSimpleName().equals(manufacturer) && preset.getPartNo().equals(partNo) ) {
146                                 presets.add(preset);
147                         }
148                 }
149                 return presets;
150         }
151
152         @Override
153         public void setFavorite( ComponentPreset preset, boolean favorite ) {
154                 preset.setFavorite(favorite);
155                 Application.getPreferences().setComponentFavorite( preset, favorite );
156                 this.fireAddEvent(preset);
157         }
158
159 }