1 /* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Eclipse Public License, Version 1.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.eclipse.org/org/documents/epl-v10.php 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.ide.eclipse.ndk.internal.templates; 18 19 import com.android.ide.eclipse.ndk.internal.Activator; 20 import com.android.ide.eclipse.ndk.internal.Messages; 21 22 import org.eclipse.cdt.core.templateengine.TemplateCore; 23 import org.eclipse.cdt.core.templateengine.process.ProcessArgument; 24 import org.eclipse.cdt.core.templateengine.process.ProcessFailureException; 25 import org.eclipse.cdt.core.templateengine.process.ProcessRunner; 26 import org.eclipse.core.resources.IContainer; 27 import org.eclipse.core.resources.IFile; 28 import org.eclipse.core.resources.IFolder; 29 import org.eclipse.core.resources.IProject; 30 import org.eclipse.core.resources.ResourcesPlugin; 31 import org.eclipse.core.runtime.CoreException; 32 import org.eclipse.core.runtime.FileLocator; 33 import org.eclipse.core.runtime.IProgressMonitor; 34 import org.eclipse.core.runtime.Path; 35 import org.osgi.framework.Bundle; 36 37 import java.io.IOException; 38 import java.net.URL; 39 import java.util.ArrayList; 40 import java.util.List; 41 42 public class SimpleFile extends ProcessRunner { 43 44 private static final class FileOp { 45 public String source; 46 public String destination; 47 } 48 49 @Override process(TemplateCore template, ProcessArgument[] args, String processId, IProgressMonitor monitor)50 public void process(TemplateCore template, ProcessArgument[] args, String processId, 51 IProgressMonitor monitor) 52 throws ProcessFailureException { 53 54 // Fetch the args 55 String projectName = null; 56 List<FileOp> fileOps = new ArrayList<FileOp>(); 57 58 for (ProcessArgument arg : args) { 59 if (arg.getName().equals("projectName")) //$NON-NLS-1$ 60 projectName = arg.getSimpleValue(); 61 else if (arg.getName().equals("files")) { //$NON-NLS-1$ 62 ProcessArgument[][] files = arg.getComplexArrayValue(); 63 for (ProcessArgument[] file : files) { 64 FileOp op = new FileOp(); 65 for (ProcessArgument fileArg : file) { 66 if (fileArg.getName().equals("source")) //$NON-NLS-1$ 67 op.source = fileArg.getSimpleValue(); 68 else if (fileArg.getName().equals("destination")) //$NON-NLS-1$ 69 op.destination = fileArg.getSimpleValue(); 70 } 71 if (op.source == null || op.destination == null) 72 throw new ProcessFailureException(Messages.SimpleFile_Bad_file_operation); 73 fileOps.add(op); 74 } 75 } 76 } 77 78 if (projectName == null) 79 throw new ProcessFailureException(Messages.SimpleFile_No_project_name); 80 IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName); 81 if (!project.exists()) 82 throw new ProcessFailureException(Messages.SimpleFile_Project_does_not_exist); 83 84 // Find bundle to find source files 85 Bundle bundle = Activator.getBundle(template.getTemplateInfo().getPluginId()); 86 if (bundle == null) 87 throw new ProcessFailureException(Messages.SimpleFile_Bundle_not_found); 88 89 try { 90 for (FileOp op : fileOps) { 91 IFile destFile = project.getFile(new Path(op.destination)); 92 if (destFile.exists()) 93 // don't overwrite files if they exist already 94 continue; 95 96 // Make sure parent folders are created 97 mkDirs(project, destFile.getParent(), monitor); 98 99 URL sourceURL = FileLocator.find(bundle, new Path(op.source), null); 100 if (sourceURL == null) 101 throw new ProcessFailureException(Messages.SimpleFile_Could_not_fine_source 102 + op.source); 103 104 TemplatedInputStream in = new TemplatedInputStream(sourceURL.openStream(), 105 template.getValueStore()); 106 destFile.create(in, true, monitor); 107 in.close(); 108 } 109 } catch (IOException e) { 110 throw new ProcessFailureException(e); 111 } catch (CoreException e) { 112 throw new ProcessFailureException(e); 113 } 114 115 } 116 mkDirs(IProject project, IContainer container, IProgressMonitor monitor)117 private void mkDirs(IProject project, IContainer container, IProgressMonitor monitor) 118 throws CoreException { 119 if (container.exists()) 120 return; 121 mkDirs(project, container.getParent(), monitor); 122 ((IFolder) container).create(true, true, monitor); 123 } 124 125 } 126