Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/synch/SynchronizeClassesJob.java')
-rw-r--r--jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/synch/SynchronizeClassesJob.java146
1 files changed, 146 insertions, 0 deletions
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/synch/SynchronizeClassesJob.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/synch/SynchronizeClassesJob.java
new file mode 100644
index 0000000000..a15741ea02
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/synch/SynchronizeClassesJob.java
@@ -0,0 +1,146 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 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.jpa.core.internal.synch;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResourceRuleFactory;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.resources.WorkspaceJob;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jpt.common.utility.internal.CollectionTools;
+import org.eclipse.jpt.common.utility.internal.iterables.TransformationIterable;
+import org.eclipse.jpt.jpa.core.JpaProject;
+import org.eclipse.jpt.jpa.core.JptJpaCorePlugin;
+import org.eclipse.jpt.jpa.core.context.persistence.MappingFileRef;
+import org.eclipse.jpt.jpa.core.context.persistence.Persistence;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnit;
+import org.eclipse.jpt.jpa.core.context.persistence.PersistenceXml;
+import org.eclipse.jpt.jpa.core.internal.JptCoreMessages;
+import org.eclipse.jpt.jpa.core.resource.persistence.PersistenceFactory;
+import org.eclipse.jpt.jpa.core.resource.persistence.XmlJavaClassRef;
+import org.eclipse.jpt.jpa.core.resource.persistence.XmlPersistence;
+import org.eclipse.jpt.jpa.core.resource.persistence.XmlPersistenceUnit;
+import org.eclipse.jpt.jpa.core.resource.xml.JpaXmlResource;
+
+/**
+ * Synchronizes the lists of persistent classes in a persistence unit and a
+ * persistence project.
+ */
+public class SynchronizeClassesJob extends WorkspaceJob
+{
+ private IFile persistenceXmlFile;
+
+
+ public SynchronizeClassesJob(IFile file) {
+ super(JptCoreMessages.SYNCHRONIZE_CLASSES_JOB);
+ IResourceRuleFactory ruleFactory = ResourcesPlugin.getWorkspace().getRuleFactory();
+ setRule(ruleFactory.modifyRule(file.getProject()));
+ this.persistenceXmlFile = file;
+ }
+
+ @Override
+ public IStatus runInWorkspace(IProgressMonitor monitor) {
+ if (monitor.isCanceled()) {
+ return Status.CANCEL_STATUS;
+ }
+ final SubMonitor sm = SubMonitor.convert(monitor, JptCoreMessages.SYNCHRONIZING_CLASSES_TASK, 20);
+ final JpaProject jpaProject = JptJpaCorePlugin.getJpaProject(this.persistenceXmlFile.getProject());
+ final JpaXmlResource resource = jpaProject.getPersistenceXmlResource();
+ if (resource == null) {
+ //the resource would only be null if the persistence.xml file had an invalid content type
+ return Status.OK_STATUS;
+ }
+ if (sm.isCanceled()) {
+ return Status.CANCEL_STATUS;
+ }
+ sm.worked(1);
+
+ resource.modify(new Runnable() {
+ public void run() {
+ XmlPersistence persistence = (XmlPersistence) resource.getRootObject();
+ XmlPersistenceUnit persistenceUnit;
+
+ if (persistence.getPersistenceUnits().size() > 0) {
+ persistenceUnit = persistence.getPersistenceUnits().get(0);
+ }
+ else {
+ persistenceUnit = PersistenceFactory.eINSTANCE.createXmlPersistenceUnit();
+ persistenceUnit.setName(jpaProject.getName());
+ persistence.getPersistenceUnits().add(persistenceUnit);
+ }
+ sm.worked(1);
+
+ persistenceUnit.getClasses().clear();
+ sm.worked(1);
+
+ addClassRefs(sm.newChild(17), jpaProject, persistenceUnit);
+ }
+ });
+ return Status.OK_STATUS;
+ }
+
+ protected void addClassRefs(IProgressMonitor monitor, JpaProject jpaProject, XmlPersistenceUnit persistenceUnit) {
+ Iterable<String> mappedClassNames = getMappedClassNames(jpaProject, '$');
+ final SubMonitor sm = SubMonitor.convert(monitor, CollectionTools.size(mappedClassNames));
+
+ for (String fullyQualifiedTypeName : mappedClassNames) {
+ if ( ! mappingFileContains(jpaProject, fullyQualifiedTypeName)) {
+ XmlJavaClassRef classRef = PersistenceFactory.eINSTANCE.createXmlJavaClassRef();
+ classRef.setJavaClass(fullyQualifiedTypeName);
+ persistenceUnit.getClasses().add(classRef);
+ }
+ sm.worked(1);
+ }
+ }
+
+ protected Iterable<String> getMappedClassNames(final JpaProject jpaProject, final char enclosingTypeSeparator) {
+ return new TransformationIterable<String, String>(jpaProject.getMappedJavaSourceClassNames()) {
+ @Override
+ protected String transform(String fullyQualifiedName) {
+ IType jdtType = SynchronizeClassesJob.this.findType(jpaProject, fullyQualifiedName);
+ return jdtType.getFullyQualifiedName(enclosingTypeSeparator);
+ }
+ };
+ }
+
+ protected IType findType(JpaProject jpaProject, String typeName) {
+ try {
+ return jpaProject.getJavaProject().findType(typeName);
+ } catch (JavaModelException ex) {
+ return null; // ignore exception?
+ }
+ }
+
+ boolean mappingFileContains(JpaProject jpaProject, String fullyQualifiedTypeName) {
+ PersistenceXml persistenceXml = jpaProject.getRootContextNode().getPersistenceXml();
+ if (persistenceXml == null) {
+ return false;
+ }
+ Persistence persistence = persistenceXml.getPersistence();
+ if (persistence == null) {
+ return false;
+ }
+ if (persistence.persistenceUnitsSize() == 0) {
+ return false;
+ }
+ PersistenceUnit persistenceUnit = persistence.persistenceUnits().next();
+ for (MappingFileRef mappingFileRef : CollectionTools.iterable(persistenceUnit.mappingFileRefs())) {
+ if (mappingFileRef.getPersistentType(fullyQualifiedTypeName) != null) {
+ return true;
+ }
+ }
+ return false;
+ }
+} \ No newline at end of file

Back to the top