com.aipo.aws.simpledb.SimpleDB.java Source code

Java tutorial

Introduction

Here is the source code for com.aipo.aws.simpledb.SimpleDB.java

Source

/*
 * This file is part of the com.aipo.aws package.
 * Copyright (C) 2004-2011 Aimluck,Inc.
 * http://www.aipo.com
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

package com.aipo.aws.simpledb;

import java.util.ArrayList;
import java.util.List;

import com.aipo.aws.AWSContext;
import com.amazonaws.services.simpledb.AmazonSimpleDB;
import com.amazonaws.services.simpledb.AmazonSimpleDBAsync;
import com.amazonaws.services.simpledb.AmazonSimpleDBAsyncClient;
import com.amazonaws.services.simpledb.AmazonSimpleDBClient;
import com.amazonaws.services.simpledb.model.Attribute;
import com.amazonaws.services.simpledb.model.CreateDomainRequest;
import com.amazonaws.services.simpledb.model.GetAttributesRequest;
import com.amazonaws.services.simpledb.model.GetAttributesResult;
import com.amazonaws.services.simpledb.model.Item;
import com.amazonaws.services.simpledb.model.PutAttributesRequest;
import com.amazonaws.services.simpledb.model.ReplaceableAttribute;
import com.amazonaws.services.simpledb.model.SelectRequest;
import com.amazonaws.services.simpledb.model.SelectResult;
import com.amazonaws.services.simpledb.model.UpdateCondition;

/**
 *
 */
public class SimpleDB {

    public static final String DEFAULT_COUNTER_DOMAIN = "__counter";

    public static AmazonSimpleDB getClient() {
        AWSContext awsContext = AWSContext.get();
        if (awsContext == null) {
            throw new IllegalStateException("AWSContext is not initialized.");
        }
        AmazonSimpleDB client = new AmazonSimpleDBClient(awsContext.getAwsCredentials());
        String endpoint = awsContext.getSdbEndpoint();
        if (endpoint != null && endpoint != "") {
            client.setEndpoint(endpoint);
        }
        return client;
    }

    public static AmazonSimpleDBAsync getAsyncClient() {
        AWSContext awsContext = AWSContext.get();
        if (awsContext == null) {
            throw new IllegalStateException("AWSContext is not initialized.");
        }
        AmazonSimpleDBAsync client = new AmazonSimpleDBAsyncClient(awsContext.getAwsCredentials());
        String endpoint = awsContext.getSdbEndpoint();
        if (endpoint != null && endpoint != "") {
            client.setEndpoint(endpoint);
        }
        return client;
    }

    /**
     * 
     * @param <M>
     * @param rootClass
     * @param sql
     * @return
     */
    public static <M> ResultList<M> select(Class<M> rootClass, String sql) {
        return select(getClient(), rootClass, sql, null);
    }

    /**
     * 
     * @param <M>
     * @param client
     * @param rootClass
     * @param sql
     * @return
     */
    public static <M> ResultList<M> select(AmazonSimpleDB client, Class<M> rootClass, String sql) {
        return select(client, rootClass, sql, null);
    }

    /**
     * 
     * @param <M>
     * @param rootClass
     * @param sql
     * @param nextToken
     * @return
     */
    public static <M> ResultList<M> select(Class<M> rootClass, String sql, String nextToken) {
        return select(getClient(), rootClass, sql, nextToken);
    }

    /**
     * 
     * @param <M>
     * @param client
     * @param rootClass
     * @param sql
     * @param nextToken
     * @return
     */
    public static <M> ResultList<M> select(AmazonSimpleDB client, Class<M> rootClass, String sql,
            String nextToken) {
        try {

            SelectRequest request = new SelectRequest(sql.toString()).withConsistentRead(true);
            if (nextToken != null) {
                request.setNextToken(nextToken);
            }
            SelectResult select = client.select(request);
            List<Item> items = select.getItems();
            ResultList<M> result = new ResultList<M>();
            for (Item item : items) {
                M model = rootClass.newInstance();
                if (model instanceof ResultItem) {
                    ResultItem resultItem = (ResultItem) model;
                    resultItem.assign(item);
                    result.add(model);
                }
            }
            result.setNextToken(select.getNextToken());
            return result;
        } catch (InstantiationException e) {
            //
        } catch (IllegalAccessException e) {
            //
        }
        return new ResultList<M>();
    }

    /**
     * 
     * @param <M>
     * @param rootClass
     * @param domain
     * @param itemName
     * @return
     */
    public static <M> M get(Class<M> rootClass, String domain, String itemName) {
        return get(getClient(), rootClass, domain, itemName);
    }

    /**
     * 
     * @param <M>
     * @param client
     * @param rootClass
     * @param domain
     * @param itemName
     * @return
     */
    public static <M> M get(AmazonSimpleDB client, Class<M> rootClass, String domain, String itemName) {
        try {
            M model = rootClass.newInstance();
            if (model instanceof ResultItem) {
                GetAttributesResult result = client
                        .getAttributes(new GetAttributesRequest(domain, itemName).withConsistentRead(true));
                ResultItem item = (ResultItem) model;
                item.assign(itemName, result);
            }
            return model;
        } catch (InstantiationException e) {
            //
        } catch (IllegalAccessException e) {
            //
        }

        return null;
    }

    /**
     * 
     * @param domain
     * @return
     */
    public static Integer counter(String domain) {
        for (int i = 0; i < 5; i++) {
            try {
                return counterJob(domain);
            } catch (Throwable t) {
                t.printStackTrace();
            }
        }
        return null;
    }

    private static Integer counterJob(String domain) {
        AmazonSimpleDB client = getClient();
        GetAttributesRequest getAttributesRequest = new GetAttributesRequest();
        getAttributesRequest.setDomainName(DEFAULT_COUNTER_DOMAIN);
        getAttributesRequest.setItemName(domain);
        getAttributesRequest.setConsistentRead(true);
        Integer count = null;
        try {
            GetAttributesResult attributes = client.getAttributes(getAttributesRequest);
            List<Attribute> list = attributes.getAttributes();
            for (Attribute item : list) {
                if ("c".equals(item.getName())) {
                    try {
                        count = Integer.valueOf(item.getValue());
                    } catch (Throwable ignore) {

                    }
                }
            }
        } catch (Throwable t) {
            t.printStackTrace();
        }

        if (count == null) {
            CreateDomainRequest createDomainRequest = new CreateDomainRequest(DEFAULT_COUNTER_DOMAIN);
            client.createDomain(createDomainRequest);
            count = 0;
        }

        int next = count + 1;
        PutAttributesRequest putAttributesRequest = new PutAttributesRequest();
        putAttributesRequest.setDomainName(DEFAULT_COUNTER_DOMAIN);
        putAttributesRequest.setItemName(domain);
        List<ReplaceableAttribute> attr = new ArrayList<ReplaceableAttribute>();
        attr.add(new ReplaceableAttribute("c", String.valueOf(next), true));
        putAttributesRequest.setAttributes(attr);
        UpdateCondition updateCondition = new UpdateCondition();
        if (next == 1) {
            updateCondition.setExists(false);
            updateCondition.setName("c");
        } else {
            updateCondition.setExists(true);
            updateCondition.setName("c");
            updateCondition.setValue(String.valueOf(count));
        }
        putAttributesRequest.setExpected(updateCondition);

        client.putAttributes(putAttributesRequest);

        return next;
    }
}