package org.kefirsf.bb;
import org.kefirsf.bb.conf.*;
import org.kefirsf.bb.proc.*;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
class PatternElementFactory {
private static final ProcBol PROC_BOL = new ProcBol();
private static final PatternJunk JUNK = new PatternJunk();
private static final ProcEol EOL = new ProcEol(false);
private static final ProcEol EOL_GHOST = new ProcEol(true);
private static final ProcBlankLine BLANK_LINE = new ProcBlankLine(false);
private static final ProcBlankLine BLANK_LINE_GHOST = new ProcBlankLine(true);
private final ProcessorBuilder processorBuilder;
private Map<Constant, PatternConstant> constants;
PatternElementFactory(ProcessorBuilder processorBuilder) {
this.processorBuilder = processorBuilder;
}
ProcPatternElement create(PatternElement element) {
if (element instanceof Variable) {
return create((Variable) element);
} else if (element instanceof Text) {
return create((Text) element);
} else if (element instanceof Constant) {
return create((Constant) element);
} else if (element instanceof Junk) {
return JUNK;
} else if (element instanceof Eol) {
return ((Eol) element).isGhost() ? EOL_GHOST : EOL;
} else if (element instanceof Bol) {
return PROC_BOL;
} else if (element instanceof BlankLine) {
return ((BlankLine) element).isGhost() ? BLANK_LINE_GHOST : BLANK_LINE;
} else if (element instanceof Url) {
Url url = (Url) element;
return new ProcUrl(url.getName(), url.isGhost(), url.isLocal(), url.isSchemaless());
} else if (element instanceof Email){
Email email = (Email) element;
return new ProcEmail(email.getName(), email.isGhost());
} else {
throw new TextProcessorFactoryException("Unknown pattern element " + element.getClass().getName() + ".");
}
}
private ProcPatternElement create(Variable variable) {
if (variable.getAction() != Action.check) {
return new ProcVariable(
variable.getName(),
variable.getRegex(),
variable.isGhost(),
variable.getAction());
} else {
return new Check(
variable.getName(),
variable.isGhost()
);
}
}
/**
* Create a constant element for text parsing
*
* @param constant constant definition
* @return pattern element for constant
*/
private PatternConstant create(Constant constant) {
if (!constants.containsKey(constant)) {
constants.put(
constant,
new PatternConstant(constant.getValue(), constant.isIgnoreCase(), constant.isGhost())
);
}
return constants.get(constant);
}
/**
* @param text element definition
* @return pattern element for text
*/
private ProcPatternElement create(Text text) {
Scope scope = text.getScope();
if (scope != null) {
return new ProcText(
text.getName(),
processorBuilder.createScope(scope),
text.isTransparent()
);
} else {
return new ProcText(text.getName(), text.isTransparent());
}
}
HashSet<PatternConstant> getConstants() {
return new HashSet<PatternConstant>(constants.values());
}
void cleanConstants() {
this.constants = new HashMap<Constant, PatternConstant>();
}
}