package com.framsticks.params.types; import com.framsticks.params.Param; import com.framsticks.util.lang.Strings; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author Piotr Sniegowski */ public class ProcedureParam extends Param { private Param resultType; private List argumentsType = new ArrayList(); private static Pattern addressPattern = Pattern.compile("^([^\\(]+)?\\(([^\\)]*)\\)$"); protected static Param parseType(String type, String name) { return Param.build().type(type).name(name).finish(); } public void parseSignature(String signature) throws Exception { if (!Strings.notEmpty(signature)) { return; } Matcher matcher = addressPattern.matcher(signature); if (!matcher.matches()) { throw new Exception("invalid signature"); } String result = Strings.collapse(matcher.group(1)); if (result != null) { resultType = parseType(result, null); } String arguments = matcher.group(2); if (!Strings.notEmpty(arguments)) { return; } for (String a : arguments.split(",")) { int space = a.indexOf(' '); String type; String name; if (space == -1) { type = a; name = null; } else { type = a.substring(0, space); name = a.substring(space + 1); } argumentsType.add(parseType(type, name)); } } @Override public Class getStorageType() { return Void.class; } public Param getResultType() { return resultType; } public List getArgumentsType() { return argumentsType; } @Override public String getFramsTypeName() { return "p"; } }