Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/resource/java/source/SourceTypeCompilationUnit.java')
-rw-r--r--jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/resource/java/source/SourceTypeCompilationUnit.java167
1 files changed, 167 insertions, 0 deletions
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/resource/java/source/SourceTypeCompilationUnit.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/resource/java/source/SourceTypeCompilationUnit.java
new file mode 100644
index 0000000000..d6dc5b48fe
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/resource/java/source/SourceTypeCompilationUnit.java
@@ -0,0 +1,167 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 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.resource.java.source;
+
+import java.util.Iterator;
+import java.util.List;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.dom.ASTNode;
+import org.eclipse.jdt.core.dom.AbstractTypeDeclaration;
+import org.eclipse.jdt.core.dom.CompilationUnit;
+import org.eclipse.jdt.core.dom.TypeDeclaration;
+import org.eclipse.jpt.core.JpaAnnotationProvider;
+import org.eclipse.jpt.core.JpaResourceType;
+import org.eclipse.jpt.core.JptCorePlugin;
+import org.eclipse.jpt.core.resource.java.JavaResourcePersistentType;
+import org.eclipse.jpt.core.utility.jdt.AnnotationEditFormatter;
+import org.eclipse.jpt.utility.CommandExecutor;
+import org.eclipse.jpt.utility.internal.iterators.EmptyIterator;
+
+/**
+ * Java compilation unit (source file)
+ * non package-info.java file
+ */
+public final class SourceTypeCompilationUnit
+ extends SourceCompilationUnit
+{
+
+ /**
+ * The primary type of the AST compilation unit. We are not going to handle
+ * multiple types defined in a single compilation unit. Entities must have
+ * a public/protected no-arg constructor, and there is no way to access
+ * the constructor in a package class (which is what all top-level,
+ * non-primary classes must be).
+ */
+ private JavaResourcePersistentType persistentType;
+
+
+ // ********** construction **********
+
+ public SourceTypeCompilationUnit(
+ ICompilationUnit compilationUnit,
+ JpaAnnotationProvider annotationProvider,
+ AnnotationEditFormatter annotationEditFormatter,
+ CommandExecutor modifySharedDocumentCommandExecutor) {
+ super(compilationUnit, annotationProvider, annotationEditFormatter, modifySharedDocumentCommandExecutor); // the JPA compilation unit is the root of its sub-tree
+ this.persistentType = this.buildPersistentType();
+ }
+
+ private JavaResourcePersistentType buildPersistentType() {
+ this.openCompilationUnit();
+ CompilationUnit astRoot = this.buildASTRoot();
+ this.closeCompilationUnit();
+ return this.buildPersistentType(astRoot);
+ }
+
+
+ // ********** JavaResourceNode implementation **********
+
+ public void synchronizeWith(CompilationUnit astRoot) {
+ this.syncPersistentType(astRoot);
+ }
+
+
+ // ********** JavaResourceNode.Root implementation **********
+
+ /**
+ * NB: return *all* the persistent types since we build them all
+ */
+ public Iterator<JavaResourcePersistentType> persistentTypes() {
+ return (this.persistentType == null) ?
+ EmptyIterator.<JavaResourcePersistentType>instance() :
+ this.persistentType.allTypes();
+ }
+
+
+ // ********** JpaResourceModel implementation **********
+
+ public JpaResourceType getResourceType() {
+ return JptCorePlugin.JAVA_SOURCE_RESOURCE_TYPE;
+ }
+
+
+ // ********** JavaResourceCompilationUnit implementation **********
+
+ public void resolveTypes() {
+ if (this.persistentType != null) {
+ this.persistentType.resolveTypes(this.buildASTRoot());
+ }
+ }
+
+
+ // ********** persistent type **********
+
+ private JavaResourcePersistentType buildPersistentType(CompilationUnit astRoot) {
+ TypeDeclaration td = this.getPrimaryTypeDeclaration(astRoot);
+ return (td == null) ? null : this.buildPersistentType(astRoot, td);
+ }
+
+
+ private void syncPersistentType(CompilationUnit astRoot) {
+ TypeDeclaration td = this.getPrimaryTypeDeclaration(astRoot);
+ if (td == null) {
+ this.syncPersistentType_(null);
+ } else {
+ if (this.persistentType == null) {
+ this.syncPersistentType_(this.buildPersistentType(astRoot, td));
+ } else {
+ this.persistentType.synchronizeWith(astRoot);
+ }
+ }
+ }
+
+ private void syncPersistentType_(JavaResourcePersistentType astPersistentType) {
+ JavaResourcePersistentType old = this.persistentType;
+ this.persistentType = astPersistentType;
+ this.firePropertyChanged(PERSISTENT_TYPES_COLLECTION, old, astPersistentType);
+ }
+
+
+ // ********** internal **********
+
+ private JavaResourcePersistentType buildPersistentType(CompilationUnit astRoot, TypeDeclaration typeDeclaration) {
+ return SourcePersistentType.newInstance(this, typeDeclaration, astRoot);
+ }
+
+ /**
+ * i.e. the type with the same name as the compilation unit;
+ * return the first class or interface (ignore annotations and enums) with
+ * the same name as the compilation unit (file);
+ * NB: this type could be in error if there is an annotation or enum
+ * with the same name preceding it in the compilation unit
+ *
+ * Return null if the parser did not resolve the type declaration's binding.
+ * This can occur if the project JRE is removed (bug 225332).
+ */
+ private TypeDeclaration getPrimaryTypeDeclaration(CompilationUnit astRoot) {
+ String primaryTypeName = this.getPrimaryTypeName();
+ for (AbstractTypeDeclaration atd : this.types(astRoot)) {
+ if (this.nodeIsPrimaryTypeDeclaration(atd, primaryTypeName)) {
+ return (atd.resolveBinding() == null) ? null : (TypeDeclaration) atd;
+ }
+ }
+ return null;
+ }
+
+ private boolean nodeIsPrimaryTypeDeclaration(AbstractTypeDeclaration atd, String primaryTypeName) {
+ return (atd.getNodeType() == ASTNode.TYPE_DECLARATION) &&
+ atd.getName().getFullyQualifiedName().equals(primaryTypeName);
+ }
+
+ private String getPrimaryTypeName() {
+ return this.getCompilationUnitName();
+ }
+
+ // minimize scope of suppressed warnings
+ @SuppressWarnings("unchecked")
+ private List<AbstractTypeDeclaration> types(CompilationUnit astRoot) {
+ return astRoot.types();
+ }
+}

Back to the top