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]>

Reply via email to