private String filter()

in guacamole-ext/src/main/java/org/apache/guacamole/token/TokenFilter.java [195:297]


    private String filter(String input, boolean strict)
            throws GuacamoleTokenUndefinedException {

        StringBuilder output = new StringBuilder();
        Matcher tokenMatcher = tokenPattern.matcher(input);

        // Track last regex match
        int endOfLastMatch = 0;

        // For each possible token
        while (tokenMatcher.find()) {

            // Pull possible leading text and first char before possible token
            String literal = tokenMatcher.group(LEADING_TEXT_GROUP);
            String escape = tokenMatcher.group(ESCAPE_CHAR_GROUP);
            String modifier = tokenMatcher.group(TOKEN_MODIFIER);

            // Append leading non-token text
            output.append(literal);

            // If char before token is '$', the token itself is escaped
            if ("$".equals(escape)) {
                String notToken = tokenMatcher.group(TOKEN_GROUP);
                output.append(notToken);
            }

            // If char is not '$', interpret as a token
            else {

                // The char before the token, if any, is a literal
                output.append(escape);

                // Pull token value
                String tokenName = tokenMatcher.group(TOKEN_NAME_GROUP);
                String tokenValue = getToken(tokenName);

                // If token is unknown, interpretation depends on whether
                // strict mode is enabled
                if (tokenValue == null) {

                    // Token marked as optional, so just skip it and update
                    // last match.
                    if (modifier != null && modifier.equals("OPTIONAL")) {
                        LOGGER.debug("The token \"{}\" has no value and has been "
                                   + "marked as optional, so it will be treated "
                                   + "as a blank value instead of a literal.",
                                     tokenName);
                        endOfLastMatch = tokenMatcher.end();
                        continue;
                    }

                    // Fail outright if strict mode is enabled
                    if (strict)
                        throw new GuacamoleTokenUndefinedException("Token "
                                + "has no defined value.", tokenName);

                    // If strict mode is NOT enabled, simply interpret as
                    // a literal
                    output.append(tokenMatcher.group(TOKEN_GROUP));

                }

                // Otherwise, check for modifiers and substitute value appropriately
                else {
                    
                    // If a modifier is present, try to use it.
                    if (modifier != null && !modifier.isEmpty()) {
                        switch (modifier) {
                            // Switch token to upper-case
                            case "UPPER":
                                output.append(tokenValue.toUpperCase());
                                break;
                                
                            // Switch token to lower case
                            case "LOWER":
                                output.append(tokenValue.toLowerCase());
                                break;
                                
                            // Just append the token value
                            default:
                                output.append(tokenValue);
                        }
                    }
                    
                    // No modifier present, so just append token value.
                    else
                        output.append(tokenValue);
                    
                }

            }

            // Update last regex match
            endOfLastMatch = tokenMatcher.end();

        }

        // Append any remaining non-token text
        output.append(input.substring(endOfLastMatch));

        return output.toString();

    }