RunOnHadoopWizard.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:11k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.eclipse.servers;
  19. import java.io.File;
  20. import java.io.FileOutputStream;
  21. import java.io.IOException;
  22. import java.util.ArrayList;
  23. import java.util.List;
  24. import org.apache.hadoop.eclipse.Activator;
  25. import org.apache.hadoop.eclipse.ErrorMessageDialog;
  26. import org.apache.hadoop.eclipse.server.HadoopServer;
  27. import org.apache.hadoop.eclipse.server.JarModule;
  28. import org.apache.hadoop.mapred.JobConf;
  29. import org.eclipse.core.resources.IFile;
  30. import org.eclipse.core.runtime.CoreException;
  31. import org.eclipse.core.runtime.IPath;
  32. import org.eclipse.core.runtime.IProgressMonitor;
  33. import org.eclipse.core.runtime.Path;
  34. import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
  35. import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
  36. import org.eclipse.jdt.launching.IRuntimeClasspathEntry;
  37. import org.eclipse.jdt.launching.JavaRuntime;
  38. import org.eclipse.jface.viewers.TableViewer;
  39. import org.eclipse.jface.wizard.Wizard;
  40. import org.eclipse.jface.wizard.WizardPage;
  41. import org.eclipse.swt.SWT;
  42. import org.eclipse.swt.events.SelectionEvent;
  43. import org.eclipse.swt.events.SelectionListener;
  44. import org.eclipse.swt.layout.FillLayout;
  45. import org.eclipse.swt.layout.GridData;
  46. import org.eclipse.swt.layout.GridLayout;
  47. import org.eclipse.swt.widgets.Button;
  48. import org.eclipse.swt.widgets.Composite;
  49. import org.eclipse.swt.widgets.Label;
  50. import org.eclipse.swt.widgets.Table;
  51. import org.eclipse.swt.widgets.TableColumn;
  52. /**
  53.  * Wizard for publishing a job to a Hadoop server.
  54.  */
  55. public class RunOnHadoopWizard extends Wizard {
  56.   private MainWizardPage mainPage;
  57.   private HadoopLocationWizard createNewPage;
  58.   /**
  59.    * The file resource (containing a main()) to run on the Hadoop location
  60.    */
  61.   private IFile resource;
  62.   /**
  63.    * The launch configuration to update
  64.    */
  65.   private ILaunchConfigurationWorkingCopy iConf;
  66.   private IProgressMonitor progressMonitor;
  67.   public RunOnHadoopWizard(IFile resource,
  68.       ILaunchConfigurationWorkingCopy iConf) {
  69.     this.resource = resource;
  70.     this.iConf = iConf;
  71.     setForcePreviousAndNextButtons(true);
  72.     setNeedsProgressMonitor(true);
  73.     setWindowTitle("Run on Hadoop");
  74.   }
  75.   /**
  76.    * This wizard contains 2 pages:
  77.    * <li> the first one lets the user choose an already existing location
  78.    * <li> the second one allows the user to create a new location, in case it
  79.    * does not already exist
  80.    */
  81.   /* @inheritDoc */
  82.   @Override
  83.   public void addPages() {
  84.     addPage(this.mainPage = new MainWizardPage());
  85.     addPage(this.createNewPage = new HadoopLocationWizard());
  86.   }
  87.   /**
  88.    * Performs any actions appropriate in response to the user having pressed
  89.    * the Finish button, or refuse if finishing now is not permitted.
  90.    */
  91.   /* @inheritDoc */
  92.   @Override
  93.   public boolean performFinish() {
  94.     /*
  95.      * Create a new location or get an existing one
  96.      */
  97.     HadoopServer location = null;
  98.     if (mainPage.createNew.getSelection()) {
  99.       location = createNewPage.performFinish();
  100.     } else if (mainPage.table.getSelection().length == 1) {
  101.       location = (HadoopServer) mainPage.table.getSelection()[0].getData();
  102.     }
  103.     if (location == null)
  104.       return false;
  105.     /*
  106.      * Get the base directory of the plug-in for storing configurations and
  107.      * JARs
  108.      */
  109.     File baseDir = Activator.getDefault().getStateLocation().toFile();
  110.     // Package the Job into a JAR
  111.     File jarFile = JarModule.createJarPackage(resource);
  112.     if (jarFile == null) {
  113.       ErrorMessageDialog.display("Run on Hadoop",
  114.           "Unable to create or locate the JAR file for the Job");
  115.       return false;
  116.     }
  117.     /*
  118.      * Generate a temporary Hadoop configuration directory and add it to the
  119.      * classpath of the launch configuration
  120.      */
  121.     File confDir;
  122.     try {
  123.       confDir = File.createTempFile("hadoop-conf-", "", baseDir);
  124.       confDir.delete();
  125.       confDir.mkdirs();
  126.       if (!confDir.isDirectory()) {
  127.         ErrorMessageDialog.display("Run on Hadoop",
  128.             "Cannot create temporary directory: " + confDir);
  129.         return false;
  130.       }
  131.     } catch (IOException ioe) {
  132.       ioe.printStackTrace();
  133.       return false;
  134.     }
  135.     // Prepare the Hadoop configuration
  136.     JobConf conf = new JobConf(location.getConfiguration());
  137.     conf.setJar(jarFile.getAbsolutePath());
  138.     // Write it to the disk file
  139.     try {
  140.       // File confFile = File.createTempFile("hadoop-site-", ".xml",
  141.       // confDir);
  142.       File confFile = new File(confDir, "hadoop-site.xml");
  143.       FileOutputStream fos = new FileOutputStream(confFile);
  144.       conf.writeXml(fos);
  145.       fos.close();
  146.     } catch (IOException ioe) {
  147.       ioe.printStackTrace();
  148.       return false;
  149.     }
  150.     // Setup the Launch class path
  151.     List<String> classPath;
  152.     try {
  153.       classPath =
  154.           iConf.getAttribute(
  155.               IJavaLaunchConfigurationConstants.ATTR_CLASSPATH,
  156.               new ArrayList());
  157.       IPath confIPath = new Path(confDir.getAbsolutePath());
  158.       IRuntimeClasspathEntry cpEntry =
  159.           JavaRuntime.newArchiveRuntimeClasspathEntry(confIPath);
  160.       classPath.add(0, cpEntry.getMemento());
  161.       iConf.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH,
  162.           classPath);
  163.     } catch (CoreException e) {
  164.       e.printStackTrace();
  165.       return false;
  166.     }
  167.     // location.runResource(resource, progressMonitor);
  168.     return true;
  169.   }
  170.   private void refreshButtons() {
  171.     getContainer().updateButtons();
  172.   }
  173.   /**
  174.    * Allows finish when an existing server is selected or when a new server
  175.    * location is defined
  176.    */
  177.   /* @inheritDoc */
  178.   @Override
  179.   public boolean canFinish() {
  180.     if (mainPage != null)
  181.       return mainPage.canFinish();
  182.     return false;
  183.   }
  184.   /**
  185.    * This is the main page of the wizard. It allows the user either to choose
  186.    * an already existing location or to indicate he wants to create a new
  187.    * location.
  188.    */
  189.   public class MainWizardPage extends WizardPage {
  190.     private Button createNew;
  191.     private Table table;
  192.     private Button chooseExisting;
  193.     public MainWizardPage() {
  194.       super("Select or define server to run on");
  195.       setTitle("Select Hadoop location");
  196.       setDescription("Select a Hadoop location to run on.");
  197.     }
  198.     /* @inheritDoc */
  199.     @Override
  200.     public boolean canFlipToNextPage() {
  201.       return createNew.getSelection();
  202.     }
  203.     /* @inheritDoc */
  204.     public void createControl(Composite parent) {
  205.       Composite panel = new Composite(parent, SWT.NONE);
  206.       panel.setLayout(new GridLayout(1, false));
  207.       // Label
  208.       Label label = new Label(panel, SWT.NONE);
  209.       label.setText("Select a Hadoop Server to run on.");
  210.       GridData gData = new GridData(GridData.FILL_BOTH);
  211.       gData.grabExcessVerticalSpace = false;
  212.       label.setLayoutData(gData);
  213.       // Create location button
  214.       createNew = new Button(panel, SWT.RADIO);
  215.       createNew.setText("Define a new Hadoop server location");
  216.       createNew.setLayoutData(gData);
  217.       createNew.addSelectionListener(new SelectionListener() {
  218.         public void widgetDefaultSelected(SelectionEvent e) {
  219.         }
  220.         public void widgetSelected(SelectionEvent e) {
  221.           setPageComplete(true);
  222.           RunOnHadoopWizard.this.refreshButtons();
  223.         }
  224.       });
  225.       createNew.setSelection(true);
  226.       // Select existing location button
  227.       chooseExisting = new Button(panel, SWT.RADIO);
  228.       chooseExisting
  229.           .setText("Choose an existing server from the list below");
  230.       chooseExisting.setLayoutData(gData);
  231.       chooseExisting.addSelectionListener(new SelectionListener() {
  232.         public void widgetDefaultSelected(SelectionEvent e) {
  233.         }
  234.         public void widgetSelected(SelectionEvent e) {
  235.           if (chooseExisting.getSelection()
  236.               && (table.getSelectionCount() == 0)) {
  237.             if (table.getItems().length > 0) {
  238.               table.setSelection(0);
  239.             }
  240.           }
  241.           RunOnHadoopWizard.this.refreshButtons();
  242.         }
  243.       });
  244.       // Table of existing locations
  245.       Composite serverListPanel = new Composite(panel, SWT.FILL);
  246.       gData = new GridData(GridData.FILL_BOTH);
  247.       gData.horizontalSpan = 1;
  248.       serverListPanel.setLayoutData(gData);
  249.       FillLayout layout = new FillLayout();
  250.       layout.marginHeight = layout.marginWidth = 12;
  251.       serverListPanel.setLayout(layout);
  252.       table =
  253.           new Table(serverListPanel, SWT.BORDER | SWT.H_SCROLL
  254.               | SWT.V_SCROLL | SWT.FULL_SELECTION);
  255.       table.setHeaderVisible(true);
  256.       table.setLinesVisible(true);
  257.       TableColumn nameColumn = new TableColumn(table, SWT.LEFT);
  258.       nameColumn.setText("Location");
  259.       nameColumn.setWidth(450);
  260.       TableColumn hostColumn = new TableColumn(table, SWT.LEFT);
  261.       hostColumn.setText("Master host name");
  262.       hostColumn.setWidth(250);
  263.       // If the user select one entry, switch to "chooseExisting"
  264.       table.addSelectionListener(new SelectionListener() {
  265.         public void widgetDefaultSelected(SelectionEvent e) {
  266.         }
  267.         public void widgetSelected(SelectionEvent e) {
  268.           chooseExisting.setSelection(true);
  269.           createNew.setSelection(false);
  270.           setPageComplete(table.getSelectionCount() == 1);
  271.           RunOnHadoopWizard.this.refreshButtons();
  272.         }
  273.       });
  274.       TableViewer viewer = new TableViewer(table);
  275.       HadoopServerSelectionListContentProvider provider =
  276.           new HadoopServerSelectionListContentProvider();
  277.       viewer.setContentProvider(provider);
  278.       viewer.setLabelProvider(provider);
  279.       viewer.setInput(new Object());
  280.       // don't care, get from singleton server registry
  281.       this.setControl(panel);
  282.     }
  283.     /**
  284.      * Returns whether this page state allows the Wizard to finish or not
  285.      * 
  286.      * @return can the wizard finish or not?
  287.      */
  288.     public boolean canFinish() {
  289.       if (!isControlCreated())
  290.         return false;
  291.       if (this.createNew.getSelection())
  292.         return getNextPage().isPageComplete();
  293.       return this.chooseExisting.getSelection();
  294.     }
  295.   }
  296.   /**
  297.    * @param progressMonitor
  298.    */
  299.   public void setProgressMonitor(IProgressMonitor progressMonitor) {
  300.     this.progressMonitor = progressMonitor;
  301.   }
  302. }