com.aerospike.aql.plugin.actions.GenerateSource.java Source code

Java tutorial

Introduction

Here is the source code for com.aerospike.aql.plugin.actions.GenerateSource.java

Source

/* 
 * Copyright 2012-2014 Aerospike, Inc.
 *
 * Portions may be licensed to Aerospike, Inc. under one or more contributor
 * license agreements.
 *
 * 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.aerospike.aql.plugin.actions;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.console.IConsoleConstants;
import org.eclipse.ui.console.IConsoleView;

import com.aerospike.aql.AQL;
import com.aerospike.aql.plugin.views.AQLResult;
import com.aerospike.core.CoreActivator;
import com.aerospike.core.model.AsCluster;
import com.aerospike.core.preferences.PreferenceConstants;

public class GenerateSource implements IWorkbenchWindowActionDelegate {
    private static final String COULD_NOT_GENERATE_CODE_FROM_SQL_FILE = "Could not generate code from SQL file: ";
    private IWorkbenchWindow window;
    private ISelection selection;
    private Shell shell;
    private IWorkbenchPart targetPart;

    /**
     * The constructor.
     */
    public GenerateSource() {
    }

    public void run(IAction action) {
        if (selection != null && selection instanceof TreeSelection) {
            TreeSelection ts = (TreeSelection) selection;
            Object element = ts.getFirstElement();
            if (element instanceof IFile && ((IFile) element).getFileExtension().equalsIgnoreCase("aql")) {
                final IFile sqlFile = (IFile) element;
                if (sqlFile == null)
                    return;
                try {
                    final List<String> errorList = new ArrayList<String>();
                    final String actionID = action.getId();
                    final AQLResult results = new AQLResult();
                    // find the Aerospike console and display it
                    IWorkbench wb = PlatformUI.getWorkbench();
                    IWorkbenchWindow win = wb.getActiveWorkbenchWindow();
                    IWorkbenchPage page = win.getActivePage();
                    IConsoleView view = (IConsoleView) page.showView(IConsoleConstants.ID_CONSOLE_VIEW);
                    view.display(results.getConsole());
                    // set generation language
                    String extension;
                    final com.aerospike.aql.AQL.Language language;
                    if (actionID.equals("com.aerospike.aql.plugin.actions.GenerateSource.java.popup")) {
                        language = com.aerospike.aql.AQL.Language.JAVA;
                        extension = ".java";
                    } else if (actionID.equals("com.aerospike.aql.plugin.actions.GenerateSource.c.popup")) {
                        language = com.aerospike.aql.AQL.Language.C;
                        extension = ".c";
                    } else if (actionID.equals("com.aerospike.aql.plugin.actions.GenerateSource.csharp.popup")) {
                        language = com.aerospike.aql.AQL.Language.CSHARP;
                        extension = ".csharp";
                    } else {
                        return;
                    }
                    IProject project = sqlFile.getProject();
                    IPath outputPath;
                    String sqlFileName = sqlFile.getName();
                    String outputFileName = sqlFileName.substring(0, sqlFileName.lastIndexOf('.')) + extension;

                    final AsCluster cluster = (AsCluster) project
                            .getSessionProperty(CoreActivator.CLUSTER_PROPERTY);
                    String outputDirectoryString = project
                            .getPersistentProperty(CoreActivator.AQL_GENERATION_DIRECTORY);
                    if (outputDirectoryString == null || outputDirectoryString.isEmpty()) {
                        outputPath = project.getLocation().append(outputFileName);
                    } else {
                        IPath dirPath = project.getLocation().append(outputDirectoryString);
                        if (!dirPath.toFile().exists())
                            dirPath.toFile().mkdirs();
                        outputPath = dirPath.append(outputFileName);
                    }
                    final File outputFile = outputPath.toFile();
                    IPath location = sqlFile.getLocation();
                    final File file = location.toFile();
                    final IFile outputIFile = project.getWorkspace().getRoot().getFileForLocation(outputPath);

                    Job job = new Job("Generate source code from AQL: " + sqlFile.getName()) {

                        @Override
                        protected IStatus run(IProgressMonitor monitor) {
                            AQL aql = new AQL();
                            try {
                                String seedNode = "";
                                int port = 3000;
                                if (cluster != null) {
                                    seedNode = cluster.getSeedHost();
                                    port = cluster.getPort();
                                } else {
                                    IPreferenceStore store = CoreActivator.getDefault().getPreferenceStore();
                                    seedNode = store.getString(PreferenceConstants.SEED_NODE);
                                    port = store.getInt(PreferenceConstants.PORT);
                                }
                                aql.compileAndGenerate(file, outputFile, language, seedNode, port);
                                results.report("Completed generation for " + sqlFile.getName());
                                outputIFile.getParent().refreshLocal(IResource.DEPTH_ONE, null);
                                return Status.OK_STATUS;
                            } catch (Exception e) {
                                CoreActivator.showError(e,
                                        COULD_NOT_GENERATE_CODE_FROM_SQL_FILE + sqlFile.getName());
                                return Status.CANCEL_STATUS;
                            }
                        }
                    };
                    job.setUser(true);
                    job.schedule();
                } catch (PartInitException e) {
                    CoreActivator.showError(e, COULD_NOT_GENERATE_CODE_FROM_SQL_FILE + sqlFile.getName());
                } catch (CoreException e) {
                    CoreActivator.showError(e, COULD_NOT_GENERATE_CODE_FROM_SQL_FILE + sqlFile.getName());
                }
            }
        }
    }

    /**
     * Selection in the workbench has been changed. We 
     * can change the state of the 'real' action here
     * if we want, but this can only happen after 
     * the delegate has been created.
     * @see IWorkbenchWindowActionDelegate#selectionChanged
     */
    public void selectionChanged(IAction action, ISelection selection) {
        this.selection = selection;
    }

    /**
     * We can use this method to dispose of any system
     * resources we previously allocated.
     * @see IWorkbenchWindowActionDelegate#dispose
     */
    public void dispose() {
    }

    /**
     * We will cache window object in order to
     * be able to provide parent shell for the message dialog.
     * @see IWorkbenchWindowActionDelegate#init
     */
    public void init(IWorkbenchWindow window) {
        this.window = window;
    }

    /**
     * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
     */
    public void setActivePart(IAction action, IWorkbenchPart targetPart) {
        this.targetPart = targetPart;
        this.shell = targetPart.getSite().getShell();
    }

}