public static int validateFriendlyURL(String friendlyURL) {
    if (friendlyURL.length() < 2) {
      return LayoutFriendlyURLException.TOO_SHORT;
    }

    if (!friendlyURL.startsWith(StringPool.SLASH)) {
      return LayoutFriendlyURLException.DOES_NOT_START_WITH_SLASH;
    }

    if (friendlyURL.endsWith(StringPool.SLASH)) {
      return LayoutFriendlyURLException.ENDS_WITH_SLASH;
    }

    if (friendlyURL.indexOf(StringPool.DOUBLE_SLASH) != -1) {
      return LayoutFriendlyURLException.ADJACENT_SLASHES;
    }

    for (char c : friendlyURL.toCharArray()) {
      if ((!Validator.isChar(c))
          && (!Validator.isDigit(c))
          && (c != CharPool.DASH)
          && (c != CharPool.PERCENT)
          && (c != CharPool.PERIOD)
          && (c != CharPool.PLUS)
          && (c != CharPool.SLASH)
          && (c != CharPool.STAR)
          && (c != CharPool.UNDERLINE)) {

        return LayoutFriendlyURLException.INVALID_CHARACTERS;
      }
    }

    return -1;
  }
  protected void validate(List<Element> children, Set<String> elNames) throws PortalException {

    for (Element el : children) {
      if (el.getName().equals("meta-data")) {
        continue;
      }

      String elName = el.attributeValue("name", StringPool.BLANK);
      String elType = el.attributeValue("type", StringPool.BLANK);

      if (Validator.isNull(elName) || elName.startsWith(JournalStructureConstants.RESERVED)) {

        throw new StructureXsdException();
      } else {
        char[] c = elName.toCharArray();

        for (int i = 0; i < c.length; i++) {
          if ((!Validator.isChar(c[i]))
              && (!Validator.isDigit(c[i]))
              && (c[i] != CharPool.DASH)
              && (c[i] != CharPool.UNDERLINE)) {

            throw new StructureXsdException();
          }
        }

        String completePath = elName;

        Element parent = el.getParent();

        while (!parent.isRootElement()) {
          completePath =
              parent.attributeValue("name", StringPool.BLANK) + StringPool.SLASH + completePath;

          parent = parent.getParent();
        }

        String elNameLowerCase = completePath.toLowerCase();

        if (elNames.contains(elNameLowerCase)) {
          throw new StructureXsdException();
        } else {
          elNames.add(elNameLowerCase);
        }
      }

      if (Validator.isNull(elType)) {
        throw new StructureXsdException();
      }

      validate(el.elements(), elNames);
    }
  }
  @Override
  public String getAUICompatibleId(String text) {
    if (Validator.isNull(text)) {
      return text;
    }

    StringBundler sb = null;

    int lastReplacementIndex = 0;

    for (int i = 0; i < text.length(); i++) {
      char c = text.charAt(i);

      if (((c <= 127) && (Validator.isChar(c) || Validator.isDigit(c)))
          || ((c > 127)
              && (c != CharPool.FIGURE_SPACE)
              && (c != CharPool.NARROW_NO_BREAK_SPACE)
              && (c != CharPool.NO_BREAK_SPACE))) {

        continue;
      }

      if (sb == null) {
        sb = new StringBundler();
      }

      if (i > lastReplacementIndex) {
        sb.append(text.substring(lastReplacementIndex, i));
      }

      sb.append(StringPool.UNDERLINE);

      if (c != CharPool.UNDERLINE) {
        sb.append(StringUtil.toHexString(c));
      }

      sb.append(StringPool.UNDERLINE);

      lastReplacementIndex = i + 1;
    }

    if (sb == null) {
      return text;
    }

    if (lastReplacementIndex < text.length()) {
      sb.append(text.substring(lastReplacementIndex));
    }

    return sb.toString();
  }
  public static int validateFriendlyURL(String friendlyURL, boolean checkMaxLength) {

    if (friendlyURL.length() < 2) {
      return LayoutFriendlyURLException.TOO_SHORT;
    }

    if (checkMaxLength && (friendlyURL.length() > LayoutConstants.FRIENDLY_URL_MAX_LENGTH)) {

      return LayoutFriendlyURLException.TOO_LONG;
    }

    if (!friendlyURL.startsWith(StringPool.SLASH)) {
      return LayoutFriendlyURLException.DOES_NOT_START_WITH_SLASH;
    }

    if (friendlyURL.endsWith(StringPool.SLASH)) {
      return LayoutFriendlyURLException.ENDS_WITH_SLASH;
    }

    if (friendlyURL.contains(StringPool.DOUBLE_SLASH)) {
      return LayoutFriendlyURLException.ADJACENT_SLASHES;
    }

    for (char c : friendlyURL.toCharArray()) {
      if (!Validator.isChar(c)
          && !Validator.isDigit(c)
          && (c != CharPool.DASH)
          && (c != CharPool.PERCENT)
          && (c != CharPool.PERIOD)
          && (c != CharPool.PLUS)
          && (c != CharPool.SLASH)
          && (c != CharPool.STAR)
          && (c != CharPool.UNDERLINE)) {

        return LayoutFriendlyURLException.INVALID_CHARACTERS;
      }
    }

    return -1;
  }
  protected String fixSessionKey(String fileName, String content, Pattern pattern) {

    Matcher matcher = pattern.matcher(content);

    if (!matcher.find()) {
      return content;
    }

    String newContent = content;

    do {
      String match = matcher.group();

      String s = null;

      if (pattern.equals(sessionKeyPattern)) {
        s = StringPool.COMMA;
      } else if (pattern.equals(taglibSessionKeyPattern)) {
        s = "key=";
      }

      int x = match.indexOf(s);

      if (x == -1) {
        continue;
      }

      x = x + s.length();

      String substring = match.substring(x).trim();

      String quote = StringPool.BLANK;

      if (substring.startsWith(StringPool.APOSTROPHE)) {
        quote = StringPool.APOSTROPHE;
      } else if (substring.startsWith(StringPool.QUOTE)) {
        quote = StringPool.QUOTE;
      } else {
        continue;
      }

      int y = match.indexOf(quote, x);
      int z = match.indexOf(quote, y + 1);

      if ((y == -1) || (z == -1)) {
        continue;
      }

      String prefix = match.substring(0, y + 1);
      String suffix = match.substring(z);
      String oldKey = match.substring(y + 1, z);

      boolean alphaNumericKey = true;

      for (char c : oldKey.toCharArray()) {
        if (!Validator.isChar(c)
            && !Validator.isDigit(c)
            && (c != CharPool.DASH)
            && (c != CharPool.UNDERLINE)) {

          alphaNumericKey = false;
        }
      }

      if (!alphaNumericKey) {
        continue;
      }

      String newKey = TextFormatter.format(oldKey, TextFormatter.O);

      newKey = TextFormatter.format(newKey, TextFormatter.M);

      if (newKey.equals(oldKey)) {
        continue;
      }

      String oldSub = prefix.concat(oldKey).concat(suffix);
      String newSub = prefix.concat(newKey).concat(suffix);

      newContent = StringUtil.replaceFirst(newContent, oldSub, newSub);
    } while (matcher.find());

    return newContent;
  }