private void createSigInfo( Entry<String, FunctionInfo> e, Description consAnno, HashMap<Category, ArrayList<SignatureInfo>> cat2sig, int i) { SignatureInfo si = new SignatureInfo(); si.signature = e.getValue().signatures[i]; Method m = si.signature.evaluateMethod; Description des = m.getAnnotation(Description.class); if ((des == null) || (des.params() == null)) { si.params = consAnno.params(); } else { si.description = des.description(); si.params = des.params(); } if (e.getValue().needsEvaluatorArgument()) { // the first parameter is the InternalGreqlEvaluator assert si.params[0].equals("internal"); si.params = Arrays.copyOfRange(si.params, 1, si.params.length); } if ((des != null) && (des.categories() != null)) { for (Category cat : des.categories()) { if (!cat2sig.containsKey(cat)) { cat2sig.put(cat, new ArrayList<SignatureInfo>()); } cat2sig.get(cat).add(si); } } else { for (Category cat : consAnno.categories()) { if (!cat2sig.containsKey(cat)) { cat2sig.put(cat, new ArrayList<SignatureInfo>()); } cat2sig.get(cat).add(si); } } }
private void fillCat2Funs(final Map<String, FunctionInfo> funs) { for (Entry<String, FunctionInfo> e : funs.entrySet()) { Class<?> funClass = e.getValue().getFunction().getClass(); assert (funClass.getConstructors().length == 1); Constructor<?> cons = funClass.getConstructors()[0]; String name = e.getKey(); String constructorDescription = null; Description consAnno = cons.getAnnotation(Description.class); if (consAnno != null) { constructorDescription = consAnno.description(); } HashMap<Category, ArrayList<SignatureInfo>> cat2sig = new HashMap<>(); int methodCount = e.getValue().signatures.length; for (int i = 0; i < methodCount; i++) { createSigInfo(e, consAnno, cat2sig, i); } for (Category cat : cat2sig.keySet()) { SortedMap<String, AnnotationInfo> m = cat2funs.get(cat); if (m == null) { m = new TreeMap<>(); cat2funs.put(cat, m); } AnnotationInfo aninfo = new AnnotationInfo(); aninfo.name = name; aninfo.constructorDescription = constructorDescription; aninfo.signatureInfos = cat2sig.get(cat).toArray(new SignatureInfo[] {}); m.put(aninfo.name, aninfo); cat2funs.put(cat, m); } } }
public final String getHtmlDescription() { StringBuilder sb = new StringBuilder(); sb.append("<html><body><p>GReQL function <font color=\"blue\"><strong>") .append(name) .append("</strong></font></p><dl>"); assert (functionClass.getConstructors().length == 1); Constructor<?> cons = functionClass.getConstructors()[0]; Description consDesc = cons.getAnnotation(Description.class); for (Signature sig : signatures) { Description funDesc = sig.evaluateMethod.getAnnotation(Description.class); if (funDesc == null) { funDesc = consDesc; } if (funDesc == null) { continue; } Class<?> ret = sig.evaluateMethod.getReturnType(); String returnType = Types.getGreqlTypeName(ret); boolean acceptsType = sig.parameterTypes[sig.parameterTypes.length - 1] == TypeCollection.class; sb.append("<dt><strong><font color=\"purple\">") .append(returnType) .append(" <font color=\"blue\">") .append(name) .append("</font></strong>"); if (acceptsType) { sb.append(" { <font color=\"#008000\">types...</font> } "); } sb.append("("); String delim = ""; int i = 0; for (String p : funDesc.params()) { if ((i == 0) && needsGraphArgument) { // don't show Graph argument ++i; continue; } if ((i == 0) && needsEvaluatorArgument) { // don't show evaluator argument ++i; continue; } if ((i == (sig.parameterTypes.length - 1)) && acceptsType) { // don't show TypeCollection argument ++i; continue; } Class<?> cls = sig.parameterTypes[i++]; String type = Types.getGreqlTypeName(cls); sb.append(delim) .append("<strong><font color=\"purple\">") .append(type) .append("</font></strong> ") .append(p); delim = ", "; } sb.append(")</dt><dd>").append(funDesc.description()).append("</dd>"); } sb.append("</dl></body></html>"); return sb.toString(); }