From 0e0e6e0f79f035ec61e992e47edfba26bb1e8ddb Mon Sep 17 00:00:00 2001
From: gmantele <gmantele@ari.uni-heidelberg.de>
Date: Wed, 1 Oct 2014 16:46:57 +0200
Subject: [PATCH] [UWS] Make XML representation of jobs and joblists valid
 (with their XML schema), and particularly the nodes jobs, job and the error
 type (which should be written in lower-case).

---
 src/uws/job/ErrorType.java                |  14 ++-
 src/uws/job/serializer/XMLSerializer.java | 108 ++++++++++++----------
 2 files changed, 69 insertions(+), 53 deletions(-)

diff --git a/src/uws/job/ErrorType.java b/src/uws/job/ErrorType.java
index 7ee038c..7e80d9d 100644
--- a/src/uws/job/ErrorType.java
+++ b/src/uws/job/ErrorType.java
@@ -16,7 +16,8 @@ package uws.job;
  * You should have received a copy of the GNU Lesser General Public License
  * along with UWSLibrary.  If not, see <http://www.gnu.org/licenses/>.
  * 
- * Copyright 2012 - UDS/Centre de Données astronomiques de Strasbourg (CDS)
+ * Copyright 2012,2014 - UDS/Centre de Données astronomiques de Strasbourg (CDS),
+ *                       Astronomisches Rechen Institut (ARI)
  */
 
 /**
@@ -24,9 +25,14 @@ package uws.job;
  * 
  * @see	ErrorSummary
  * 
- * @author Gr&eacute;gory Mantelet (CDS)
- * @version 09/2010
+ * @author Gr&eacute;gory Mantelet (CDS;ARI)
+ * @version 4.1 (09/2014)
  */
 public enum ErrorType{
-	FATAL, TRANSIENT
+	FATAL, TRANSIENT;
+
+	@Override
+	public String toString(){
+		return super.toString().toLowerCase();
+	}
 }
