/*
* Copyright 2003-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package jetbrains.mps.idea.core.project;
import com.intellij.facet.FacetManager;
import com.intellij.notification.Notification;
import com.intellij.notification.NotificationType;
import com.intellij.notification.Notifications;
import com.intellij.openapi.components.ProjectComponent;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.startup.StartupManager;
import jetbrains.mps.ide.project.ProjectHelper;
import jetbrains.mps.idea.core.facet.MPSFacet;
import jetbrains.mps.idea.core.facet.MPSFacetType;
import jetbrains.mps.smodel.DefaultSModelDescriptor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.mps.openapi.model.SModel;
/**
* Created by danilla on 12/3/14.
*/
public class UpgradeModelsPersistence implements ProjectComponent {
// deliberately not using ModelPersistence.LAST_VERSION here not to make upgrading automatic
private static int LAST_VERSION = 9;
private Project myProject;
public UpgradeModelsPersistence(Project project) {
myProject = project;
}
@Override
public void projectOpened() {
StartupManager.getInstance(myProject).runWhenProjectIsInitialized(new Runnable() {
@Override
public void run() {
ProjectHelper.getModelAccess(myProject).executeUndoTransparentCommand(new Runnable() {
@Override
public void run() {
for (Module module : ModuleManager.getInstance(myProject).getModules()) {
MPSFacet facet = FacetManager.getInstance(module).getFacetByType(MPSFacetType.ID);
if (facet == null) {
continue;
}
for (SModel model : facet.getSolution().getModels()) {
if (!((model instanceof DefaultSModelDescriptor))) {
continue;
}
DefaultSModelDescriptor ourModel = (DefaultSModelDescriptor) model;
if (ourModel.getPersistenceVersion() < LAST_VERSION) {
upgrade(ourModel);
Notifications.Bus.notify(new Notification("Model Persistence", "Model re-saved", "Model " + ourModel.getModelName() + " has been re-saved in newer persistence", NotificationType.INFORMATION), myProject);
}
}
}
}
});
}
});
}
private void upgrade(DefaultSModelDescriptor model) {
// removing self-import if any; pre persistence 9 they were very often present
model.deleteModelImport(model.getReference());
model.load();
model.setPersistenceVersion(LAST_VERSION);
model.setChanged(true);
model.save();
}
@Override
public void projectClosed() {
}
@Override
public void initComponent() {
}
@Override
public void disposeComponent() {
}
@NotNull
@Override
public String getComponentName() {
return "Migrate models to persistence version 9";
}
}