View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
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  //XXX Using SessionScoped, because Singleton is not passivation capable.
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       // adds a solar object as node to its orbit as tree child.
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       // todo: use lambda
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 }