#84 Work on cake baking

This commit is contained in:
Ilkka Seppala 2015-08-12 23:13:10 +03:00
parent 8f5b1b0ed3
commit 913b4fa30c
9 changed files with 96 additions and 19 deletions

View File

@ -1,16 +1,27 @@
package com.iluwatar.layers; package com.iluwatar.layers;
import java.util.Arrays;
public class App { public class App {
public static void main(String[] args) { public static void main(String[] args) {
CakeBakingService service = new CakeBakingServiceImpl(); CakeBakingService service = new CakeBakingServiceImpl();
service.saveNewLayer(new CakeLayerInfo("foo", 1)); service.saveNewLayer(new CakeLayerInfo("chocolate", 1200));
service.saveNewLayer(new CakeLayerInfo("bar", 2)); service.saveNewLayer(new CakeLayerInfo("banana", 900));
service.saveNewLayer(new CakeLayerInfo("strawberry", 950));
service.getAllLayers().stream().forEach((layer) -> System.out.println(layer)); service.getAllLayers().stream().forEach((layer) -> System.out.println(layer));
service.saveNewTopping(new CakeToppingInfo("hoi", 11)); service.saveNewTopping(new CakeToppingInfo("candies", 350));
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),
Arrays.asList(new CakeLayerInfo("chocolate", 0), new CakeLayerInfo("chocolate", 0),
new CakeLayerInfo("chocolate", 0)));
try {
service.bakeNewCake(cakeInfo);
} catch (CakeBakingException e) {
e.printStackTrace();
}
} }
} }

View File

