#84 More work on cake baking

This commit is contained in:
Ilkka Seppala
2015-08-13 20:35:13 +03:00
parent 913b4fa30c
commit aa04e7c856
9 changed files with 55 additions and 18 deletions

View File

@ -16,12 +16,13 @@ public class App {
service.getAllToppings().stream().forEach((topping) -> System.out.println(topping)); service.getAllToppings().stream().forEach((topping) -> System.out.println(topping));
CakeInfo cakeInfo = new CakeInfo(new CakeToppingInfo("candies", 0), CakeInfo cakeInfo = new CakeInfo(new CakeToppingInfo("candies", 0),
Arrays.asList(new CakeLayerInfo("chocolate", 0), new CakeLayerInfo("chocolate", 0), Arrays.asList(new CakeLayerInfo("chocolate", 0), new CakeLayerInfo("banana", 0),
new CakeLayerInfo("chocolate", 0))); new CakeLayerInfo("strawberry", 0)));
try { try {
service.bakeNewCake(cakeInfo); service.bakeNewCake(cakeInfo);
} catch (CakeBakingException e) { } catch (CakeBakingException e) {
e.printStackTrace(); e.printStackTrace();
} }
service.getAllCakes().stream().forEach((cake) -> System.out.println(cake));
} }
} }

View File

@ -1,10 +1,11 @@
package com.iluwatar.layers; package com.iluwatar.layers;
import java.util.ArrayList; import java.util.HashSet;
import java.util.List; import java.util.Set;
import javax.persistence.CascadeType; import javax.persistence.CascadeType;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue; import javax.persistence.GeneratedValue;
import javax.persistence.Id; import javax.persistence.Id;
import javax.persistence.OneToMany; import javax.persistence.OneToMany;
@ -17,14 +18,14 @@ public class Cake {
@GeneratedValue @GeneratedValue
private Long id; private Long id;
@OneToOne(cascade = CascadeType.ALL) @OneToOne(cascade=CascadeType.REMOVE)
private CakeTopping topping; private CakeTopping topping;
@OneToMany(cascade = CascadeType.ALL) @OneToMany(cascade=CascadeType.REMOVE, fetch=FetchType.EAGER)
private List<CakeLayer> layers; private Set<CakeLayer> layers;
public Cake() { public Cake() {
setLayers(new ArrayList<>()); setLayers(new HashSet<>());
} }
public Long getId() { public Long getId() {
@ -43,15 +44,20 @@ public class Cake {
this.topping = topping; this.topping = topping;
} }
public List<CakeLayer> getLayers() { public Set<CakeLayer> getLayers() {
return layers; return layers;
} }
public void setLayers(List<CakeLayer> layers) { public void setLayers(Set<CakeLayer> layers) {
this.layers = layers; this.layers = layers;
} }
public void addLayer(CakeLayer layer) { public void addLayer(CakeLayer layer) {
this.layers.add(layer); this.layers.add(layer);
} }
@Override
public String toString() {
return String.format("id=%s topping=%s layers=%s", id, topping, layers.toString());
}
} }

View File

