Make ComponentPresetDao and interface with implementation in ComponentPresetDatabase...
[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                         InputStream is = ComponentPresetDao.class.getResourceAsStream("/datafiles/bodytubepresets.csv");
31
32                         PresetCSVReader parser = new PresetCSVReader(is);
33                         List<TypedPropertyMap> list = parser.parse();
34                         for( TypedPropertyMap o : list ) {
35                                 try {
36                                         ComponentPreset preset = ComponentPreset.create(o);
37                                         if ( favorites.contains(preset.preferenceKey())) {
38                                                 preset.setFavorite(true);
39                                         }
40                                         returnval.add(preset);
41                                 } catch ( InvalidComponentPresetException ex ) {
42                                         throw new BugException( ex );
43                                 }
44                         }
45                         return returnval;
46                 }
47                 
48         }
49         
50         public ComponentPresetDatabase() {
51                 super(new ComponentPresetLoader());
52         }
53         
54         @Override
55         public List<ComponentPreset> listAll() {
56                 return list;
57         }
58
59         @Override
60         public void insert( ComponentPreset preset ) {
61                 list.add(preset);
62         }
63
64         @Override
65         public List<ComponentPreset> listForType( ComponentPreset.Type type ) {
66                 if ( type == null ) {
67                         return Collections.<ComponentPreset>emptyList();
68                 }
69                 
70                 List<ComponentPreset> result = new ArrayList<ComponentPreset>(list.size()/6);
71
72                 for( ComponentPreset preset : list ) {
73                         if ( preset.get(ComponentPreset.TYPE).equals(type) ) {
74                                 result.add(preset);
75                         }
76                 }
77                 return result;
78
79         }
80
81         /**
82          * Return a list of component presets based on the type.
83          * All components returned will be of Type type.
84          * 
85          * @param type  
86          * @param favorite if true, only return the favorites.  otherwise return all matching.
87          * @return
88          */
89         @Override
90         public List<ComponentPreset> listForType( ComponentPreset.Type type, boolean favorite ) {
91
92                 if ( !favorite ) {
93                         return listForType(type);
94                 }
95
96                 List<ComponentPreset> result = new ArrayList<ComponentPreset>(list.size()/6);
97
98                 for( ComponentPreset preset : list ) {
99                         if ( preset.isFavorite() && preset.get(ComponentPreset.TYPE).equals(type) ) {
100                                 result.add(preset);
101                         }
102                 }
103                 return result;
104         }
105
106         @Override
107         public List<ComponentPreset> listForTypes( ComponentPreset.Type ... type ) {
108
109                 if( type == null || type.length == 0 ) {
110                         return Collections.<ComponentPreset>emptyList();
111                 }
112
113                 if (type.length == 1 ) {
114                         return listForType(type[0]);
115                 }
116
117                 List<ComponentPreset> result = new ArrayList<ComponentPreset>(list.size()/6);
118
119                 for( ComponentPreset preset : list ) {
120                         ComponentPreset.Type presetType = preset.get(ComponentPreset.TYPE);
121                         typeLoop: for( int i=0; i<type.length; i++ ) {
122                                 if ( !presetType.equals(type) ) {
123                                         result.add(preset);
124                                         break typeLoop; // from inner loop.
125                                 }
126                         }
127
128                 }
129                 return result;
130         }
131
132         @Override
133         public void setFavorite( ComponentPreset preset, boolean favorite ) {
134                 preset.setFavorite(favorite);
135                 Application.getPreferences().setComponentFavorite( preset, favorite );
136                 this.fireAddEvent(preset);
137         }
138
139 }