| /******************************************************************************* |
| * Copyright (c) 2010 Oracle. |
| * All rights reserved. This program and the accompanying materials are |
| * made available under the terms of the Eclipse Public License v1.0 which |
| * accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Oracle - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jpt.core.internal.context.java; |
| |
| import org.eclipse.jdt.core.dom.CompilationUnit; |
| import org.eclipse.jpt.core.context.AccessType; |
| import org.eclipse.jpt.core.context.java.JavaIdClassReference; |
| import org.eclipse.jpt.core.context.java.JavaPersistentType; |
| import org.eclipse.jpt.core.context.java.JavaTypeMapping; |
| import org.eclipse.jpt.core.resource.java.IdClassAnnotation; |
| import org.eclipse.jpt.core.resource.java.JavaResourcePersistentType; |
| import org.eclipse.jpt.core.utility.TextRange; |
| |
| public class GenericJavaIdClassReference |
| extends AbstractJavaJpaContextNode |
| implements JavaIdClassReference |
| { |
| protected String idClassName; |
| |
| protected JavaPersistentType idClass; |
| |
| |
| public GenericJavaIdClassReference(JavaTypeMapping parent) { |
| super(parent); |
| } |
| |
| |
| protected JavaTypeMapping getTypeMapping() { |
| return (JavaTypeMapping) getParent(); |
| } |
| |
| protected JavaPersistentType getPersistentType() { |
| return getTypeMapping().getPersistentType(); |
| } |
| |
| |
| // **************** PersistentType.Owner impl ***************************** |
| |
| public AccessType getOverridePersistentTypeAccess() { |
| return getPersistentType().getAccess(); |
| } |
| |
| public AccessType getDefaultPersistentTypeAccess() { |
| // this shouldn't be needed, since we've specified an override access, but just to be safe ... |
| return getPersistentType().getAccess(); |
| } |
| |
| |
| // **************** IdClassReference impl ********************************* |
| |
| public String getSpecifiedIdClassName() { |
| return this.idClassName; |
| } |
| |
| public void setSpecifiedIdClassName(String newClassName) { |
| String oldClassName = this.idClassName; |
| this.idClassName = newClassName; |
| if (this.valuesAreDifferent(newClassName, oldClassName)) { |
| if (newClassName != null) { |
| if (getIdClassAnnotation() == null) { |
| addIdClassAnnotation(); |
| } |
| getIdClassAnnotation().setValue(newClassName); |
| } |
| else { |
| removeIdClassAnnotation(); |
| } |
| } |
| firePropertyChanged(SPECIFIED_ID_CLASS_NAME_PROPERTY, oldClassName, newClassName); |
| } |
| |
| protected void setIdClassName_(String newClassName) { |
| String oldClassName = this.idClassName; |
| this.idClassName = newClassName; |
| firePropertyChanged(SPECIFIED_ID_CLASS_NAME_PROPERTY, oldClassName, newClassName); |
| } |
| |
| protected String buildIdClassName() { |
| IdClassAnnotation annotation = getIdClassAnnotation(); |
| if (annotation != null) { |
| return annotation.getValue(); |
| } |
| return null; |
| } |
| |
| public String getDefaultIdClassName() { |
| return null; |
| } |
| |
| public String getIdClassName() { |
| return getSpecifiedIdClassName(); |
| } |
| |
| public boolean isSpecified() { |
| return getSpecifiedIdClassName() != null; |
| } |
| |
| public JavaPersistentType getIdClass() { |
| return this.idClass; |
| } |
| |
| protected void setIdClass_(JavaPersistentType newIdClass) { |
| JavaPersistentType oldIdClass = this.idClass; |
| this.idClass = newIdClass; |
| firePropertyChanged(ID_CLASS_PROPERTY, oldIdClass, newIdClass); |
| } |
| |
| protected JavaPersistentType buildIdClass() { |
| JavaResourcePersistentType resourceIdClass = getResourceIdClass(); |
| return (resourceIdClass == null) ? |
| null : this.buildIdClass(resourceIdClass); |
| } |
| |
| protected JavaPersistentType buildIdClass(JavaResourcePersistentType resourceClass) { |
| return getJpaFactory().buildJavaPersistentType(this, resourceClass); |
| } |
| |
| protected JavaResourcePersistentType getResourcePersistentType() { |
| return getPersistentType().getResourcePersistentType(); |
| } |
| |
| protected IdClassAnnotation getIdClassAnnotation() { |
| return (IdClassAnnotation) getResourcePersistentType(). |
| getAnnotation(IdClassAnnotation.ANNOTATION_NAME); |
| } |
| |
| protected void addIdClassAnnotation() { |
| getResourcePersistentType().addAnnotation(IdClassAnnotation.ANNOTATION_NAME); |
| } |
| |
| protected void removeIdClassAnnotation() { |
| getResourcePersistentType().removeAnnotation(IdClassAnnotation.ANNOTATION_NAME); |
| } |
| |
| protected JavaResourcePersistentType getResourceIdClass() { |
| IdClassAnnotation annotation = getIdClassAnnotation(); |
| String className = (annotation == null) ? |
| null : annotation.getFullyQualifiedClassName(); |
| return (className == null) ? |
| null : getJpaProject().getJavaResourcePersistentType(className); |
| } |
| |
| public char getIdClassEnclosingTypeSeparator() { |
| return '.'; |
| } |
| |
| public void initialize() { |
| this.idClassName = buildIdClassName(); |
| this.idClass = buildIdClass(); |
| } |
| |
| public void update() { |
| setIdClassName_(buildIdClassName()); |
| updateIdClass(); |
| } |
| |
| protected void updateIdClass() { |
| JavaResourcePersistentType resourceIdClass = getResourceIdClass(); |
| if (resourceIdClass == null) { |
| setIdClass_(null); |
| } |
| else { |
| if (this.idClass == null || this.idClass.getResourcePersistentType() != resourceIdClass) { |
| setIdClass_(buildIdClass(resourceIdClass)); |
| } |
| this.idClass.update(resourceIdClass); |
| } |
| } |
| |
| |
| // **************** validation ******************************************** |
| |
| public TextRange getValidationTextRange(CompilationUnit astRoot) { |
| return (getIdClassAnnotation() == null) ? |
| getTypeMapping().getValidationTextRange(astRoot) |
| : getIdClassAnnotation().getTextRange(astRoot); |
| } |
| } |