From 5688d286c39f73b32338032ca7c105aeddf861b7 Mon Sep 17 00:00:00 2001
From: gmantele <gmantele@ari.uni-heidelberg.de>
Date: Wed, 9 Apr 2014 20:48:55 +0200
Subject: [PATCH] TAP: Modify the xSV formats in order to let developer specify
 a MIME type and short MIME type (or alias) for any SV format, but especially
 for the one not already managed (CSV and TSV).

---
 src/tap/formatter/ResultSet2SVFormatter.java |  35 ++++--
 src/tap/formatter/SVFormat.java              | 123 ++++++++++++++-----
 2 files changed, 121 insertions(+), 37 deletions(-)

diff --git a/src/tap/formatter/ResultSet2SVFormatter.java b/src/tap/formatter/ResultSet2SVFormatter.java
index 6289570..0eb1edf 100644
--- a/src/tap/formatter/ResultSet2SVFormatter.java
+++ b/src/tap/formatter/ResultSet2SVFormatter.java
@@ -16,28 +16,46 @@ package tap.formatter;
  * You should have received a copy of the GNU Lesser General Public License
  * along with TAPLibrary.  If not, see <http://www.gnu.org/licenses/>.
  * 
- * Copyright 2012 - UDS/Centre de Données astronomiques de Strasbourg (CDS)
+ * Copyright 2012-2013 - UDS/Centre de Données astronomiques de Strasbourg (CDS),
+ *                       Astronomisches Rechen Institute (ARI)
  */
 
 import java.io.IOException;
 import java.io.PrintWriter;
-
 import java.sql.ResultSet;
 import java.sql.SQLException;
 
-import adql.db.DBColumn;
-
 import tap.ServiceConnection;
 import tap.TAPException;
 import tap.TAPExecutionReport;
+import adql.db.DBColumn;
 
