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