public Json makeTyped(Object anything) {
    boolean isarray = anything.getClass().isArray();
    Class<?> type = isarray ? anything.getClass().getComponentType() : anything.getClass();
    JsonConverter converter = converterMap.get(type.getName());
    String typeName = shortNameMap.getY(type.getName());
    if (typeName == null) typeName = type.getName();
    if (isarray) {
      Json result = Json.array();
      Object[] A = (Object[]) anything;
      for (Object x : A) {
        if (x == null) result.add(Json.nil());
        else result.add(converter != null ? converter.to(x) : make(x));
      }
      return Json.object().set("javaArrayType", typeName).set("array", result);
    } else if (type.isEnum())
      return Json.object().set("java.lang.Enum", type.getName()).set("value", anything.toString());

    for (Class<?> abstractConv : converterFromAbstractMap.keySet())
      if (abstractConv.isAssignableFrom(type))
        return converterFromAbstractMap.get(abstractConv).to(anything);
    Json value = null;
    if (converter != null) value = converter.to(anything);
    else if (Collection.class.isAssignableFrom(type) || Map.class.isAssignableFrom(type))
      value = beanConverter.to(anything);
    else
      try {
        value = f.make(anything);
      } catch (Throwable t) {
        value = beanConverter.to(anything);
      }
    return Json.object().set("javaType", typeName).set("value", value);
  }
 public static HGHandle getHandle(String name) {
   HGHandle result = syntacticPredicates.get(name);
   if (result == null) {
     String s = relationNames.getX(name);
     if (s != null) result = syntacticPredicates.get(s);
   }
   return result;
 }
 @SuppressWarnings({"unchecked", "rawtypes"})
 public <T> T value(Json x) {
   if (x == null || x.isNull()) return null;
   else if (x.isPrimitive()) return (T) x.getValue();
   else if (x.isArray())
     // what to do here ... this is some sort of collection??
     return (T) x.getValue();
   else if (x.has("java.lang.Enum")) {
     try {
       return (T)
           Enum.valueOf(
               (Class<Enum>) Class.forName(x.at("java.lang.Enum").asString()),
               x.at("value").asString());
     } catch (Exception t) {
       throw new RuntimeException(t);
     }
   } else if (x.has("javaArrayType")) {
     String fullName = shortNameMap.getX(x.at("javaArrayType").asString());
     if (fullName == null) fullName = x.at("javaArrayType").asString();
     try {
       Class<?> cl = Class.forName(fullName);
       JsonConverter converter = converterMap.get(fullName);
       Object A = Array.newInstance(cl, x.at("array").asJsonList().size());
       for (int i = 0; i < x.at("array").asJsonList().size(); i++) {
         Json j = x.at("array").at(i);
         Array.set(A, i, j.isNull() ? null : converter != null ? converter.from(j) : value(j));
       }
       return (T) A;
     } catch (Exception ex) {
       throw new RuntimeException(ex);
     }
   } else if (x.has("javaType")) {
     String fullName = shortNameMap.getX(x.at("javaType").asString());
     if (fullName == null) fullName = x.at("javaType").asString();
     JsonConverter converter = converterMap.get(fullName);
     if (converter != null)
       return (T) converter.from(converter instanceof BeanJsonConverter ? x : x.at("value"));
     else return (T) beanConverter.from(x); // .at("value"));
   } else return (T) x.getValue();
 }
 public static String idFriendlyToRelex(String idFriendlyName) {
   String y = relationNames.getY(idFriendlyName);
   return y != null ? y : idFriendlyName;
 }
  static {
    relationNames.add("rx_action", "_to-do");
    relationNames.add("rx_adj_modifier", "_amod");
    relationNames.add("rx_adv_modifier", "_advmod");
    relationNames.add("rx_appositive", "_appo");
    relationNames.add("rx_cause", "_%because");
    relationNames.add("rx_ind_obj", "_iobj");
    relationNames.add("rx_is", "_%inheritance");
    relationNames.add("rx_location", "_%atLocation");
    relationNames.add("rx_noun_mod", "_nn");
    relationNames.add("rx_object", "_obj");
    relationNames.add("rx_prep_object", "_pobj");
    relationNames.add("rx_prep_subject", "_psubj");
    relationNames.add("rx_pred_adjective", "_predadj");
    relationNames.add("rx_possesion", "_poss");
    relationNames.add("rx_property", "_to-be");
    relationNames.add("rx_quant_mult", "_%quantity_mult");
    relationNames.add("rx_quantifier", "_%quantity_mod");
    relationNames.add("rx_quantity", "_%quantity");
    relationNames.add("rx_subject", "_subj");
    relationNames.add("rx_that", "_that");
    relationNames.add("rx_time", "_%atTime");
    relationNames.add("rx_comparison", "_more");
    relationNames.add("rx_gender", "gender");
    relationNames.add("rx_number", "noun_number");
    relationNames.add("rx_pos", "POS");
    relationNames.add("rx_quantification", "DEFINITE-FLAG");
    relationNames.add("rx_query", "QUERY-TYPE");
    relationNames.add("rx_tense", "tense");
    relationNames.add("rx_hyp", "hyp");
    relationNames.add("rx_copula", "_%copula");

    // unary relations on words, coming from the value of rx_quantification etc.
    relationNames.add("rx_word", "WORD"); // a lonely word that wasn't included in a linkage
    relationNames.add("rx_noun", "noun");
    relationNames.add("rx_verb", "verb");
    relationNames.add("rx_adjective", "adj");
    relationNames.add("rx_adverb", "adv");
    relationNames.add("rx_definite", "definite");
    relationNames.add("rx_past", "past");
    relationNames.add("rx_present", "present");
    relationNames.add("rx_future", "future");
    relationNames.add("rx_singular", "singular");
    relationNames.add("rx_plural", "plural");
    relationNames.add("rx_punctuation", "punctuation");
    relationNames.add("rx_det", "det");
    relationNames.add("rx_prep", "prep");
    relationNames.add("rx_progressive", "progressive");
    relationNames.add("rx_present_progressive", "present_progressive");
    relationNames.add("rx_infinitive", "infinitive");
    relationNames.add("rx_particle", "particle");
    relationNames.add("rx_uncountable", "uncountable");
    relationNames.add("rx_countable", "countable");
  }
 public static String relexToIdFriendly(String relexName) {
   String x = relationNames.getX(relexName);
   return x != null ? x : relexName;
 }