Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpfullbright2011-03-11 16:20:10 +0000
committerpfullbright2011-03-11 16:20:10 +0000
commitb235a3e53aa78624f5329d7b2e67d78cd1868094 (patch)
tree11c6fcbfc3f5c062b5a9470cbb5bd9f7ee90e8fd /jaxb/plugins
parent3a3cd088da5cf2eb72ef7b8049b2a1e0f8cd82a9 (diff)
downloadwebtools.dali-b235a3e53aa78624f5329d7b2e67d78cd1868094.tar.gz
webtools.dali-b235a3e53aa78624f5329d7b2e67d78cd1868094.tar.xz
webtools.dali-b235a3e53aa78624f5329d7b2e67d78cd1868094.zip
added basic support for jaxb.index (resource model, tie-in to context calculation)
Diffstat (limited to 'jaxb/plugins')
-rw-r--r--jaxb/plugins/org.eclipse.jpt.jaxb.core/META-INF/MANIFEST.MF2
-rw-r--r--jaxb/plugins/org.eclipse.jpt.jaxb.core/plugin.xml12
-rw-r--r--jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/JaxbProject.java9
-rw-r--r--jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/JptJaxbCorePlugin.java25
-rw-r--r--jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/internal/AbstractJaxbProject.java17
-rw-r--r--jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/internal/context/GenericContextRoot.java28
-rw-r--r--jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/internal/jaxb21/AbstractJaxb_2_1_PlatformDefinition.java4
-rw-r--r--jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/internal/resource/jaxbindex/JaxbIndexResourceImpl.java127
-rw-r--r--jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/internal/resource/jaxbindex/JaxbIndexResourceModelProvider.java153
-rw-r--r--jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/resource/jaxbindex/JaxbIndexResource.java19
10 files changed, 389 insertions, 7 deletions
diff --git a/jaxb/plugins/org.eclipse.jpt.jaxb.core/META-INF/MANIFEST.MF b/jaxb/plugins/org.eclipse.jpt.jaxb.core/META-INF/MANIFEST.MF
index e49484abc0..893cd60200 100644
--- a/jaxb/plugins/org.eclipse.jpt.jaxb.core/META-INF/MANIFEST.MF
+++ b/jaxb/plugins/org.eclipse.jpt.jaxb.core/META-INF/MANIFEST.MF
@@ -43,8 +43,10 @@ Export-Package: org.eclipse.jpt.jaxb.core,
org.eclipse.jpt.jaxb.core.internal.resource.java;x-internal:=true,
org.eclipse.jpt.jaxb.core.internal.resource.java.binary;x-internal:=true,
org.eclipse.jpt.jaxb.core.internal.resource.java.source;x-internal:=true,
+ org.eclipse.jpt.jaxb.core.internal.resource.jaxbindex,
org.eclipse.jpt.jaxb.core.internal.validation;x-internal:=true,
org.eclipse.jpt.jaxb.core.libprov,
org.eclipse.jpt.jaxb.core.platform,
org.eclipse.jpt.jaxb.core.resource.java,
+ org.eclipse.jpt.jaxb.core.resource.jaxbindex,
org.eclipse.jpt.jaxb.core.xsd
diff --git a/jaxb/plugins/org.eclipse.jpt.jaxb.core/plugin.xml b/jaxb/plugins/org.eclipse.jpt.jaxb.core/plugin.xml
index cda3f8216d..ed4e793d69 100644
--- a/jaxb/plugins/org.eclipse.jpt.jaxb.core/plugin.xml
+++ b/jaxb/plugins/org.eclipse.jpt.jaxb.core/plugin.xml
@@ -22,6 +22,18 @@
<!-- ***** extensions ***** -->
+ <extension
+ point="org.eclipse.core.contenttype.contentTypes">
+
+ <content-type
+ id="org.eclipse.jpt.jaxb.core.content.jaxbIndex"
+ name="%JAXB_INDEX_CONTENT"
+ base-type="org.eclipse.core.runtime.text"
+ priority="high"
+ file-names="jaxb.index"/>
+
+ </extension>
+
<extension
point="org.eclipse.core.expressions.propertyTesters">
diff --git a/jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/JaxbProject.java b/jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/JaxbProject.java
index 0845231e37..5eaae199ab 100644
--- a/jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/JaxbProject.java
+++ b/jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/JaxbProject.java
@@ -26,6 +26,7 @@ import org.eclipse.jpt.jaxb.core.platform.JaxbPlatform;
import org.eclipse.jpt.jaxb.core.platform.JaxbPlatformDefinition;
import org.eclipse.jpt.jaxb.core.resource.java.JavaResourceAbstractType;
import org.eclipse.jpt.jaxb.core.resource.java.JavaResourcePackage;
+import org.eclipse.jpt.jaxb.core.resource.jaxbindex.JaxbIndexResource;
import org.eclipse.wst.validation.internal.provisional.core.IMessage;
import org.eclipse.wst.validation.internal.provisional.core.IReporter;
@@ -203,6 +204,14 @@ public interface JaxbProject
JavaResourceAbstractType getJavaResourceType(String typeName, JavaResourceAbstractType.Kind kind);
+ // **************** jaxb.index resources *****************************************
+
+ /**
+ * Return all jaxb.index resource models within the project
+ */
+ Iterable<JaxbIndexResource> getJaxbIndexResources();
+
+
// **************** context model *****************************************
/**
diff --git a/jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/JptJaxbCorePlugin.java b/jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/JptJaxbCorePlugin.java
index acba0d5a92..c23bacdd72 100644
--- a/jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/JptJaxbCorePlugin.java
+++ b/jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/JptJaxbCorePlugin.java
@@ -18,11 +18,13 @@ import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.preferences.DefaultScope;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.IScopeContext;
import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.jpt.common.core.JptResourceType;
import org.eclipse.jpt.jaxb.core.internal.JptJaxbCoreMessages;
import org.eclipse.jpt.jaxb.core.internal.platform.JaxbPlatformManagerImpl;
import org.eclipse.jpt.jaxb.core.platform.JaxbPlatformDescription;
@@ -52,7 +54,7 @@ public class JptJaxbCorePlugin
extends Plugin {
private static volatile boolean flushPreferences = true;
-
+
/**
* The plug-in identifier of Dali JAXB core
* (value <code>"org.eclipse.jpt.jaxb.core"</code>).
@@ -109,6 +111,27 @@ public class JptJaxbCorePlugin
*/
public static final String VALIDATION_MARKER_ID = PLUGIN_ID + ".jaxbProblemMarker"; //$NON-NLS-1$
+ /**
+ * The content type for jaxb.index files
+ */
+ public static final IContentType JAXB_INDEX_CONTENT_TYPE = getJaxbContentType("jaxbIndex");
+
+ /**
+ * The resource type for jaxb.index files
+ */
+ public static final JptResourceType JAXB_INDEX_RESOURCE_TYPE = new JptResourceType(JAXB_INDEX_CONTENT_TYPE);
+
+ private static IContentType getJaxbContentType(String contentType) {
+ return getContentType(CONTENT_PREFIX_ + contentType);
+ }
+
+ public static final String CONTENT_PREFIX = PLUGIN_ID_ + "content"; //$NON-NLS-1$
+
+ public static final String CONTENT_PREFIX_ = CONTENT_PREFIX + '.';
+
+ private static IContentType getContentType(String contentType) {
+ return Platform.getContentTypeManager().getContentType(contentType);
+ }
// **************** fields ************************************************
diff --git a/jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/internal/AbstractJaxbProject.java b/jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/internal/AbstractJaxbProject.java
index dd87607d47..f8d4487457 100644
--- a/jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/internal/AbstractJaxbProject.java
+++ b/jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/internal/AbstractJaxbProject.java
@@ -76,6 +76,7 @@ import org.eclipse.jpt.jaxb.core.resource.java.JavaResourceCompilationUnit;
import org.eclipse.jpt.jaxb.core.resource.java.JavaResourceNode;
import org.eclipse.jpt.jaxb.core.resource.java.JavaResourcePackage;
import org.eclipse.jpt.jaxb.core.resource.java.JavaResourcePackageInfoCompilationUnit;
+import org.eclipse.jpt.jaxb.core.resource.jaxbindex.JaxbIndexResource;
import org.eclipse.jst.common.project.facet.core.libprov.ILibraryProvider;
import org.eclipse.jst.common.project.facet.core.libprov.LibraryInstallDelegate;
import org.eclipse.jst.j2ee.model.internal.validation.ValidationCancelledException;
@@ -896,8 +897,20 @@ public abstract class AbstractJaxbProject
// protected Iterable<IPackageFragmentRoot> getPackageFragmentRoots() throws JavaModelException {
// return new ArrayIterable<IPackageFragmentRoot>(this.getJavaProject().getPackageFragmentRoots());
// }
-
-
+
+
+ // **************** jaxb.index resources *****************************************
+
+ public Iterable<JaxbIndexResource> getJaxbIndexResources() {
+ return new TransformationIterable<JaxbFile, JaxbIndexResource>(getJaxbFiles(JptJaxbCorePlugin.JAXB_INDEX_CONTENT_TYPE)) {
+ @Override
+ protected JaxbIndexResource transform(JaxbFile o) {
+ return (JaxbIndexResource) o.getResourceModel();
+ }
+ };
+ }
+
+
// ********** Java events **********
// TODO handle changes to external projects
diff --git a/jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/internal/context/GenericContextRoot.java b/jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/internal/context/GenericContextRoot.java
index 5b61923364..8a6459cfb1 100644
--- a/jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/internal/context/GenericContextRoot.java
+++ b/jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/internal/context/GenericContextRoot.java
@@ -17,7 +17,9 @@ import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.jpt.common.utility.internal.ClassName;
import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.common.utility.internal.NotNullFilter;
import org.eclipse.jpt.common.utility.internal.StringTools;
+import org.eclipse.jpt.common.utility.internal.iterables.CompositeIterable;
import org.eclipse.jpt.common.utility.internal.iterables.FilteringIterable;
import org.eclipse.jpt.common.utility.internal.iterables.LiveCloneIterable;
import org.eclipse.jpt.common.utility.internal.iterables.SnapshotCloneIterable;
@@ -37,6 +39,7 @@ import org.eclipse.jpt.jaxb.core.resource.java.JavaResourceAbstractType;
import org.eclipse.jpt.jaxb.core.resource.java.JavaResourceEnum;
import org.eclipse.jpt.jaxb.core.resource.java.JavaResourcePackage;
import org.eclipse.jpt.jaxb.core.resource.java.JavaResourceType;
+import org.eclipse.jpt.jaxb.core.resource.jaxbindex.JaxbIndexResource;
import org.eclipse.wst.validation.internal.provisional.core.IMessage;
import org.eclipse.wst.validation.internal.provisional.core.IReporter;
@@ -99,7 +102,7 @@ public class GenericContextRoot
this.types.put(registryResourceType.getName(), buildRegistry(registryResourceType));
}
- // calculate initial set of persistent types (annotated with @XmlType)
+ // calculate initial set of persistent types (annotated with @XmlType or listed in jaxb.index files)
final Set<JavaResourceAbstractType> resourceTypesToProcess = calculateInitialPersistentTypes();
// while there are resource types to process or types to scan, continue to do so
@@ -197,7 +200,7 @@ public class GenericContextRoot
}
}
- // calculate initial set of persistent types (annotated with @XmlType)
+ // calculate initial set of persistent types (annotated with @XmlType or listed in jaxb.index files)
final Set<JavaResourceAbstractType> resourceTypesToProcess = calculateInitialPersistentTypes();
// while there are resource types to process or types to scan, continue to do so
@@ -299,15 +302,34 @@ public class GenericContextRoot
/*
* Calculate set of resource types annotated with @XmlType (and not @XmlRegistry)
+ * plus those referred to in jaxb.index files
*/
protected Set<JavaResourceAbstractType> calculateInitialPersistentTypes() {
- return CollectionTools.set(
+ Set<JavaResourceAbstractType> set = CollectionTools.set(
new FilteringIterable<JavaResourceAbstractType>(getJaxbProject().getJavaSourceResourceTypes()) {
@Override
protected boolean accept(JavaResourceAbstractType o) {
return o.getAnnotation(JAXB.XML_TYPE) != null && o.getAnnotation(JAXB.XML_REGISTRY) == null;
}
});
+ CollectionTools.addAll(
+ set,
+ new FilteringIterable<JavaResourceAbstractType>(
+ new TransformationIterable<String, JavaResourceAbstractType>(
+ new CompositeIterable<String>(
+ new TransformationIterable<JaxbIndexResource, Iterable<String>>(getJaxbProject().getJaxbIndexResources()) {
+ @Override
+ protected Iterable<String>transform(JaxbIndexResource o) {
+ return o.getFullyQualifiedClassNames();
+ }
+ })) {
+ @Override
+ protected JavaResourceAbstractType transform(String o) {
+ return getJaxbProject().getJavaResourceType(o);
+ }
+ },
+ NotNullFilter.<JavaResourceAbstractType>instance()));
+ return set;
}
protected void processType(JavaResourceAbstractType resourceType, Set<String> typesToUpdate) {
diff --git a/jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/internal/jaxb21/AbstractJaxb_2_1_PlatformDefinition.java b/jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/internal/jaxb21/AbstractJaxb_2_1_PlatformDefinition.java
index c8a445aa9a..9a7b0d1688 100644
--- a/jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/internal/jaxb21/AbstractJaxb_2_1_PlatformDefinition.java
+++ b/jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/internal/jaxb21/AbstractJaxb_2_1_PlatformDefinition.java
@@ -53,6 +53,7 @@ import org.eclipse.jpt.jaxb.core.internal.resource.java.XmlSeeAlsoAnnotationDefi
import org.eclipse.jpt.jaxb.core.internal.resource.java.XmlTransientAnnotationDefinition;
import org.eclipse.jpt.jaxb.core.internal.resource.java.XmlTypeAnnotationDefinition;
import org.eclipse.jpt.jaxb.core.internal.resource.java.XmlValueAnnotationDefinition;
+import org.eclipse.jpt.jaxb.core.internal.resource.jaxbindex.JaxbIndexResourceModelProvider;
import org.eclipse.jpt.jaxb.core.resource.java.AnnotationDefinition;
import org.eclipse.jpt.jaxb.core.resource.java.NestableAnnotationDefinition;
@@ -121,7 +122,8 @@ public abstract class AbstractJaxb_2_1_PlatformDefinition
// order should not be important here
return new JaxbResourceModelProvider[] {
JavaResourceModelProvider.instance(),
- JavaPackageInfoResourceModelProvider.instance()};
+ JavaPackageInfoResourceModelProvider.instance(),
+ JaxbIndexResourceModelProvider.instance()};
}
diff --git a/jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/internal/resource/jaxbindex/JaxbIndexResourceImpl.java b/jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/internal/resource/jaxbindex/JaxbIndexResourceImpl.java
new file mode 100644
index 0000000000..7c963f1f2d
--- /dev/null
+++ b/jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/internal/resource/jaxbindex/JaxbIndexResourceImpl.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * Copyright (c) 2011 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.jaxb.core.internal.resource.jaxbindex;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.List;
+import java.util.Vector;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jpt.common.core.JptResourceModelListener;
+import org.eclipse.jpt.common.core.JptResourceType;
+import org.eclipse.jpt.common.utility.internal.ListenerList;
+import org.eclipse.jpt.common.utility.internal.StringTools;
+import org.eclipse.jpt.common.utility.internal.iterables.SnapshotCloneIterable;
+import org.eclipse.jpt.common.utility.internal.iterables.TransformationIterable;
+import org.eclipse.jpt.jaxb.core.JptJaxbCorePlugin;
+import org.eclipse.jpt.jaxb.core.resource.jaxbindex.JaxbIndexResource;
+
+
+public class JaxbIndexResourceImpl
+ implements JaxbIndexResource {
+
+ protected final ListenerList<JptResourceModelListener> resourceModelListenerList =
+ new ListenerList<JptResourceModelListener>(JptResourceModelListener.class);
+
+
+ protected final List<String> classNames = new Vector<String>();
+
+ protected IFile file;
+
+
+ public JaxbIndexResourceImpl(IFile file) {
+ super();
+ if (file == null) {
+ throw new IllegalArgumentException("file cannot be null");
+ }
+ this.file = file;
+ buildClassNames();
+ }
+
+
+ private void buildClassNames() {
+ InputStream stream = null;
+
+ try {
+ stream = file.getContents();
+ }
+ catch (CoreException ce) {
+ JptJaxbCorePlugin.log(ce);
+ return;
+ }
+
+ if (stream != null) {
+ BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
+ try {
+ String line = reader.readLine();
+ while (line != null) {
+ String className = line.trim();
+ this.classNames.add(className);
+ line = reader.readLine();
+ }
+ }
+ catch (Exception ex) {
+ JptJaxbCorePlugin.log(ex);
+ }
+ }
+ }
+
+ public Iterable<String> getFullyQualifiedClassNames() {
+ String packageName = getPackageName();
+ final String packagePrefix = StringTools.stringIsEmpty(packageName) ? "" : packageName + ".";
+ return new TransformationIterable<String, String>(
+ new SnapshotCloneIterable<String>(this.classNames)) {
+ @Override
+ protected String transform(String shortClassName) {
+ return packagePrefix + shortClassName;
+ }
+ };
+ }
+
+ protected String getPackageName() {
+ IJavaElement javaElement = JavaCore.create(this.file.getParent());
+ if (javaElement != null && javaElement.getElementType() == IJavaElement.PACKAGE_FRAGMENT) {
+ return ((IPackageFragment) javaElement).getElementName();
+ }
+ return null;
+ }
+
+ void update() {
+ this.classNames.clear();
+ buildClassNames();
+ resourceModelChanged();
+ }
+
+
+ // ********** JptResourceModel implementation **********
+
+ public JptResourceType getResourceType() {
+ return JptJaxbCorePlugin.JAXB_INDEX_RESOURCE_TYPE;
+ }
+
+ public void addResourceModelListener(JptResourceModelListener listener) {
+ this.resourceModelListenerList.add(listener);
+ }
+
+ public void removeResourceModelListener(JptResourceModelListener listener) {
+ this.resourceModelListenerList.remove(listener);
+ }
+
+ protected void resourceModelChanged() {
+ for (JptResourceModelListener listener : this.resourceModelListenerList.getListeners()) {
+ listener.resourceModelChanged(this);
+ }
+ }
+}
diff --git a/jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/internal/resource/jaxbindex/JaxbIndexResourceModelProvider.java b/jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/internal/resource/jaxbindex/JaxbIndexResourceModelProvider.java
new file mode 100644
index 0000000000..c99f82f073
--- /dev/null
+++ b/jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/internal/resource/jaxbindex/JaxbIndexResourceModelProvider.java
@@ -0,0 +1,153 @@
+/*******************************************************************************
+ * Copyright (c) 2011 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.jaxb.core.internal.resource.jaxbindex;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceDeltaVisitor;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.jpt.common.core.JptResourceModel;
+import org.eclipse.jpt.common.utility.internal.iterables.SnapshotCloneIterable;
+import org.eclipse.jpt.jaxb.core.JaxbProject;
+import org.eclipse.jpt.jaxb.core.JaxbResourceModelProvider;
+import org.eclipse.jpt.jaxb.core.JptJaxbCorePlugin;
+
+
+public class JaxbIndexResourceModelProvider
+ implements JaxbResourceModelProvider {
+
+ // singleton
+ private static final JaxbResourceModelProvider INSTANCE = new JaxbIndexResourceModelProvider();
+
+ /**
+ * Return the singleton.
+ */
+ public static JaxbResourceModelProvider instance() {
+ return INSTANCE;
+ }
+
+
+ private final Map<IFile, JaxbIndexResourceImpl> models = new HashMap<IFile, JaxbIndexResourceImpl>();
+
+ private final IResourceChangeListener resourceChangeListener;
+
+
+ /**
+ * Enforce singleton usage
+ */
+ private JaxbIndexResourceModelProvider() {
+ super();
+ this.resourceChangeListener = buildResourceChangeListener();
+ ResourcesPlugin.getWorkspace().addResourceChangeListener(this.resourceChangeListener);
+ }
+
+
+ protected IResourceChangeListener buildResourceChangeListener() {
+ return new IResourceChangeListener() {
+ public void resourceChanged(IResourceChangeEvent event) {
+ handleResourceChangeEvent(event);
+ }
+ };
+ }
+
+ public IContentType getContentType() {
+ return JptJaxbCorePlugin.JAXB_INDEX_CONTENT_TYPE;
+ }
+
+ public JptResourceModel buildResourceModel(JaxbProject jaxbProject, IFile file) {
+ JaxbIndexResourceImpl resource = this.models.get(file);
+ if (resource != null) {
+ return resource;
+ }
+ resource = new JaxbIndexResourceImpl(file);
+ this.models.put(file, resource);
+ return resource;
+ }
+
+ protected void handleResourceChangeEvent(IResourceChangeEvent event) {
+ switch (event.getType()) {
+ case IResourceChangeEvent.PRE_CLOSE :
+ case IResourceChangeEvent.PRE_DELETE :
+ removeProjectResources((IProject) event.getResource());
+ return;
+
+ case IResourceChangeEvent.POST_CHANGE :
+ updateResources(event.getDelta());
+ }
+ }
+
+ protected void removeProjectResources(IProject removedProject) {
+ for (IFile file : new SnapshotCloneIterable<IFile>(this.models.keySet())) {
+ if (file.getProject().equals(removedProject)) {
+ removeResource(file);
+ }
+ }
+ }
+
+ protected void updateResources(IResourceDelta delta) {
+ try {
+ delta.accept(new ResourceDeltaVisitor());
+ }
+ catch (CoreException ce) {
+ // shouldn't happen
+ JptJaxbCorePlugin.log(ce);
+ }
+ }
+
+ protected void removeResource(IFile file) {
+ this.models.remove(file);
+ }
+
+ protected void updateResource(IFile file) {
+ JaxbIndexResourceImpl resource = this.models.get(file);
+ if (resource != null) {
+ resource.update();
+ }
+ }
+
+
+ protected class ResourceDeltaVisitor
+ implements IResourceDeltaVisitor {
+
+ public boolean visit(IResourceDelta delta) {
+ IResource res = delta.getResource();
+ switch (res.getType()) {
+ case IResource.ROOT :
+ return true; // visit children
+ case IResource.PROJECT :
+ return true; // visit children
+ case IResource.FOLDER :
+ return true; // visit children
+ case IResource.FILE :
+ fileChanged((IFile) res, delta.getKind());
+ return false; // no children
+ default :
+ return false; // no children (probably shouldn't get here...)
+ }
+ }
+
+ protected void fileChanged(IFile file, int deltaKind) {
+ if (deltaKind == IResourceDelta.REMOVED) {
+ JaxbIndexResourceModelProvider.this.removeResource(file);
+ }
+ else if (deltaKind == IResourceDelta.CHANGED) {
+ JaxbIndexResourceModelProvider.this.updateResource(file);
+ }
+ }
+ }
+}
diff --git a/jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/resource/jaxbindex/JaxbIndexResource.java b/jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/resource/jaxbindex/JaxbIndexResource.java
new file mode 100644
index 0000000000..49285aeb3d
--- /dev/null
+++ b/jaxb/plugins/org.eclipse.jpt.jaxb.core/src/org/eclipse/jpt/jaxb/core/resource/jaxbindex/JaxbIndexResource.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2011 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.jaxb.core.resource.jaxbindex;
+
+import org.eclipse.jpt.common.core.JptResourceModel;
+
+
+public interface JaxbIndexResource
+ extends JptResourceModel {
+
+ Iterable<String> getFullyQualifiedClassNames();
+}

Back to the top