blob: fbf88c16b55e4fdea692313f81692568d11864ab [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 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.synch;
import java.io.IOException;
import java.util.Iterator;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.WorkspaceJob;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jpt.core.JpaProject;
import org.eclipse.jpt.core.JptCorePlugin;
import org.eclipse.jpt.core.context.persistence.MappingFileRef;
import org.eclipse.jpt.core.context.persistence.Persistence;
import org.eclipse.jpt.core.context.persistence.PersistenceUnit;
import org.eclipse.jpt.core.context.persistence.PersistenceXml;
import org.eclipse.jpt.core.internal.JptCoreMessages;
import org.eclipse.jpt.core.resource.persistence.PersistenceArtifactEdit;
import org.eclipse.jpt.core.resource.persistence.PersistenceFactory;
import org.eclipse.jpt.core.resource.persistence.PersistenceResource;
import org.eclipse.jpt.core.resource.persistence.XmlJavaClassRef;
import org.eclipse.jpt.core.resource.persistence.XmlPersistence;
import org.eclipse.jpt.core.resource.persistence.XmlPersistenceUnit;
import org.eclipse.jpt.utility.internal.CollectionTools;
/**
* 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);
setRule(file.getProject());
this.persistenceXmlFile = file;
}
@Override
public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
monitor.beginTask(JptCoreMessages.SYNCHRONIZING_CLASSES_TASK, 200);
if (monitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
JpaProject jpaProject = JptCorePlugin.getJpaProject(this.persistenceXmlFile.getProject());
PersistenceArtifactEdit persistenceArtifactEdit = PersistenceArtifactEdit.getArtifactEditForWrite(this.persistenceXmlFile.getProject());
PersistenceResource persistenceResource = persistenceArtifactEdit.getResource(this.persistenceXmlFile);
monitor.worked(25);
XmlPersistence persistence = persistenceResource.getPersistence();
if (persistence == null) {
persistence = PersistenceFactory.eINSTANCE.createXmlPersistence();
persistenceResource.getContents().add(persistence);
}
XmlPersistenceUnit persistenceUnitResource;
if (persistence.getPersistenceUnits().size() > 0) {
persistenceUnitResource = persistence.getPersistenceUnits().get(0);
}
else {
persistenceUnitResource = PersistenceFactory.eINSTANCE.createXmlPersistenceUnit();
persistenceUnitResource.setName(this.persistenceXmlFile.getProject().getName());
persistence.getPersistenceUnits().add(persistenceUnitResource);
}
persistenceUnitResource.getClasses().clear();
monitor.worked(25);
for (Iterator<String> stream = jpaProject.annotatedClassNames(); stream.hasNext(); ) {
String fullyQualifiedTypeName = stream.next();
if ( ! mappingFileContains(jpaProject, fullyQualifiedTypeName)) {
XmlJavaClassRef classRef = PersistenceFactory.eINSTANCE.createXmlJavaClassRef();
classRef.setJavaClass(fullyQualifiedTypeName);
persistenceUnitResource.getClasses().add(classRef);
}
}
monitor.worked(100);
try {
persistenceResource.save(null);
}
catch (IOException ioe) {
return new Status(IStatus.ERROR, JptCorePlugin.PLUGIN_ID, JptCoreMessages.ERROR_WRITING_FILE, ioe);
}
finally {
persistenceArtifactEdit.dispose();
monitor.done();
}
return Status.OK_STATUS;
}
private boolean mappingFileContains(JpaProject jpaProject, String fullyQualifiedTypeName) {
PersistenceXml persistenceXml = jpaProject.getRootContext().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;
}
}