<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>TypeConvertor.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">jUDDI Core Services</a> &gt; <a href="index.source.html" class="el_package">org.apache.juddi.subscription</a> &gt; <span class="el_source">TypeConvertor.java</span></div><h1>TypeConvertor.java</h1><pre class="source lang-java linenums">/*
 * Copyright 2001-2008 The Apache Software Foundation.
 * 
 * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
 * 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 &quot;AS IS&quot; 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.juddi.subscription;

import java.util.Date;
import java.util.GregorianCalendar;

import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.Duration;
import javax.xml.datatype.XMLGregorianCalendar;

import org.apache.juddi.v3.error.ErrorMessage;
import org.apache.juddi.v3.error.FatalErrorException;
import org.uddi.v3_service.DispositionReportFaultMessage;
/**
 * 
 */
<span class="nc" id="L33">public class TypeConvertor {</span>
	public static XMLGregorianCalendar convertDateToXMLGregorianCalendar(Date date) throws DispositionReportFaultMessage {
<span class="fc" id="L35">		XMLGregorianCalendar result = null;</span>
		try { 
<span class="pc bpc" id="L37" title="1 of 2 branches missed.">			if (date!=null) {</span>
<span class="fc" id="L38">				GregorianCalendar gc = new GregorianCalendar();</span>
<span class="fc" id="L39">				gc.setTimeInMillis(date.getTime());</span>
				
<span class="fc" id="L41">				DatatypeFactory df = DatatypeFactory.newInstance();</span>
<span class="fc" id="L42">				result = df.newXMLGregorianCalendar(gc);</span>
			}
		}
<span class="nc" id="L45">		catch(DatatypeConfigurationException ce) { </span>
<span class="nc" id="L46">			throw new FatalErrorException(new ErrorMessage(&quot;errors.Unspecified&quot;));</span>
<span class="fc" id="L47">		}</span>
		
<span class="fc" id="L49">		return result;</span>
	}
	
	public static Duration convertStringToDuration(String duration) throws DispositionReportFaultMessage {
<span class="fc bfc" id="L53" title="All 2 branches covered.">		if (duration==null) return null;</span>
<span class="fc" id="L54">		Duration result = null;</span>
		try { 
			
<span class="fc" id="L57">			DatatypeFactory df = DatatypeFactory.newInstance();</span>
<span class="fc" id="L58">			result = df.newDuration(duration);</span>
		}
<span class="nc" id="L60">		catch(DatatypeConfigurationException ce) { </span>
<span class="nc" id="L61">			throw new FatalErrorException(new ErrorMessage(&quot;errors.Unspecified&quot;));</span>
<span class="fc" id="L62">		}</span>

<span class="fc" id="L64">		return result;</span>
	}
}
</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.7.9.201702052155</span></div></body></html>