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