@Override
  protected BooleanClause doGetFacetClause() {
    SearchContext searchContext = getSearchContext();

    FacetConfiguration facetConfiguration = getFacetConfiguration();

    JSONObject dataJSONObject = facetConfiguration.getData();

    String[] values = null;

    if (isStatic() && dataJSONObject.has("values")) {
      JSONArray valuesJSONArray = dataJSONObject.getJSONArray("values");

      values = new String[valuesJSONArray.length()];

      for (int i = 0; i < valuesJSONArray.length(); i++) {
        values[i] = valuesJSONArray.getString(i);
      }
    }

    String[] valuesParam =
        StringUtil.split(GetterUtil.getString(searchContext.getAttribute(getFieldName())));

    if (!isStatic() && (valuesParam != null) && (valuesParam.length > 0)) {
      values = valuesParam;
    }

    if ((values == null) || (values.length == 0)) {
      return null;
    }

    BooleanQuery facetQuery = BooleanQueryFactoryUtil.create(searchContext);

    for (String value : values) {
      FacetValueValidator facetValueValidator = getFacetValueValidator();

      if ((searchContext.getUserId() > 0) && !facetValueValidator.check(searchContext, value)) {

        continue;
      }

      TermQuery termQuery = TermQueryFactoryUtil.create(searchContext, getFieldName(), value);

      try {
        facetQuery.add(termQuery, BooleanClauseOccur.SHOULD);
      } catch (ParseException pe) {
        _log.error(pe, pe);
      }
    }

    if (!facetQuery.hasClauses()) {
      return null;
    }

    return BooleanClauseFactoryUtil.create(
        searchContext, facetQuery, BooleanClauseOccur.MUST.getName());
  }
  protected void addLayoutColumn(Layout layout, String columnId, JSONArray columnJSONArray)
      throws Exception {

    if (columnJSONArray == null) {
      return;
    }

    for (int i = 0; i < columnJSONArray.length(); i++) {
      JSONObject portletJSONObject = columnJSONArray.getJSONObject(i);

      if (portletJSONObject == null) {
        String articleId = getJournalArticleId(columnJSONArray.getString(i));

        portletJSONObject = getDefaultPortletJSONObject(articleId);
      }

      addLayoutColumnPortlet(layout, columnId, portletJSONObject);
    }
  }
  protected String getDDMFormFieldValueString(DDMFormFieldValue ddmFormFieldValue) {

    Value value = ddmFormFieldValue.getValue();

    String valueString = value.getString(_locale);

    String type = getDDMFormFieldType(ddmFormFieldValue.getName());

    if (type.equals(DDMFormFieldType.SELECT)) {
      try {
        JSONArray jsonArray = _jsonFactory.createJSONArray(valueString);

        if (jsonArray.length() == 1) {
          valueString = jsonArray.getString(0);
        }
      } catch (JSONException je) {
        ReflectionUtil.throwException(je);
      }
    }

    return valueString;
  }
  protected Map<String, String> getTemplateParams(JSONArray templateParamsJSONArray) {

    if (templateParamsJSONArray == null) {
      return null;
    }

    Map<String, String> templateParams = new HashMap<String, String>();

    for (int i = 0; i < templateParamsJSONArray.length(); i++) {
      JSONObject templateParamJSONObject = templateParamsJSONArray.getJSONObject(i);

      JSONArray namesJSONArray = templateParamJSONObject.names();

      for (int j = 0; j < namesJSONArray.length(); j++) {
        String name = namesJSONArray.getString(j);

        String value = templateParamJSONObject.getString(name);

        templateParams.put(name, value);
      }
    }

    return templateParams;
  }