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

网格计算

开发平台:

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;
  19. import java.io.File;
  20. import java.io.FilenameFilter;
  21. import java.lang.reflect.InvocationTargetException;
  22. import java.util.logging.Level;
  23. import java.util.logging.Logger;
  24. import org.apache.hadoop.eclipse.preferences.MapReducePreferencePage;
  25. import org.apache.hadoop.eclipse.preferences.PreferenceConstants;
  26. import org.eclipse.core.resources.IProject;
  27. import org.eclipse.core.resources.IProjectDescription;
  28. import org.eclipse.core.resources.ResourcesPlugin;
  29. import org.eclipse.core.runtime.CoreException;
  30. import org.eclipse.core.runtime.IConfigurationElement;
  31. import org.eclipse.core.runtime.IExecutableExtension;
  32. import org.eclipse.core.runtime.IProgressMonitor;
  33. import org.eclipse.core.runtime.NullProgressMonitor;
  34. import org.eclipse.core.runtime.Path;
  35. import org.eclipse.core.runtime.QualifiedName;
  36. import org.eclipse.core.runtime.SubProgressMonitor;
  37. import org.eclipse.jdt.ui.wizards.NewJavaProjectWizardPage;
  38. import org.eclipse.jface.dialogs.IDialogConstants;
  39. import org.eclipse.jface.operation.IRunnableWithProgress;
  40. import org.eclipse.jface.preference.PreferenceDialog;
  41. import org.eclipse.jface.preference.PreferenceManager;
  42. import org.eclipse.jface.preference.PreferenceNode;
  43. import org.eclipse.jface.viewers.IStructuredSelection;
  44. import org.eclipse.jface.wizard.IWizardPage;
  45. import org.eclipse.jface.wizard.Wizard;
  46. import org.eclipse.swt.SWT;
  47. import org.eclipse.swt.events.SelectionEvent;
  48. import org.eclipse.swt.events.SelectionListener;
  49. import org.eclipse.swt.layout.GridData;
  50. import org.eclipse.swt.layout.GridLayout;
  51. import org.eclipse.swt.widgets.Button;
  52. import org.eclipse.swt.widgets.Composite;
  53. import org.eclipse.swt.widgets.DirectoryDialog;
  54. import org.eclipse.swt.widgets.Group;
  55. import org.eclipse.swt.widgets.Link;
  56. import org.eclipse.swt.widgets.Text;
  57. import org.eclipse.ui.IWorkbench;
  58. import org.eclipse.ui.IWorkbenchWizard;
  59. import org.eclipse.ui.PlatformUI;
  60. import org.eclipse.ui.dialogs.WizardNewProjectCreationPage;
  61. import org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard;
  62. /**
  63.  * Wizard for creating a new MapReduce Project
  64.  * 
  65.  */
  66. public class NewMapReduceProjectWizard extends Wizard implements
  67.     IWorkbenchWizard, IExecutableExtension {
  68.   static Logger log =
  69.       Logger.getLogger(NewMapReduceProjectWizard.class.getName());
  70.   private HadoopFirstPage firstPage;
  71.   private NewJavaProjectWizardPage javaPage;
  72.   public NewDriverWizardPage newDriverPage;
  73.   private IConfigurationElement config;
  74.   public NewMapReduceProjectWizard() {
  75.     setWindowTitle("New MapReduce Project Wizard");
  76.   }
  77.   public void init(IWorkbench workbench, IStructuredSelection selection) {
  78.   }
  79.   @Override
  80.   public boolean canFinish() {
  81.     return firstPage.isPageComplete() && javaPage.isPageComplete()
  82.     // && ((!firstPage.generateDriver.getSelection())
  83.     // || newDriverPage.isPageComplete()
  84.     ;
  85.   }
  86.   @Override
  87.   public IWizardPage getNextPage(IWizardPage page) {
  88.     // if (page == firstPage
  89.     // && firstPage.generateDriver.getSelection()
  90.     // )
  91.     // {
  92.     // return newDriverPage; // if "generate mapper" checked, second page is
  93.     // new driver page
  94.     // }
  95.     // else
  96.     // {
  97.     IWizardPage answer = super.getNextPage(page);
  98.     if (answer == newDriverPage) {
  99.       return null; // dont flip to new driver page unless "generate
  100.       // driver" is checked
  101.     } else if (answer == javaPage) {
  102.       return answer;
  103.     } else {
  104.       return answer;
  105.     }
  106.     // }
  107.   }
  108.   @Override
  109.   public IWizardPage getPreviousPage(IWizardPage page) {
  110.     if (page == newDriverPage) {
  111.       return firstPage; // newDriverPage, if it appears, is the second
  112.       // page
  113.     } else {
  114.       return super.getPreviousPage(page);
  115.     }
  116.   }
  117.   static class HadoopFirstPage extends WizardNewProjectCreationPage
  118.       implements SelectionListener {
  119.     public HadoopFirstPage() {
  120.       super("New Hadoop Project");
  121.       setImageDescriptor(ImageLibrary.get("wizard.mapreduce.project.new"));
  122.     }
  123.     private Link openPreferences;
  124.     private Button workspaceHadoop;
  125.     private Button projectHadoop;
  126.     private Text location;
  127.     private Button browse;
  128.     private String path;
  129.     public String currentPath;
  130.     // private Button generateDriver;
  131.     @Override
  132.     public void createControl(Composite parent) {
  133.       super.createControl(parent);
  134.       setTitle("MapReduce Project");
  135.       setDescription("Create a MapReduce project.");
  136.       Group group = new Group((Composite) getControl(), SWT.NONE);
  137.       group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
  138.       group.setText("Hadoop MapReduce Library Installation Path");
  139.       GridLayout layout = new GridLayout(3, true);
  140.       layout.marginLeft =
  141.           convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
  142.       layout.marginRight =
  143.           convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
  144.       layout.marginTop =
  145.           convertHorizontalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
  146.       layout.marginBottom =
  147.           convertHorizontalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
  148.       group.setLayout(layout);
  149.       workspaceHadoop = new Button(group, SWT.RADIO);
  150.       GridData d =
  151.           new GridData(GridData.BEGINNING, GridData.BEGINNING, false, false);
  152.       d.horizontalSpan = 2;
  153.       workspaceHadoop.setLayoutData(d);
  154.       // workspaceHadoop.setText("Use default workbench Hadoop library
  155.       // location");
  156.       workspaceHadoop.setSelection(true);
  157.       updateHadoopDirLabelFromPreferences();
  158.       openPreferences = new Link(group, SWT.NONE);
  159.       openPreferences
  160.           .setText("<a>Configure Hadoop install directory...</a>");
  161.       openPreferences.setLayoutData(new GridData(GridData.END,
  162.           GridData.CENTER, false, false));
  163.       openPreferences.addSelectionListener(this);
  164.       projectHadoop = new Button(group, SWT.RADIO);
  165.       projectHadoop.setLayoutData(new GridData(GridData.BEGINNING,
  166.           GridData.CENTER, false, false));
  167.       projectHadoop.setText("Specify Hadoop library location");
  168.       location = new Text(group, SWT.SINGLE | SWT.BORDER);
  169.       location.setText("");
  170.       d = new GridData(GridData.END, GridData.CENTER, true, false);
  171.       d.horizontalSpan = 1;
  172.       d.widthHint = 250;
  173.       d.grabExcessHorizontalSpace = true;
  174.       location.setLayoutData(d);
  175.       location.setEnabled(false);
  176.       browse = new Button(group, SWT.NONE);
  177.       browse.setText("Browse...");
  178.       browse.setLayoutData(new GridData(GridData.BEGINNING, GridData.CENTER,
  179.           false, false));
  180.       browse.setEnabled(false);
  181.       browse.addSelectionListener(this);
  182.       projectHadoop.addSelectionListener(this);
  183.       workspaceHadoop.addSelectionListener(this);
  184.       // generateDriver = new Button((Composite) getControl(), SWT.CHECK);
  185.       // generateDriver.setText("Generate a MapReduce driver");
  186.       // generateDriver.addListener(SWT.Selection, new Listener()
  187.       // {
  188.       // public void handleEvent(Event event) {
  189.       // getContainer().updateButtons(); }
  190.       // });
  191.     }
  192.     @Override
  193.     public boolean isPageComplete() {
  194.       boolean validHadoop = validateHadoopLocation();
  195.       if (!validHadoop && isCurrentPage()) {
  196.         setErrorMessage("Invalid Hadoop Runtime specified; please click 'Configure Hadoop install directory' or fill in library location input field");
  197.       } else {
  198.         setErrorMessage(null);
  199.       }
  200.       return super.isPageComplete() && validHadoop;
  201.     }
  202.     private boolean validateHadoopLocation() {
  203.       FilenameFilter gotHadoopJar = new FilenameFilter() {
  204.         public boolean accept(File dir, String name) {
  205.           return (name.startsWith("hadoop") && name.endsWith(".jar")
  206.               && (name.indexOf("test") == -1) && (name.indexOf("examples") == -1));
  207.         }
  208.       };
  209.       if (workspaceHadoop.getSelection()) {
  210.         this.currentPath = path;
  211.         return new Path(path).toFile().exists()
  212.             && (new Path(path).toFile().list(gotHadoopJar).length > 0);
  213.       } else {
  214.         this.currentPath = location.getText();
  215.         File file = new Path(location.getText()).toFile();
  216.         return file.exists()
  217.             && (new Path(location.getText()).toFile().list(gotHadoopJar).length > 0);
  218.       }
  219.     }
  220.     private void updateHadoopDirLabelFromPreferences() {
  221.       path =
  222.           Activator.getDefault().getPreferenceStore().getString(
  223.               PreferenceConstants.P_PATH);
  224.       if ((path != null) && (path.length() > 0)) {
  225.         workspaceHadoop.setText("Use default Hadoop");
  226.       } else {
  227.         workspaceHadoop.setText("Use default Hadoop (currently not set)");
  228.       }
  229.     }
  230.     public void widgetDefaultSelected(SelectionEvent e) {
  231.     }
  232.     public void widgetSelected(SelectionEvent e) {
  233.       if (e.getSource() == openPreferences) {
  234.         PreferenceManager manager = new PreferenceManager();
  235.         manager.addToRoot(new PreferenceNode(
  236.             "Hadoop Installation Directory", new MapReducePreferencePage()));
  237.         PreferenceDialog dialog =
  238.             new PreferenceDialog(this.getShell(), manager);
  239.         dialog.create();
  240.         dialog.setMessage("Select Hadoop Installation Directory");
  241.         dialog.setBlockOnOpen(true);
  242.         dialog.open();
  243.         updateHadoopDirLabelFromPreferences();
  244.       } else if (e.getSource() == browse) {
  245.         DirectoryDialog dialog = new DirectoryDialog(this.getShell());
  246.         dialog
  247.             .setMessage("Select a hadoop installation, containing hadoop-X-core.jar");
  248.         dialog.setText("Select Hadoop Installation Directory");
  249.         String directory = dialog.open();
  250.         if (directory != null) {
  251.           location.setText(directory);
  252.           if (!validateHadoopLocation()) {
  253.             setErrorMessage("No Hadoop jar found in specified directory");
  254.           } else {
  255.             setErrorMessage(null);
  256.           }
  257.         }
  258.       } else if (projectHadoop.getSelection()) {
  259.         location.setEnabled(true);
  260.         browse.setEnabled(true);
  261.       } else {
  262.         location.setEnabled(false);
  263.         browse.setEnabled(false);
  264.       }
  265.       getContainer().updateButtons();
  266.     }
  267.   }
  268.   @Override
  269.   public void addPages() {
  270.     /*
  271.      * firstPage = new HadoopFirstPage(); addPage(firstPage ); addPage( new
  272.      * JavaProjectWizardSecondPage(firstPage) );
  273.      */
  274.     firstPage = new HadoopFirstPage();
  275.     javaPage =
  276.         new NewJavaProjectWizardPage(ResourcesPlugin.getWorkspace()
  277.             .getRoot(), firstPage);
  278.     // newDriverPage = new NewDriverWizardPage(false);
  279.     // newDriverPage.setPageComplete(false); // ensure finish button
  280.     // initially disabled
  281.     addPage(firstPage);
  282.     addPage(javaPage);
  283.     // addPage(newDriverPage);
  284.   }
  285.   @Override
  286.   public boolean performFinish() {
  287.     try {
  288.       PlatformUI.getWorkbench().getProgressService().runInUI(
  289.           this.getContainer(), new IRunnableWithProgress() {
  290.             public void run(IProgressMonitor monitor) {
  291.               try {
  292.                 monitor.beginTask("Create Hadoop Project", 300);
  293.                 javaPage.getRunnable().run(
  294.                     new SubProgressMonitor(monitor, 100));
  295.                 // if( firstPage.generateDriver.getSelection())
  296.                 // {
  297.                 // newDriverPage.setPackageFragmentRoot(javaPage.getNewJavaProject().getAllPackageFragmentRoots()[0],
  298.                 // false);
  299.                 // newDriverPage.getRunnable().run(new
  300.                 // SubProgressMonitor(monitor,100));
  301.                 // }
  302.                 IProject project =
  303.                     javaPage.getNewJavaProject().getResource().getProject();
  304.                 IProjectDescription description = project.getDescription();
  305.                 String[] existingNatures = description.getNatureIds();
  306.                 String[] natures = new String[existingNatures.length + 1];
  307.                 for (int i = 0; i < existingNatures.length; i++) {
  308.                   natures[i + 1] = existingNatures[i];
  309.                 }
  310.                 natures[0] = MapReduceNature.ID;
  311.                 description.setNatureIds(natures);
  312.                 project.setPersistentProperty(new QualifiedName(
  313.                     Activator.PLUGIN_ID, "hadoop.runtime.path"),
  314.                     firstPage.currentPath);
  315.                 project.setDescription(description,
  316.                     new NullProgressMonitor());
  317.                 String[] natureIds = project.getDescription().getNatureIds();
  318.                 for (int i = 0; i < natureIds.length; i++) {
  319.                   log.fine("Nature id # " + i + " > " + natureIds[i]);
  320.                 }
  321.                 monitor.worked(100);
  322.                 monitor.done();
  323.                 BasicNewProjectResourceWizard.updatePerspective(config);
  324.               } catch (CoreException e) {
  325.                 // TODO Auto-generated catch block
  326.                 log.log(Level.SEVERE, "CoreException thrown.", e);
  327.               } catch (InvocationTargetException e) {
  328.                 // TODO Auto-generated catch block
  329.                 e.printStackTrace();
  330.               } catch (InterruptedException e) {
  331.                 // TODO Auto-generated catch block
  332.                 e.printStackTrace();
  333.               }
  334.             }
  335.           }, null);
  336.     } catch (InvocationTargetException e) {
  337.       // TODO Auto-generated catch block
  338.       e.printStackTrace();
  339.     } catch (InterruptedException e) {
  340.       // TODO Auto-generated catch block
  341.       e.printStackTrace();
  342.     }
  343.     return true;
  344.   }
  345.   public void setInitializationData(IConfigurationElement config,
  346.       String propertyName, Object data) throws CoreException {
  347.     this.config = config;
  348.   }
  349. }