+/*
+ * © 2009 David ‘Bombe’ Roden
+ */
+package net.pterodactylus.arachne.parser;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import de.ina.util.data.InternetMediaType;
+import de.ina.util.validation.Validation;
+
+/**
+ * Factory that can create {@link Parser} objects depending on a given content
+ * type.
+ *
+ * @author David ‘Bombe’ Roden <bombe@pterodactylus.net>
+ */
+public class ParserFactory {
+
+ /** The logger. */
+ private static final Logger logger = Logger.getLogger(ParserFactory.class.getName());
+
+ /** Mapping from MIME type to parser classes. */
+ private final Map<InternetMediaType, Class<? extends Parser>> parsers = new HashMap<InternetMediaType, Class<? extends Parser>>();
+
+ /**
+ * Creates a new parser factory using default parsers for common MIME types.
+ */
+ public ParserFactory() {
+ parsers.put(new InternetMediaType("text", "html"), HtmlEditorKitParser.class);
+ }
+
+ /**
+ * Returns a {@link Parser} for the given content type.
+ *
+ * @param contentType
+ * The content type
+ * @return A parser for the content type, or <code>null</code> if no parser
+ * for the given content type could be found
+ */
+ public Parser getParser(String contentType) {
+ Validation.begin().isNotNull("contentType", (Object) contentType).check();
+ InternetMediaType internetMediaType = InternetMediaType.fromString(contentType);
+ Class<? extends Parser> parserClass = parsers.get(internetMediaType);
+ if (parserClass == null) {
+ return null;
+ }
+ try {
+ Parser parser = parserClass.newInstance();
+ return parser;
+ } catch (InstantiationException ie1) {
+ logger.log(Level.WARNING, "Could not instantiate parser “" + parserClass.getName() + "!", ie1);
+ } catch (IllegalAccessException iae1) {
+ logger.log(Level.WARNING, "Could not instantiate parser “" + parserClass.getName() + "!", iae1);
+ }
+ return null;
+ }
+
+}