/*
* FuzzFactory.java
*
* Created on 17 June 2005, 03:29
*/
package org.owasp.webscarab.plugin.fuzz;
import java.io.IOException;
import java.io.File;
import java.io.Reader;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;
import java.util.LinkedList;
import java.util.Map;
import java.util.TreeMap;
import java.beans.PropertyChangeSupport;
import java.beans.PropertyChangeListener;
import java.util.regex.PatternSyntaxException;
/**
*
* @author rogan
*/
public class FuzzFactory {
public static final String SOURCES = "Sources";
private Map<String, FuzzSource> _sources = new TreeMap<String, FuzzSource>();
private PropertyChangeSupport _changeSupport = new PropertyChangeSupport(this);
/** Creates a new instance of FuzzFactory */
public FuzzFactory() {
}
public String[] getSourceDescriptions() {
return _sources.keySet().toArray(new String[_sources.size()]);
}
public void addSource(FuzzSource source) {
_sources.put(source.getDescription(), source);
_changeSupport.firePropertyChange(SOURCES, null, null);
}
public void loadFuzzStrings(String description, InputStream inputStream) throws IOException {
addSource(new FileSource(description, new InputStreamReader(inputStream)));
}
public void loadFuzzStrings(String description, File file) throws IOException {
addSource(new FileSource(description, new FileReader(file)));
}
public boolean removeSource(String name) {
boolean success = (_sources.remove(name) != null);
_changeSupport.firePropertyChange(SOURCES, null, null);
return success;
}
public void addRegexSource(String description, String regex) throws PatternSyntaxException {
addSource(new RegexSource(description, regex));
}
public FuzzSource getSource(String name) {
FuzzSource source = _sources.get(name);
if (source == null) {
return null;
} else {
return source.newInstance();
}
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
_changeSupport.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
_changeSupport.removePropertyChangeListener(listener);
}
private class FileSource implements FuzzSource {
private String _description;
private String[] _items;
private int _index = 0;
public FileSource(String description, Reader reader) throws IOException {
_description = description;
BufferedReader br = new BufferedReader(reader);
String line;
List<String> items = new LinkedList<String>();
while ((line = br.readLine()) != null) {
items.add(line);
}
br.close();
_items = (String[]) items.toArray(new String[items.size()]);
}
public String getDescription() {
return _description;
}
public void increment() {
_index++;
}
public boolean hasNext() {
return _index < _items.length-1;
}
public void reset() {
_index = 0;
}
public int size() {
return _items.length;
}
protected String[] getItems() {
return _items;
}
public Object current() {
return _items[_index];
}
public FuzzSource newInstance() {
return new ArraySource(_description, _items);
}
}
private class ArraySource implements FuzzSource {
private String _description;
private String[] _items;
private int _index = 0;
public ArraySource(String description, String[] items) {
_description = description;
_items = items;
}
public String getDescription() {
return _description;
}
public int size() {
return _items.length;
}
public void reset() {
_index = 0;
}
public void increment() {
_index++;
}
public boolean hasNext() {
return _index < _items.length-1;
}
public Object current() {
return _items[_index];
}
public FuzzSource newInstance() {
return new ArraySource(_description, _items);
}
}
}