/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 org.apache.hadoop.eclipse; import java.io.IOException; import java.util.ArrayList; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.search.SearchEngine; import org.eclipse.jdt.ui.IJavaElementSearchConstants; import org.eclipse.jdt.ui.JavaUI; import org.eclipse.jdt.ui.wizards.NewTypeWizardPage; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.dialogs.SelectionDialog; /** * Pre-fills the new MapReduce driver class with a template. * */ public class NewDriverWizardPage extends NewTypeWizardPage { private Button isCreateMapMethod; private Text reducerText; private Text mapperText; private final boolean showContainerSelector; public NewDriverWizardPage() { this(true); } public NewDriverWizardPage(boolean showContainerSelector) { super(true, "MapReduce Driver"); this.showContainerSelector = showContainerSelector; setTitle("MapReduce Driver"); setDescription("Create a new MapReduce driver."); setImageDescriptor(ImageLibrary.get("wizard.driver.new")); } public void setSelection(IStructuredSelection selection) { initContainerPage(getInitialJavaElement(selection)); initTypePage(getInitialJavaElement(selection)); } @Override /** * Creates the new type using the entered field values. */ public void createType(IProgressMonitor monitor) throws CoreException, InterruptedException { super.createType(monitor); } @Override protected void createTypeMembers(final IType newType, ImportsManager imports, final IProgressMonitor monitor) throws CoreException { super.createTypeMembers(newType, imports, monitor); imports.addImport("org.apache.hadoop.fs.Path"); imports.addImport("org.apache.hadoop.io.Text"); imports.addImport("org.apache.hadoop.io.IntWritable"); imports.addImport("org.apache.hadoop.mapred.JobClient"); imports.addImport("org.apache.hadoop.mapred.JobConf"); imports.addImport("org.apache.hadoop.mapred.Reducer"); imports.addImport("org.apache.hadoop.mapred.Mapper"); /** * TODO(jz) - move most code out of the runnable */ getContainer().getShell().getDisplay().syncExec(new Runnable() { public void run() { String method = "public static void main(String[] args) {\n JobClient client = new JobClient();"; method += "JobConf conf = new JobConf(" + newType.getFullyQualifiedName() + ".class);\n\n"; method += "// TODO: specify output types\nconf.setOutputKeyClass(Text.class);\nconf.setOutputValueClass(IntWritable.class);\n\n"; method += "// TODO: specify input and output DIRECTORIES (not files)\nconf.setInputPath(new Path(\"src\"));\nconf.setOutputPath(new Path(\"out\"));\n\n"; if (mapperText.getText().length() > 0) { method += "conf.setMapperClass(" + mapperText.getText() + ".class);\n\n"; } else { method += "// TODO: specify a mapper\nconf.setMapperClass(org.apache.hadoop.mapred.lib.IdentityMapper.class);\n\n"; } if (reducerText.getText().length() > 0) { method += "conf.setReducerClass(" + reducerText.getText() + ".class);\n\n"; } else { method += "// TODO: specify a reducer\nconf.setReducerClass(org.apache.hadoop.mapred.lib.IdentityReducer.class);\n\n"; } method += "client.setConf(conf);\n"; method += "try {\n\tJobClient.runJob(conf);\n} catch (Exception e) {\n" + "\te.printStackTrace();\n}\n"; method += "}\n"; try { newType.createMethod(method, null, false, monitor); } catch (JavaModelException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } public void createControl(Composite parent) { // super.createControl(parent); initializeDialogUnits(parent); Composite composite = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 4; composite.setLayout(layout); createContainerControls(composite, 4); createPackageControls(composite, 4); createSeparator(composite, 4); createTypeNameControls(composite, 4); createSuperClassControls(composite, 4); createSuperInterfacesControls(composite, 4); createSeparator(composite, 4); createMapperControls(composite); createReducerControls(composite); if (!showContainerSelector) { setPackageFragmentRoot(null, false); setSuperClass("java.lang.Object", false); setSuperInterfaces(new ArrayList(), false); } setControl(composite); setFocus(); handleFieldChanged(CONTAINER); // setSuperClass("org.apache.hadoop.mapred.MapReduceBase", true); // setSuperInterfaces(Arrays.asList(new String[]{ // "org.apache.hadoop.mapred.Mapper" }), true); } @Override protected void handleFieldChanged(String fieldName) { super.handleFieldChanged(fieldName); validate(); } private void validate() { if (showContainerSelector) { updateStatus(new IStatus[] { fContainerStatus, fPackageStatus, fTypeNameStatus, fSuperClassStatus, fSuperInterfacesStatus }); } else { updateStatus(new IStatus[] { fTypeNameStatus, }); } } private void createMapperControls(Composite composite) { this.mapperText = createBrowseClassControl(composite, "Ma&pper:", "&Browse...", "org.apache.hadoop.mapred.Mapper", "Mapper Selection"); } private void createReducerControls(Composite composite) { this.reducerText = createBrowseClassControl(composite, "&Reducer:", "Browse&...", "org.apache.hadoop.mapred.Reducer", "Reducer Selection"); } private Text createBrowseClassControl(final Composite composite, final String string, String browseButtonLabel, final String baseClassName, final String dialogTitle) { Label label = new Label(composite, SWT.NONE); GridData data = new GridData(GridData.FILL_HORIZONTAL); label.setText(string); label.setLayoutData(data); final Text text = new Text(composite, SWT.SINGLE | SWT.BORDER); GridData data2 = new GridData(GridData.FILL_HORIZONTAL); data2.horizontalSpan = 2; text.setLayoutData(data2); Button browse = new Button(composite, SWT.NONE); browse.setText(browseButtonLabel); GridData data3 = new GridData(GridData.FILL_HORIZONTAL); browse.setLayoutData(data3); browse.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { IType baseType; try { baseType = getPackageFragmentRoot().getJavaProject().findType( baseClassName); // edit this to limit the scope SelectionDialog dialog = JavaUI.createTypeDialog( composite.getShell(), new ProgressMonitorDialog(composite .getShell()), SearchEngine.createHierarchyScope(baseType), IJavaElementSearchConstants.CONSIDER_CLASSES, false); dialog.setMessage("&Choose a type:"); dialog.setBlockOnOpen(true); dialog.setTitle(dialogTitle); dialog.open(); if ((dialog.getReturnCode() == Window.OK) && (dialog.getResult().length > 0)) { IType type = (IType) dialog.getResult()[0]; text.setText(type.getFullyQualifiedName()); } } catch (JavaModelException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); if (!showContainerSelector) { label.setEnabled(false); text.setEnabled(false); browse.setEnabled(false); } return text; } }