com.rorrell.personrest.data.PersonDaoDynamo.java Source code

Java tutorial

Introduction

Here is the source code for com.rorrell.personrest.data.PersonDaoDynamo.java

Source

package com.rorrell.personrest.data;

import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBScanExpression;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import com.rorrell.personrest.model.Person;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javafx.util.Pair;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author rachel
 */
public class PersonDaoDynamo implements PersonDao {

    private static PersonDaoDynamo orm;
    private static final DynamoDBMapper DB = DynamoDbConnector.getInstance().getDatabase();

    private enum Fields {
        ID(":id"), FIRSTNAME(":firstName"), LASTNAME(":lastName"), AGE(":age"), GENDER(":gender");

        private final String value;

        private Fields(String s) {
            value = s;
        }

        public String getValue() {
            return value;
        }

        public static Fields findByValue(String value) {
            for (Fields f : Fields.values()) {
                if (f.getValue().equals(value)) {
                    return f;
                }
            }
            return null;
        }
    }

    private PersonDaoDynamo() {
    }

    public static PersonDaoDynamo getInstance() {
        if (orm == null) {
            orm = new PersonDaoDynamo();
        }
        return orm;
    }

    private DynamoDBScanExpression getQuery(String conditionExpression, Pair... values) {
        Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>();
        for (Pair p : values) {
            Fields key = Fields.findByValue(p.getKey().toString());
            switch (key) {
            case ID:
            case AGE:
                eav.put(p.getKey().toString(), new AttributeValue().withN(p.getValue().toString()));
                break;
            case FIRSTNAME:
            case LASTNAME:
            case GENDER:
                eav.put(p.getKey().toString(), new AttributeValue().withS(p.getValue().toString()));
                break;
            }
        }
        return new DynamoDBScanExpression().withFilterExpression(conditionExpression)
                .withExpressionAttributeValues(eav);
    }

    @Override
    public Person findById(long id) {
        return DB.load(Person.class, id);
    }

    @Override
    public List<Person> findOlder(int age) {
        return DB.scan(Person.class,
                getQuery("age > " + Fields.AGE.getValue(), new Pair(Fields.AGE.getValue(), age)));
    }

    @Override
    public List<Person> findOppositeGender(String gender) {
        return DB.scan(Person.class,
                getQuery("gender <> " + Fields.GENDER.getValue(), new Pair(Fields.GENDER.getValue(), gender)));
    }

    @Override
    public List<Person> findSameGender(String gender) {
        return DB.scan(Person.class,
                getQuery("gender = " + Fields.GENDER.getValue(), new Pair(Fields.GENDER.getValue(), gender)));
    }

    @Override
    public List<Person> findYounger(int age) {
        return DB.scan(Person.class,
                getQuery("age < " + Fields.AGE.getValue(), new Pair(Fields.AGE.getValue(), age)));
    }

    @Override
    public List<Person> getAll() {
        List<Person> result = DB.scan(Person.class, new DynamoDBScanExpression());
        List<Person> people = new ArrayList<Person>(result);
        Collections.sort(people);
        return people;
    }

}