Author: andy
Date: Fri Jun 13 11:56:42 2014
New Revision: 1602392
URL: http://svn.apache.org/r1602392
Log:
Fix bug in file upload to a GSP endpont where only the first file processed.
Clean up the testing of GSP/FileUpload.
Added:
jena/Experimental/jena-fuseki2/dwim-fileupload (with props)
jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/AbstractFusekiTest.java
(with props)
Modified:
jena/Experimental/jena-fuseki2/D.trig
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/DEF.java
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP_RW.java
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Upload.java
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/Upload.java
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/UploadDetails.java
jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/TestDatasetOps.java
jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/TestFileUpload.java
(contents, props changed)
jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/TestQuery.java
Modified: jena/Experimental/jena-fuseki2/D.trig
URL:
http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/D.trig?rev=1602392&r1=1602391&r2=1602392&view=diff
==============================================================================
--- jena/Experimental/jena-fuseki2/D.trig (original)
+++ jena/Experimental/jena-fuseki2/D.trig Fri Jun 13 11:56:42 2014
@@ -1,3 +1,4 @@
prefix : <http://example/>
-:g { :s :p :o }
+{ :s :p "quads" }
+:g { :s :p 2 }
Added: jena/Experimental/jena-fuseki2/dwim-fileupload
URL:
http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/dwim-fileupload?rev=1602392&view=auto
==============================================================================
--- jena/Experimental/jena-fuseki2/dwim-fileupload (added)
+++ jena/Experimental/jena-fuseki2/dwim-fileupload Fri Jun 13 11:56:42 2014
@@ -0,0 +1,22 @@
+#!/bin/bash
+# How to do a file upload in curl
+
+# GSP strict
+## curl -F '[email protected]' http://localhost:3030/ds/data
+
+# Quads to GSP
+## curl -F '[email protected]' http://localhost:3030/ds/data
+
+# Quads to graph : NGs in data ignored
+## curl -F '[email protected]' 'http://localhost:3030/ds/data?default'
+#curl -F '[email protected]' 'http://localhost:3030/ds/data?graph=http://example/G'
+
+## Many
+
+
+# Dataset
+## curl -F '[email protected]' http://localhost:3030/ds
+
+curl -F '[email protected]' -F '[email protected]' http://localhost:3030/ds
+
+curl http://localhost:3030/ds
Propchange: jena/Experimental/jena-fuseki2/dwim-fileupload
------------------------------------------------------------------------------
svn:executable = *
Modified:
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/DEF.java
URL:
http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/DEF.java?rev=1602392&r1=1602391&r2=1602392&view=diff
==============================================================================
---
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/DEF.java
(original)
+++
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/DEF.java
Fri Jun 13 11:56:42 2014
@@ -27,6 +27,9 @@ public class DEF
public static final MediaType acceptRDFXML =
MediaType.create(contentTypeRDFXML) ;
public static final MediaType acceptNQuads =
MediaType.create(contentTypeNQuads) ;
public static final MediaType acceptRSXML =
MediaType.create(contentTypeResultsXML) ;
+ public static final MediaType acceptJSON =
MediaType.create(contentTypeJSON) ;
+
+ public static final AcceptList jsonOffer =
AcceptList.create(contentTypeJSON) ;
public static final AcceptList rdfOffer =
AcceptList.create(contentTypeTurtle,
contentTypeTurtleAlt1,
Modified:
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP_RW.java
URL:
http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP_RW.java?rev=1602392&r1=1602391&r2=1602392&view=diff
==============================================================================
---
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP_RW.java
(original)
+++
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_GSP_RW.java
Fri Jun 13 11:56:42 2014
@@ -22,7 +22,10 @@ import static org.apache.jena.riot.WebCo
import static org.apache.jena.riot.WebContent.matchContentType ;
import org.apache.jena.atlas.json.JsonValue ;
import org.apache.jena.atlas.web.ContentType ;
+import org.apache.jena.atlas.web.MediaType ;
+import org.apache.jena.fuseki.DEF ;
import org.apache.jena.fuseki.FusekiLib ;
+import org.apache.jena.fuseki.conneg.ConNeg ;
import org.apache.jena.fuseki.servlets.UploadDetails.PreState ;
import org.apache.jena.riot.RiotException ;
import org.apache.jena.riot.system.StreamRDF ;
@@ -90,12 +93,21 @@ public class SPARQL_GSP_RW extends SPARQ
else
details = addDataIntoNonTxn(action, overwrite) ;
- // WRONG
+ MediaType mt = ConNeg.chooseCharset(action.request, DEF.jsonOffer,
DEF.acceptJSON) ;
+
+ if ( mt == null ) {
+ // No return body.
+ if ( details.getExistedBefore().equals(PreState.ABSENT) )
+ ServletOps.successCreated(action) ;
+ else
+ ServletOps.successNoContent(action) ;
+ return ;
+ }
+
if ( details.getExistedBefore().equals(PreState.ABSENT) )
- ServletOps.successCreated(action) ; // Gets lost by
+ ServletOps.successCreated(action) ;
else
ServletOps.success(action) ; // successNoContent if empty body.
-
JsonValue v = details.detailsJson() ;
ServletOps.sendJson(action, v) ;
}
Modified:
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Upload.java
URL:
http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Upload.java?rev=1602392&r1=1602391&r2=1602392&view=diff
==============================================================================
---
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Upload.java
(original)
+++
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Upload.java
Fri Jun 13 11:56:42 2014
@@ -182,11 +182,13 @@ public class SPARQL_Upload extends Actio
}
}
- /** process an HTTP upload of RDF.
- * We can't stream straight into a dataset because the graph name can be
after the data.
+ /** Process an HTTP file upload of RDF with additiona name field for the
graph name.
+ * We can't stream straight into a dataset because the graph name can be
after the data.
* @return graph name and count
*/
+ // ?? Combine with Upload.fileUploadWorker
+ // Difference is the handling of names for graphs.
static private UploadDetails uploadWorker(HttpAction action, String base)
{
DatasetGraph dsgTmp = DatasetGraphFactory.createMem() ;
Modified:
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/Upload.java
URL:
http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/Upload.java?rev=1602392&r1=1602391&r2=1602392&view=diff
==============================================================================
---
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/Upload.java
(original)
+++
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/Upload.java
Fri Jun 13 11:56:42 2014
@@ -30,6 +30,7 @@ import java.util.zip.GZIPInputStream ;
import org.apache.commons.fileupload.FileItemIterator ;
import org.apache.commons.fileupload.FileItemStream ;
import org.apache.commons.fileupload.servlet.ServletFileUpload ;
+import org.apache.commons.fileupload.util.Streams ;
import org.apache.jena.atlas.io.IO ;
import org.apache.jena.atlas.web.ContentType ;
import org.apache.jena.fuseki.FusekiLib ;
@@ -85,16 +86,23 @@ public class Upload {
public static UploadDetails fileUploadWorker(HttpAction action, StreamRDF
dest) {
String base = ActionLib.wholeRequestURL(action.request) ;
ServletFileUpload upload = new ServletFileUpload();
- long count = -1 ;
-
//log.info(format("[%d] Upload: Field=%s ignored", action.id,
fieldName)) ;
+ // This is teh overal count.
+
+ // Overall counting.
+ StreamRDFCounting countingDest = StreamRDFLib.count(dest) ;
try {
FileItemIterator iter = upload.getItemIterator(action.request);
while (iter.hasNext()) {
FileItemStream fileStream = iter.next();
- if (fileStream.isFormField())
- ServletOps.errorBadRequest("Only files accept in multipart
file upload") ;
+ if (fileStream.isFormField()) {
+ // Ignore?
+ String fieldName = fileStream.getFieldName() ;
+ InputStream stream = fileStream.openStream();
+ String value = Streams.asString(stream, "UTF-8") ;
+ ServletOps.errorBadRequest(format("Only files accepted in
multipart file upload (got %s=%s)",fieldName, value)) ;
+ }
//Ignore the field name.
//String fieldName = fileStream.getFieldName();
@@ -126,14 +134,14 @@ public class Upload {
// action.log.info(format("[%d] Filename: %s, Content-Type=%s,
Charset=%s => %s",
// action.id, printfilename,
ct.getContentType(), ct.getCharset(), lang.getName())) ;
- StreamRDFCounting countingDest = StreamRDFLib.count(dest) ;
+ // count just this step
+ StreamRDFCounting countingDest2 =
StreamRDFLib.count(countingDest) ;
try {
- ActionSPARQL.parse(action, countingDest, stream, lang,
base);
- UploadDetails details = new
UploadDetails(countingDest.count(),
countingDest.countTriples(),countingDest.countQuads()) ;
+ ActionSPARQL.parse(action, countingDest2, stream, lang,
base);
+ UploadDetails details1 = new
UploadDetails(countingDest2.count(),
countingDest2.countTriples(),countingDest2.countQuads()) ;
action.log.info(format("[%d] Filename: %s,
Content-Type=%s, Charset=%s => %s : %s",
action.id, printfilename,
ct.getContentType(), ct.getCharset(), lang.getName(),
- details.detailsStr())) ;
- return details ;
+ details1.detailsStr())) ;
} catch (RiotParseException ex) {
action.log.info(format("[%d] Filename: %s,
Content-Type=%s, Charset=%s => %s : %s",
action.id, printfilename,
ct.getContentType(), ct.getCharset(), lang.getName(),
@@ -144,7 +152,9 @@ public class Upload {
}
catch (ActionErrorException ex) { throw ex ; }
catch (Exception ex) {
ServletOps.errorOccurred(ex.getMessage()) ; }
- return null ;
+ // Overall results.
+ UploadDetails details = new UploadDetails(countingDest.count(),
countingDest.countTriples(),countingDest.countQuads()) ;
+ return details ;
}
}
Modified:
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/UploadDetails.java
URL:
http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/UploadDetails.java?rev=1602392&r1=1602391&r2=1602392&view=diff
==============================================================================
---
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/UploadDetails.java
(original)
+++
jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/servlets/UploadDetails.java
Fri Jun 13 11:56:42 2014
@@ -36,15 +36,19 @@ public class UploadDetails {
this.quadCount = parserQuadCount ;
}
- public String detailsStr() {
+ public static String detailsStr(long count, long tripleCount, long
quadCount) {
return String.format("Count=%d Triples=%d Quads=%d", count,
tripleCount, quadCount) ;
}
+ public String detailsStr() {
+ return detailsStr(count, tripleCount, quadCount) ;
+ }
+
public static String jCount = "count" ;
public static String jTriplesCount = "tripleCount" ;
public static String jQuadsCount = "quadCount" ;
- public JsonValue detailsJson() {
+ public static JsonValue detailsJson(long count, long tripleCount, long
quadCount) {
JsonBuilder b = new JsonBuilder() ;
b.startObject("details") ;
b.key(jCount).value(count) ;
@@ -54,6 +58,10 @@ public class UploadDetails {
return b.build() ;
}
+ public JsonValue detailsJson() {
+ return detailsJson(count, tripleCount, quadCount) ;
+ }
+
public long getCount() {
return count ;
}
Added:
jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/AbstractFusekiTest.java
URL:
http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/AbstractFusekiTest.java?rev=1602392&view=auto
==============================================================================
---
jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/AbstractFusekiTest.java
(added)
+++
jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/AbstractFusekiTest.java
Fri Jun 13 11:56:42 2014
@@ -0,0 +1,47 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.fuseki;
+
+import org.apache.jena.atlas.junit.BaseTest ;
+import org.junit.AfterClass ;
+import org.junit.Before ;
+import org.junit.BeforeClass ;
+
+/** Framework for tests using client-side operation onto a forked Fuseki
server.
+ * Not general - some test sets set up their own environment for
+ * different, additional requirements.
+ */
+
+public class AbstractFusekiTest extends BaseTest
+{
+ @BeforeClass
+ public static void allocServerForSuite() {
+ ServerTest.allocServer() ;
+ }
+
+ @AfterClass
+ public static void freeServerForSuite() {
+ ServerTest.freeServer() ;
+ }
+
+ @Before public void resetServer() {
+ ServerTest.resetServer() ;
+ }
+}
+
Propchange:
jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/AbstractFusekiTest.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified:
jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/TestDatasetOps.java
URL:
http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/TestDatasetOps.java?rev=1602392&r1=1602391&r2=1602392&view=diff
==============================================================================
---
jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/TestDatasetOps.java
(original)
+++
jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/TestDatasetOps.java
Fri Jun 13 11:56:42 2014
@@ -28,7 +28,6 @@ import java.io.OutputStream ;
import org.apache.http.HttpEntity ;
import org.apache.http.entity.ContentProducer ;
import org.apache.http.entity.EntityTemplate ;
-import org.apache.jena.atlas.junit.BaseTest ;
import org.apache.jena.atlas.lib.StrUtils ;
import org.apache.jena.atlas.web.HttpException ;
import org.apache.jena.atlas.web.TypedInputStream ;
@@ -39,9 +38,6 @@ import org.apache.jena.riot.system.Strea
import org.apache.jena.riot.system.StreamRDFLib ;
import org.apache.jena.riot.web.HttpOp ;
import org.apache.jena.web.HttpSC ;
-import org.junit.AfterClass ;
-import org.junit.Before ;
-import org.junit.BeforeClass ;
import org.junit.Test ;
import com.hp.hpl.jena.sparql.core.DatasetGraph ;
@@ -51,23 +47,8 @@ import com.hp.hpl.jena.sparql.sse.SSE ;
/** TestDatasetAccessorHTTP does most of the GSP testing.
* This class adds the testing of Fuseki extras.
*/
-public class TestDatasetOps extends BaseTest
+public class TestDatasetOps extends AbstractFusekiTest
{
- @BeforeClass
- public static void beforeClass() {
- ServerTest.allocServer() ;
- //ServerTest.resetServer() ;
- }
-
- @AfterClass
- public static void afterClass() {
- ServerTest.freeServer() ;
- }
-
- @Before public void beforeTest() {
- ServerTest.resetServer() ;
- }
-
static DatasetGraph data = SSE.parseDatasetGraph(StrUtils.strjoinNL
("(prefix ((: <http://example/>))",
" (dataset",
Modified:
jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/TestFileUpload.java
URL:
http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/TestFileUpload.java?rev=1602392&r1=1602391&r2=1602392&view=diff
==============================================================================
---
jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/TestFileUpload.java
(original)
+++
jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/TestFileUpload.java
Fri Jun 13 11:56:42 2014
@@ -19,41 +19,40 @@
package org.apache.jena.fuseki;
import static org.apache.jena.fuseki.ServerTest.serviceREST ;
-import org.apache.jena.atlas.junit.BaseTest ;
-import org.junit.AfterClass ;
-import org.junit.Before ;
-import org.junit.BeforeClass ;
+import org.apache.jena.atlas.web.TypedInputStream ;
+import org.apache.jena.fuseki.http.TestDatasetAccessorHTTP ;
+import org.apache.jena.fuseki.http.TestHttpOp ;
+import org.apache.jena.riot.RDFDataMgr ;
+import org.apache.jena.riot.RDFLanguages ;
+import org.apache.jena.riot.web.HttpOp ;
import org.junit.Test ;
import com.hp.hpl.jena.query.DatasetAccessor ;
import com.hp.hpl.jena.query.DatasetAccessorFactory ;
import com.hp.hpl.jena.rdf.model.Model ;
+import com.hp.hpl.jena.rdf.model.ModelFactory ;
-public class TestFileUpload extends BaseTest
+/** Additional tests for the SPARQL Graph Store protocol,
+ * mainly for HTTP file upload. See {@linkplain TestDatasetAccessorHTTP}
+ * and {@linkplain TestHttpOp} for tests that exercise direct GSp functionality
+ *
+ * @see TestDatasetAccessorHTTP
+ * @see TestHttpOp
+ */
+public class TestFileUpload extends AbstractFusekiTest
{
- @BeforeClass
- public static void beforeClass() {
- ServerTest.allocServer() ;
- //ServerTest.resetServer() ;
- }
-
- @AfterClass
- public static void afterClass() {
- ServerTest.freeServer() ;
- }
-
- @Before public void beforeTest() {
- ServerTest.resetServer() ;
- }
-
@Test public void upload_gsp_01()
{
FileSender x = new FileSender(ServerTest.serviceREST+"?default") ;
x.add("D.ttl", "<http://example/s> <http://example/p>
<http://example/o> .", "text/turtle") ;
x.send("POST") ;
- DatasetAccessor du = DatasetAccessorFactory.createHTTP(serviceREST) ;
- Model m = du.getModel() ;
+ Model m = ModelFactory.createDefaultModel() ;
+ TypedInputStream in = HttpOp.execHttpGet(serviceREST, "text/turtle") ;
+ RDFDataMgr.read(m, in,
RDFLanguages.contentTypeToLang(in.getMediaType()) ) ;
+ // which is is effectively :
+// DatasetAccessor du = DatasetAccessorFactory.createHTTP(serviceREST) ;
+// Model m = du.getModel() ;
assertEquals(1, m.size()) ;
}
@@ -64,12 +63,13 @@ public class TestFileUpload extends Base
x.add("D.nt", "<http://example/s> <http://example/p>
<http://example/o-456> .", "application/n-triples") ;
x.send("PUT") ;
+ // BUG
DatasetAccessor du = DatasetAccessorFactory.createHTTP(serviceREST) ;
Model m = du.getModel() ;
assertEquals(2, m.size()) ;
}
-
- // Beyond strict GSP - no graph selector => dataset
+
+ // Extension of GSP - no graph selector => dataset
@Test public void upload_gsp_03()
{
FileSender x = new FileSender(ServerTest.serviceREST) ;
@@ -101,7 +101,9 @@ public class TestFileUpload extends Base
assertEquals(2, m.size()) ;
}
- @Test public void upload_dataset_01() {
+ // Via DatasetAccessor
+
+ @Test public void dataset_accessor_01() {
FileSender x = new FileSender(ServerTest.urlDataset) ;
x.add("D.nq", "", "application/-n-quads") ;
x.send("PUT") ;
@@ -109,12 +111,11 @@ public class TestFileUpload extends Base
DatasetAccessor du = DatasetAccessorFactory.createHTTP(serviceREST) ;
Model m = du.getModel() ;
assertEquals(0, m.size()) ;
-
}
- @Test public void upload_dataset_02() {
+ @Test public void dataset_accessor_02() {
FileSender x = new FileSender(ServerTest.urlDataset) ;
- x.add("D.nq", "<http://example/s> <http://example/p>
<http://example/o-456> <http://example/g> .", "application/-n-quads") ;
+ x.add("D.nq", "<http://example/s> <http://example/p>
<http://example/o-456> <http://example/g> .", "application/n-quads") ;
x.send("PUT") ;
DatasetAccessor du = DatasetAccessorFactory.createHTTP(serviceREST) ;
@@ -122,7 +123,6 @@ public class TestFileUpload extends Base
assertEquals(1, m.size()) ;
m = du.getModel() ;
assertEquals(0, m.size()) ;
-
}
}
Propchange:
jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/TestFileUpload.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified:
jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/TestQuery.java
URL:
http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/TestQuery.java?rev=1602392&r1=1602391&r2=1602392&view=diff
==============================================================================
---
jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/TestQuery.java
(original)
+++
jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/TestQuery.java
Fri Jun 13 11:56:42 2014
@@ -46,7 +46,6 @@ public class TestQuery extends BaseTest
rs1 = BuilderResultSet.build(item) ;
}
- // DRY - test protocol?
@BeforeClass public static void beforeClass()
{
ServerTest.allocServer() ;