Package de.innovationgate.eclipse.editors.all

Source Code of de.innovationgate.eclipse.editors.all.TMLMetadataFileMaintainer

/*******************************************************************************
* Copyright (c) 2009, 2010 Innovation Gate GmbH.
* 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:
*     Innovation Gate GmbH - initial API and implementation
******************************************************************************/
package de.innovationgate.eclipse.editors.all;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;

import de.innovationgate.eclipse.editors.Plugin;
import de.innovationgate.eclipse.utils.wga.WGADesignStructureHelper;

/**
* this resource change listener is responsible for keeping tml metadata files up to date
* for e.g.
* - deletion of an tml file should also delete the metadata file if present
* - moving/renaming an tml file should also move the metadata file
*
*
*/
public class TMLMetadataFileMaintainer implements IResourceChangeListener {
 
  private Set<IFile> _metaDataFilesToRemove = new HashSet<IFile>();
  private Map<IFile, IFile> _metaDataFilesToMove = new HashMap<IFile, IFile>();

  public void resourceChanged(IResourceChangeEvent event) {
    if (event.getType() == IResourceChangeEvent.POST_CHANGE) {
      IResourceDelta delta = event.getDelta();
      if (delta != null) {
        try {
          delta.accept(new IResourceDeltaVisitor() {

            public boolean visit(IResourceDelta delta) throws CoreException {
              if (delta.getResource() instanceof IFile) {
                IFile file = (IFile) delta.getResource();
                if (file != null && file.getLocation() != null && file.getLocation().getFileExtension() != null &&
                    file.getLocation().getFileExtension().equals("tml")) {
                  // a tml file changed
                  if (delta.getKind() == IResourceDelta.REMOVED) {
                    // tml file removed
                    IFile metadataFile = WGADesignStructureHelper.getMetadataFile(file);
                    if (metadataFile.exists()) {
                      _metaDataFilesToRemove.add(metadataFile);
                    }
                   
                  } else if (delta.getKind() == IResourceDelta.ADDED && delta.getMovedFromPath() != null) {
                    // tml file moved from another location
                    IFile orgFile = ResourcesPlugin.getWorkspace().getRoot().getFile(delta.getMovedFromPath());
                    IFile metadataFileFrom = WGADesignStructureHelper.getMetadataFile(orgFile);
                    if (metadataFileFrom.exists()) {
                      IFile metadataFileTo = WGADesignStructureHelper.getMetadataFile(file);
                      _metaDataFilesToMove.put(metadataFileFrom, metadataFileTo);
                    }
                  }
                }                  
              }
              return true;
            }
           
          });
        } catch (CoreException e) {
          Plugin.getDefault().logError("Unable to execute TMLMetadataMaintenance." , e);
        }
      }
    } else if (event.getType() == IResourceChangeEvent.PRE_BUILD) {
      Iterator<IFile> moveFromFiles = _metaDataFilesToMove.keySet().iterator();
      while (moveFromFiles.hasNext()) {
        IFile moveFrom = moveFromFiles.next();
        IFile moveToFile = _metaDataFilesToMove.get(moveFrom);
        try {
          if (moveToFile.getParent() instanceof IFolder) {
            IFolder folder = (IFolder) moveToFile.getParent();
            if (!folder.exists()) {
              folder.create(true,true, new NullProgressMonitor());
            }
            moveFrom.move(moveToFile.getFullPath(), true, new NullProgressMonitor());
          }         
        } catch (CoreException e) {
          Plugin.getDefault().logError("Unable to execute TMLMetadataMaintenance." , e);
        }           
      }

      Iterator<IFile> removeFiles = _metaDataFilesToRemove.iterator();
      while (removeFiles.hasNext()) {
        try {
          removeFiles.next().delete(true, new NullProgressMonitor());
        } catch (CoreException e) {
          Plugin.getDefault().logError("Unable to execute TMLMetadataMaintenance." , e);
        }
      }
      _metaDataFilesToMove.clear();
      _metaDataFilesToRemove.clear();
    }

  }

}
TOP

Related Classes of de.innovationgate.eclipse.editors.all.TMLMetadataFileMaintainer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.