@ -5,6 +5,8 @@ import java.util.List;
public interface CakeBakingService { public interface CakeBakingService {
void bakeNewCake(CakeInfo cakeInfo) throws CakeBakingException; void bakeNewCake(CakeInfo cakeInfo) throws CakeBakingException;
List<CakeInfo> getAllCakes();
void saveNewTopping(CakeToppingInfo toppingInfo); void saveNewTopping(CakeToppingInfo toppingInfo);

View File

@ -1,9 +1,11 @@
package com.iluwatar.layers; package com.iluwatar.layers;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.AbstractApplicationContext;
@ -30,7 +32,7 @@ public class CakeBakingServiceImpl implements CakeBakingService {
throw new CakeBakingException(String.format("Topping %s is not available", cakeInfo.cakeToppingInfo.name)); throw new CakeBakingException(String.format("Topping %s is not available", cakeInfo.cakeToppingInfo.name));
} }
List<CakeLayer> allLayers = getAllLayerEntities(); List<CakeLayer> allLayers = getAllLayerEntities();
List<CakeLayer> foundLayers = new ArrayList<>(); Set<CakeLayer> foundLayers = new HashSet<>();
for (CakeLayerInfo info: cakeInfo.cakeLayerInfos) { for (CakeLayerInfo info: cakeInfo.cakeLayerInfos) {
Optional<CakeLayer> found = allLayers.stream().filter((layer) -> layer.getName().equals(info.name)).findFirst(); Optional<CakeLayer> found = allLayers.stream().filter((layer) -> layer.getName().equals(info.name)).findFirst();
if (!found.isPresent()) { if (!found.isPresent()) {
@ -43,14 +45,16 @@ public class CakeBakingServiceImpl implements CakeBakingService {
CakeTopping topping = toppingBean.findOne(matchingToppings.iterator().next().id.get()); CakeTopping topping = toppingBean.findOne(matchingToppings.iterator().next().id.get());
CakeDao cakeBean = context.getBean(CakeDao.class); CakeDao cakeBean = context.getBean(CakeDao.class);
Cake cake = new Cake(); Cake cake = new Cake();
cake = cakeBean.save(cake);
cake.setTopping(topping); cake.setTopping(topping);
topping.setCake(cake);
cake.setLayers(foundLayers); cake.setLayers(foundLayers);
cakeBean.save(cake);
topping.setCake(cake);
toppingBean.save(topping);
CakeLayerDao layerBean = context.getBean(CakeLayerDao.class);
for (CakeLayer layer: foundLayers) { for (CakeLayer layer: foundLayers) {
layer.setCake(cake); layer.setCake(cake);
layerBean.save(layer);
} }
cakeBean.save(cake);
} }
@Override @Override
@ -108,4 +112,23 @@ public class CakeBakingServiceImpl implements CakeBakingService {
} }
return result; return result;
} }
@Override
public List<CakeInfo> getAllCakes() {
CakeDao cakeBean = context.getBean(CakeDao.class);
List<CakeInfo> result = new ArrayList<>();
Iterator<Cake> iterator = cakeBean.findAll().iterator();
while (iterator.hasNext()) {
Cake cake = iterator.next();
CakeToppingInfo cakeToppingInfo = new CakeToppingInfo(cake.getTopping().getId(),
cake.getTopping().getName(), cake.getTopping().getCalories());
ArrayList<CakeLayerInfo> cakeLayerInfos = new ArrayList<CakeLayerInfo>();
for (CakeLayer layer: cake.getLayers()) {
cakeLayerInfos.add(new CakeLayerInfo(layer.getId(), layer.getName(), layer.getCalories()));
}
CakeInfo cakeInfo = new CakeInfo(cake.getId(), cakeToppingInfo, cakeLayerInfos);
result.add(cakeInfo);
}
return result;
}
} }

View File

@ -20,4 +20,9 @@ public class CakeInfo {
this.cakeToppingInfo = cakeToppingInfo; this.cakeToppingInfo = cakeToppingInfo;
this.cakeLayerInfos = cakeLayerInfos; this.cakeLayerInfos = cakeLayerInfos;
} }
@Override
public String toString() {
return String.format("CakeInfo id=%d topping=%s layers=%s", id.get(), cakeToppingInfo, cakeLayerInfos);
}
} }

View File

@ -54,7 +54,7 @@ public class CakeLayer {
@Override @Override
public String toString() { public String toString() {
return String.format("name: %s calories: %d", name, calories); return String.format("id=%s name=%s calories=%d", id, name, calories);
} }
public Cake getCake() { public Cake getCake() {

View File

@ -22,6 +22,6 @@ public class CakeLayerInfo {
@Override @Override
public String toString() { public String toString() {
return String.format("CakeLayerInfo name: %s calories: %d", name, calories); return String.format("CakeLayerInfo id=%d name=%s calories=%d", id.get(), name, calories);
} }
} }

View File

@ -54,7 +54,7 @@ public class CakeTopping {
@Override @Override
public String toString() { public String toString() {
return String.format("name: %s calories: %d", name, calories); return String.format("id=%s name=%s calories=%d", name, calories);
} }
public Cake getCake() { public Cake getCake() {

View File

@ -22,6 +22,6 @@ public class CakeToppingInfo {
@Override @Override
public String toString() { public String toString() {
return String.format("CakeToppingInfo name: %s calories: %d", name, calories); return String.format("CakeToppingInfo id=%d name=%s calories=%d", id.get(), name, calories);
} }
} }