diff --git a/src/uws/job/serializer/XMLSerializer.java b/src/uws/job/serializer/XMLSerializer.java
index fc33a64..b5a1942 100644
--- a/src/uws/job/serializer/XMLSerializer.java
+++ b/src/uws/job/serializer/XMLSerializer.java
@@ -105,10 +105,10 @@ public class XMLSerializer extends UWSSerializer {
 	/**
 	 * Gets all UWS namespaces declarations needed for an XML representation of a UWS object.
 	 * 
-	 * @return	The UWS namespaces: <br /> (i.e. <i>= "xmlns:uws=[...] xmlns:xlink=[...] xmlns:xs=[...] xmlns:xsi=[...]"</i>).
+	 * @return	The UWS namespaces: <br /> (i.e. <i>= "xmlns:uws=[...] xmlns:xlink=[...] xmlns:xs=[...] xmlns:xsi=[...] xsi:schemaLocation=[...]"</i>).
 	 */
 	public String getUWSNamespace(){
-		return "xmlns:uws=\"http://www.ivoa.net/xml/UWS/v1.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"";
+		return "xmlns=\"http://www.ivoa.net/xml/UWS/v1.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.ivoa.net/xml/UWS/v1.0 http://www.ivoa.net/xml/UWS/v1.0 http://www.w3.org/1999/xlink http://www.w3.org/1999/xlink.xsd http://www.w3.org/2001/XMLSchema http://www.w3.org/2001/XMLSchema.xsd\"";
 	}
 
 	/**
@@ -163,12 +163,14 @@ public class XMLSerializer extends UWSSerializer {
 
 	@Override
 	public String getJobList(final JobList jobsList, final JobOwner owner, final boolean root){
-		String name = jobsList.getName();
 		StringBuffer xml = new StringBuffer(getHeader());
 
-		xml.append("<uws:jobList").append(getUWSNamespace(true));
-		if (name != null)
-			xml.append(" name=\"").append(escapeXMLAttribute(name)).append("\"");
+		xml.append("<jobs").append(getUWSNamespace(true));
+		/* Note: NO ATTRIBUTE "name" IN THE XML SCHEMA!
+		 * String name = jobsList.getName();
+		 * if (name != null)
+		 * 	xml.append(" name=\"").append(escapeXMLAttribute(name)).append("\"");
+		 */
 		xml.append(">");
 
 		UWSUrl jobsListUrl = jobsList.getUrl();
@@ -176,7 +178,7 @@ public class XMLSerializer extends UWSSerializer {
 		while(it.hasNext())
 			xml.append("\n\t").append(getJobRef(it.next(), jobsListUrl));
 
-		xml.append("\n</uws:jobList>");
+		xml.append("\n</jobs>");
 
 		return xml.toString();
 	}
@@ -187,7 +189,7 @@ public class XMLSerializer extends UWSSerializer {
 		String newLine = "\n\t";
 
 		// general information:
-		xml.append("<uws:job").append(getUWSNamespace(root)).append(">");
+		xml.append("<job").append(getUWSNamespace(root)).append(">");
 		xml.append(newLine).append(getJobID(job, false));
 		xml.append(newLine).append(getRunID(job, false));
 		xml.append(newLine).append(getOwnerID(job, false));
@@ -211,7 +213,7 @@ public class XMLSerializer extends UWSSerializer {
 		xml.append(newLine).append(getErrorSummary(job.getErrorSummary(), false));
 
 		tabPrefix = "";
-		return xml.append("\n</uws:job>").toString();
+		return xml.append("\n</job>").toString();
 	}
 
 	@Override
@@ -222,120 +224,122 @@ public class XMLSerializer extends UWSSerializer {
 			url = jobsListUrl.getRequestURL();
 		}
 
-		StringBuffer xml = new StringBuffer("<uws:jobRef id=\"");
+		StringBuffer xml = new StringBuffer("<jobref id=\"");
 		xml.append(escapeXMLAttribute(job.getJobId()));
-		if (job.getRunId() != null && job.getRunId().length() > 0)
-			xml.append("\" runId=\"").append(escapeXMLAttribute(job.getRunId()));
+		/* Note: NO ATTRIBUTE "runId" IN THE XML SCHEMA!
+		 * if (job.getRunId() != null && job.getRunId().length() > 0)
+		 * 	xml.append("\" runId=\"").append(escapeXMLAttribute(job.getRunId()));
+		 */
 		xml.append("\" xlink:href=\"");
 		if (url != null)
 			xml.append(escapeURL(url));
-		xml.append("\">").append(getPhase(job, false)).append("</uws:jobRef>");
+		xml.append("\">\n\t\t").append(getPhase(job, false)).append("\n\t</jobref>");
 
 		return xml.toString();
 	}
 
 	@Override
 	public String getJobID(final UWSJob job, final boolean root){
-		return (new StringBuffer(root ? getHeader() : "")).append("<uws:jobId").append(getUWSNamespace(root)).append(">").append(escapeXMLData(job.getJobId())).append("</uws:jobId>").toString();
+		return (new StringBuffer(root ? getHeader() : "")).append("<jobId").append(getUWSNamespace(root)).append(">").append(escapeXMLData(job.getJobId())).append("</jobId>").toString();
 	}
 
 	@Override
 	public String getRunID(final UWSJob job, final boolean root){
-		StringBuffer xml = new StringBuffer(root ? getHeader() : "");
-		xml.append("<uws:runId").append(getUWSNamespace(root));
-		if (job.getRunId() == null)
-			xml.append(" xsi:nil=\"true\" />");
-		else
-			xml.append(">").append(escapeXMLData(job.getRunId())).append("</uws:runId>");
-		return xml.toString();
+		if (job.getRunId() != null){
+			StringBuffer xml = new StringBuffer(root ? getHeader() : "");
+			xml.append("<runId").append(getUWSNamespace(root));
+			xml.append(">").append(escapeXMLData(job.getRunId())).append("</runId>");
+			return xml.toString();
+		}else
+			return "";
 	}
 
 	@Override
 	public String getOwnerID(final UWSJob job, final boolean root){
 		StringBuffer xml = new StringBuffer(root ? getHeader() : "");
-		xml.append("<uws:ownerId").append(getUWSNamespace(root));
+		xml.append("<ownerId").append(getUWSNamespace(root));
 		if (job.getOwner() == null)
 			xml.append(" xsi:nil=\"true\" />");
 		else
-			xml.append(">").append(escapeXMLData(job.getOwner().getPseudo())).append("</uws:ownerId>");
+			xml.append(">").append(escapeXMLData(job.getOwner().getPseudo())).append("</ownerId>");
 		return xml.toString();
 	}
 
 	@Override
 	public String getPhase(final UWSJob job, final boolean root){
-		return (new StringBuffer(root ? getHeader() : "")).append("<uws:phase").append(getUWSNamespace(root)).append(">").append(job.getPhase()).append("</uws:phase>").toString();
+		return (new StringBuffer(root ? getHeader() : "")).append("<phase").append(getUWSNamespace(root)).append(">").append(job.getPhase()).append("</phase>").toString();
 	}
 
 	@Override
 	public String getQuote(final UWSJob job, final boolean root){
 		StringBuffer xml = new StringBuffer(root ? getHeader() : "");
-		xml.append("<uws:quote").append(getUWSNamespace(root));
+		xml.append("<quote").append(getUWSNamespace(root));
 		if (job.getQuote() <= 0)
 			xml.append(" xsi:nil=\"true\" />");
 		else
-			xml.append(">").append(job.getQuote()).append("</uws:quote>");
+			xml.append(">").append(job.getQuote()).append("</quote>");
 		return xml.toString();
 	}
 
 	@Override
 	public String getStartTime(final UWSJob job, final boolean root){
 		StringBuffer xml = new StringBuffer(root ? getHeader() : "");
-		xml.append("<uws:startTime").append(getUWSNamespace(root));
+		xml.append("<startTime").append(getUWSNamespace(root));
 		if (job.getStartTime() == null)
 			xml.append(" xsi:nil=\"true\" />");
 		else
-			xml.append(">").append(ISO8601Format.format(job.getStartTime())).append("</uws:startTime>");
+			xml.append(">").append(ISO8601Format.format(job.getStartTime())).append("</startTime>");
 		return xml.toString();
 	}
 
 	@Override
 	public String getEndTime(final UWSJob job, final boolean root){
 		StringBuffer xml = new StringBuffer(root ? getHeader() : "");
-		xml.append("<uws:endTime").append(getUWSNamespace(root));
+		xml.append("<endTime").append(getUWSNamespace(root));
 		if (job.getEndTime() == null)
 			xml.append(" xsi:nil=\"true\" />");
 		else
-			xml.append(">").append(ISO8601Format.format(job.getEndTime())).append("</uws:endTime>");
+			xml.append(">").append(ISO8601Format.format(job.getEndTime())).append("</endTime>");
 		return xml.toString();
 	}
 
 	@Override
 	public String getDestructionTime(final UWSJob job, final boolean root){
 		StringBuffer xml = new StringBuffer(root ? getHeader() : "");
-		xml.append("<uws:destruction").append(getUWSNamespace(root));
+		xml.append("<destruction").append(getUWSNamespace(root));
 		if (job.getDestructionTime() == null)
 			xml.append(" xsi:nil=\"true\" />");
 		else
-			xml.append(">").append(ISO8601Format.format(job.getDestructionTime())).append("</uws:destruction>");
+			xml.append(">").append(ISO8601Format.format(job.getDestructionTime())).append("</destruction>");
 		return xml.toString();
 	}
 
 	@Override
 	public String getExecutionDuration(final UWSJob job, final boolean root){
-		return (new StringBuffer(root ? getHeader() : "")).append("<uws:executionDuration").append(getUWSNamespace(root)).append(">").append(job.getExecutionDuration()).append("</uws:executionDuration>").toString();
+		return (new StringBuffer(root ? getHeader() : "")).append("<executionDuration").append(getUWSNamespace(root)).append(">").append(job.getExecutionDuration()).append("</executionDuration>").toString();
 	}
 
 	@Override
 	public String getErrorSummary(final ErrorSummary error, final boolean root){
-		StringBuffer xml = new StringBuffer(root ? getHeader() : "");
-		xml.append(tabPrefix).append("<uws:errorSummary").append(getUWSNamespace(root));
 		if (error != null){
+			StringBuffer xml = new StringBuffer(root ? getHeader() : "");
+			xml.append(tabPrefix).append("<errorSummary").append(getUWSNamespace(root));
 			xml.append(" type=\"").append(error.getType()).append("\"").append(" hasDetail=\"").append(error.hasDetail()).append("\">");
-			xml.append("\n\t").append(tabPrefix).append("<uws:message>").append(escapeXMLData(error.getMessage())).append("</uws:message>");
-			xml.append("\n").append(tabPrefix).append("</uws:errorSummary>");
+			xml.append("\n\t").append(tabPrefix).append("<message>").append(escapeXMLData(error.getMessage())).append("</message>");
+			xml.append("\n").append(tabPrefix).append("</errorSummary>");
+			return xml.toString();
 		}else
-			xml.append(" xsi:nil=\"true\" />");
-		return xml.toString();
+			return "";
 	}
 
 	@Override
 	public String getAdditionalParameters(final UWSJob job, final boolean root){
 		StringBuffer xml = new StringBuffer(root ? getHeader() : "");
-		xml.append(tabPrefix).append("<uws:parameters").append(getUWSNamespace(root)).append(">");
+		xml.append(tabPrefix).append("<parameters").append(getUWSNamespace(root)).append(">");
 		String newLine = "\n\t" + tabPrefix;
 		for(String paramName : job.getAdditionalParameters())
 			xml.append(newLine).append(getAdditionalParameter(paramName, job.getAdditionalParameterValue(paramName), false));
-		xml.append("\n").append(tabPrefix).append("</uws:parameters>");
+		xml.append("\n").append(tabPrefix).append("</parameters>");
 		return xml.toString();
 	}
 
@@ -345,7 +349,7 @@ public class XMLSerializer extends UWSSerializer {
 			if (root)
 				return paramValue.toString();
 			else
-				return (new StringBuffer("<uws:parameter")).append(getUWSNamespace(root)).append(" id=\"").append(escapeXMLAttribute(paramName)).append("\">").append(escapeXMLData(paramValue.toString())).append("</uws:parameter>").toString();
+				return (new StringBuffer("<parameter")).append(getUWSNamespace(root)).append(" id=\"").append(escapeXMLAttribute(paramName)).append("\">").append(escapeXMLData(paramValue.toString())).append("</parameter>").toString();
 		}else
 			return "";
 	}
