package com.mysema.rdfbean.model; import java.util.List; import javax.annotation.Nullable; import com.google.common.base.Objects; import com.mysema.commons.lang.Assert; import com.mysema.query.types.Expression; import com.mysema.query.types.ExpressionUtils; import com.mysema.query.types.Ops; import com.mysema.query.types.Predicate; import com.mysema.query.types.ToStringVisitor; import com.mysema.query.types.Visitor; import com.mysema.query.types.expr.BooleanExpression; import com.mysema.query.types.expr.BooleanOperation; public class GraphBlock implements ContainerBlock { private static final long serialVersionUID = -4450740702187022383L; private final List<Block> blocks; @Nullable private final Predicate filters; private final Expression<UID> context; public GraphBlock(Expression<UID> context, List<Block> blocks, Predicate... filters) { this.blocks = Assert.notEmpty(blocks, "blocks"); this.context = context; this.filters = ExpressionUtils.allOf(filters); } @Override public Predicate not() { throw new UnsupportedOperationException(); } @Override @SuppressWarnings("unchecked") public <R, C> R accept(Visitor<R, C> v, C context) { if (v instanceof RDFVisitor) { return (R) ((RDFVisitor) v).visit(this, context); } else if (v instanceof ToStringVisitor) { return (R) toString(); } else if (v.getClass().getName().equals("com.mysema.query.types.ExtractorVisitor")) { return (R) this; } else { throw new IllegalArgumentException(v.toString()); } } @Override public Class<? extends Boolean> getType() { return Boolean.class; } public List<Block> getBlocks() { return blocks; } @Nullable public Predicate getFilters() { return filters; } public Expression<UID> getContext() { return context; } @Override public BooleanExpression exists() { return BooleanOperation.create(Ops.EXISTS, this); } @Override public int hashCode() { return context.hashCode(); } @Override public boolean equals(Object o) { if (o == this) { return true; } else if (o instanceof GraphBlock) { GraphBlock gb = (GraphBlock) o; return context.equals(gb.context) && Objects.equal(filters, gb.filters) && blocks.equals(gb.blocks); } else { return false; } } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("GRAPH ").append(context).append("{ "); for (Block block : blocks) { builder.append(block.toString()).append(" "); } if (filters != null) { builder.append(" FILTER(").append(filters).append(")"); } builder.append(" }"); return builder.toString(); } }