@ -3,6 +3,7 @@ package com.iluwatar.layers;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.GeneratedValue; import javax.persistence.GeneratedValue;
import javax.persistence.Id; import javax.persistence.Id;
@ -16,10 +17,10 @@ public class Cake {
@GeneratedValue @GeneratedValue
private Long id; private Long id;
@OneToOne @OneToOne(cascade = CascadeType.ALL)
private CakeTopping topping; private CakeTopping topping;
@OneToMany @OneToMany(cascade = CascadeType.ALL)
private List<CakeLayer> layers; private List<CakeLayer> layers;
public Cake() { public Cake() {
@ -49,4 +50,8 @@ public class Cake {
public void setLayers(List<CakeLayer> layers) { public void setLayers(List<CakeLayer> layers) {
this.layers = layers; this.layers = layers;
} }
public void addLayer(CakeLayer layer) {
this.layers.add(layer);
}
} }

View File

@ -8,7 +8,11 @@ import java.util.stream.Collectors;
import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional
public class CakeBakingServiceImpl implements CakeBakingService { public class CakeBakingServiceImpl implements CakeBakingService {
private AbstractApplicationContext context; private AbstractApplicationContext context;
@ -22,23 +26,31 @@ public class CakeBakingServiceImpl implements CakeBakingService {
List<CakeToppingInfo> allToppings = getAllToppings(); List<CakeToppingInfo> allToppings = getAllToppings();
List<CakeToppingInfo> matchingToppings = allToppings.stream() List<CakeToppingInfo> matchingToppings = allToppings.stream()
.filter((t) -> t.name.equals(cakeInfo.cakeToppingInfo.name)).collect(Collectors.toList()); .filter((t) -> t.name.equals(cakeInfo.cakeToppingInfo.name)).collect(Collectors.toList());
if (!matchingToppings.isEmpty()) { if (matchingToppings.isEmpty()) {
// CakeToppingDao toppingBean = context.getBean(CakeToppingDao.class);
// toppingBean.delete(matchingToppings.iterator().next().id.get());
} else {
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<CakeLayerInfo> allLayers = getAllLayers(); List<CakeLayer> allLayers = getAllLayerEntities();
List<CakeLayer> foundLayers = new ArrayList<>();
for (CakeLayerInfo info: cakeInfo.cakeLayerInfos) { for (CakeLayerInfo info: cakeInfo.cakeLayerInfos) {
Optional<CakeLayerInfo> found = allLayers.stream().filter((layer) -> layer.name.equals(info.name)).findFirst(); Optional<CakeLayer> found = allLayers.stream().filter((layer) -> layer.getName().equals(info.name)).findFirst();
if (found.isPresent()) { if (!found.isPresent()) {
// CakeLayerDao layerBean = context.getBean(CakeLayerDao.class);
// layerBean.delete(found.get().id.get());
} else {
throw new CakeBakingException(String.format("Layer %s is not available", info.name)); throw new CakeBakingException(String.format("Layer %s is not available", info.name));
} else {
foundLayers.add(found.get());
} }
} }
CakeToppingDao toppingBean = context.getBean(CakeToppingDao.class);
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 = cakeBean.save(cake);
cake.setTopping(topping);
topping.setCake(cake);
cake.setLayers(foundLayers);
for (CakeLayer layer: foundLayers) {
layer.setCake(cake);
}
cakeBean.save(cake);
} }
@Override @Override
@ -53,6 +65,16 @@ public class CakeBakingServiceImpl implements CakeBakingService {
bean.save(new CakeLayer(layerInfo.name, layerInfo.calories)); bean.save(new CakeLayer(layerInfo.name, layerInfo.calories));
} }
private List<CakeTopping> getAllToppingEntities() {
CakeToppingDao bean = context.getBean(CakeToppingDao.class);
List<CakeTopping> result = new ArrayList<>();
Iterator<CakeTopping> iterator = bean.findAll().iterator();
while (iterator.hasNext()) {
result.add(iterator.next());
}
return result;
}
@Override @Override
public List<CakeToppingInfo> getAllToppings() { public List<CakeToppingInfo> getAllToppings() {
CakeToppingDao bean = context.getBean(CakeToppingDao.class); CakeToppingDao bean = context.getBean(CakeToppingDao.class);
@ -65,6 +87,16 @@ public class CakeBakingServiceImpl implements CakeBakingService {
return result; return result;
} }
private List<CakeLayer> getAllLayerEntities() {
CakeLayerDao bean = context.getBean(CakeLayerDao.class);
List<CakeLayer> result = new ArrayList<>();
Iterator<CakeLayer> iterator = bean.findAll().iterator();
while (iterator.hasNext()) {
result.add(iterator.next());
}
return result;
}
@Override @Override
public List<CakeLayerInfo> getAllLayers() { public List<CakeLayerInfo> getAllLayers() {
CakeLayerDao bean = context.getBean(CakeLayerDao.class); CakeLayerDao bean = context.getBean(CakeLayerDao.class);

View File

@ -1,8 +1,10 @@
package com.iluwatar.layers; package com.iluwatar.layers;
import javax.persistence.CascadeType;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.GeneratedValue; import javax.persistence.GeneratedValue;
import javax.persistence.Id; import javax.persistence.Id;
import javax.persistence.ManyToOne;
@Entity @Entity
public class CakeLayer { public class CakeLayer {
@ -15,6 +17,9 @@ public class CakeLayer {
private int calories; private int calories;
@ManyToOne(cascade = CascadeType.ALL)
private Cake cake;
public CakeLayer() { public CakeLayer() {
} }
@ -51,4 +56,12 @@ public class CakeLayer {
public String toString() { public String toString() {
return String.format("name: %s calories: %d", name, calories); return String.format("name: %s calories: %d", name, calories);
} }
public Cake getCake() {
return cake;
}
public void setCake(Cake cake) {
this.cake = cake;
}
} }

View File

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

View File

@ -1,8 +1,10 @@
package com.iluwatar.layers; package com.iluwatar.layers;
import javax.persistence.CascadeType;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.GeneratedValue; import javax.persistence.GeneratedValue;
import javax.persistence.Id; import javax.persistence.Id;
import javax.persistence.OneToOne;
@Entity @Entity
public class CakeTopping { public class CakeTopping {
@ -15,6 +17,9 @@ public class CakeTopping {
private int calories; private int calories;
@OneToOne(cascade = CascadeType.ALL)
private Cake cake;
public CakeTopping() { public CakeTopping() {
} }
@ -51,4 +56,12 @@ public class CakeTopping {
public String toString() { public String toString() {
return String.format("name: %s calories: %d", name, calories); return String.format("name: %s calories: %d", name, calories);
} }
public Cake getCake() {
return cake;
}
public void setCake(Cake cake) {
this.cake = cake;
}
} }

View File

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

View File

@ -6,10 +6,12 @@
xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation=" xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.0.xsd"> http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<jpa:repositories base-package="com.iluwatar" /> <jpa:repositories base-package="com.iluwatar" />
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" /> <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean> </bean>
@ -33,6 +35,7 @@
<map> <map>
<entry key="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" /> <entry key="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
<entry key="hibernate.hbm2ddl.auto" value="create-drop" /> <entry key="hibernate.hbm2ddl.auto" value="create-drop" />
<entry key="hibernate.show_sql" value="true" />
</map> </map>
</property> </property>
</bean> </bean>