All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.oodt.cas.cli.printer.StdCmdLinePrinter Maven / Gradle / Ivy

There is a newer version: 1.9.1
Show newest version
/*
 * 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.printer;


import com.google.common.collect.Lists;

import org.apache.commons.lang.StringUtils;
import org.apache.oodt.cas.cli.action.CmdLineAction;
import org.apache.oodt.cas.cli.option.*;
import org.apache.oodt.cas.cli.option.validator.CmdLineOptionValidator.Result;

import java.util.List;
import java.util.Set;

import static org.apache.oodt.cas.cli.util.CmdLineUtils.*;


/**
 * Standard {@link CmdLinePrinter}.
 * 
 * @author bfoster (Brian Foster)
 */
public class StdCmdLinePrinter implements CmdLinePrinter {

   @Override
   public String printActionHelp(CmdLineAction action,
         Set options) {
      return "" + getHeader(action) + "\n" + getDescription(action) + "\n" + getUsage(action, options) + "\n"
             + getExamples(action) + "\n" + getFooter(action) + "\n";
   }

   protected String getHeader(CmdLineAction action) {
      return "** Action Help for '" + action.getName() + "' **";
   }

   protected String getDescription(CmdLineAction action) {
      StringBuilder sb = new StringBuilder("> DESCRIPTION:\n");
      if (action.getDetailedDescription() != null) {
         sb.append(" ").append(action.getDetailedDescription()
               .replaceAll("^\\s*", "").replaceAll("\\s*$", ""));
      } else if (action.getDescription() != null) {
         sb.append(" ").append(
               action.getDescription().replaceAll("^\\s*", "")
                     .replaceAll("\\s*$", ""));
      } else {
         sb.append(" - N/A");
      }
      return sb.append("\n").toString();
   }

   protected String getUsage(CmdLineAction action, Set options) {
      StringBuilder sb = new StringBuilder("> USAGE:\n");
      sb.append(getRequiredSubHeader()).append("\n");
      Set requiredOptions = determineRequired(action, options);
      List sortedRequiredOptions = sortOptions(requiredOptions);
      for (CmdLineOption option : sortedRequiredOptions) {
         sb.append(getRequiredOptionHelp(action, option)).append("\n");
      }

      sb.append(getOptionalSubHeader()).append("\n");
      Set optionalOptions = determineOptional(action, options);
      List sortedOptionalOptions = sortOptions(optionalOptions);
      for (CmdLineOption option : sortedOptionalOptions) {
         sb.append(getOptionalOptionHelp(action, option)).append("\n");
      }
      return sb.toString();
   }

   protected String getRequiredSubHeader() {
      return " Required:";
   }

   protected String getRequiredOptionHelp(CmdLineAction action,
         CmdLineOption option) {
      if (option instanceof GroupCmdLineOption) {
         return getGroupHelp(action, (GroupCmdLineOption) option, "   ");
      } else {
         return getOptionHelp(action, option, "   ");
      }
   }

   protected String getOptionalSubHeader() {
      return " Optional:";
   }

   protected String getOptionalOptionHelp(CmdLineAction action,
         CmdLineOption option) {
      if (option instanceof GroupCmdLineOption) {
         return getGroupHelp(action, (GroupCmdLineOption) option, "   ");
      } else {
         return getOptionHelp(action, option, "   ");
      }
   }

   protected String getExamples(CmdLineAction action) {
      StringBuilder sb = new StringBuilder("> EXAMPLES:\n");
      if (action.getExamples() != null) {
         sb.append(" ").append(action.getExamples().replaceAll("^\\s*", "")
               .replaceAll("\\s*$", ""));
      } else {
         sb.append(" - N/A");
      }
      return sb.toString();
   }

   protected String getFooter(CmdLineAction action) {
      return "";
   }

   protected String getOptionHelp(CmdLineAction action, CmdLineOption option,
         String indent) {
      String argDescription = null;
      if (option instanceof AdvancedCmdLineOption) {
         argDescription = ((AdvancedCmdLineOption) option).getHandler()
               .getArgDescription(action, option);
      }

      String argHelp;
      if (option instanceof ActionCmdLineOption && option.hasArgs()) {
         argHelp = " " + action.getName();
      } else {
         argHelp = (option.hasArgs() ? " <"
               + (argDescription != null ? argDescription : option
                     .getArgsDescription()) + ">" : "");
      }
      return indent + "-" + option.getShortOption() + " [--"
            + option.getLongOption() + "]" + argHelp;
   }

