[DEV] some modifs

This commit is contained in:
Edouard DUPIN 2021-06-16 20:44:13 +02:00
parent 85fb5f5c81
commit 5097b0b041
5 changed files with 187 additions and 140 deletions

1
out/eclipse/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/classes/

View File

@ -0,0 +1,127 @@
package org.atriasoft.island;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.atriasoft.island.internal.Log;
import org.atriasoft.island.model.ActionException;
import org.atriasoft.island.model.ActionInterface;
public class Actions {
private static Map<String, Class<ActionInterface>> actions = new HashMap<String,Class<ActionInterface>>();
public static void addAction(String name, Class<ActionInterface> klass) {
actions.put(name, klass);
}
/**
* Get the wall list of action availlable
* @return The list of action name
*/
public Set<String> getListOfAction() {
return actions.keySet();
}
///**
// * Get a description of an action
// * @param action_name (string) Name of the action
// * @param function_name (string) Name of the fucntion to call
// * @param default_value (*) Renurned value of the call if function does not exist
// * @return (*) the getted value or the default_value
// */
//public void get_function_value(action_name, function_name, default_value = None):
// global list_actions;
// for elem in list_actions:
// if elem["name"] == action_name:
// // finish the parsing
// sys.path.append(os.path.dirname(elem["path"]))
// the_action = __import__(__base_action_name + action_name)
// if function_name not in dir(the_action):
// return default_value
// method_to_call = getattr(the_action, function_name)
// return method_to_call()
// return default_value
/**
* Get the global help value of a module
* @param action_name (string) Name of the action
* @return The first line of description
*/
private String getFullActionHelp(String action_name) {
Class<ActionInterface> actionClass = actions.get(action_name);
if (actionClass == null) {
return "Action does not exist";
}
ActionInterface action = actionClass.getDeclaredConstructor().newInstance();
if (action == null) {
return "Action creation error";
}
return action.help();
}
private String getActionHelpExample(String action_name) {
Class<ActionInterface> actionClass = actions.get(action_name);
if (actionClass == null) {
return null;
}
ActionInterface action = actionClass.getDeclaredConstructor().newInstance();
if (action == null) {
return null;
}
return action.helpExample();
}
/**
* Get the global help value of a module
* @param action_name (string) Name of the action
* @return The first line of description
*/
public String getActionHelp(String action_name) {
return getFullActionHelp(action_name).split("\n")[0];
}
public void usage(String action_name, List<String> arguments) {
String help = getFullActionHelp(action_name);
Log.print("Description:");
Log.print("\t" + help);
//TODO: ??? arguments.display(action_name);
String helpExample = getActionHelpExample(action_name);
if (helpExample != null) {
Log.print("Example:");
for (String elem : helpExample.split("\n")) {
Log.print("\t" + elem);
}
}
System.exit(0);
}
public void execute(String action_name, List<String> arguments) {
Class<ActionInterface> actionClass = actions.get(action_name);
if (actionClass == null) {
throw new ActionException("Action does not registered");
}
ActionInterface action = actionClass.getDeclaredConstructor().newInstance();
if (action == null) {
throw new ActionException("Uneable to intanciate Action");
}
Log.info("action: " + action_name);
Arguments my_under_args_parser = new Arguments();
my_under_args_parser.add("h", "help", null, "Help of this action");
action.addSpecificArguments(my_under_args_parser, action_name);
boolean have_unknow_argument = action.haveUnknowArgument();
my_under_args = my_under_args_parser.parse(arguments, have_unknow_argument);
// search help if needed ==> permit to not duplicating code
for (elem : my_under_args) {
if (elem.get_option_name() == "help") {
usage(my_under_args_parser, action_name);
System.exit(0);
}
}
// now we can execute:
Log.info("execute: " + action_name);
for (elem : my_under_args) {
Log.debug(" " + elem.get_option_name() + "='" + elem.get_arg() + "'");
}
action.execute(my_under_args);
}
}

View File

@ -0,0 +1,10 @@
package org.atriasoft.island.model;
public class ActionException extends Exception {
private static final long serialVersionUID = 1L;
public ActionException(String message) {
super(message);
}
}

View File

@ -0,0 +1,49 @@
package org.atriasoft.island.model;
public interface ActionInterface {
/**
* Get the global description of the current action
* @return the description string (fist line if reserved for the overview, all is for the specific display)
*/
String help();
/**
* @brief Add argument to the specific action
* @param[in,out] my_args (death.Arguments) Argument manager
* @param[in] section Name of the currect action
*/
default void addSpecificArguments(Arguments myArgs, String section) {
}
/**
* Set the option argument are not able to check if the argument are correct or not
* @return Have parameter without arguments
*/
default boolean haveUnknowArgument() {
return false;
}
/**
* Add argument to the specific action
* @param myArgs (death.Arguments) Argument manager
* @param section Name of the current action
*/
void add_specific_arguments(Arguments myArgs, String section);
/**
* Execute the action required.
* @return error value [0 .. 50] the <0 value is reserved system ==> else, what you want.
* None : No error (return program out 0)
* -10 : ACTION is not existing
* -11 : ACTION execution system error
* -12 : ACTION Wrong parameters
*/
public void execute(Arguments _arguments) throws ActionException;
String helpExample();
}

