/** * */ package org.korsakow.services.plugin.predicate; import java.text.MessageFormat; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; public class PredicateTypeInfo implements IPredicateTypeInfo { public static PredicateTypeInfo create(String id, int arity, String displayString, String formattedDisplayString, IArgumentInfo... args) { return new PredicateTypeInfo(id, arity, displayString, formattedDisplayString, args); } public static PredicateTypeInfo create(String id, int arity, String displayString) { return new PredicateTypeInfo(id, arity, displayString, displayString, new IArgumentInfo[0]); } private final String id; private final String displayString; private final String formattedDisplayString; private final int arity; private final List<IArgumentInfo> arguments; private final Map<String, IArgumentInfo> argmap; public PredicateTypeInfo(String id, int arity, String displayString, String formattedDisplayString, IArgumentInfo... args) { this.id = id; this.displayString = displayString; this.formattedDisplayString = formattedDisplayString; this.arity = arity; this.arguments = Arrays.asList(args); this.argmap = new HashMap<String, IArgumentInfo>(); for (IArgumentInfo info : args) argmap.put(info.getName(), info); } public String getId() { return id; } public String getDisplayString() { return displayString; } public String getFormattedDisplayString(Object... args) { if (args.length != arguments.size()) throw new IllegalArgumentException("Argument count mismatch; expecting " + arguments.size() + ", got " + args.length); String[] fargs = new String[args.length]; for (int i = 0; i < args.length; ++i) fargs[i] = arguments.get(i).getFormattedDisplayString(args[i]); return MessageFormat.format(formattedDisplayString, fargs); } public int getArity() { return arity; } public Collection<IArgumentInfo> getArguments() { return arguments; } public IArgumentInfo getArgument(String name) { return argmap.get(name); } }