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

it.amattioli.dominate.jcr.JcrAssembler Maven / Gradle / Ivy

The newest version!
package it.amattioli.dominate.jcr;

import java.util.Stack;

import org.apache.jackrabbit.ocm.query.Filter;
import org.apache.jackrabbit.ocm.query.Query;
import org.apache.jackrabbit.ocm.query.QueryManager;

import it.amattioli.dominate.specifications.Assembler;

public class JcrAssembler implements Assembler {
	private QueryManager queryMgr;
	private Class entityClass;
	private boolean negated = false;
	private Stack stackedJunctions = new Stack();
	private Junction currentJunction;
	
	public JcrAssembler(QueryManager queryMgr, Class entityClass) {
		this.queryMgr = queryMgr;
		this.entityClass = entityClass;
		currentJunction = new Conjunction(queryMgr.createFilter(entityClass));
	}
	
	public Filter createFilter() {
		Filter filter = queryMgr.createFilter(entityClass);
		return filter;
	}
	
	public void addFilter(Filter filter) {
		currentJunction.addFilter(filter);
	}
	
	public Query getAssembledQuery() {
		return queryMgr.createQuery(currentJunction.getFilter());
	}
	
	public void startConjunction() {
		stackedJunctions.push(currentJunction);
		currentJunction = new Conjunction(queryMgr.createFilter(entityClass));
	}
	
	public void endConjunction() {
		endJunction();
	}
	
	public void startDisjunction() {
		stackedJunctions.push(currentJunction);
		currentJunction = new Disjunction(queryMgr.createFilter(entityClass));
	}
	
	public void endDisjunction() {
		endJunction();
	}
	
	private void endJunction() {
		Filter toBeAdded = currentJunction.getFilter();
		if (negated) {
			//toBeAdded = Restrictions.not(toBeAdded);
		}
		stackedJunctions.peek().addFilter(toBeAdded);
		currentJunction = stackedJunctions.pop();
	}
	
	public void startNegation() {
		negated = true;
	}

	public void endNegation() {
		negated = false;
	}

	public void noResults() {
		Filter filter = createFilter();
		filter.addEqualTo("id", "");
		addFilter(filter);
	}
	
	private static abstract class Junction {
		private Filter filter;
		
		public Junction(Filter filter) {
			this.filter = filter;
		}
		
		public Filter getFilter() {
			return filter;
		}
		
		public abstract void addFilter(Filter filter);
	}
	
	private static class Conjunction extends Junction {
		
		public Conjunction(Filter filter) {
			super(filter);
		}
		
		public void addFilter(Filter filter) {
			getFilter().addAndFilter(filter);
		}
		
	}
	
	private static class Disjunction extends Junction {
		
		public Disjunction(Filter filter) {
			super(filter);
		}
		
		public void addFilter(Filter filter) {
			getFilter().addOrFilter(filter);
		}
		
	}
	
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy