Home | History | Annotate | Download | only in templates
      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
     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 
    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