/*******************************************************************************
* Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
* which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Oracle - initial API and implementation from Oracle TopLink
******************************************************************************/
package org.eclipse.persistence.tools.workbench.mappingsmodel.query.relational;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Vector;
import org.eclipse.persistence.tools.workbench.mappingsmodel.MWModel;
import org.eclipse.persistence.tools.workbench.mappingsmodel.meta.MWClass;
import org.eclipse.persistence.tools.workbench.mappingsmodel.query.MWAbstractQuery;
import org.eclipse.persistence.tools.workbench.mappingsmodel.query.MWQueryable;
import org.eclipse.persistence.tools.workbench.mappingsmodel.query.MWReadAllQuery;
import org.eclipse.persistence.tools.workbench.mappingsmodel.query.MWReadObjectQuery;
import org.eclipse.persistence.tools.workbench.utility.iterators.CloneListIterator;
import org.eclipse.persistence.tools.workbench.utility.node.Node;
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.descriptors.DescriptorEvent;
import org.eclipse.persistence.oxm.XMLDescriptor;
import org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping;
import org.eclipse.persistence.queries.DatabaseQuery;
import org.eclipse.persistence.queries.ObjectLevelReadQuery;
import org.eclipse.persistence.queries.ReadAllQuery;
public final class MWRelationalReadAllQuery
extends MWAbstractRelationalReadQuery
implements MWReadAllQuery, MWOrderableQuery
{
private List batchReadItems;
public static final String BATCH_READ_ITEMS_LIST = "batchReadItems";
private List orderingItems;
public static final String ORDERING_ITEMS_LIST = "orderingItems";
// **************** static methods ****************
public static XMLDescriptor buildDescriptor() {
XMLDescriptor descriptor = new XMLDescriptor();
descriptor.setJavaClass(MWRelationalReadAllQuery.class);
descriptor.getInheritancePolicy().setParentClass(MWAbstractRelationalReadQuery.class);
XMLCompositeCollectionMapping batchReadItemsMapping = new XMLCompositeCollectionMapping();
batchReadItemsMapping.setAttributeName("batchReadItems");
batchReadItemsMapping.setReferenceClass(MWOrderingItem.class);
batchReadItemsMapping.setXPath("batch-reads/batch-read-item");
descriptor.addMapping(batchReadItemsMapping);
XMLCompositeCollectionMapping orderingItemsMapping = new XMLCompositeCollectionMapping();
orderingItemsMapping.setAttributeName("orderingItems");
orderingItemsMapping.setReferenceClass(MWOrderingItem.class);
orderingItemsMapping.setXPath("orderings/ordering-item");
descriptor.addMapping(orderingItemsMapping);
return descriptor;
}
/** Default constructor - for TopLink use only. */
private MWRelationalReadAllQuery() {
super();
}
MWRelationalReadAllQuery(MWRelationalQueryManager parent, String name) {
super(parent, name);
}
protected void initialize(Node parent) {
super.initialize(parent);
this.batchReadItems = new Vector();
this.orderingItems = new Vector();
}
protected void addChildrenTo(List children) {
super.addChildrenTo(children);
synchronized (this.batchReadItems) { children.addAll(this.batchReadItems); }
synchronized (this.orderingItems) { children.addAll(this.orderingItems); }
}
// ******************* Morphing *******************
public MWReportQuery asReportQuery() {
getQueryManager().removeQuery(this);
MWReportQuery newQuery = ((MWRelationalQueryManager) getQueryManager()).addReportQuery(getName());
newQuery.initializeFrom((MWReadAllQuery) this);
return newQuery;
}
public MWReadObjectQuery asReadObjectQuery() {
getQueryManager().removeQuery(this);
MWReadObjectQuery newQuery = getQueryManager().addReadObjectQuery(getName());
((MWAbstractQuery) newQuery).initializeFrom((MWReadAllQuery) this);
return newQuery;
}
public MWReadAllQuery asReadAllQuery() {
return this;
}
public String queryType() {
return READ_ALL_QUERY;
}
// ********** orderingItems **********
public Ordering addOrderingItem(MWQueryable queryable) {
if (orderingAttributesAllowed()) {
MWOrderingItem orderingItem = new MWOrderingItem(this, queryable);
addOrderingItem(orderingItem);
return orderingItem;
}
throw new IllegalStateException("Ordering Items are not allowed if the QueryFormat is EJBQL or SQL");
}
public Ordering addOrderingItem(Iterator queryables) {
if (orderingAttributesAllowed()) {
MWOrderingItem orderingItem = new MWOrderingItem(this, queryables);
addOrderingItem(orderingItem);
return orderingItem;
}
throw new IllegalStateException("Ordering Items are not allowed if the QueryFormat is EJBQL or SQL");
}
public Ordering addOrderingItem(Iterator queryables, Iterator allowsNull) {
if (orderingAttributesAllowed()) {
MWOrderingItem orderingItem = new MWOrderingItem(this, queryables, allowsNull);
addOrderingItem(orderingItem);
return orderingItem;
}
throw new IllegalStateException("Ordering Items are not allowed if the QueryFormat is EJBQL or SQL");
}
public Ordering addOrderingItem(int index, Iterator queryables, Iterator allowsNull) {
if (orderingAttributesAllowed()) {
MWOrderingItem orderingItem = new MWOrderingItem(this, queryables, allowsNull);
addOrderingItem(index, orderingItem);
return orderingItem;
}
throw new IllegalStateException("Ordering Items are not allowed if the QueryFormat is EJBQL or SQL");
}
private boolean orderingAttributesAllowed() {
return getQueryFormat().orderingAttributesAllowed();
}
private void addOrderingItem(Ordering orderingItem) {
addOrderingItem(orderingItemsSize(), orderingItem);
}
private void addOrderingItem(int index, Ordering orderingItem) {
addItemToList(index, orderingItem, this.orderingItems, ORDERING_ITEMS_LIST);
}
public void removeOrderingItem(Ordering orderingItem) {
removeOrderingItem(this.orderingItems.indexOf(orderingItem));
}
public void removeOrderingItem(int index) {
removeItemFromList(index, this.orderingItems, ORDERING_ITEMS_LIST);
}
public void removeOrderingItems(Iterator orderingItems) {
while(orderingItems.hasNext()) {
removeOrderingItem((Ordering) orderingItems.next());
}
}
public ListIterator orderingItems() {
return new CloneListIterator(this.orderingItems);
}
public int orderingItemsSize() {
return this.orderingItems.size();
}
public int indexOfOrderingItem(Ordering orderingItem) {
return this.orderingItems.indexOf(orderingItem);
}
public void moveOrderingItemUp(Ordering item) {
int index = indexOfOrderingItem(item);
removeOrderingItem(index);
addOrderingItem(index - 1, item);
}
public void moveOrderingItemDown(Ordering item) {
int index = indexOfOrderingItem(item);
removeOrderingItem(index);
addOrderingItem(index + 1, item);
}
// ********** batchReadItems **********
public MWBatchReadItem addBatchReadItem(MWQueryable queryable) {
if (batchReadAttributesAllowed()) {
MWBatchReadItem item = new MWBatchReadItem(this, queryable);
addBatchReadItem(item);
return item;
}
throw new IllegalStateException("BatchRead Items are not allowed if the QueryFormat is SQL");
}
public MWBatchReadItem addBatchReadItem(Iterator queryables) {
if (batchReadAttributesAllowed()) {
MWBatchReadItem item = new MWBatchReadItem(this, queryables);
addBatchReadItem(item);
return item;
}
throw new IllegalStateException("BatchRead Items are not allowed if the QueryFormat is SQL");
}
public MWBatchReadItem addBatchReadItem(Iterator queryables, Iterator allowsNull) {
if (batchReadAttributesAllowed()) {
MWBatchReadItem item = new MWBatchReadItem(this, queryables, allowsNull);
addBatchReadItem(item);
return item;
}
throw new IllegalStateException("BatchRead Items are not allowed if the QueryFormat is SQL");
}
public MWBatchReadItem addBatchReadItem(int index, Iterator queryables, Iterator allowsNull) {
if (batchReadAttributesAllowed()) {
MWBatchReadItem item = new MWBatchReadItem(this, queryables, allowsNull);
addBatchReadItem(index, item);
return item;
}
throw new IllegalStateException("BatchRead Items are not allowed if the QueryFormat is SQL");
}
private boolean batchReadAttributesAllowed() {
return getQueryFormat().batchReadAttributesAllowed();
}
private void addBatchReadItem(MWBatchReadItem item) {
addBatchReadItem(batchReadItemsSize(), item);
}
private void addBatchReadItem(int index, MWBatchReadItem item) {
addItemToList(index, item, this.batchReadItems, BATCH_READ_ITEMS_LIST);
}
public void removeBatchReadItem(MWBatchReadItem batchReadItem) {
removeBatchReadItem(this.batchReadItems.indexOf(batchReadItem));
}
public void removeBatchReadItem(int index) {
removeItemFromList(index, this.batchReadItems, BATCH_READ_ITEMS_LIST);
}
public void removeBatchReadItems(Iterator batchReadItems) {
while(batchReadItems.hasNext()) {
removeBatchReadItem((MWBatchReadItem) batchReadItems.next());
}
}
public void moveBatchReadItemUp(MWBatchReadItem batchReadItem) {
int index = indexOfBatchReadItem(batchReadItem);
removeBatchReadItem(index);
addBatchReadItem(index-1, batchReadItem);
}
public void moveBatchReadItemDown(MWBatchReadItem batchReadItem) {
int index = indexOfBatchReadItem(batchReadItem);
removeBatchReadItem(index);
addBatchReadItem(index + 1, batchReadItem);
}
public ListIterator batchReadItems() {
return new CloneListIterator(this.batchReadItems);
}
public int batchReadItemsSize() {
return this.batchReadItems.size();
}
public int indexOfBatchReadItem(MWBatchReadItem item) {
return this.batchReadItems.indexOf(item);
}
//*********** MWRelationalQuery implementation ***************
public void formatSetToEjbql() {
removeOrderingItems(orderingItems());
}
public void formatSetToSql() {
removeOrderingItems(orderingItems());
removeBatchReadItems(batchReadItems());
}
// **************** Runtime conversion ****************
public DatabaseQuery runtimeQuery() {
ReadAllQuery query = (ReadAllQuery) super.runtimeQuery();
for (Iterator i = batchReadItems(); i.hasNext();) {
((MWBatchReadItem) i.next()).adjustRuntimeQuery(query);
}
for (Iterator i = orderingItems(); i.hasNext(); ) {
((MWOrderingItem) i.next()).adjustRuntimeQuery(query);
}
return query;
}
protected ObjectLevelReadQuery buildRuntimeQuery() {
return new ReadAllQuery();
}
}