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