| /******************************************************************************* |
| * Copyright (c) 2000, 2005 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 |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jdt.internal.corext.refactoring.nls.changes; |
| |
| import java.io.ByteArrayInputStream; |
| import java.io.File; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.UnsupportedEncodingException; |
| |
| 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.core.resources.IFile; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| |
| import org.eclipse.ltk.core.refactoring.Change; |
| import org.eclipse.ltk.core.refactoring.RefactoringStatus; |
| |
| import org.eclipse.jdt.core.IJavaModelStatusConstants; |
| import org.eclipse.jdt.core.JavaModelException; |
| |
| import org.eclipse.jdt.internal.corext.Assert; |
| import org.eclipse.jdt.internal.corext.refactoring.base.JDTChange; |
| import org.eclipse.jdt.internal.corext.util.Messages; |
| |
| public class CreateFileChange extends JDTChange { |
| |
| 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; |
| } |
| |
| public String getName() { |
| if (fChangeName == null) |
| return NLSChangesMessages.createFile_Create_file + fPath.toString(); |
| 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; |
| } |
| |
| public Object getModifiedElement() { |
| return ResourcesPlugin.getWorkspace().getRoot().getFile(fPath); |
| } |
| |
| public RefactoringStatus isValid(IProgressMonitor pm) { |
| RefactoringStatus result= new RefactoringStatus(); |
| IFile file= ResourcesPlugin.getWorkspace().getRoot().getFile(fPath); |
| File jFile= new File(file.getLocation().toOSString()); |
| if (jFile.exists()) { |
| result.addFatalError(Messages.format( |
| NLSChangesMessages.CreateFileChange_error_exists, |
| file.getFullPath().toString())); |
| return result; |
| } |
| return result; |
| } |
| |
| public Change perform(IProgressMonitor pm) throws CoreException { |
| |
| InputStream is= null; |
| 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 { |
| 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 JavaModelException(e, IJavaModelStatusConstants.IO_EXCEPTION); |
| } |
| } finally { |
| try { |
| if (is != null) |
| is.close(); |
| } catch (IOException ioe) { |
| throw new JavaModelException(ioe, IJavaModelStatusConstants.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); |
| } |
| } |