Esempio n. 1
0
 /*package*/ void scheduleFullUpdate() {
   myQueue.addTask(
       new Runnable() {
         public void run() {
           update(false);
         }
       });
 }
Esempio n. 2
0
 public void dispose() {
   synchronized (this) {
     if (!(myDisposed)) {
       myDisposed = true;
       SModelRepository.getInstance().removeModelRepositoryListener(myModelListener);
       myEventsCollector.remove(myModelDescriptor);
       myEventsCollector.dispose();
       myQueue.runTask(
           new Runnable() {
             public void run() {
               myDifference.removeChangeSet();
             }
           });
     }
   }
 }
Esempio n. 3
0
 private void runUpdateTask(
     final _FunctionTypes._void_P0_E0 task, SNode currentNode, final SModelEvent event) {
   myEventConsumingMapping.addEvent(event);
   final List<SNodeId> ancestors =
       ListSequence.fromList(SNodeOperations.getAncestors(currentNode, null, true))
           .select(
               new ISelector<SNode, SNodeId>() {
                 public SNodeId select(SNode a) {
                   return a.getNodeId();
                 }
               })
           .toListSequence();
   myQueue.runTask(
       new Runnable() {
         public void run() {
           if (myDifference.getChangeSet() == null) {
             update(true);
           } else {
             if (ListSequence.fromList(ancestors)
                 .any(
                     new IWhereFilter<SNodeId>() {
                       public boolean accept(SNodeId a) {
                         return myAddedNodesToChanges.containsKey(a);
                       }
                     })) {
               // ignore
             } else {
               if (myEventConsumingMapping.removeEvent(event)) {
                 myDifference.getBroadcaster().changeUpdateStarted();
                 ModelAccess.instance()
                     .runReadAction(
                         new Runnable() {
                           public void run() {
                             synchronized (ChangesTracking.this) {
                               if (!(myDisposed)) {
                                 task.invoke();
                               }
                             }
                           }
                         });
                 myDifference.getBroadcaster().changeUpdateFinished();
               }
             }
           }
         }
       });
 }
Esempio n. 4
0
  private void update(boolean force) {
    final Wrappers._boolean _force = new Wrappers._boolean(force);
    myQueue.assertSoftlyIsCommandThread();
    if (!(myDifference.isEnabled())) {
      return;
    }

    IFile modelFile = myModelDescriptor.getSource().getFile();
    if (!(modelFile.exists())) {
      return;
    }
    VirtualFile modelVFile = VirtualFileUtils.getVirtualFile(modelFile);
    if (modelVFile == null
        || ProjectLevelVcsManager.getInstance(myProject).getVcsFor(modelVFile) == null) {
      return;
    }
    FileStatus status = FileStatusManager.getInstance(myProject).getStatus(modelVFile);
    if (ConflictsUtil.isModelOrModuleConflicting(myModelDescriptor, myProject)) {
      status = FileStatus.MERGED_WITH_CONFLICTS;
    }

    if (myDifference.getChangeSet() != null) {
      ModelAccess.instance()
          .runReadAction(
              new Runnable() {
                public void run() {
                  if (myDifference.getChangeSet().getNewModel() != myModelDescriptor.getSModel()) {
                    _force.value = true;
                  }
                }
              });
    }

    if (myStatusOnLastUpdate == status && !(_force.value)) {
      return;
    }
    myDifference.removeChangeSet();
    myStatusOnLastUpdate = status;
    if (FileStatus.NOT_CHANGED == status && !(_force.value)) {
      return;
    }
    final Wrappers._T<SModel> baseVersionModel = new Wrappers._T<SModel>(null);
    if (BaseVersionUtil.isAddedFileStatus(status)
        || ConflictsUtil.isModelOrModuleConflicting(myModelDescriptor, myProject)) {
      baseVersionModel.value =
          new jetbrains.mps.smodel.SModel(myModelDescriptor.getSModelReference());
    } else {
      String content = BaseVersionUtil.getBaseVersionContent(modelVFile, myProject);
      if (content == null && status != FileStatus.NOT_CHANGED) {
        LOG.error("Base version content is null while file status is " + status);
      }
      if (content == null) {
        return;
      }
      try {
        baseVersionModel.value = ModelPersistence.readModel(content, false);
      } catch (ModelReadException e) {
        LOG.warning("", e);
        return;
      }
    }
    ModelAccess.instance()
        .runReadAction(
            new Runnable() {
              public void run() {
                synchronized (ChangesTracking.this) {
                  if (!(myDisposed)) {
                    ChangeSet changeSet =
                        ChangeSetBuilder.buildChangeSet(
                            baseVersionModel.value, myModelDescriptor.getSModel(), true);
                    myDifference.setChangeSet((ChangeSetImpl) changeSet);
                    buildCaches();
                  }
                }
              }
            });
  }