/******************************************************************************* * 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.internal.jpa.parsing; import org.eclipse.persistence.queries.*; import org.eclipse.persistence.exceptions.*; import org.eclipse.persistence.expressions.*; import org.eclipse.persistence.descriptors.ClassDescriptor; /** * INTERNAL: * ModifyNode is the superclass for UpdateNode and DeleteNode */ public abstract class ModifyNode extends QueryNode { private String abstractSchemaIdentifier; private String abstractSchemaName; /** * INTERNAL * Apply this node to the passed query. This node does not change the query. */ public void applyToQuery(DatabaseQuery theQuery, GenerationContext context) { } /** * INTERNAL * Validate node and calculate its type. */ public void validate(ParseTreeContext context) { // If defined use the abstractSchemaIdentifier as the base variable, // otherwise use the abstractSchemaName String baseVariable = getCanonicalAbstractSchemaIdentifier(); context.setBaseVariable(baseVariable); super.validate(context); } /** * INTERNAL */ public Expression generateExpression(GenerationContext context) { return null; } /** * INTERNAL */ public String getAbstractSchemaName() { return abstractSchemaName; } /** * INTERNAL */ public void setAbstractSchemaName(String abstractSchemaName) { this.abstractSchemaName = abstractSchemaName; } /** * INTERNAL */ public String getAbstractSchemaIdentifier() { return abstractSchemaIdentifier; } /** * INTERNAL */ public void setAbstractSchemaIdentifier(String identifierName) { abstractSchemaIdentifier = identifierName; } /** * INTERNAL: * Returns the canonical name of abstract schema identifier. * If the identifier is not specified(unqualified attribute scenario), * the canonical name of abstract schema is returned. */ public String getCanonicalAbstractSchemaIdentifier() { String variable = abstractSchemaIdentifier != null ? abstractSchemaIdentifier : abstractSchemaName; return IdentificationVariableDeclNode.calculateCanonicalName(variable); } /** * resolveClass: Answer the class which corresponds to my variableName. This is the class for * an alias, where the variableName is registered to an alias. */ public Class resolveClass(GenerationContext context) { String alias = abstractSchemaName; ClassDescriptor descriptor = context.getSession().getDescriptorForAlias(alias); if (descriptor == null) { throw JPQLException.entityTypeNotFound2( context.getParseTreeContext().getQueryInfo(), getLine(), getColumn(), alias); } Class theClass = descriptor.getJavaClass(); if (theClass == null) { throw JPQLException.resolutionClassNotFoundException2( context.getParseTreeContext().getQueryInfo(), getLine(), getColumn(), alias); } return theClass; } }