1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.myfaces.tobago.example.demo;
21
22 import com.google.gson.Gson;
23 import com.google.gson.GsonBuilder;
24 import com.google.gson.reflect.TypeToken;
25 import org.apache.myfaces.tobago.model.SelectItem;
26
27 import javax.enterprise.context.SessionScoped;
28 import javax.inject.Named;
29 import javax.swing.tree.DefaultMutableTreeNode;
30 import java.io.InputStreamReader;
31 import java.io.Serializable;
32 import java.util.ArrayList;
33 import java.util.Arrays;
34 import java.util.HashMap;
35 import java.util.List;
36 import java.util.Map;
37 import java.util.stream.Collectors;
38 import java.util.stream.Stream;
39
40
41 @SessionScoped
42 @Named
43 public class AstroData implements Serializable {
44
45 private final List<SolarObject> dataList;
46 private final Map<String, SolarObject> dataMap;
47
48 private final List<SelectItem> planets;
49 private final List<SelectItem> terrestrialPlanets;
50 private final List<SelectItem> giantPlanets;
51
52 public AstroData() {
53
54 final InputStreamReader reader
55 = new InputStreamReader(AstroData.class.getResourceAsStream("astro-data.json"));
56
57 Gson gson = new GsonBuilder().create();
58 dataList = gson.fromJson(reader, new TypeToken<ArrayList<SolarObject>>(){}.getType());
59 dataMap = new HashMap<>(dataList.size());
60 for (SolarObject solarObject : dataList) {
61 dataMap.put(solarObject.getName(), solarObject);
62 }
63
64 planets = findByName("Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune")
65 .map(planet -> new SelectItem(planet, planet.getName())).collect(Collectors.toList());
66 terrestrialPlanets = findByName("Mercury", "Venus", "Earth", "Mars")
67 .map(planet -> new SelectItem(planet, planet.getName())).collect(Collectors.toList());
68 giantPlanets = findByName("Jupiter", "Saturn", "Uranus", "Neptune")
69 .map(planet -> new SelectItem(planet, planet.getName())).collect(Collectors.toList());
70 }
71
72 public Stream<SolarObject> findAll() {
73 return dataList.stream();
74 }
75
76 public Map<String, SolarObject> findAllAsMap() {
77 return dataMap;
78 }
79
80 public Stream<SolarObject> findAllAsCopy() {
81 return dataList.stream().map(SolarObject::new);
82 }
83
84 public SolarObject find(final String name) {
85 return dataList.stream().filter(solarObject -> name.equals(solarObject.getName())).findFirst()
86 .orElse(null);
87 }
88
89 public Stream<SolarObject> findByName(String... filter) {
90 return dataList.stream()
91 .filter(solarObject -> Arrays.asList(filter).contains(solarObject.getName()));
92 }
93
94 public DefaultMutableTreeNode getAllAsTree() {
95 final Map<String, DefaultMutableTreeNode> cache = new HashMap<>();
96 for (final SolarObject solar : (Iterable<SolarObject>) dataList.stream()::iterator) {
97 final DefaultMutableTreeNode node = new DefaultMutableTreeNode(solar);
98 cache.put(solar.getName(), node);
99 final String orbitName = solar.getOrbit();
100 if (orbitName.equals("-")) {
101 continue;
102 }
103
104 cache.get(orbitName).add(node);
105 }
106 return cache.get("Sun");
107 }
108
109 public List<SolarObject> getSatellites(final String center) {
110 final List<SolarObject> collect = new ArrayList<>();
111 for (final SolarObject solar : (Iterable<SolarObject>) dataList.stream()::iterator) {
112
113 if (solar.getOrbit().equals(center)) {
114 collect.add(solar);
115 }
116 }
117 return collect;
118 }
119
120
121 private List<SelectItem> createSelectItems(final List<SolarObject> objects) {
122 final List<SelectItem> list = new ArrayList<>();
123 for (SolarObject object : objects) {
124 list.add(new SelectItem(object, object.getName()));
125 }
126 return list;
127 }
128
129 public List<SelectItem> getPlanets() {
130 return planets;
131 }
132
133 public List<SelectItem> getTerrestrialPlanets() {
134 return terrestrialPlanets;
135 }
136
137 public List<SelectItem> getGiantPlanets() {
138 return giantPlanets;
139 }
140
141 public String namesFromArray(SolarObject[] objects) {
142 if (objects == null) {
143 return null;
144 } else {
145 StringBuilder builder = new StringBuilder();
146 for (SolarObject object : objects) {
147 builder.append(object.getName());
148 builder.append(", ");
149 }
150 if (builder.length() >= 2) {
151 builder.delete(builder.length() - 2, builder.length());
152 }
153 return builder.toString();
154 }
155 }
156 }