   protected String getGroupHelp(CmdLineAction action,
         GroupCmdLineOption option, String indent) {
      StringBuilder helpString = new StringBuilder(getOptionHelp(action, option, indent));
      Set subOptions = determineRequiredSubOptions(action,
          option);
      if (subOptions.isEmpty()) {
         if (!option.getSubOptions().isEmpty()) {
            helpString.append("\n").append(indent).append("  One of:");
            for (GroupSubOption subOption : option.getSubOptions()) {
               helpString.append("\n").append(getOptionHelp(action, subOption.getOption(), "   "
                                                                                           + indent));
            }
         }
      } else {
         for (CmdLineOption subOption : determineRelevantSubOptions(action,
               option)) {
            helpString.append("\n");
            if (subOption instanceof GroupCmdLineOption) {
               helpString.append(getGroupHelp(action,
                     (GroupCmdLineOption) subOption, "  " + indent));
            } else {
               helpString.append(getOptionHelp(action, subOption, "  " + indent));
            }
            helpString.append(" ").append(subOptions.contains(subOption) ? "(required)"
                                                                         : "(optional)");
         }
      }
      return helpString.toString();
   }

   @Override
   public String printActionsHelp(Set actions) {
      StringBuilder sb = new StringBuilder("");
      sb.append("-----------------------------------------------------------------------------------------------------------------\n");
      sb.append("|").append(StringUtils.rightPad(" Action", 35)).append("|").append(" Description\n");
      sb.append("-----------------------------------------------------------------------------------------------------------------\n");
      for (CmdLineAction action : sortActions(actions)) {
         sb.append("  ").append(StringUtils.rightPad(action.getName(), 35));
         sb.append(" ").append(action.getDescription()).append("\n\n");
      }
      sb.append("-----------------------------------------------------------------------------------------------------------------\n");
      return sb.toString();
   }

   @Override
   public String printOptionsHelp(Set options) {
      StringBuilder sb = new StringBuilder("");
      List sortedOptions = sortOptionsByRequiredStatus(options);
      sb.append(getHeader()).append("\n");
      for (CmdLineOption option : sortedOptions) {
         sb.append(getOptionHelp(option, "")).append("\n");
      }
      sb.append(getFooter()).append("\n");
      return sb.toString();
   }

   protected String getHeader() {
      return ""
             + "-----------------------------------------------------------------------------------------------------------------\n"
             + "|" + StringUtils.rightPad(" Short", 7) + "|"
             + StringUtils.rightPad(" Long", 50) + "| Description\n"
             + "-----------------------------------------------------------------------------------------------------------------\n";
   }

   protected String getOptionHelp(CmdLineOption option, String indent) {
      String argName = option.hasArgs() ? " <" + option.getArgsDescription()
            + ">" : "";
      String optionUsage = indent
            + "-"
            + StringUtils.rightPad(option.getShortOption() + ",", 7)
            + "--"
            + StringUtils.rightPad((option.getLongOption() + argName),
                  49 - indent.length()) + option.getDescription();

      optionUsage = " " + optionUsage;

      if (!option.getRequirementRules().isEmpty()) {
         optionUsage += "\n"
               + getFormattedString("Requirement Rules:", 62, 113)
               + getFormattedString(option.getRequirementRules().toString(),
                     63, 113);
      }

      if (option instanceof AdvancedCmdLineOption) {
         if (((AdvancedCmdLineOption) option).hasHandler()) {
            String handlerHelp = ((AdvancedCmdLineOption) option).getHandler()
                  .getHelp(option);
            if (handlerHelp != null) {
               optionUsage += "\n"
                     + getFormattedString("Handler:", 62, 113)
                     + getFormattedString(handlerHelp, 63, 113);
            }
         }
      } else if (isGroupOption(option)) {
         GroupCmdLineOption groupOption = asGroupOption(option);
         optionUsage += "\n";
         optionUsage += "   SubOptions:\n";
         optionUsage += "   > Required:\n";

         List optionalOptions = Lists.newArrayList();
         for (GroupSubOption subOption : groupOption.getSubOptions()) {
            if (subOption.isRequired()) {
               optionUsage += getOptionHelp(subOption.getOption(), "     ");
            } else {
               optionalOptions.add(subOption.getOption());
            }
         }
         optionUsage += "   > Optional:\n";
         for (CmdLineOption optionalOption : optionalOptions) {
            optionUsage += getOptionHelp(optionalOption, "     ");
         }
      }

      return optionUsage;
   }

   protected String getFooter() {
      return "-----------------------------------------------------------------------------------------------------------------";
   }

   @Override
   public String printOptionValidationErrors(List results) {
      StringBuilder sb = new StringBuilder("Validation Failures:");
      for (Result result : results) {
         sb.append(" - ").append(result.getMessage()).append("\n");
      }
      return sb.toString();
   }

   @Override
   public String printRequiredOptionsMissingError(
         Set missingOptions) {
      StringBuilder sb = new StringBuilder("Missing required options:\n");
      for (CmdLineOption option : missingOptions) {
         sb.append(" - ").append(option.toString()).append("\n");
      }
      return sb.toString();
   }

   @Override
   public String printActionMessages(List messages) {
      StringBuilder sb = new StringBuilder("");
      for (String message : messages) {
         sb.append(message);
      }
      return sb.toString();
   }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy