| /* |
| * Copyright (C) 2012 The Android Open Source Project |
| * |
| * Licensed under the Eclipse Public License, Version 1.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.eclipse.org/org/documents/epl-v10.php |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.ide.eclipse.adt.internal.wizards.templates; |
| |
| import com.android.annotations.NonNull; |
| import com.android.ide.eclipse.adt.AdtPlugin; |
| import com.android.ide.eclipse.adt.AdtUtils; |
| import com.google.common.io.Closeables; |
| import com.google.common.io.Files; |
| import com.google.common.io.InputSupplier; |
| |
| import org.eclipse.core.resources.IContainer; |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IFolder; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.OperationCanceledException; |
| import org.eclipse.core.runtime.SubProgressMonitor; |
| import org.eclipse.ltk.core.refactoring.Change; |
| import org.eclipse.ltk.core.refactoring.RefactoringStatus; |
| import org.eclipse.ltk.core.refactoring.resource.ResourceChange; |
| |
| import java.io.File; |
| import java.io.FileInputStream; |
| import java.io.InputStream; |
| import java.net.URI; |
| |
| /** Change which lazily copies a file */ |
| public class CreateFileChange extends ResourceChange { |
| private String mName; |
| private final IPath mPath; |
| private final File mSource; |
| |
| CreateFileChange(@NonNull String name, @NonNull IPath workspacePath, File source) { |
| mName = name; |
| mPath = workspacePath; |
| mSource = source; |
| } |
| |
| @Override |
| protected IResource getModifiedResource() { |
| return ResourcesPlugin.getWorkspace().getRoot().getFile(mPath); |
| } |
| |
| @Override |
| public String getName() { |
| return mName; |
| } |
| |
| @Override |
| public RefactoringStatus isValid(IProgressMonitor pm) |
| throws CoreException, OperationCanceledException { |
| RefactoringStatus result = new RefactoringStatus(); |
| IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(mPath); |
| URI location = file.getLocationURI(); |
| if (location == null) { |
| result.addFatalError("Unknown location " + file.getFullPath().toString()); |
| return result; |
| } |
| return result; |
| } |
| |
| @SuppressWarnings("resource") // Eclipse doesn't know about Guava's Closeables.closeQuietly |
| @Override |
| public Change perform(IProgressMonitor pm) throws CoreException { |
| InputSupplier<FileInputStream> supplier = Files.newInputStreamSupplier(mSource); |
| InputStream is = null; |
| try { |
| pm.beginTask("Creating file", 3); |
| IFile file = (IFile) getModifiedResource(); |
| |
| IContainer parent = file.getParent(); |
| if (parent != null && !parent.exists()) { |
| IFolder folder = ResourcesPlugin.getWorkspace().getRoot().getFolder( |
| parent.getFullPath()); |
| AdtUtils.ensureExists(folder); |
| } |
| |
| is = supplier.getInput(); |
| file.create(is, false, new SubProgressMonitor(pm, 1)); |
| pm.worked(1); |
| } catch (Exception ioe) { |
| AdtPlugin.log(ioe, null); |
| } finally { |
| Closeables.closeQuietly(is); |
| pm.done(); |
| } |
| return null; |
| } |
| } |