View File

@ -1,140 +0,0 @@
//!/usr/bin/python
// -*- coding: utf-8 -*-
//#
//# @author Edouard DUPIN
//#
//# @copyright 2012, Edouard DUPIN, all right reserved
//#
//# @license MPL v2.0 (see license file)
//#
// Local import
from realog import debug
import os
import sys
from . import env
import death.Arguments as arguments
list_actions = []
__base_action_name = env.get_system_base_name() + "Action_"
public void init(files):
global list_actions;
debug.verbose("List of action for island: " + str(len(files)))
for elem_path in files :
debug.verbose("parse file : " + elem_path)
base_name = os.path.basename(elem_path)
if len(base_name) <= 3 + len(__base_action_name):
// reject it, too small
continue
base_name = base_name[:-3]
if base_name[:len(__base_action_name)] != __base_action_name:
// reject it, wrong start file
continue
name_action = base_name[len(__base_action_name):]
debug.debug(" '" + os.path.basename(elem_path)[:-3] + "' file=" + elem_path)
list_actions.append({
"name":name_action,
"path":elem_path,
})
//#
//# @brief Get the wall list of action availlable
//# @return ([string]) the list of action name
//#
public void get_list_of_action():
global list_actions;
out = []
for elem in list_actions:
out.append(elem["name"])
return out
//#
//# @brief Get a description of an action
//# @param[in] action_name (string) Name of the action
//# @param[in] function_name (string) Name of the fucntion to call
//# @param[in] default_value (*) Renurned value of the call if function does not exist
//# @return (*) the getted value or the default_value
//#
public void get_function_value(action_name, function_name, default_value = None):
global list_actions;
for elem in list_actions:
if elem["name"] == action_name:
// finish the parsing
sys.path.append(os.path.dirname(elem["path"]))
the_action = __import__(__base_action_name + action_name)
if function_name not in dir(the_action):
return default_value
method_to_call = getattr(the_action, function_name)
return method_to_call()
return default_value
//#
//# @brief Get the global help value of a module
//# @param[in] action_name (string) Name of the action
//# @return The first line of description
//#
public void get_action_help(action_name):
value = get_function_value(action_name, "help", "---")
return value.split("\n")[0]
public void usage(arguments, action_name):
color = debug.get_color_set()
// generic argument displayed for specific action:
//print("Specific argument for the command: '" + action_name + "'" )
//print(" " + get_desc(action_name))
value = get_function_value(action_name, "help")
debug.info("Description:")
debug.info("\t" + str(value))
arguments.display(action_name)
value = get_function_value(action_name, "help_example")
if value != None:
debug.info("Example:")
for elem in value.split("\n"):
debug.info("\t" + value)
exit(0)
public void execute(action_name, argument_start_id):
global list_actions;
// TODO: Move here the check if action is availlable
for elem in list_actions:
if elem["name"] != action_name:
continue
debug.info("action: " + str(elem));
// finish the parsing
sys.path.append(os.path.dirname(elem["path"]))
the_action = __import__(__base_action_name + action_name)
my_under_args_parser = arguments.Arguments()
my_under_args_parser.add("h", "help", desc="Help of this action")
if "add_specific_arguments" in dir(the_action):
the_action.add_specific_arguments(my_under_args_parser, elem["name"])
have_unknow_argument = false
if "have_unknow_argument" in dir(the_action):
have_unknow_argument = the_action.have_unknow_argument()
my_under_args = my_under_args_parser.parse(argument_start_id, have_unknow_argument)
// search help if needed ==> permit to not duplicating code
for elem in my_under_args:
if elem.get_option_name() == "help":
usage(my_under_args_parser, action_name)
return 0
// now we can execute:
if "execute" not in dir(the_action):
debug.error("execute is not implmented for this action ... '" + str(action_name) + "'")
return -11
debug.info("execute: " + action_name)
for elem in my_under_args:
debug.debug(" " + str(elem.get_option_name()) + "='" + str(elem.get_arg()) + "'")
ret = the_action.execute(my_under_args)
if ret == None:
return 0
if ret < 0:
debug.info(" ==========================")
debug.info(" == Some error occured ==")
debug.info(" ==========================")
return ret
debug.error("Can not do the action...")
return -10