@@ -353,29 +357,35 @@ public class XMLSerializer extends UWSSerializer {
 	@Override
 	public String getResults(final UWSJob job, final boolean root){
 		StringBuffer xml = new StringBuffer(root ? getHeader() : "");
-		xml.append(tabPrefix).append("<uws:results").append(getUWSNamespace(root)).append(">");
+		xml.append(tabPrefix).append("<results").append(getUWSNamespace(root)).append(">");
 
 		Iterator<Result> it = job.getResults();
 		String newLine = "\n\t" + tabPrefix;
 		while(it.hasNext())
 			xml.append(newLine).append(getResult(it.next(), false));
-		xml.append("\n").append(tabPrefix).append("</uws:results>");
+		xml.append("\n").append(tabPrefix).append("</results>");
 		return xml.toString();
 	}
 
 	@Override
 	public String getResult(final Result result, final boolean root){
 		StringBuffer xml = new StringBuffer(root ? getHeader() : "");
-		xml.append("<uws:result").append(getUWSNamespace(root)).append(" id=\"").append(escapeXMLAttribute(result.getId())).append("\"");
+		xml.append("<result").append(getUWSNamespace(root)).append(" id=\"").append(escapeXMLAttribute(result.getId())).append("\"");
 		if (result.getHref() != null){
 			if (result.getType() != null)
 				xml.append(" xlink:type=\"").append(escapeXMLAttribute(result.getType())).append("\"");
 			xml.append(" xlink:href=\"").append(escapeURL(result.getHref())).append("\"");
 		}
-		if (result.getMimeType() != null)
-			xml.append(" mime=\"").append(escapeXMLAttribute(result.getMimeType())).append("\"");
-		if (result.getSize() >= 0)
-			xml.append(" size=\"").append(result.getSize()).append("\"");
+
+		/* Note: THE FOLLOWING ATTRIBUTES MAY PROVIDE USEFUL INFORMATION TO USERS, BUT THEY ARE NOT ALLOWED BY THE CURRENT UWS STANDARD.
+		 *       HOWEVER, IF, ONE DAY, THEY ARE, THE FOLLOWING LINES SHOULD BE UNCOMNENTED. 
+		 *
+		 * if (result.getMimeType() != null)
+		 * 	xml.append(" mime=\"").append(escapeXMLAttribute(result.getMimeType())).append("\"");
+		 * if (result.getSize() >= 0)
+		 * 	xml.append(" size=\"").append(result.getSize()).append("\"");
+		 */
+
 		return xml.append(" />").toString();
 	}
 
-- 
GitLab