/** * 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.launch; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.ui.AbstractLaunchConfigurationTab; import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup; import org.eclipse.debug.ui.CommonTab; import org.eclipse.debug.ui.ILaunchConfigurationDialog; import org.eclipse.debug.ui.ILaunchConfigurationTab; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.dom.AST; import org.eclipse.jdt.core.search.SearchEngine; import org.eclipse.jdt.debug.ui.launchConfigurations.JavaArgumentsTab; import org.eclipse.jdt.debug.ui.launchConfigurations.JavaClasspathTab; import org.eclipse.jdt.debug.ui.launchConfigurations.JavaJRETab; import org.eclipse.jdt.ui.IJavaElementSearchConstants; import org.eclipse.jdt.ui.JavaUI; import org.eclipse.jface.dialogs.ProgressMonitorDialog; 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; /** * * Handler for Local MapReduce job launches * * TODO(jz) this may not be needed as we almost always deploy to a remote server * and not locally, where we do do it locally we may just be able to exec * scripts without going to java * */ public class LocalMapReduceLaunchTabGroup extends AbstractLaunchConfigurationTabGroup { public LocalMapReduceLaunchTabGroup() { // TODO Auto-generated constructor stub } public void createTabs(ILaunchConfigurationDialog dialog, String mode) { setTabs(new ILaunchConfigurationTab[] { new MapReduceLaunchTab(), new JavaArgumentsTab(), new JavaJRETab(), new JavaClasspathTab(), new CommonTab() }); } public static class MapReduceLaunchTab extends AbstractLaunchConfigurationTab { private Text combinerClass; private Text reducerClass; private Text mapperClass; @Override public boolean canSave() { return true; } @Override public boolean isValid(ILaunchConfiguration launchConfig) { // todo: only if all classes are of proper types return true; } public void createControl(final Composite parent) { Composite panel = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(3, false); panel.setLayout(layout); Label mapperLabel = new Label(panel, SWT.NONE); mapperLabel.setText("Mapper"); mapperClass = new Text(panel, SWT.SINGLE | SWT.BORDER); createRow(parent, panel, mapperClass); Label reducerLabel = new Label(panel, SWT.NONE); reducerLabel.setText("Reducer"); reducerClass = new Text(panel, SWT.SINGLE | SWT.BORDER); createRow(parent, panel, reducerClass); Label combinerLabel = new Label(panel, SWT.NONE); combinerLabel.setText("Combiner"); combinerClass = new Text(panel, SWT.SINGLE | SWT.BORDER); createRow(parent, panel, combinerClass); panel.pack(); setControl(panel); } private void createRow(final Composite parent, Composite panel, final Text text) { text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Button button = new Button(panel, SWT.BORDER); button.setText("Browse..."); button.addListener(SWT.Selection, new Listener() { public void handleEvent(Event arg0) { try { AST ast = AST.newAST(3); SelectionDialog dialog = JavaUI.createTypeDialog(parent.getShell(), new ProgressMonitorDialog(parent.getShell()), SearchEngine .createWorkspaceScope(), IJavaElementSearchConstants.CONSIDER_CLASSES, false); dialog.setMessage("Select Mapper type (implementing )"); dialog.setBlockOnOpen(true); dialog.setTitle("Select Mapper Type"); dialog.open(); if ((dialog.getReturnCode() == Window.OK) && (dialog.getResult().length > 0)) { IType type = (IType) dialog.getResult()[0]; text.setText(type.getFullyQualifiedName()); setDirty(true); } } catch (JavaModelException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } public String getName() { return "Hadoop"; } public void initializeFrom(ILaunchConfiguration configuration) { try { mapperClass.setText(configuration.getAttribute( "org.apache.hadoop.eclipse.launch.mapper", "")); reducerClass.setText(configuration.getAttribute( "org.apache.hadoop.eclipse.launch.reducer", "")); combinerClass.setText(configuration.getAttribute( "org.apache.hadoop.eclipse.launch.combiner", "")); } catch (CoreException e) { // TODO Auto-generated catch block e.printStackTrace(); setErrorMessage(e.getMessage()); } } public void performApply(ILaunchConfigurationWorkingCopy configuration) { configuration.setAttribute("org.apache.hadoop.eclipse.launch.mapper", mapperClass.getText()); configuration.setAttribute( "org.apache.hadoop.eclipse.launch.reducer", reducerClass .getText()); configuration.setAttribute( "org.apache.hadoop.eclipse.launch.combiner", combinerClass .getText()); } public void setDefaults(ILaunchConfigurationWorkingCopy configuration) { } } }