blob: 2c26b6bed5bfeea2b01d749bb1bda5b7918a4ac2 [file] [log] [blame]
/*
* 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.oodt.cas.cli.option.handler;
//OODT static imports
import static org.apache.oodt.cas.cli.util.CmdLineUtils.convertToType;
//JDK imports
import java.util.Arrays;
import java.util.List;
//Apache imports
import org.apache.commons.lang.StringUtils;
//OODT imports
import org.apache.oodt.cas.cli.action.CmdLineAction;
import org.apache.oodt.cas.cli.option.CmdLineOption;
import org.apache.oodt.cas.cli.option.CmdLineOptionInstance;
//Google imports
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.Lists;
/**
* {@link CmdLineOptionHandler} which applies {@link CmdLineOption} values to
* given {@link CmdLineAction}. If {@link CmdLineOption} is a repeating option
* then "add<long-name>" is invoked on {@link CmdLineAction}, otherwise
* "set<long-name" is invoked, unless the method name was supplied, then that
* method will be invoked.
*
* @author bfoster (Brian Foster)
*/
public class ApplyToActionHandler implements CmdLineOptionHandler {
private List<ApplyToAction> applyToActions;
public void setApplyToActions(List<ApplyToAction> applyToActions) {
this.applyToActions = applyToActions;
}
public List<ApplyToAction> getApplyToActions() {
return applyToActions;
}
public void initialize(CmdLineOption option) {
// Do nothing.
}
public void handleOption(CmdLineAction action,
CmdLineOptionInstance optionInstance) {
try {
Class<?> type = optionInstance.getOption().getType();
List<?> vals = (optionInstance.getValues().isEmpty()) ? convertToType(
Arrays.asList(new String[] { "true" }), type = Boolean.TYPE)
: convertToType(optionInstance.getValues(), type);
String methodName = getMethodName(action.getName());
if (methodName != null) {
action.getClass().getMethod(methodName, type)
.invoke(action, vals.toArray(new Object[vals.size()]));
} else {
action.getClass()
.getMethod(
(optionInstance.getOption().isRepeating() ? "add"
: "set") + StringUtils.capitalize(optionInstance
.getOption().getLongOption()), type)
.invoke(action, vals.toArray(new Object[vals.size()]));
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@VisibleForTesting
protected String getMethodName(String actionName) {
if (applyToActions != null) {
for (ApplyToAction applyToAction : applyToActions) {
if (applyToAction.getActionName().equals(actionName)) {
return applyToAction.getMethodName();
}
}
}
return null;
}
@VisibleForTesting
protected String getDescription(String actionName) {
if (applyToActions != null) {
for (ApplyToAction applyToAction : applyToActions) {
if (applyToAction.getActionName().equals(actionName)) {
return applyToAction.getDescription();
}
}
}
return null;
}
@VisibleForTesting
protected String getArgDescription(String actionName) {
if (applyToActions != null) {
for (ApplyToAction applyToAction : applyToActions) {
if (applyToAction.getActionName().equals(actionName)) {
return applyToAction.getArgDescription();
}
}
}
return null;
}
public String getHelp(CmdLineOption option) {
return "Will invoke '" + (option.isRepeating() ? "add" : "set")
+ StringUtils.capitalize(option.getLongOption())
+ "' on action selected, except for the following actions: "
+ (applyToActions != null ? applyToActions : Lists.newArrayList());
}
public String getDescription(CmdLineAction action, CmdLineOption option) {
return getDescription(action.getName());
}
public String getArgDescription(CmdLineAction action, CmdLineOption option) {
return getArgDescription(action.getName());
}
}