Skip to content

Latest commit

 

History

History
157 lines (116 loc) · 3.62 KB

10.md

File metadata and controls

157 lines (116 loc) · 3.62 KB

10. 商品の一連の操作を実装しよう(前準備)

DAOMockの準備

ハンズオンの中で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}]

--

戻る