<?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>PublicationHelper.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.api.impl</a> &gt; <span class="el_source">PublicationHelper.java</span></div><h1>PublicationHelper.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.api.impl;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.persistence.EntityManager;

import org.apache.juddi.mapping.MappingModelToApi;
import org.apache.juddi.model.UddiEntityPublisher;
import org.apache.juddi.query.FindBusinessByPublisherQuery;
import org.apache.juddi.query.FindPublisherAssertionByBusinessQuery;
import org.uddi.api_v3.AssertionStatusItem;
import org.uddi.api_v3.CompletionStatus;
import org.uddi.v3_service.DispositionReportFaultMessage;

/**
 * Used to factor out publication functionality that is used in more than one spot.
 * 
 * @author &lt;a href=&quot;mailto:jfaath@apache.org&quot;&gt;Jeff Faath&lt;/a&gt;
 */
<span class="nc" id="L38">public class PublicationHelper {</span>

	public static List&lt;AssertionStatusItem&gt; getAssertionStatusItemList(UddiEntityPublisher publisher, CompletionStatus completionStatus, EntityManager em) throws DispositionReportFaultMessage {
<span class="fc" id="L41">		List&lt;org.uddi.api_v3.AssertionStatusItem&gt; result = new ArrayList&lt;org.uddi.api_v3.AssertionStatusItem&gt;(0);</span>

<span class="fc" id="L43">		List&lt;?&gt; businessKeysFound = null;</span>
<span class="fc" id="L44">		businessKeysFound = FindBusinessByPublisherQuery.select(em, null, publisher, businessKeysFound);</span>
		
<span class="fc" id="L46">		List&lt;org.apache.juddi.model.PublisherAssertion&gt; pubAssertionList = FindPublisherAssertionByBusinessQuery.select(em, businessKeysFound, completionStatus);</span>
<span class="pc bpc" id="L47" title="1 of 2 branches missed.">                if (pubAssertionList==null)</span>
<span class="nc" id="L48">                    return result;</span>
<span class="pc bpc" id="L49" title="1 of 2 branches missed.">		for(org.apache.juddi.model.PublisherAssertion modelPubAssertion : pubAssertionList) {</span>
<span class="nc" id="L50">			org.uddi.api_v3.AssertionStatusItem apiAssertionStatusItem = new org.uddi.api_v3.AssertionStatusItem();</span>

<span class="nc" id="L52">			MappingModelToApi.mapAssertionStatusItem(modelPubAssertion, apiAssertionStatusItem, businessKeysFound);</span>
			
<span class="nc" id="L54">			result.add(apiAssertionStatusItem);</span>
<span class="nc" id="L55">		}</span>
		
<span class="fc" id="L57">		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>