blob: ffec17e845aa165b1b91787cfc045e0d12edce6b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008-2010 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Sonatype, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.m2e.refactoring;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.eclipse.core.filebuffers.FileBuffers;
import org.eclipse.core.filebuffers.ITextFileBuffer;
import org.eclipse.core.filebuffers.ITextFileBufferManager;
import org.eclipse.core.filebuffers.LocationKind;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.command.CompoundCommand;
import org.eclipse.emf.ecore.resource.Resource;
import org.apache.maven.project.MavenProject;
import org.eclipse.m2e.core.project.IMavenProjectFacade;
import org.eclipse.m2e.model.edit.pom.Model;
import org.eclipse.m2e.model.edit.pom.PropertyElement;
/**
* This class manages all refactoring-related resources for a particular maven project
*
* @author Anton Kraev
*/
public class RefactoringModelResources {
private static final Logger log = LoggerFactory.getLogger(RefactoringModelResources.class);
private static final String TMP_PROJECT_NAME = ".m2eclipse_refactoring"; //$NON-NLS-1$
protected IFile pomFile;
protected IFile tmpFile;
protected ITextFileBuffer pomBuffer;
protected ITextFileBuffer tmpBuffer;
protected Model tmpModel;
protected org.apache.maven.model.Model effective;
protected ITextFileBufferManager textFileBufferManager;
protected Map<String, PropertyInfo> properties;
protected MavenProject project;
protected CompoundCommand command;
protected static IProject tmpProject;
protected IProject getTmpProject() {
if(tmpProject == null) {
tmpProject = ResourcesPlugin.getWorkspace().getRoot().getProject(TMP_PROJECT_NAME);
}
if(!tmpProject.exists()) {
try {
tmpProject.create(null);
tmpProject.open(null);
} catch(CoreException ex) {
log.error(ex.getMessage(), ex);
}
}
return tmpProject;
}
public RefactoringModelResources(IMavenProjectFacade projectFacade) throws CoreException, IOException {
textFileBufferManager = FileBuffers.getTextFileBufferManager();
project = projectFacade.getMavenProject(null);
effective = project.getModel();
pomFile = projectFacade.getPom();
pomBuffer = getBuffer(pomFile);
//create temp file
IProject project = getTmpProject();
File f = File.createTempFile("pom", ".xml", project.getLocation().toFile()); //$NON-NLS-1$ //$NON-NLS-2$
f.delete();
tmpFile = project.getFile(f.getName());
pomFile.copy(tmpFile.getFullPath(), true, null);
Resource resource = AbstractPomRefactoring.loadResource(tmpFile);
tmpModel = (Model) resource.getContents().get(0);
tmpBuffer = getBuffer(tmpFile);
}
public CompoundCommand getCommand() {
return command;
}
public void setCommand(CompoundCommand command) {
this.command = command;
}
public IFile getPomFile() {
return pomFile;
}
public IFile getTmpFile() {
return tmpFile;
}
public ITextFileBuffer getPomBuffer() {
return pomBuffer;
}
public ITextFileBuffer getTmpBuffer() {
return tmpBuffer;
}
public Model getTmpModel() {
return tmpModel;
}
public org.apache.maven.model.Model getEffective() {
return effective;
}
public MavenProject getProject() {
return project;
}
public Map<String, PropertyInfo> getProperties() {
return properties;
}
public void setProperties(Map<String, PropertyInfo> properties) {
this.properties = properties;
}
public void releaseAllResources() throws CoreException {
releaseBuffer(pomBuffer, pomFile);
if(tmpFile != null && tmpFile.exists()) {
releaseBuffer(tmpBuffer, tmpFile);
}
if(tmpModel != null) {
tmpModel.eResource().unload();
}
}
public static void cleanupTmpProject() throws CoreException {
if(tmpProject.exists()) {
tmpProject.delete(true, true, null);
}
}
protected ITextFileBuffer getBuffer(IFile file) throws CoreException {
textFileBufferManager.connect(file.getLocation(), LocationKind.NORMALIZE, null);
return textFileBufferManager.getTextFileBuffer(file.getLocation(), LocationKind.NORMALIZE);
}
protected void releaseBuffer(ITextFileBuffer buffer, IFile file) throws CoreException {
buffer.revert(null);
textFileBufferManager.disconnect(file.getLocation(), LocationKind.NORMALIZE, null);
}
public String getName() {
return pomFile.getProject().getName();
}
public static class PropertyInfo {
protected PropertyElement pair;
protected RefactoringModelResources resource;
protected Command newValue;
public Command getNewValue() {
return newValue;
}
public void setNewValue(Command newValue) {
this.newValue = newValue;
}
public PropertyElement getPair() {
return pair;
}
public void setPair(PropertyElement pair) {
this.pair = pair;
}
public RefactoringModelResources getResource() {
return resource;
}
public void setResource(RefactoringModelResources resource) {
this.resource = resource;
}
}
}