ハンズオンの中でDatabaseの代わりに動作する DAOMock クラスを作成する。(時間が無い人はコピーで)
IDAOMock.java を作成する。
package javado.lec06;
import java.util.List;
public interface IDAOMock {
List<Product> select();
Product select(int id);
void insert(Product product);
void update(int id, Product product);
void delete(int id);
}
DAOMock.java を作成する。
package javado.lec06;
import java.util.*;
import java.util.stream.Collectors;
/**
* データベースの処理を模したMockクラス。シングルトンオブジェクトを生成する。
*/
public class DAOMock implements IDAOMock {
private static DAOMock instance = new DAOMock();
private Map<Integer, Product> productMap;
private DAOMock() {
productMap = new HashMap<>();
Product product1 = new Product();
product1.setName("孤独のグルメ 【新装版】");
product1.setPrice(1234);
insert(product1);
Product product2 = new Product();
product2.setName("孤独のグルメ2");
product2.setPrice(994);
insert(product2);
}
public static DAOMock getInstance() {
return instance;
}
@Override
public List<Product> select() {
List<Product> products = productMap.entrySet()
.stream()
.map(Map.Entry::getValue)
.sorted(Comparator.comparing(Product::getId))
.collect(Collectors.toList());
return products;
}
@Override
public Product select(int id) {
Optional<Product> product = productMap.entrySet()
.stream()
.filter(e -> Objects.equals(e.getKey(), id))
.map(e -> e.getValue())
.findFirst();
return product.orElseThrow(() -> new IllegalArgumentException("検索しようとしたidが存在しません:" + id));
}
@Override
public synchronized void insert(Product product) {
if (Objects.isNull(product)) {
throw new NullPointerException("登録データが存在しません");
}
int maxId = productMap.entrySet()
.stream()
.map(Map.Entry::getKey)
.max((a, b) -> a.compareTo(b)).orElse(0);
int newId = maxId + 1;
product.setId(newId);
productMap.put(newId, product);
}
@Override
public synchronized void update(int id, Product product) {
if (Objects.isNull(product)) {
throw new NullPointerException("更新データが存在しません");
}
product.setId(id);
if (count(id) > 0) {
productMap.replace(id, product);
return;
}
throw new IllegalArgumentException("更新しようとしたidが存在しません:" + id);
}
@Override
public synchronized void delete(int id) {
if (count(id) > 0) {
productMap.remove(id);
return;
}
throw new IllegalArgumentException("削除しようとしたidが存在しません:" + id);
}
protected long count(int id) {
return productMap.entrySet()
.stream()
.filter(e -> Objects.equals(e.getKey(), id))
.count();
}
}
ProductResource クラスに次のメソッドを追加する。
@GET
@Path("all")
@Produces(MediaType.APPLICATION_JSON)
public List<Product> getProducts() {
IDAOMock dao = DAOMock.getInstance();
return dao.select();
}
javado.lec06.Main を実行しなおす。
http://localhost:8080/myapp/product/all にブラウザでアクセスして、下のようなJSONが表示されればOK。
[{"id":1,"name":"孤独のグルメ 【新装版】","price":1234},{"id":2,"name":"孤独のグルメ2","price":994}]
--