com.curlap.orb.plugin.builder.CurlOrbBuilder.java Source code

Java tutorial

Introduction

Here is the source code for com.curlap.orb.plugin.builder.CurlOrbBuilder.java

Source

// Copyright (C) 1998-2010, Sumisho Computer Systems Corp. All Rights Reserved.

// Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
// 
// 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.curlap.orb.plugin.builder;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URI;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jface.preference.IPreferenceStore;

import com.curlap.orb.plugin.OrbPlugin;
import com.curlap.orb.plugin.generator.CurlClassGenerator;
import com.curlap.orb.plugin.generator.CurlClassGeneratorFactory;
import com.curlap.orb.plugin.generator.CurlGenerateException;
import com.curlap.orb.plugin.generator.impl.CurlServiceClassGenerator;
import com.curlap.orb.plugin.ui.PreferenceConstants;

/**
 * 
 * 
 * @author Wang Huailiang
 * @since 0.8
 */
public class CurlOrbBuilder extends IncrementalProjectBuilder {

    public static final String BUILDER_ID = "com.curlap.orb.plugin.orbbuilder";
    private IProject fCurlProject;
    private URI fCurlProjectLocation;

    @SuppressWarnings("unchecked")
    @Override
    protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException {
        // implement build processing
        if (kind == FULL_BUILD) {
            fullBuild(monitor);
        } else {
            IResourceDelta delta = getDelta(getProject());
            if (delta == null) {
                fullBuild(monitor);
            } else {
                incrementalBuild(delta, monitor);
            }
        }
        return null;

    }

    private void fullBuild(IProgressMonitor monitor) throws CoreException {
        setCurlProject();
        getProject().accept(new IResourceVisitor() {
            public boolean visit(IResource resource) throws CoreException {
                // build processing 
                if (resource instanceof IFile) {
                    IJavaElement element = JavaCore.create(resource);
                    if (element != null && element instanceof ICompilationUnit) {
                        generateCurlFiles((ICompilationUnit) element);
                    }

                }
                return true;
            }
        });
    }

    private void incrementalBuild(IResourceDelta delta, IProgressMonitor monitor) throws CoreException {
        setCurlProject();
        delta.accept(new IResourceDeltaVisitor() {
            public boolean visit(IResourceDelta delta) throws CoreException {
                // build processing
                /*if(delta instanceof IFile) {
                    
                  }*/

                if (delta.getKind() == IResourceDelta.ADDED || delta.getKind() == IResourceDelta.CHANGED) {
                    IResource resource = delta.getResource();
                    IJavaElement element = JavaCore.create(resource);
                    if (element != null && element instanceof ICompilationUnit) {
                        generateCurlFiles((ICompilationUnit) element);
                    }

                }
                return true;
            }
        });
    }

    // create Curl source file
    private void createCurlSourceFile(CurlClassGenerator generator, VelocityContext context,
            String generatedFileName) throws CurlGenerateException {
        // write Curl source code file
        FileWriter fileWriter = null;
        try {
            // Get the output file name from the context
            String projectRootPath = fCurlProjectLocation.getPath();
            String filePath = projectRootPath + generator.getSavePath() + "/" + generatedFileName;
            fileWriter = new FileWriter(new File(filePath));
            Template template = Velocity.getTemplate(generator.getVelocityTemplateName());
            template.merge(context, fileWriter);
            fileWriter.flush();
            fileWriter.close();
        } catch (Exception e) {
            throw new CurlGenerateException(e);
        } finally {
            if (fileWriter != null) {
                try {
                    fileWriter.close();
                } catch (IOException e) {
                    fileWriter = null;
                }
            }
        }
    }

    private void generateCurlFiles(ICompilationUnit source) {
        try {
            // create Generator
            CurlClassGenerator generator = CurlClassGeneratorFactory.getInstance().createGenerator(source);
            if (generator == null)
                return;

            VelocityContext context = generator.generateClass();
            context.put("generate_date", SimpleDateFormat.getInstance().format(new Date()));

            // create test template if needs.
            //   Note: test template is NOT added to load.scurl automatically. 
            final String testTemplatePrefix = "_test_template_";
            boolean generateTestTemplate = false;
            if (generator instanceof CurlServiceClassGenerator) {
                generateTestTemplate = (Boolean) context.get("is_template");
                if (generateTestTemplate) {
                    String testTemplateFile = testTemplatePrefix + generator.getFileName();
                    createCurlSourceFile(generator, context, testTemplateFile);
                }
            }

            // create Curl source
            context.put("is_template", false);
            String sourceFile = generator.getFileName();
            createCurlSourceFile(generator, context, sourceFile);

            // create or rewrite load file (Curl package file)
            File curlPackageUrl = new File(fCurlProjectLocation.getPath() + "/" + generator.getPackageFileName());
            String includeUrl = fCurlProjectLocation.getPath() + generator.getSavePath() + "/" + sourceFile;
            FileWriter curlPackageFileWriter = null;
            try {
                if (!curlPackageUrl.exists()) {
                    curlPackageFileWriter = new FileWriter(curlPackageUrl);
                    VelocityContext contextPackageFile = new VelocityContext();
                    contextPackageFile.put("package_name", generator.getPackageName().toUpperCase());
                    contextPackageFile.put("file_url", includeUrl);
                    Template packageFileTemplate = Velocity.getTemplate(generator.getPackageVelocityTemplateName());
                    packageFileTemplate.merge(contextPackageFile, curlPackageFileWriter);
                    curlPackageFileWriter.flush();
                    curlPackageFileWriter.close();
                } else {
                    BufferedReader curlPackageFileBufferedReader = null;
                    try {
                        FileReader curlPackageFileReader = new FileReader(curlPackageUrl);
                        curlPackageFileBufferedReader = new BufferedReader(curlPackageFileReader);
                        String line;
                        boolean included = false;
                        while ((line = curlPackageFileBufferedReader.readLine()) != null) {
                            if (line.indexOf("\"" + includeUrl + "\"") != -1)
                                included = true;
                        }
                        curlPackageFileBufferedReader.close();
                        curlPackageFileReader.close();
                        if (!included) {
                            curlPackageFileWriter = new FileWriter(curlPackageUrl, true);
                            curlPackageFileWriter.write("\n{include \"" + includeUrl + "\"}");
                            curlPackageFileWriter.flush();
                            curlPackageFileWriter.close();
                        }
                    } catch (IOException e) {
                        if (curlPackageFileBufferedReader != null)
                            curlPackageFileBufferedReader.close();
                    }
                }
            } catch (IOException e) {
                throw new CurlGenerateException(e);
            } finally {
                if (curlPackageFileWriter != null)
                    curlPackageFileWriter.close();
            }
        } catch (Exception e) {
            // FIXME:
            e.printStackTrace();
        }
    }

    @Override
    protected void clean(IProgressMonitor monitor) throws CoreException {
        // clean processing
    }

    @Override
    protected void startupOnInitialize() {
        // init processing
    }

    private void setCurlProject() {
        IPreferenceStore store = OrbPlugin.getDefault().getPreferenceStore();
        String curlPrjName = "";
        curlPrjName = store.getString(PreferenceConstants.CURL_ORB_BUILDER_CURL_PRJNAME);
        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
        fCurlProject = root.getProject(curlPrjName);
        fCurlProjectLocation = fCurlProject.getLocationURI();
    }

    @Override
    public void setInitializationData(IConfigurationElement config, String propertyName, Object data)
            throws CoreException {
        setCurlProject();
        super.setInitializationData(config, propertyName, data);
    }
}