blob: d04d852e5d5d6ec44f949c54951cdc43fdebad64 [file] [log] [blame]
package org.eclipse.ecf.internal.bulletinboard.commons;
import java.net.URL;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.ecf.bulletinboard.BBException;
import org.eclipse.ecf.bulletinboard.IBBObject;
import org.eclipse.ecf.bulletinboard.IMember;
import org.eclipse.ecf.bulletinboard.IMemberGroup;
import org.eclipse.ecf.bulletinboard.IThread;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.identity.IDCreateException;
import org.eclipse.ecf.core.identity.Namespace;
import org.eclipse.ecf.internal.bulletinboard.commons.parsing.GenericParser;
import org.eclipse.ecf.internal.bulletinboard.commons.parsing.IPatternDescriptor;
import org.eclipse.ecf.internal.bulletinboard.commons.util.StringUtil;
public abstract class AbstractParser {
protected Namespace namespace;
protected URL baseURL;
protected GenericParser genericParser;
protected AbstractParser(Namespace namespace, URL baseURL) {
this.namespace = namespace;
this.baseURL = baseURL;
this.genericParser = new GenericParser(namespace, baseURL);
}
public abstract void throwException(String msg, CharSequence seq)
throws BBException;
public abstract Long parseTimestamp(CharSequence seq);
public abstract IPatternDescriptor getThreadPattern();
public abstract IBBObjectFactory getThreadFactory();
public abstract IPatternDescriptor getAuthorInfoMemberPattern();
public Map<ID, IThread> parseThreads(final CharSequence seq) {
IPatternDescriptor pattern = getThreadPattern();
IBBObjectFactory factory = getThreadFactory();
Matcher m = pattern.getPattern().matcher(seq);
Map<ID, IThread> threads = new LinkedHashMap<ID, IThread>();
while (m.find()) {
Map<String, Object> values = pattern.getValueMap(m);
ID id = null;
try {
id = factory.createBBObjectId(namespace, baseURL,
(String) values.get(IPatternDescriptor.ID_PARAM));
} catch (IDCreateException e) {
// TODO autogen e
e.printStackTrace();
}
String name = StringUtil.stripHTMLTrim((String) values
.get(IPatternDescriptor.NAME_PARAM));
String authorInfo = (String) values.get("authorInfo");
IBBObject member = genericParser.parseSingleIdName(
getAuthorInfoMemberPattern(), authorInfo,
getMemberFactory());
if (member != null) {
values.put("author", member);
} else {
IBBObjectFactory gf = getGuestFactory();
String guestName = StringUtil.stripHTMLTrim(authorInfo);
ID guestID = null;
try {
guestID = gf
.createBBObjectId(namespace, baseURL, guestName);
} catch (IDCreateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
values.put("author", getGuestFactory().createBBObject(guestID,
guestName, null));
}
IThread obj = (IThread) factory.createBBObject(id,
new String(name), values);
threads.put(id, obj);
}
return threads;
}
public abstract Pattern getMemberNamePattern();
public abstract IBBObjectFactory getMemberFactory();
public abstract IBBObjectFactory getGuestFactory();
public IMember parseMemberPageForName(final CharSequence seq, ID memberID) {
Matcher m = getMemberNamePattern().matcher(seq);
if (m.find()) {
return (IMember) getMemberFactory().createBBObject(memberID,
new String(m.group(1)), null);
}
return null;
}
public abstract IPatternDescriptor getMemberPattern();
public Map<ID, IMember> parseMembers(final CharSequence seq) {
// TODO is stripHTMLTrim needed? GenericParser doesn't do it
Map<ID, IBBObject> objects = genericParser.parseMultiIdName(
getMemberPattern(), seq, getMemberFactory(), true);
Map<ID, IMember> members = new LinkedHashMap<ID, IMember>(objects
.size());
for (IBBObject obj : objects.values()) {
members.put(obj.getID(), (IMember) obj);
}
return members;
}
public abstract IBBObjectFactory getMemberGroupFactory();
public abstract Pattern getMemberGroupContainerPattern();
public abstract IPatternDescriptor getMemberGroupPattern();
public Map<ID, IMemberGroup> parseMemberGroups(final CharSequence seq)
throws BBException {
Matcher m = getMemberGroupContainerPattern().matcher(seq);
if (m.find()) {
// TODO is stripHTMLTrim needed? GenericParser doesn't do it
Map<ID, IBBObject> objects = genericParser.parseMultiIdName(
getMemberGroupPattern(), m.group(0),
getMemberGroupFactory(), true);
Map<ID, IMemberGroup> members = new LinkedHashMap<ID, IMemberGroup>(
objects.size());
for (IBBObject obj : objects.values()) {
members.put(obj.getID(), (IMemberGroup) obj);
}
return members;
} else {
throwException("Could not find member groups.", seq);
}
return Collections.emptyMap();
}
}