All Downloads are FREE. Search and download functionalities are using the official Maven repository.

sk.seges.acris.security.server.dao.twig.AbstractTwigCrud Maven / Gradle / Ivy

The newest version!
package sk.seges.acris.security.server.dao.twig;

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

import sk.seges.sesam.dao.Criterion;
import sk.seges.sesam.dao.Filter;
import sk.seges.sesam.dao.ICrudDAO;
import sk.seges.sesam.dao.Page;
import sk.seges.sesam.dao.PagedResult;
import sk.seges.sesam.dao.SimpleExpression;
import sk.seges.sesam.shared.model.dao.SortInfo;
import sk.seges.sesam.domain.IMutableDomainObject;

import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.Query.FilterOperator;
import com.google.appengine.api.datastore.Query.SortDirection;
import com.vercer.engine.persist.FindCommand.RootFindCommand;
import com.vercer.engine.persist.ObjectDatastore;


public abstract class AbstractTwigCrud> implements ICrudDAO {

	private ObjectDatastore datastore;
	private Class clazz;
	
	protected AbstractTwigCrud(ObjectDatastore datastore, Class clazz) {
		this.datastore = datastore;
		this.clazz = clazz;
	}

	public T findUnique(Page requestedPage) {
		//reseting the page to unlimited page
		requestedPage.setStartIndex(0);
		requestedPage.setPageSize(Page.ALL_RESULTS);

		List result =  findAll(requestedPage).getResult();
		if (result == null || result.size() == 0) {
			throw new RuntimeException("Unable to obtain unique result. No results found!");
		}
		
		if (result.size() > 1) {
			throw new RuntimeException("Unable to obtain unique result. More results found!");
		}
		
		return result.get(0);
	}
	
	@Override
	public PagedResult> findAll(Page requestedPage) {
		RootFindCommand findCommand = datastore.find().type(clazz);
		applyPageSize(findCommand, requestedPage);
		applySortCriteria(findCommand, requestedPage);
		applyProjections(findCommand, requestedPage);
		applyFilters(findCommand, requestedPage);

		int totalCount = findCommand.countResultsNow();
		
		Iterator result = findCommand.returnResultsNow();
		
		List resultList = new ArrayList();
		
		while (result.hasNext()) {
			resultList.add(result.next());
		}
		
		return new PagedResult>(requestedPage, resultList, totalCount);
	}

	private RootFindCommand applyProjections(RootFindCommand findCommand, Page page) {
		//TODO
		return findCommand;
	}
	
	private RootFindCommand applyFilters(RootFindCommand findCommand, Page page) {
		Criterion criterion = page.getFilterable();
		
		if (criterion instanceof SimpleExpression) {
			SimpleExpression expression = (SimpleExpression)criterion;
			findCommand.addFilter(expression.getProperty(), convertOperatorToAppengine(expression.getOperation()), expression.getValue());

		}
		return findCommand;
	}
	
	private FilterOperator convertOperatorToAppengine(String operator) {
		if (operator.equals(Filter.NE)) return FilterOperator.NOT_EQUAL;
		if (operator.equals(Filter.EQ)) return FilterOperator.EQUAL;
		if (operator.equals(Filter.LE)) return FilterOperator.LESS_THAN_OR_EQUAL;
		if (operator.equals(Filter.LT)) return FilterOperator.LESS_THAN;
		if (operator.equals(Filter.GE)) return FilterOperator.GREATER_THAN_OR_EQUAL;
		if (operator.equals(Filter.GT)) return FilterOperator.GREATER_THAN;

		//TODO
		//Filter.ILIKE, Filter.BETWEEN, Filter.LIKE are not currently supported
		
		throw new RuntimeException("Unsupported " + (operator) + " criterion operator!");
	}
	
	private RootFindCommand applySortCriteria(RootFindCommand findCommand, Page page) {
		if (page.getSortables() == null) {
			return findCommand;
		}
		
		for (SortInfo sortInfo : page.getSortables()) {
			findCommand.addSort(sortInfo.getColumn(), sortInfo.isAscending() ? SortDirection.ASCENDING : SortDirection.DESCENDING);
		}
		
		return findCommand;
	}
	
	private RootFindCommand applyPageSize(RootFindCommand findCommand, Page page) {
		if (page.getPageSize() != Page.ALL_RESULTS) {
			findCommand.startFrom(page.getStartIndex());
			findCommand.maximumResults(page.getPageSize());
		}
		return findCommand;
	}
	
	@Override
	public T findEntity(T entity) {
		return datastore.load(clazz, entity.getId());
	}

	@Override
	public T persist(T entity) {
		Key key = datastore.store(entity);
		entity.setId(key.getId());
		return entity;
//		Key key = datastore.store()
//		  .instance(entity)
//		  .ensureUniqueKey()
//		  .returnKeyNow();
//		entity.setId(key.getId());
//		return entity;
	}

	@Override
	public T merge(T entity) {
		datastore.associate(entity);
		datastore.update(entity);
		return entity;
	}

	@Override
	public void remove(T entity) {
		datastore.associate(entity);
		datastore.delete(entity);
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy