blob: d4dd9aa3dc826bd21b9cf6a0d8b7fe1b903c6853 [file] [log] [blame]
/**
* <copyright>
*
* Copyright (c) 2008-2013 See4sys, itemis and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
*
* Contributors:
* See4sys - Initial API and implementation
* itemis - [423662] Prevent creation of duplicated model descriptors by design
* itemis - [425854] The diagram created in the Artop is not saved after being updated to "sphinx-Update-0.8.0M4".
*
* </copyright>
*/
package org.eclipse.sphinx.emf.internal.model;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.sphinx.emf.Activator;
import org.eclipse.sphinx.emf.internal.messages.Messages;
import org.eclipse.sphinx.emf.model.IModelDescriptor;
import org.eclipse.sphinx.emf.model.ModelDescriptorRegistry;
import org.eclipse.sphinx.platform.IExtendedPlatformConstants;
import org.eclipse.sphinx.platform.resources.syncing.AbstractResourceSynchronizerDelegate;
import org.eclipse.sphinx.platform.util.ExtendedPlatform;
import org.eclipse.sphinx.platform.util.StatusUtil;
public class ProjectScopeModelDescriptorSynchronizerDelegate extends AbstractResourceSynchronizerDelegate<IModelDescriptorSyncRequest> {
/**
* The singleton instance.
*/
public static final ProjectScopeModelDescriptorSynchronizerDelegate INSTANCE = new ProjectScopeModelDescriptorSynchronizerDelegate();
@Override
public void handleProjectDescriptionChanged(int eventType, IProject project) {
if (eventType == IResourceChangeEvent.POST_CHANGE) {
updateReferencedModels(project);
}
}
protected void updateReferencedModels(final IProject project) {
Job job = new Job(Messages.job_updatingReferencedModelDescriptors) {
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
SubMonitor progress = SubMonitor.convert(monitor, 2);
// Remove descriptors of obsolete models on affected project and referencing projects in case that
// project reference(s) have been removed
ModelDescriptorRegistry.INSTANCE.removeModels(project);
ModelDescriptorRegistry.INSTANCE.addModels(project);
// Add descriptors for models on referenced projects in case that new project reference(s) have been
// added
for (IProject referencedProject : ExtendedPlatform.getReferencedProjectsSafely(project)) {
for (IModelDescriptor referencedModelDescriptor : ModelDescriptorRegistry.INSTANCE.getModels(referencedProject)) {
ModelDescriptorRegistry.INSTANCE.addModel(referencedModelDescriptor.getMetaModelDescriptor(),
referencedModelDescriptor.getTargetMetaModelDescriptor(), project);
}
}
progress.worked(1);
return Status.OK_STATUS;
} catch (OperationCanceledException ex) {
return Status.CANCEL_STATUS;
} catch (Exception ex) {
return StatusUtil.createErrorStatus(Activator.getPlugin(), ex);
}
}
@Override
public boolean belongsTo(Object family) {
return IExtendedPlatformConstants.FAMILY_MODEL_LOADING.equals(family);
}
};
job.setPriority(Job.SHORT);
job.setRule(project);
job.setSystem(true);
job.schedule();
}
}