content: /*******************************************************************************
   * Copyright (c) 2006, 2008 Abstratt Technologies
   * 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:
   *    Rafael Chaves (Abstratt Technologies) - initial API and implementation
   *******************************************************************************/
  package com.abstratt.mdd.internal.ui.editors;
  
  import java.util.HashSet;
  import java.util.Iterator;
  import java.util.Set;
  
  import org.eclipse.core.resources.IFile;
  import org.eclipse.jface.text.IDocument;
  
  import com.abstratt.mdd.frontend.core.ASTNode;
  import com.abstratt.mdd.internal.ui.model.ASTUtils;
  
  /**
   * Keeps track of all the current working copies. Working copies are created for
   * IDocument objects.
   */
  public class WorkingCopyRegistry {
  
      protected static WorkingCopyRegistry instance = new WorkingCopyRegistry();
  
      protected Set<WorkingCopy> copies;
  
      public static WorkingCopyRegistry getInstance() {
          return instance;
      }
  
      protected WorkingCopyRegistry() {
          copies = new HashSet<WorkingCopy>();
      }
  
      public IFile getFile(ASTNode node) {
          WorkingCopy copy = getWorkingCopy(node);
          if (copy != null) {
              return copy.getFile();
          }
          return null;
      }
  
      public IFile getFile(IDocument document) {
          WorkingCopy copy = getWorkingCopy(document);
          if (copy != null) {
              return copy.getFile();
          }
          return null;
      }
  
      public WorkingCopy getWorkingCopy(ASTNode node) {
          ASTNode root = ASTUtils.getRootNode(node);
          for (Iterator<WorkingCopy> iter = copies.iterator(); iter.hasNext();) {
              WorkingCopy copy = iter.next();
              if (root == copy.getRootASTNode()) {
                  return copy;
              }
          }
          return null;
      }
  
      public WorkingCopy getWorkingCopy(IDocument document) {
          for (Iterator<WorkingCopy> iter = copies.iterator(); iter.hasNext();) {
              WorkingCopy copy = iter.next();
              if (document == copy.getDocument()) {
                  return copy;
              }
          }
          return null;
      }
  
      public WorkingCopy getWorkingCopy(IFile file) {
          for (Iterator<WorkingCopy> iter = copies.iterator(); iter.hasNext();) {
              WorkingCopy copy = iter.next();
              if (file == copy.getFile()) {
                  return copy;
              }
          }
          return null;
      }
  
      /**
       * Registers this document with the working copies. If a working copy for
       * this document does not exist, a new one will be created.
       */
      public void register(IDocument document, IFile file) {
          synchronized (copies) {
              WorkingCopy copy = getWorkingCopy(document);
              if (copy == null) {
                  copy = new WorkingCopy(document, file);
                  copies.add(copy);
              }
          }
      }
  
      public void unregister(IDocument document) {
          synchronized (copies) {
              WorkingCopy copy = getWorkingCopy(document);
              if (copy != null) {
                  copies.remove(copy);
                  copy.dispose();
              }
          }
      }
  }