/**
  * Loads a similarity metric if it isn't already loaded.
  *
  * @param name
  * @return
  * @throws ConfigurationException
  * @throws IOException
  */
 public SimilarityMetric loadMetric(String name) throws ConfigurationException, IOException {
   if (env.hasMetric(name)) {
     return env.getMetric(name);
   }
   info("loading metric " + name);
   String type = requireString(configuration.getMetric(name), "type");
   SimilarityMetric metric;
   if (type.equals("category")) {
     metric = createCategorySimilarity(name);
   } else if (type.equals("text")) {
     metric = createTextSimilarity(name);
   } else if (type.equals("esa")) {
     metric = createEsaSimilarity(name);
   } else if (type.equals("links")) {
     metric = createLinkSimilarity(name);
   } else if (type.equals("pairwise")) {
     metric = createPairwiseSimilarity(name);
   } else if (type.equals("ensemble")) {
     metric = loadEnsembleMetric(name);
   } else {
     throw new ConfigurationException("Unknown metric type: " + type);
   }
   metric.setName(name);
   JSONObject params = configuration.getMetric(name);
   if (params.containsKey("normalizer")) {
     Normalizer norm = parseNormalizer(requireString(params, "normalizer"));
     if (!norm.equals(null)) {
       metric.setNormalizer(norm);
     }
   }
   env.addMetric(name, metric);
   return metric;
 }