package uc.protocols; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import logger.LoggerFactory; import org.apache.log4j.Logger; import uc.protocols.hub.Flag; import uc.protocols.hub.INFField; public abstract class AbstractADCCommand extends AbstractDCProtocolCommand { private static Logger logger = LoggerFactory.make(); public static Map<INFField,String> INFMap(String attributes) { String[] splits = IProtocolCommand.space.split(attributes); Map<INFField,String> flagValue = new HashMap<INFField,String>(); for (String s: splits) { if (s.length() >= 2) { INFField fls = INFField.parse(s.substring(0, 2)); String value = revReplaces(s.substring(2)); if (fls != null && fls.verify(value)) { flagValue.put(fls,value); } } } return flagValue; } public static String reverseINFMap( Map<INFField,String> attributes) { StringBuilder sb = new StringBuilder(); for (Entry<INFField,String> e: attributes.entrySet()) { sb.append(' '); sb.append(e.getKey().name()); sb.append(doReplaces(e.getValue())); } return sb.toString(); } /** * * @param maps * @return string containing all flags with values * lead by a space so it can be appended to any normal command * empty string if no flags. */ public static String getFlagString(Map<Flag,String> maps) { StringBuilder sb = new StringBuilder(); for (Entry<Flag,String> e:maps.entrySet()) { sb.append(' '); sb.append(e.getKey().name()); sb.append(doReplaces(e.getValue())); } return sb.toString(); } // public static String getINFString(User usr,INFField... fields ) { // String s = ""; // for (INFField inff:fields) { // if (!GH.isEmpty(s)) { // s += " "; // } // s+=inff.name()+ doReplaces(inff.getProperty(usr)); // } // return s; // } public String getPrefix() { return getClass().getSimpleName(); } public boolean matches(String command) { if (getPattern() != null) { matcher = getPattern().matcher(command); return matcher.matches(); } else { return command.substring(1).startsWith(getPrefix()) && command.charAt(4) == ' '; } } public static String doReplaces(String s) { return s.replace("\\", "\\\\").replace(" ", "\\s").replace("\n","\\n"); } /** * * @param s - a string received in ADC * @return s without replaces * @throws IllegalArgumentException - is thrown on illegal replace */ public static String revReplaces(String s) throws IllegalArgumentException { StringBuilder build = new StringBuilder(s); for (int i=0 ; i+1 < build.length() ; i++) { if (build.charAt(i) == '\\') { String repl; switch(build.charAt(i+1)) { case '\\': repl = "\\"; break; case 'n': repl = "\n"; break; case 's': repl = " "; break; default: repl= ""+build.charAt(i+1); logger.info("invalid replacement found: "+s); } build.replace(i, i+2, repl); //i++; } } return build.toString(); } }