| /******************************************************************************* |
| * Copyright (c) 2000, 2017 IBM Corporation and others. |
| * 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 |
| * |
| *******************************************************************************/ |
| package org.eclipse.dltk.internal.corext.refactoring.nls.changes; |
| |
| import java.io.ByteArrayInputStream; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.UnsupportedEncodingException; |
| import java.net.URI; |
| |
| import org.eclipse.core.filesystem.EFS; |
| import org.eclipse.core.filesystem.IFileInfo; |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.Assert; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.SubProgressMonitor; |
| import org.eclipse.dltk.core.IModelStatusConstants; |
| import org.eclipse.dltk.core.ModelException; |
| import org.eclipse.dltk.internal.corext.refactoring.base.DLTKChange; |
| import org.eclipse.dltk.internal.corext.util.Messages; |
| import org.eclipse.ltk.core.refactoring.Change; |
| import org.eclipse.ltk.core.refactoring.RefactoringStatus; |
| |
| public class CreateFileChange extends DLTKChange { |
| |
| private String fChangeName; |
| |
| private IPath fPath; |
| private String fSource; |
| private String fEncoding; |
| private boolean fExplicitEncoding; |
| private long fStampToRestore; |
| |
| public CreateFileChange(IPath path, String source, String encoding) { |
| this(path, source, encoding, IResource.NULL_STAMP); |
| } |
| |
| public CreateFileChange(IPath path, String source, String encoding, |
| long stampToRestore) { |
| Assert.isNotNull(path, "path"); //$NON-NLS-1$ |
| Assert.isNotNull(source, "source"); //$NON-NLS-1$ |
| fPath = path; |
| fSource = source; |
| fEncoding = encoding; |
| fExplicitEncoding = fEncoding != null; |
| fStampToRestore = stampToRestore; |
| } |
| |
| /* |
| * private CreateFileChange(IPath path, String source, String encoding, long |
| * stampToRestore, boolean explicit) { Assert.isNotNull(path, "path"); |
| * //$NON-NLS-1$ Assert.isNotNull(source, "source"); //$NON-NLS-1$ |
| * Assert.isNotNull(encoding, "encoding"); //$NON-NLS-1$ fPath= path; |
| * fSource= source; fEncoding= encoding; fStampToRestore= stampToRestore; |
| * fExplicitEncoding= explicit; } |
| */ |
| |
| protected void setEncoding(String encoding, boolean explicit) { |
| Assert.isNotNull(encoding, "encoding"); //$NON-NLS-1$ |
| fEncoding = encoding; |
| fExplicitEncoding = explicit; |
| } |
| |
| @Override |
| public String getName() { |
| if (fChangeName == null) |
| return Messages.format(NLSChangesMessages.createFile_Create_file, |
| fPath.toOSString()); |
| else |
| return fChangeName; |
| } |
| |
| public void setName(String name) { |
| fChangeName = name; |
| } |
| |
| protected void setSource(String source) { |
| fSource = source; |
| } |
| |
| protected String getSource() { |
| return fSource; |
| } |
| |
| protected void setPath(IPath path) { |
| fPath = path; |
| } |
| |
| protected IPath getPath() { |
| return fPath; |
| } |
| |
| @Override |
| public Object getModifiedElement() { |
| return ResourcesPlugin.getWorkspace().getRoot().getFile(fPath); |
| } |
| |
| @Override |
| public RefactoringStatus isValid(IProgressMonitor pm) throws CoreException { |
| RefactoringStatus result = new RefactoringStatus(); |
| IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(fPath); |
| |
| URI location = file.getLocationURI(); |
| if (location == null) { |
| result.addFatalError(Messages.format( |
| NLSChangesMessages.CreateFileChange_error_unknownLocation, |
| file.getFullPath().toString())); |
| return result; |
| } |
| |
| IFileInfo jFile = EFS.getStore(location).fetchInfo(); |
| if (jFile.exists()) { |
| result.addFatalError(Messages.format( |
| NLSChangesMessages.CreateFileChange_error_exists, |
| file.getFullPath().toString())); |
| return result; |
| } |
| return result; |
| } |
| |
| @Override |
| public Change perform(IProgressMonitor pm) throws CoreException { |
| |
| try { |
| pm.beginTask(NLSChangesMessages.createFile_creating_resource, 3); |
| |
| initializeEncoding(); |
| IFile file = getOldFile(new SubProgressMonitor(pm, 1)); |
| /* |
| * if (file.exists()) { CompositeChange composite= new |
| * CompositeChange(getName()); composite.add(new |
| * DeleteFileChange(file)); composite.add(new |
| * CreateFileChange(fPath, fSource, fEncoding, fStampToRestore, |
| * fExplicitEncoding)); pm.worked(1); return composite.perform(new |
| * SubProgressMonitor(pm, 1)); } else { |
| */ |
| try (InputStream is = new ByteArrayInputStream( |
| fSource.getBytes(fEncoding))) { |
| |
| file.create(is, false, new SubProgressMonitor(pm, 1)); |
| if (fStampToRestore != IResource.NULL_STAMP) { |
| file.revertModificationStamp(fStampToRestore); |
| } |
| if (fExplicitEncoding) { |
| file.setCharset(fEncoding, new SubProgressMonitor(pm, 1)); |
| } else { |
| pm.worked(1); |
| } |
| return new DeleteFileChange(file); |
| } catch (UnsupportedEncodingException e) { |
| throw new ModelException(e, IModelStatusConstants.IO_EXCEPTION); |
| } catch (IOException ioe) { |
| throw new ModelException(ioe, |
| IModelStatusConstants.IO_EXCEPTION); |
| } |
| } finally { |
| pm.done(); |
| } |
| } |
| |
| protected IFile getOldFile(IProgressMonitor pm) { |
| pm.beginTask("", 1); //$NON-NLS-1$ |
| try { |
| return ResourcesPlugin.getWorkspace().getRoot().getFile(fPath); |
| } finally { |
| pm.done(); |
| } |
| } |
| |
| private void initializeEncoding() { |
| if (fEncoding == null) { |
| fExplicitEncoding = false; |
| IFile file = ResourcesPlugin.getWorkspace().getRoot() |
| .getFile(fPath); |
| if (file != null) { |
| try { |
| if (file.exists()) { |
| fEncoding = file.getCharset(false); |
| if (fEncoding == null) { |
| fEncoding = file.getCharset(true); |
| } else { |
| fExplicitEncoding = true; |
| } |
| } else { |
| fEncoding = file.getCharset(true); |
| } |
| } catch (CoreException e) { |
| fEncoding = ResourcesPlugin.getEncoding(); |
| fExplicitEncoding = true; |
| } |
| } else { |
| fEncoding = ResourcesPlugin.getEncoding(); |
| fExplicitEncoding = true; |
| } |
| } |
| Assert.isNotNull(fEncoding); |
| } |
| } |