package org.megam.chef.parser;
import java.util.ArrayList;
import java.util.Formatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.megam.chef.core.Condition;
import org.megam.chef.shell.MultiCommands;
import org.megam.chef.shell.FedInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* <p>ChefInfo class.</p>
*
* @author rajthilak
* @version $Id: $Id
*/
public class ChefInfo extends ProvisionerInfo {
/**
* @param args
*/
private static final String COMMAND = "command";
private static final String PLUGIN = "plugin";
private static final String RUNLIST = "run-list";
private static final String DRUNLIST = "run_list";
private static final String NAME = "name";
private static final String KNIFE = "knife";
private List<String> missingReasonToList = new ArrayList<String>();
// create Map name as chef from config.json file
private Map<String, String> chef = new HashMap<String, String>();
private Logger logger = LoggerFactory.getLogger(ChefInfo.class);
/**
* <p>Constructor for ChefInfo.</p>
*/
public ChefInfo() {
super("CHEF");
}
/**
* <p>map.</p>
*
* @return chef map
*/
public Map<String, String> map() {
return chef;
}
/**
* <p>getCommand.</p>
*
* @return a {@link java.lang.String} object.
*/
public String getCommand() {
if (chef.get(COMMAND).length() > 0)
return chef.get(COMMAND);
else
return "";
}
/**
* <p>getPlugin.</p>
*
* @return a {@link java.lang.String} object.
*/
public String getPlugin() {
if (chef.get(PLUGIN).length() > 0)
return changeServerName(chef.get(PLUGIN));
else
return "";
}
/**
* <p>getRunList.</p>
*
* @return a {@link java.lang.String} object.
*/
public String getRunList() {
if (chef.get(DRUNLIST).length() > 0)
return "--" + RUNLIST + " " + chef.get(DRUNLIST);
else
return "";
}
/**
* <p>getName.</p>
*
* @return a {@link java.lang.String} object.
*/
public String getName() {
if (chef.get(NAME).length() > 0) {
String[] parts = chef.get(PLUGIN).split(" ");
String[] name = (chef.get(NAME)).split(" ");
String new_name = null;
//if (parts[0].equals("google")) {
// name[1] = name[1].replaceAll("\\W", "");
// StringBuilder builder = new StringBuilder();
// for (String s : name) {
// builder.append(s + " ");
// }
// new_name = builder.toString();
//} else {
new_name = chef.get(NAME);
//}
return new_name;
} else
return "";
}
/**
* <p>getReason.</p>
*
* @return a {@link java.util.List} object.
*/
public List<String> getReason() {
return missingReasonToList;
}
/**
* <p>ok.</p>
*
* @return a boolean.
*/
public boolean ok() {
return validate(COMMAND, KNIFE);
}
/**
*
* @param key
* @param value
*/
private boolean validate(String key, String value) {
boolean isValid = true;
for (Map.Entry<String, String> entry : map().entrySet()) {
if (entry.getKey().equals(key)) {
isValid = isValid && (entry.getValue().equals(value));
if (!entry.getValue().equals(value)) {
missingReasonToList.add(key + " is not valid ");
}
}
}
return isValid;
}
private String changeServerName(String plugin) {
String[] parts = plugin.split(" ");
String[] name = chef.get(NAME).split(" ");
String new_plugin = null;
if (parts[0].equals("google")) {
parts[3] = name[1].replaceAll("\\W", "");
StringBuilder builder = new StringBuilder();
for (String s : parts) {
builder.append(s + " ");
}
new_plugin = builder.toString();
} else {
new_plugin = plugin;
}
return new_plugin;
}
/*
* (non-Javadoc)
*
* @see org.megam.chef.core.Condition#inputAvailable()
*/
/**
* <p>inputAvailable.</p>
*
* @return a boolean.
*/
public boolean inputAvailable() {
boolean isAvailable = true;
isAvailable = isAvailable && notNull(COMMAND);
isAvailable = isAvailable && notNull(PLUGIN);
isAvailable = isAvailable && notNull(RUNLIST);
isAvailable = isAvailable && notNull(NAME);
return isAvailable;
}
/**
* <p>notNull.</p>
*
* @param str a {@link java.lang.String} object.
* @return a boolean.
*/
public boolean notNull(String str) {
if (map().containsKey(str)) {
return true;
} else {
missingReasonToList.add(str + " is Missing");
return false;
}
}
/**
* <p>canFeed.</p>
*
* @return a boolean.
*/
public boolean canFeed() {
return true;
}
/**
* <p>feed.</p>
*
* @return a {@link org.megam.chef.shell.FedInfo} object.
*/
public FedInfo feed() {
FedInfo fed = new FedInfo(getName().split(" ")[1], getCommand() + " "
+ getPlugin() + " " + getRunList() + " " + getName());
return fed;
}
/*
* (non-Javadoc)
*
* @see org.megam.chef.core.Condition#name()
*/
/**
* <p>name.</p>
*
* @return a {@link java.lang.String} object.
*/
public String name() {
return "CHEF :";
}
/**
* tostring method for chef map
*
* @return a {@link java.lang.String} object.
*/
public String toString() {
StringBuilder strbd = new StringBuilder();
final Formatter formatter = new Formatter(strbd);
logger.debug("<-------> ChefInfo <------->");
for (Map.Entry<String, String> entry : map().entrySet()) {
formatter.format("%10s = %s%n", entry.getKey(), entry.getValue());
}
formatter.close();
logger.debug(strbd.toString());
logger.debug("<----------------------->");
return strbd.toString();
}
}