# Class SSIProcessor

java.lang.Object
org.apache.catalina.ssi.SSIProcessor

public class SSIProcessor extends Object
The entry point to SSI processing. This class does the actual parsing, delegating to the SSIMediator, SSICommand, and SSIExternalResolver as necessary.

## Field Summary

Fields
Modifier and Type
Field
Description
`protected final boolean`
`allowExec`
Whether exec commands are allowed.
`protected static final String`
`COMMAND_END`
The end pattern
`protected static final String`
`COMMAND_START`
The start pattern
`protected final HashMap<String, SSICommand>`
`commands`
Map of registered SSI command names to their handlers.
`protected final int`
`debug`
Debug level for SSI processing.
`protected final SSIExternalResolver`
`ssiExternalResolver`
External resolver for file and variable access.

## Constructor Summary

Constructors
Constructor
Description
`SSIProcessor(SSIExternalResolver ssiExternalResolver, int debug, boolean allowExec)`
Creates a new SSI processor with the given configuration.

## Method Summary

Modifier and Type
Method
Description
`protected void`
`addBuiltinCommands()`
Registers all built-in SSI commands.
`void`
`addCommand(String name, SSICommand command)`
Registers a custom SSI command handler.
`protected boolean`
`charCmp(String buf, int index, String command)`
Compares a substring of the buffer with the given command string.
`protected boolean`
`isQuote(char c)`
Checks if the given character is a quote character.
`protected boolean`
`isSpace(char c)`
Checks if the given character is a whitespace character.
`protected String[]`
`parseParamNames(StringBuilder cmd, int start)`
Parse a StringBuilder and take out the param type token.
`protected String[]`
`parseParamValues(StringBuilder cmd, int start, int count)`
Parse a StringBuilder and take out the param token.
`long`
`process(Reader reader, long lastModifiedDate, PrintWriter writer)`
Process a file with server-side commands, reading from reader and writing the processed version to writer.

### Methods inherited from class Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

## Field Details

### COMMAND_START

protected static final String COMMAND_START
The start pattern

See Also:
  - Constant Field Values

### COMMAND_END

protected static final String COMMAND_END
The end pattern

See Also:
  - Constant Field Values

### ssiExternalResolver

protected final SSIExternalResolver ssiExternalResolver
External resolver for file and variable access.

### commands

protected final HashMap<String, SSICommand> commands
Map of registered SSI command names to their handlers.

### debug

protected final int debug
Debug level for SSI processing.

### allowExec

protected final boolean allowExec
Whether exec commands are allowed.

## Constructor Details

### SSIProcessor

public SSIProcessor(SSIExternalResolver ssiExternalResolver, int debug, boolean allowExec)
Creates a new SSI processor with the given configuration.

Parameters:
  `ssiExternalResolver` - the external resolver for file/variable access
  `debug` - the debug level
  `allowExec` - whether exec commands are allowed

## Method Details

### addBuiltinCommands

protected void addBuiltinCommands()
Registers all built-in SSI commands.

### addCommand

public void addCommand(String name, SSICommand command)
Registers a custom SSI command handler.

Parameters:
  `name` - the command name
  `command` - the command handler

### process

public long process(Reader reader, long lastModifiedDate, PrintWriter writer) throws IOException
Process a file with server-side commands, reading from reader and writing the processed version to writer. NOTE: We really should be doing this in a streaming way rather than converting it to an array first.

Parameters:
  `reader` - the reader to read the file containing SSIs from
  `lastModifiedDate` - resource last modification date
  `writer` - the writer to write the file with the SSIs processed.
Returns:
  the most current modified date resulting from any SSI commands
Throws:
  `IOException` - when things go horribly awry. Should be unlikely since the SSICommand usually catches 'normal' IOExceptions.

### parseParamNames

protected String[] parseParamNames(StringBuilder cmd, int start)
Parse a StringBuilder and take out the param type token. Called from `requestHandler`

Parameters:
  `cmd` - a value of type 'StringBuilder'
  `start` - index on which parsing will start
Returns:
  an array with the parameter names

### parseParamValues

protected String[] parseParamValues(StringBuilder cmd, int start, int count)
Parse a StringBuilder and take out the param token. Called from `requestHandler`

Parameters:
  `cmd` - a value of type 'StringBuilder'
  `start` - index on which parsing will start
  `count` - number of values which should be parsed
Returns:
  an array with the parameter values

### charCmp

protected boolean charCmp(String buf, int index, String command)
Compares a substring of the buffer with the given command string.

Parameters:
  `buf` - the buffer to search
  `index` - the starting index
  `command` - the command string to match
Returns:
  true if the substring matches the command

### isSpace

protected boolean isSpace(char c)
Checks if the given character is a whitespace character.

Parameters:
  `c` - the character to check
Returns:
  true if the character is a space, tab, newline, or carriage return

### isQuote

protected boolean isQuote(char c)
Checks if the given character is a quote character.

Parameters:
  `c` - the character to check
Returns:
  true if the character is a single, double, or backtick quote