diff options
author | bvosburgh | 2008-03-26 21:18:05 +0000 |
---|---|---|
committer | bvosburgh | 2008-03-26 21:18:05 +0000 |
commit | c040ea464d96837e850f3da692c4950b63d14e40 (patch) | |
tree | ebe6a344b7848cec0bf38faf0bad3315b6a77246 /jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/resource/java/JavaResourceModelImpl.java | |
parent | e4395562b8f1e3d5e0a4b8b02fa7ee89394a1705 (diff) | |
download | webtools.dali-c040ea464d96837e850f3da692c4950b63d14e40.tar.gz webtools.dali-c040ea464d96837e850f3da692c4950b63d14e40.tar.xz webtools.dali-c040ea464d96837e850f3da692c4950b63d14e40.zip |
added JavaResourceModel interface
Diffstat (limited to 'jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/resource/java/JavaResourceModelImpl.java')
-rw-r--r-- | jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/resource/java/JavaResourceModelImpl.java | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/resource/java/JavaResourceModelImpl.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/resource/java/JavaResourceModelImpl.java new file mode 100644 index 0000000000..69d10efebf --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/resource/java/JavaResourceModelImpl.java @@ -0,0 +1,124 @@ +/******************************************************************************* + * Copyright (c) 2007, 2008 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; + +import java.util.ArrayList; +import java.util.Collection; +import org.eclipse.core.resources.IFile; +import org.eclipse.jdt.core.ElementChangedEvent; +import org.eclipse.jdt.core.IJavaElement; +import org.eclipse.jdt.core.IJavaElementDelta; +import org.eclipse.jpt.core.JpaAnnotationProvider; +import org.eclipse.jpt.core.ResourceModelListener; +import org.eclipse.jpt.core.internal.AbstractResourceModel; +import org.eclipse.jpt.core.internal.utility.jdt.JDTTools; +import org.eclipse.jpt.core.resource.java.JavaResourceModel; +import org.eclipse.jpt.core.resource.java.JpaCompilationUnit; +import org.eclipse.jpt.core.utility.jdt.AnnotationEditFormatter; +import org.eclipse.jpt.utility.CommandExecutorProvider; +import org.eclipse.jpt.utility.internal.BitTools; + +public class JavaResourceModelImpl + extends AbstractResourceModel + implements JavaResourceModel +{ + private final Collection<ResourceModelListener> resourceModelListeners; + + private final JpaCompilationUnit compilationUnitResource; + + + public JavaResourceModelImpl( + IFile file, JpaAnnotationProvider annotationProvider, + CommandExecutorProvider modifySharedDocumentCommandExecutorProvider, + AnnotationEditFormatter annotationEditFormatter) { + super(); + this.resourceModelListeners = new ArrayList<ResourceModelListener>(); + this.compilationUnitResource = + new JpaCompilationUnitImpl(file, annotationProvider, modifySharedDocumentCommandExecutorProvider, annotationEditFormatter, this); + } + + public String getResourceType() { + return JAVA_RESOURCE_TYPE; + } + + @Override + public JpaCompilationUnit getResource() { + return this.compilationUnitResource; + } + + public void addResourceModelChangeListener(ResourceModelListener listener) { + if (listener == null) { + throw new IllegalArgumentException("Listener cannot be null"); + } + if (this.resourceModelListeners.contains(listener)) { + throw new IllegalArgumentException("Listener " + listener + " already added"); + } + this.resourceModelListeners.add(listener); + } + + public void removeResourceModelChangeListener(ResourceModelListener listener) { + if (!this.resourceModelListeners.contains(listener)) { + throw new IllegalArgumentException("Listener " + listener + " was never added"); + } + this.resourceModelListeners.add(listener); + } + + public void resourceChanged() { + if (getResource() == null) { + throw new IllegalStateException("Change events should not be fired during construction"); + } + for (ResourceModelListener listener : this.resourceModelListeners) { + listener.resourceModelChanged(); + } + } + + public void javaElementChanged(ElementChangedEvent event) { + synchWithJavaDelta(event.getDelta()); + } + + private void synchWithJavaDelta(IJavaElementDelta delta) { + switch (delta.getElement().getElementType()) { + case IJavaElement.JAVA_MODEL : + case IJavaElement.JAVA_PROJECT : + case IJavaElement.PACKAGE_FRAGMENT_ROOT : + case IJavaElement.PACKAGE_FRAGMENT : + this.synchChildrenWithJavaDelta(delta); + break; + case IJavaElement.COMPILATION_UNIT : + this.synchCompilationUnitWithJavaDelta(delta); + break; + default : + break; // the event is somehow lower than a compilation unit + } + } + + private void synchChildrenWithJavaDelta(IJavaElementDelta delta) { + for (IJavaElementDelta child : delta.getAffectedChildren()) { + this.synchWithJavaDelta(child); // recurse + } + } + + private void synchCompilationUnitWithJavaDelta(IJavaElementDelta delta) { + // ignore changes to/from primary working copy - no content has changed; + // and make sure there are no other flags set that indicate both a change to/from + // primary working copy AND content has changed + if (BitTools.onlyFlagIsSet(delta.getFlags(), IJavaElementDelta.F_PRIMARY_WORKING_COPY)) { + return; + } + if (delta.getElement().equals(this.compilationUnitResource.getCompilationUnit())) { + //TODO possibly hop on the UI thread here so that we know only 1 thread is changing our model + this.compilationUnitResource.updateFromJava(JDTTools.buildASTRoot(this.compilationUnitResource.getCompilationUnit())); + } + } + + public void resolveTypes() { + this.compilationUnitResource.resolveTypes(JDTTools.buildASTRoot(this.compilationUnitResource.getCompilationUnit())); + } +} |