Till Westmann has uploaded a new change for review.
https://asterix-gerrit.ics.uci.edu/1400
Change subject: WIP - load from classpath
......................................................................
WIP - load from classpath
- instantiate DelimitedDataParserFactory from config file found
on classpath
Change-Id: I36a3fca2df9134423fe7590be260cfc3856c7f01
---
M asterixdb/asterix-external-data/pom.xml
M
asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/provider/ParserFactoryProvider.java
A
asterixdb/asterix-external-data/src/main/resources/META-INF/services/org.apache.asterix.external.api.IDataParserFactory
3 files changed, 64 insertions(+), 7 deletions(-)
git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb
refs/changes/00/1400/1
diff --git a/asterixdb/asterix-external-data/pom.xml
b/asterixdb/asterix-external-data/pom.xml
index 72c7997..3796a0d 100644
--- a/asterixdb/asterix-external-data/pom.xml
+++ b/asterixdb/asterix-external-data/pom.xml
@@ -106,6 +106,7 @@
<include>**/NOTICE</include>
<include>**/LICENSE</include>
<include>**/DEPENDENCIES</include>
+ <include>**/services/**</include>
</includes>
</configuration>
<executions>
diff --git
a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/provider/ParserFactoryProvider.java
b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/provider/ParserFactoryProvider.java
index ebe3276..c7b56ca 100644
---
a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/provider/ParserFactoryProvider.java
+++
b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/provider/ParserFactoryProvider.java
@@ -18,21 +18,34 @@
*/
package org.apache.asterix.external.provider;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.nio.charset.Charset;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
import java.util.Map;
import org.apache.asterix.common.exceptions.AsterixException;
import org.apache.asterix.common.library.ILibraryManager;
import org.apache.asterix.external.api.IDataParserFactory;
import org.apache.asterix.external.parser.factory.ADMDataParserFactory;
-import org.apache.asterix.external.parser.factory.DelimitedDataParserFactory;
import org.apache.asterix.external.parser.factory.HiveDataParserFactory;
import org.apache.asterix.external.parser.factory.RSSParserFactory;
import
org.apache.asterix.external.parser.factory.RecordWithMetadataParserFactory;
import org.apache.asterix.external.parser.factory.TweetParserFactory;
import org.apache.asterix.external.util.ExternalDataConstants;
import org.apache.asterix.external.util.ExternalDataUtils;
+import org.apache.commons.io.IOUtils;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
public class ParserFactoryProvider {
+
+ private static final String RESOURCE =
"META-INF/services/org.apache.asterix.external.api.IDataParserFactory";
+ private static Map<String, Class> FACTORIES = null;
private ParserFactoryProvider() {
}
@@ -56,14 +69,17 @@
@SuppressWarnings("rawtypes")
public static IDataParserFactory getDataParserFactory(String parser)
throws AsterixException {
+ if (FACTORIES == null) {
+ FACTORIES = initFactories();
+ }
+ if (FACTORIES.containsKey(parser)) {
+ return getInstance(FACTORIES.get(parser));
+ }
switch (parser) {
case ExternalDataConstants.FORMAT_ADM:
case ExternalDataConstants.FORMAT_JSON:
case ExternalDataConstants.FORMAT_SEMISTRUCTURED:
return new ADMDataParserFactory();
- case ExternalDataConstants.FORMAT_DELIMITED_TEXT:
- case ExternalDataConstants.FORMAT_CSV:
- return new DelimitedDataParserFactory();
case ExternalDataConstants.FORMAT_HIVE:
case ExternalDataConstants.PARSER_HIVE:
return new HiveDataParserFactory();
@@ -75,11 +91,47 @@
return new RecordWithMetadataParserFactory();
default:
try {
- return (IDataParserFactory)
Class.forName(parser).newInstance();
- } catch (IllegalAccessException | ClassNotFoundException |
InstantiationException
- | ClassCastException e) {
+ return getInstance(Class.forName(parser));
+ } catch (ClassNotFoundException e) {
throw new AsterixException("Unknown format: " + parser, e);
}
}
}
+
+ protected static IDataParserFactory getInstance(Class clazz) throws
AsterixException {
+ try {
+ return (IDataParserFactory) clazz.newInstance();
+ } catch (IllegalAccessException | InstantiationException |
ClassCastException e) {
+ throw new AsterixException("Cannot create: " +
clazz.getSimpleName(), e);
+ }
+ }
+
+ protected static Map<String, Class> initFactories() throws
AsterixException {
+ Map<String, Class> factories = new HashMap<>();
+ ClassLoader cl = ParserFactoryProvider.class.getClassLoader();
+ final Charset encoding = Charset.forName("UTF-8");
+ try {
+ Enumeration<URL> urls = cl.getResources(RESOURCE);
+ for (URL url : Collections.list(urls)) {
+ InputStream is = url.openStream();
+ String config = IOUtils.toString(is, encoding);
+ is.close();
+ JSONObject confObj = new JSONObject(config);
+ String className = confObj.getString("class");
+ final Class<?> clazz = Class.forName(className);
+ JSONArray formatArray = confObj.getJSONArray("formats");
+ for (int i = 0; i < formatArray.length(); ++i) {
+ String format = formatArray.getString(i);
+ if (factories.containsKey(format)) {
+ throw new AsterixException("Duplicate format " +
format);
+ }
+ // System.err.println("registering " + factory + " for
format \"" + format + "\"");
+ factories.put(format, clazz);
+ }
+ }
+ } catch (IOException | JSONException | ClassNotFoundException e) {
+ throw new AsterixException(e);
+ }
+ return factories;
+ }
}
diff --git
a/asterixdb/asterix-external-data/src/main/resources/META-INF/services/org.apache.asterix.external.api.IDataParserFactory
b/asterixdb/asterix-external-data/src/main/resources/META-INF/services/org.apache.asterix.external.api.IDataParserFactory
new file mode 100644
index 0000000..380025a
--- /dev/null
+++
b/asterixdb/asterix-external-data/src/main/resources/META-INF/services/org.apache.asterix.external.api.IDataParserFactory
@@ -0,0 +1,4 @@
+{
+ "formats": [ "delimited-text", "csv" ],
+ "class":
"org.apache.asterix.external.parser.factory.DelimitedDataParserFactory"
+}
--
To view, visit https://asterix-gerrit.ics.uci.edu/1400
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I36a3fca2df9134423fe7590be260cfc3856c7f01
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: Till Westmann <[email protected]>