GH-2358 Initial code changes and tests
diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AskBuilder.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AskBuilder.java
index 4fce378..ae1e9aa 100644
--- a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AskBuilder.java
+++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/AskBuilder.java
@@ -84,25 +84,13 @@
     }
 
     @Override
-    public AskBuilder fromNamed(String graphName) {
+    public AskBuilder fromNamed(Object graphName) {
         getDatasetHandler().fromNamed(graphName);
         return this;
     }
 
     @Override
-    public AskBuilder fromNamed(Collection<String> graphNames) {
-        getDatasetHandler().fromNamed(graphNames);
-        return this;
-    }
-
-    @Override
-    public AskBuilder from(String graphName) {
-        getDatasetHandler().from(graphName);
-        return this;
-    }
-
-    @Override
-    public AskBuilder from(Collection<String> graphName) {
+    public AskBuilder from(Object graphName) {
         getDatasetHandler().from(graphName);
         return this;
     }
diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/ConstructBuilder.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/ConstructBuilder.java
index 3a9b30d..3012378 100644
--- a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/ConstructBuilder.java
+++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/ConstructBuilder.java
@@ -98,25 +98,13 @@
     }
 
     @Override
-    public ConstructBuilder fromNamed(String graphName) {
+    public ConstructBuilder fromNamed(Object graphName) {
         getDatasetHandler().fromNamed(graphName);
         return this;
     }
 
     @Override
-    public ConstructBuilder fromNamed(Collection<String> graphNames) {
-        getDatasetHandler().fromNamed(graphNames);
-        return this;
-    }
-
-    @Override
-    public ConstructBuilder from(String graphName) {
-        getDatasetHandler().from(graphName);
-        return this;
-    }
-
-    @Override
-    public ConstructBuilder from(Collection<String> graphName) {
+    public ConstructBuilder from(Object graphName) {
         getDatasetHandler().from(graphName);
         return this;
     }
diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/DescribeBuilder.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/DescribeBuilder.java
index 5fdd9f4..c9ee5ab 100644
--- a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/DescribeBuilder.java
+++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/DescribeBuilder.java
@@ -386,25 +386,13 @@
     }
 
     @Override
-    public DescribeBuilder fromNamed(String graphName) {
+    public DescribeBuilder fromNamed(Object graphName) {
         getDatasetHandler().fromNamed(graphName);
         return this;
     }
 
     @Override
-    public DescribeBuilder fromNamed(Collection<String> graphNames) {
-        getDatasetHandler().fromNamed(graphNames);
-        return this;
-    }
-
-    @Override
-    public DescribeBuilder from(String graphName) {
-        getDatasetHandler().from(graphName);
-        return this;
-    }
-
-    @Override
-    public DescribeBuilder from(Collection<String> graphName) {
+    public DescribeBuilder from(Object graphName) {
         getDatasetHandler().from(graphName);
         return this;
     }
diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/SelectBuilder.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/SelectBuilder.java
index 2c0a116..d3f162d 100644
--- a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/SelectBuilder.java
+++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/SelectBuilder.java
@@ -138,25 +138,13 @@
     }
 
     @Override
-    public SelectBuilder fromNamed(String graphName) {
+    public SelectBuilder fromNamed(Object graphName) {
         getDatasetHandler().fromNamed(graphName);
         return this;
     }
 
     @Override
-    public SelectBuilder fromNamed(Collection<String> graphNames) {
-        getDatasetHandler().fromNamed(graphNames);
-        return this;
-    }
-
-    @Override
-    public SelectBuilder from(String graphName) {
-        getDatasetHandler().from(graphName);
-        return this;
-    }
-
-    @Override
-    public SelectBuilder from(Collection<String> graphName) {
+    public SelectBuilder from(Object graphName) {
         getDatasetHandler().from(graphName);
         return this;
     }
diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/clauses/DatasetClause.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/clauses/DatasetClause.java
index 6f047b9..4b502fb 100644
--- a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/clauses/DatasetClause.java
+++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/clauses/DatasetClause.java
@@ -17,8 +17,6 @@
  */
 package org.apache.jena.arq.querybuilder.clauses;
 
-import java.util.Collection;
-
 import org.apache.jena.arq.querybuilder.AbstractQueryBuilder;
 import org.apache.jena.arq.querybuilder.handlers.DatasetHandler;
 
@@ -35,15 +33,7 @@
      * @param graphName the graph name to add.
      * @return This builder for chaining.
      */
-    public T fromNamed(String graphName);
-
-    /**
-     * Add several "FROM NAMED" graph names.
-     * 
-     * @param graphNames the collection graph names to add.
-     * @return This builder for chaining.
-     */
-    public T fromNamed(Collection<String> graphNames);
+    public T fromNamed(Object graphName);
 
     /**
      * Add the "FROM" graph name.
@@ -51,15 +41,7 @@
      * @param graphName the graph name to add.
      * @return This builder for chaining.
      */
-    public T from(String graphName);
-
-    /**
-     * Add several "FROM" graph names.
-     * 
-     * @param graphName the collection graph names to add.
-     * @return This builder for chaining.
-     */
-    public T from(Collection<String> graphName);
+    public T from(Object graphName);
 
     /**
      * Get the Dataset handler for this clause.
diff --git a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/DatasetHandler.java b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/DatasetHandler.java
index 2fe249d..26ce281 100644
--- a/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/DatasetHandler.java
+++ b/jena-extras/jena-querybuilder/src/main/java/org/apache/jena/arq/querybuilder/handlers/DatasetHandler.java
@@ -21,7 +21,10 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.jena.graph.FrontsNode;
 import org.apache.jena.graph.Node;
+import org.apache.jena.graph.Node_Literal;
+import org.apache.jena.graph.Node_URI;
 import org.apache.jena.query.Query;
 import org.apache.jena.sparql.core.Var;
 
@@ -54,24 +57,42 @@
     }
 
     /**
+     * Converts an object into a graph name.
+     * @param graphName the object that represents the graph name.
+     * @return the string that is the graph name.
+     */
+    String asGraphName(Object graphName) {
+        // package private for testing access
+        if (graphName instanceof String) {
+            return (String) graphName;
+        }
+        if (graphName instanceof FrontsNode) {
+            return asGraphName(((FrontsNode)graphName).asNode());
+        }
+        if (graphName instanceof Node_URI) {
+            return ((Node_URI)graphName).getURI();
+        }
+        if (graphName instanceof Node_Literal) {
+            return asGraphName(((Node_Literal)graphName).getLiteralValue());
+        }
+
+        return graphName.toString();
+    }
+
+    /**
      * Add a graph name to the from named list.
      *
      * @param graphName The graph name to add.
      */
-    public void fromNamed(String graphName) {
-        query.addNamedGraphURI(graphName);
-    }
-
-    /**
-     * Add the graph names to the from named list.
-     *
-     * The names are ordered in as defined in the collection.
-     *
-     * @param graphNames The from names to add.
-     */
-    public void fromNamed(Collection<String> graphNames) {
-        for (String uri : graphNames) {
-            query.addNamedGraphURI(uri);
+    public void fromNamed(Object graphName) {
+        if (graphName instanceof Collection) {
+            ((Collection<?>)graphName).forEach(this::fromNamed);
+        } else if (graphName instanceof Object[]) {
+            for (Object o : ((Object[])graphName)) {
+                fromNamed(o);
+            }
+        } else {
+            query.addNamedGraphURI(asGraphName(graphName));
         }
     }
 
@@ -80,20 +101,15 @@
      *
      * @param graphName the name to add.
      */
-    public void from(String graphName) {
-        query.addGraphURI(graphName);
-    }
-
-    /**
-     * Add the graph names to the named list.
-     *
-     * The names are ordered in as defined in the collection.
-     *
-     * @param graphNames The names to add.
-     */
-    public void from(Collection<String> graphNames) {
-        for (String uri : graphNames) {
-            query.addGraphURI(uri);
+    public void from(Object graphName) {
+        if (graphName instanceof Collection) {
+            ((Collection<?>)graphName).forEach(this::from);
+        } else if (graphName instanceof Object[]) {
+            for (Object o : ((Object[])graphName)) {
+                from(o);
+            }
+        } else {
+            query.addGraphURI(asGraphName(graphName));
         }
     }
 
diff --git a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/DatasetHandlerTest.java b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/DatasetHandlerTest.java
index 5e6d458..a9acd65 100644
--- a/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/DatasetHandlerTest.java
+++ b/jena-extras/jena-querybuilder/src/test/java/org/apache/jena/arq/querybuilder/handlers/DatasetHandlerTest.java
@@ -17,15 +17,20 @@
  */
 package org.apache.jena.arq.querybuilder.handlers;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.UUID;
 
 import org.apache.jena.graph.Node;
 import org.apache.jena.graph.NodeFactory;
 import org.apache.jena.query.Query;
+import org.apache.jena.rdf.model.ResourceFactory;
 import org.apache.jena.sparql.core.Var;
 import org.junit.Before;
 import org.junit.Test;
@@ -73,6 +78,18 @@
     }
 
     @Test
+    public void asGraphNameTest() throws URISyntaxException {
+        assertEquals("urn:example.com:uri", handler.asGraphName(new URI("urn:example.com:uri")));
+        assertEquals("urn:example.com:node", handler.asGraphName(NodeFactory.createURI("urn:example.com:node")));
+        assertEquals("five", handler.asGraphName(ResourceFactory.createPlainLiteral("five")));
+        assertEquals("6", handler.asGraphName(ResourceFactory.createTypedLiteral(6)));
+        Node n = NodeFactory.createBlankNode();
+        assertEquals(n.toString(), handler.asGraphName(n));
+        UUID uuid = UUID.randomUUID();
+        assertEquals(uuid.toString(), handler.asGraphName(uuid));
+    }
+
+    @Test
     public void fromStringCollection() {
         String[] names = { "foo", "bar" };
         handler.from(Arrays.asList(names));