+/**
+ * 
+ * @author Gr&eacute;gory Mantelet (CDS;ARI) - gmantele@ari.uni-heidelberg.de
+ * @version 1.1 (12/2013)
+ */
 public class ResultSet2SVFormatter extends SVFormat<ResultSet> implements ResultSetFormatter {
 
+	/**
+	 * @since 1.1
+	 */
+	public ResultSet2SVFormatter(final ServiceConnection<ResultSet> service, char colSeparator){
+		super(service, colSeparator);
+	}
+
 	public ResultSet2SVFormatter(final ServiceConnection<ResultSet> service, char colSeparator, boolean delimitStrings){
 		super(service, colSeparator, delimitStrings);
 	}
 
-	public ResultSet2SVFormatter(final ServiceConnection<ResultSet> service, char colSeparator){
+	/**
+	 * @since 1.1
+	 */
+	public ResultSet2SVFormatter(final ServiceConnection<ResultSet> service, char colSeparator, boolean delimitStrings, String mimeType, String typeAlias){
+		super(service, colSeparator, delimitStrings, mimeType, typeAlias);
+	}
+
+	public ResultSet2SVFormatter(final ServiceConnection<ResultSet> service, String colSeparator){
 		super(service, colSeparator);
 	}
 
@@ -45,8 +63,11 @@ public class ResultSet2SVFormatter extends SVFormat<ResultSet> implements Result
 		super(service, colSeparator, delimitStrings);
 	}
 
-	public ResultSet2SVFormatter(final ServiceConnection<ResultSet> service, String colSeparator){
-		super(service, colSeparator);
+	/**
+	 * @since 1.1
+	 */
+	public ResultSet2SVFormatter(final ServiceConnection<ResultSet> service, String colSeparator, boolean delimitStrings, String mimeType, String typeAlias){
+		super(service, colSeparator, delimitStrings, mimeType, typeAlias);
 	}
 
 	@Override
diff --git a/src/tap/formatter/SVFormat.java b/src/tap/formatter/SVFormat.java
index 259fff2..3cc95c3 100644
--- a/src/tap/formatter/SVFormat.java
+++ b/src/tap/formatter/SVFormat.java
@@ -16,19 +16,28 @@ package tap.formatter;
  * You should have received a copy of the GNU Lesser General Public License
  * along with TAPLibrary.  If not, see <http://www.gnu.org/licenses/>.
  * 
- * Copyright 2012 - UDS/Centre de Données astronomiques de Strasbourg (CDS)
+ * Copyright 2012-2013 - UDS/Centre de Données astronomiques de Strasbourg (CDS),
+ *                       Astronomisches Rechen Institute (ARI)
  */
 
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.PrintWriter;
 
-import cds.savot.writer.SavotWriter;
-import adql.db.DBColumn;
 import tap.ServiceConnection;
 import tap.TAPException;
 import tap.TAPExecutionReport;
+import adql.db.DBColumn;
+import cds.savot.writer.SavotWriter;
 
+/**
+ * 
+ * 
+ * @author Gr&eacute;gory Mantelet (CDS;ARI) - gmantele@ari.uni-heidelberg.de
+ * @version 1.1 (12/2013)
+ * 
+ * @param <R>
+ */
 public abstract class SVFormat< R > implements OutputFormat<R> {
 
 	/** Indicates whether a format report (start and end date/time) must be printed in the log output.  */
@@ -42,60 +51,114 @@ public abstract class SVFormat< R > implements OutputFormat<R> {
 
 	protected final String separator;
 	protected final boolean delimitStr;
+	/** @since 1.1 */
+	protected final String mimeType;
+	/** @since 1.1 */
+	protected final String shortMimeType;
 
 	public SVFormat(final ServiceConnection<R> service, char colSeparator){
 		this(service, colSeparator, true);
 	}
 
+	/**
+	 * @since 1.1
+	 */
+	public SVFormat(final ServiceConnection<R> service, String colSeparator){
+		this(service, colSeparator, true);
+	}
+
 	public SVFormat(final ServiceConnection<R> service, char colSeparator, boolean delimitStrings){
-		this(service, colSeparator, delimitStrings, false);
+		this(service, "" + colSeparator, delimitStrings);
 	}
 
-	public SVFormat(final ServiceConnection<R> service, char colSeparator, boolean delimitStrings, final boolean logFormatReport){
-		separator = "" + colSeparator;
-		delimitStr = delimitStrings;
-		this.service = service;
-		this.logFormatReport = logFormatReport;
+	/**
+	 * @since 1.1
+	 */
+	public SVFormat(final ServiceConnection<R> service, String colSeparator, boolean delimitStrings){
+		this(service, colSeparator, delimitStrings, null, null);
 	}
 
-	public SVFormat(final ServiceConnection<R> service, String colSeparator){
-		this(service, colSeparator, true);
+	/**
+	 * @since 1.1
+	 */
+	public SVFormat(final ServiceConnection<R> service, char colSeparator, boolean delimitStrings, String mimeType, String typeAlias){
+		this(service, "" + colSeparator, delimitStrings, mimeType, typeAlias);
 	}
 
-	public SVFormat(final ServiceConnection<R> service, String colSeparator, boolean delimitStrings){
+	/**
+	 * @since 1.1
+	 */
+	public SVFormat(final ServiceConnection<R> service, String colSeparator, boolean delimitStrings, String mimeType, String typeAlias){
+		this(service, colSeparator, delimitStrings, mimeType, typeAlias, false);
+	}
+
+	/**
+	 * @since 1.1
+	 */
+	public SVFormat(final ServiceConnection<R> service, char colSeparator, boolean delimitStrings, String mimeType, String typeAlias, final boolean logFormatReport){
+		this(service, "" + colSeparator, delimitStrings, mimeType, typeAlias, logFormatReport);
+	}
+
+	/**
+	 * @since 1.1
+	 */
+	public SVFormat(final ServiceConnection<R> service, String colSeparator, boolean delimitStrings, String mimeType, String typeAlias, final boolean logFormatReport){
 		separator = (colSeparator == null) ? ("" + COMMA_SEPARATOR) : colSeparator;
 		delimitStr = delimitStrings;
 		this.service = service;
+		this.logFormatReport = logFormatReport;
+
+		// Set the MIME type:
+		if (mimeType == null || mimeType.length() == 0){
+			// if none is provided, guess it from the separator:
+			switch(separator.charAt(0)){
+				case COMMA_SEPARATOR:
+				case SEMI_COLON_SEPARATOR:
+					this.mimeType = "text/csv";
+					break;
+				case TAB_SEPARATOR:
+					this.mimeType = "text/tsv";
+					break;
+				default:
+					this.mimeType = "text/plain";
+			}
+		}else
+			this.mimeType = mimeType;
+
+		// Set the short MIME type (or the alias):
+		if (typeAlias == null || typeAlias.length() == 0){
+			// if none is provided, guess it from the separator:
+			switch(separator.charAt(0)){
+				case COMMA_SEPARATOR:
+				case SEMI_COLON_SEPARATOR:
+					this.shortMimeType = "csv";
+					break;
+				case TAB_SEPARATOR:
+					this.shortMimeType = "tsv";
+					break;
+				default:
+					this.shortMimeType = "text";
+			}
+		}else
+			this.shortMimeType = typeAlias;
 	}
 
+	@Override
 	public String getMimeType(){
-		switch(separator.charAt(0)){
-			case COMMA_SEPARATOR:
-			case SEMI_COLON_SEPARATOR:
-				return "text/csv";
-			case TAB_SEPARATOR:
-				return "text/tsv";
-			default:
-				return "text/plain";
-		}
+		return mimeType;
 	}
 
+	@Override
 	public String getShortMimeType(){
-		switch(separator.charAt(0)){
-			case COMMA_SEPARATOR:
-			case SEMI_COLON_SEPARATOR:
-				return "csv";
-			case TAB_SEPARATOR:
-				return "tsv";
-			default:
-				return "text";
-		}
+		return shortMimeType;
 	}
 
+	@Override
 	public String getDescription(){
 		return null;
 	}
 
+	@Override
 	public String getFileExtension(){
 		switch(separator.charAt(0)){
 			case COMMA_SEPARATOR:
-- 
GitLab