<?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>MappingModelToApi.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 - OpenJPA</a> &gt; <a href="index.source.html" class="el_package">org.apache.juddi.mapping</a> &gt; <span class="el_source">MappingModelToApi.java</span></div><h1>MappingModelToApi.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.mapping;

import java.math.BigInteger;
import java.util.GregorianCalendar;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import org.w3._2000._09.xmldsig_.X509IssuerSerialType;
import java.io.ByteArrayInputStream;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.EntityManager;
import javax.xml.bind.JAXB;
import javax.xml.bind.JAXBElement;

import javax.xml.bind.JAXBException;
import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.juddi.config.AppConfig;
import org.apache.juddi.config.Property;
import org.apache.juddi.jaxb.JAXBMarshaller;
import org.apache.juddi.model.CanonicalizationMethod;
import org.apache.juddi.model.ControlMessage;
import org.apache.juddi.model.Edge;
import org.apache.juddi.model.EdgeReceiverAlternate;
import org.apache.juddi.model.KeyInfo;
import org.apache.juddi.model.OverviewDoc;
import org.apache.juddi.model.Reference;
import org.apache.juddi.model.SignatureTransform;
import org.apache.juddi.model.SignatureValue;
import org.apache.juddi.model.SignedInfo;
import org.apache.juddi.model.UddiEntity;
import org.apache.juddi.model.KeyDataValue;
import org.apache.juddi.model.Node;
import org.apache.juddi.model.ReplicationConfiguration;
import org.apache.juddi.model.ReplicationConfigurationNode;
import org.apache.juddi.model.Signature;
import org.apache.juddi.model.SignatureTransformDataValue;
import org.apache.juddi.subscription.TypeConvertor;
import org.apache.juddi.v3.client.cryptor.XmlUtils;
import org.apache.juddi.v3.error.ErrorMessage;
import org.apache.juddi.v3.error.FatalErrorException;
import org.uddi.api_v3.BusinessEntity;
import org.uddi.api_v3.CompletionStatus;
import org.uddi.api_v3.Contact;
import org.uddi.api_v3.Contacts;
import org.uddi.api_v3.OperationalInfo;
import org.uddi.api_v3.PersonName;
import org.uddi.repl_v3.ChangeRecord;
import org.uddi.repl_v3.ChangeRecordIDType;
import org.uddi.repl_v3.CommunicationGraph;
import org.uddi.repl_v3.Operator;
import org.uddi.repl_v3.OperatorStatusType;
import org.uddi.sub_v3.SubscriptionFilter;
import org.uddi.v3_service.DispositionReportFaultMessage;
import org.w3._2000._09.xmldsig_.CanonicalizationMethodType;
import org.w3._2000._09.xmldsig_.DSAKeyValueType;
import org.w3._2000._09.xmldsig_.DigestMethodType;
import org.w3._2000._09.xmldsig_.KeyInfoType;
import org.w3._2000._09.xmldsig_.KeyValueType;
import org.w3._2000._09.xmldsig_.PGPDataType;
import org.w3._2000._09.xmldsig_.RSAKeyValueType;
import org.w3._2000._09.xmldsig_.ReferenceType;
import org.w3._2000._09.xmldsig_.RetrievalMethodType;
import org.w3._2000._09.xmldsig_.SPKIDataType;
import org.w3._2000._09.xmldsig_.SignatureMethodType;
import org.w3._2000._09.xmldsig_.SignatureType;
import org.w3._2000._09.xmldsig_.SignatureValueType;
import org.w3._2000._09.xmldsig_.SignedInfoType;
import org.w3._2000._09.xmldsig_.TransformType;
import org.w3._2000._09.xmldsig_.TransformsType;
import org.w3._2000._09.xmldsig_.X509DataType;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

/**
 * @author &lt;a href=&quot;mailto:jfaath@apache.org&quot;&gt;Jeff Faath&lt;/a&gt;
 * @author &lt;a href=&quot;mailto:kstam@apache.org&quot;&gt;Kurt T Stam&lt;/a&gt;
 */
<span class="nc" id="L106">public class MappingModelToApi {</span>

<span class="fc" id="L108">        private static Log logger = LogFactory.getLog(MappingModelToApi.class);</span>

        public static void mapPublisher(org.apache.juddi.model.Publisher modelPublisher,
             org.apache.juddi.api_v3.Publisher apiPublisher)
             throws DispositionReportFaultMessage {

<span class="fc" id="L114">                apiPublisher.setAuthorizedName(modelPublisher.getAuthorizedName());</span>
<span class="fc" id="L115">                apiPublisher.setPublisherName(modelPublisher.getPublisherName());</span>
<span class="fc" id="L116">                apiPublisher.setEmailAddress(modelPublisher.getEmailAddress());</span>
<span class="fc" id="L117">                apiPublisher.setIsAdmin(modelPublisher.getIsAdmin());</span>
<span class="fc" id="L118">                apiPublisher.setIsEnabled(modelPublisher.getIsEnabled());</span>
<span class="fc" id="L119">                apiPublisher.setMaxBindingsPerService(modelPublisher.getMaxBindingsPerService());</span>
<span class="fc" id="L120">                apiPublisher.setMaxBusinesses(modelPublisher.getMaxBusinesses());</span>
<span class="fc" id="L121">                apiPublisher.setMaxServicePerBusiness(modelPublisher.getMaxServicesPerBusiness());</span>
<span class="fc" id="L122">                apiPublisher.setMaxTModels(modelPublisher.getMaxTmodels());</span>
<span class="fc" id="L123">                mapSignature(modelPublisher.getSignatures(), apiPublisher.getSignature());</span>
<span class="fc" id="L124">        }</span>

        public static void mapBusinessEntity(org.apache.juddi.model.BusinessEntity modelBusinessEntity,
             org.uddi.api_v3.BusinessEntity apiBusinessEntity)
             throws DispositionReportFaultMessage {

<span class="fc" id="L130">                apiBusinessEntity.setBusinessKey(modelBusinessEntity.getEntityKey());</span>

<span class="fc" id="L132">                mapBusinessNames(modelBusinessEntity.getBusinessNames(), apiBusinessEntity.getName());</span>
<span class="fc" id="L133">                mapBusinessDescriptions(modelBusinessEntity.getBusinessDescrs(), apiBusinessEntity.getDescription());</span>

<span class="fc" id="L135">                mapDiscoveryUrls(modelBusinessEntity.getDiscoveryUrls(), apiBusinessEntity.getDiscoveryURLs(), apiBusinessEntity);</span>
<span class="fc" id="L136">                mapContacts(modelBusinessEntity.getContacts(), apiBusinessEntity.getContacts(), apiBusinessEntity);</span>
<span class="fc" id="L137">                mapBusinessIdentifiers(modelBusinessEntity.getBusinessIdentifiers(), apiBusinessEntity.getIdentifierBag(), apiBusinessEntity);</span>
<span class="fc" id="L138">                apiBusinessEntity.setCategoryBag(mapCategoryBag(modelBusinessEntity.getCategoryBag(), apiBusinessEntity.getCategoryBag()));</span>

<span class="fc" id="L140">                mapBusinessServices(modelBusinessEntity.getBusinessServices(), modelBusinessEntity.getServiceProjections(), apiBusinessEntity.getBusinessServices(), apiBusinessEntity);</span>

<span class="fc" id="L142">                mapSignature(modelBusinessEntity.getSignatures(), apiBusinessEntity.getSignature());</span>
<span class="fc" id="L143">        }</span>

        public static void mapSignature(List&lt;org.apache.juddi.model.Signature&gt; signatureList,
             List&lt;org.w3._2000._09.xmldsig_.SignatureType&gt; apiSignatureList)
             throws DispositionReportFaultMessage {
<span class="fc" id="L148">                apiSignatureList.clear();</span>
<span class="fc bfc" id="L149" title="All 2 branches covered.">                for (org.apache.juddi.model.Signature modelSig : signatureList) {</span>
<span class="fc" id="L150">                        SignatureType apiSignature = new SignatureType();</span>
<span class="fc" id="L151">                        apiSignature.setId(modelSig.getXmlID());</span>

<span class="fc" id="L153">                        SignedInfo modelSignedInfo = modelSig.getSignedInfo();</span>
<span class="fc" id="L154">                        SignedInfoType apiSignedInfoType = new SignedInfoType();</span>
<span class="fc" id="L155">                        apiSignature.setSignedInfo(apiSignedInfoType);</span>
                        // Canonicalization method
<span class="fc" id="L157">                        CanonicalizationMethod modelCanonMethod = modelSignedInfo.getCanonicalizationMethod();</span>
<span class="fc" id="L158">                        CanonicalizationMethodType apiCanonMethod = new CanonicalizationMethodType();</span>
<span class="fc" id="L159">                        apiCanonMethod.setAlgorithm(modelCanonMethod.getAlgorithm());</span>
<span class="fc" id="L160">                        apiSignedInfoType.setCanonicalizationMethod(apiCanonMethod);</span>

                        // Signature Method
<span class="fc" id="L163">                        String sigAlg = modelSignedInfo.getSignatureMethod().getAlgorithm();</span>
<span class="fc" id="L164">                        SignatureMethodType apiSigMethod = new SignatureMethodType();</span>
<span class="fc" id="L165">                        apiSigMethod.setAlgorithm(sigAlg);</span>
<span class="fc" id="L166">                        apiSignedInfoType.setSignatureMethod(apiSigMethod);</span>

                        // References
<span class="fc" id="L169">                        List&lt;Reference&gt; modelReferenceList = modelSignedInfo.getReference();</span>
<span class="fc" id="L170">                        List&lt;ReferenceType&gt; apiReferenceList = apiSignedInfoType.getReference();</span>
<span class="fc bfc" id="L171" title="All 2 branches covered.">                        for (Reference modelRef : modelReferenceList) {</span>
<span class="fc" id="L172">                                ReferenceType apiRef = new ReferenceType();</span>
<span class="fc" id="L173">                                String refUri = modelRef.getUri();</span>
<span class="pc bpc" id="L174" title="1 of 2 branches missed.">                                if (refUri == null) {</span>
<span class="nc" id="L175">                                        refUri = &quot;&quot;;</span>
                                }
<span class="fc" id="L177">                                apiRef.setURI(refUri);</span>

<span class="fc" id="L179">                                List&lt;SignatureTransform&gt; modelSigTransformList = modelRef.getTransforms();</span>
<span class="fc" id="L180">                                TransformsType apiTransformsType = apiRef.getTransforms();</span>
<span class="pc bpc" id="L181" title="1 of 2 branches missed.">                                if (apiTransformsType == null) {</span>
<span class="fc" id="L182">                                        apiTransformsType = new TransformsType();</span>
<span class="fc" id="L183">                                        apiRef.setTransforms(apiTransformsType);</span>
                                }
<span class="fc" id="L185">                                List&lt;TransformType&gt; apiTransformList = apiTransformsType.getTransform();</span>
<span class="fc bfc" id="L186" title="All 2 branches covered.">                                for (SignatureTransform modelSigTransform : modelSigTransformList) {</span>
<span class="fc" id="L187">                                        String modelTransformAlgStr = modelSigTransform.getTransform();</span>
<span class="fc" id="L188">                                        TransformType apiTransform = new TransformType();</span>
<span class="fc" id="L189">                                        apiTransform.setAlgorithm(modelTransformAlgStr);</span>

<span class="fc" id="L191">                                        List&lt;SignatureTransformDataValue&gt; sigTransformSDVList = modelSigTransform.getSignatureTransformDataValue();</span>
<span class="fc bfc" id="L192" title="All 2 branches covered.">                                        for (SignatureTransformDataValue sigTransformSDV : sigTransformSDVList) {</span>
<span class="fc" id="L193">                                                String type = sigTransformSDV.getContentType();</span>
<span class="fc" id="L194">                                                byte[] xformBytes = sigTransformSDV.getContentBytes();</span>
<span class="fc" id="L195">                                                Object transformObject = convertDataToTransformContent(type, xformBytes);</span>
<span class="fc" id="L196">                                                apiTransform.getContent().add(transformObject);</span>
<span class="fc" id="L197">                                        }</span>

<span class="fc" id="L199">                                        apiTransformList.add(apiTransform);</span>
<span class="fc" id="L200">                                }</span>

<span class="fc" id="L202">                                String digestMethodStr = modelRef.getDigestMethod();</span>
<span class="fc" id="L203">                                byte[] digestValBytes = modelRef.getDigestValue();</span>

<span class="fc" id="L205">                                DigestMethodType apiDigestMethod = new DigestMethodType();</span>
<span class="fc" id="L206">                                apiDigestMethod.setAlgorithm(digestMethodStr);</span>
<span class="fc" id="L207">                                apiRef.setDigestMethod(apiDigestMethod);</span>
<span class="fc" id="L208">                                apiRef.setDigestValue(digestValBytes);</span>

<span class="fc" id="L210">                                apiReferenceList.add(apiRef);</span>
<span class="fc" id="L211">                        }</span>

                        // Signature Value
<span class="fc" id="L214">                        SignatureValueType apiSignatureValue = new SignatureValueType();</span>
<span class="fc" id="L215">                        SignatureValue modelSigValue = modelSig.getSignatureValue();</span>
<span class="fc" id="L216">                        apiSignatureValue.setId(modelSigValue.getXmlID());</span>
<span class="fc" id="L217">                        apiSignatureValue.setValue(modelSigValue.getValue());</span>

<span class="fc" id="L219">                        apiSignature.setSignatureValue(apiSignatureValue);</span>

<span class="fc" id="L221">                        KeyInfoType apiKeyInfo = new KeyInfoType();</span>
<span class="fc" id="L222">                        KeyInfo modelKeyInfo = modelSig.getKeyInfo();</span>
<span class="fc" id="L223">                        apiKeyInfo.setId(modelKeyInfo.getXmlID());</span>

<span class="fc" id="L225">                        List&lt;KeyDataValue&gt; modelKeyDataValueList = modelKeyInfo.getKeyDataValue();</span>
<span class="fc" id="L226">                        List&lt;Object&gt; apiX509KeyInfoList = apiKeyInfo.getContent();</span>
<span class="fc" id="L227">                        mapModelKeyDataValue(modelKeyDataValueList, apiX509KeyInfoList);</span>
<span class="fc" id="L228">                        apiSignature.setKeyInfo(apiKeyInfo);</span>
<span class="fc" id="L229">                        apiSignatureList.add(apiSignature);</span>
<span class="fc" id="L230">                }</span>
<span class="fc" id="L231">        }</span>

        private static void mapModelKeyDataValue(List&lt;KeyDataValue&gt; modelKeyDataValueList, List&lt;Object&gt; parentKeyDataList) {
<span class="fc bfc" id="L234" title="All 2 branches covered.">                for (KeyDataValue modelKeyDataValue : modelKeyDataValueList) {</span>
<span class="fc" id="L235">                        String tagName = modelKeyDataValue.getKeyDataName();</span>
<span class="fc" id="L236">                        String dataType = modelKeyDataValue.getKeyDataType();</span>
<span class="fc" id="L237">                        byte[] contentBytes = modelKeyDataValue.getKeyDataValueBytes();</span>
<span class="fc" id="L238">                        String contentStr = modelKeyDataValue.getKeyDataValueString();</span>
<span class="fc bfc" id="L239" title="All 2 branches covered.">                        Object contents = contentBytes != null ? contentBytes : contentStr;</span>

<span class="fc bfc" id="L241" title="All 2 branches covered.">                        if (contents == null) {</span>
<span class="fc" id="L242">                                List&lt;Object&gt; childKeyDataList = new ArrayList&lt;Object&gt;();</span>
<span class="fc bfc" id="L243" title="All 2 branches covered.">                                if (dataType.equals(X509DataType.class.getSimpleName())) {</span>
<span class="fc" id="L244">                                        X509DataType x509DataType = new X509DataType();</span>
<span class="fc" id="L245">                                        mapModelKeyDataValue(modelKeyDataValue.getKeyDataValueList(), childKeyDataList);</span>
<span class="fc" id="L246">                                        x509DataType.getX509IssuerSerialOrX509SKIOrX509SubjectName().addAll(childKeyDataList);</span>
<span class="fc" id="L247">                                        JAXBElement dataJAXB = new JAXBElement(new QName(&quot;http://www.w3.org/2000/09/xmldsig#&quot;, tagName), X509DataType.class, x509DataType);</span>
<span class="fc" id="L248">                                        parentKeyDataList.add(dataJAXB);</span>
<span class="fc bfc" id="L249" title="All 2 branches covered.">                                } else if (dataType.equals(RetrievalMethodType.class.getSimpleName())) {</span>
<span class="fc" id="L250">                                        RetrievalMethodType retrievalMethodType = new RetrievalMethodType();</span>
<span class="fc" id="L251">                                        TransformsType transformsType = new TransformsType();</span>
<span class="fc bfc" id="L252" title="All 2 branches covered.">                                        for (KeyDataValue retrievalMethodKDV : modelKeyDataValue.getKeyDataValueList()) {</span>
<span class="fc bfc" id="L253" title="All 2 branches covered.">                                                if (retrievalMethodKDV.getKeyDataName().equals(&quot;Transform&quot;)) {</span>
<span class="fc" id="L254">                                                        TransformType tType = new TransformType();</span>
<span class="fc" id="L255">                                                        tType.setAlgorithm(retrievalMethodKDV.getKeyDataValueString());</span>

<span class="fc bfc" id="L257" title="All 2 branches covered.">                                                        for (KeyDataValue transformContentKDV : retrievalMethodKDV.getKeyDataValueList()) {</span>
<span class="fc" id="L258">                                                                String type = transformContentKDV.getKeyDataType();</span>
<span class="fc" id="L259">                                                                byte[] xformBytes = transformContentKDV.getKeyDataValueBytes();</span>
<span class="fc" id="L260">                                                                Object transformObject = convertDataToTransformContent(type, xformBytes);</span>
<span class="fc" id="L261">                                                                tType.getContent().add(transformObject);</span>
<span class="fc" id="L262">                                                        }</span>

<span class="fc" id="L264">                                                        transformsType.getTransform().add(tType);</span>
<span class="fc bfc" id="L265" title="All 2 branches covered.">                                                } else if (retrievalMethodKDV.getKeyDataName().equals(&quot;Type&quot;)) {</span>
<span class="fc" id="L266">                                                        retrievalMethodType.setType(retrievalMethodKDV.getKeyDataValueString());</span>
<span class="pc bpc" id="L267" title="1 of 2 branches missed.">                                                } else if (retrievalMethodKDV.getKeyDataName().equals(&quot;URI&quot;)) {</span>
<span class="fc" id="L268">                                                        retrievalMethodType.setURI(retrievalMethodKDV.getKeyDataValueString());</span>
                                                } else {
<span class="nc" id="L270">                                                        throw new RuntimeException(&quot;Unrecognized key data type: &quot; + retrievalMethodKDV.getKeyDataType());</span>
                                                }
<span class="fc" id="L272">                                        }</span>
<span class="pc bpc" id="L273" title="2 of 4 branches missed.">                                        if (transformsType.getTransform() != null &amp;&amp; !transformsType.getTransform().isEmpty()) {</span>
<span class="fc" id="L274">                                                retrievalMethodType.setTransforms(transformsType);</span>
                                        }
<span class="fc" id="L276">                                        JAXBElement dataJAXB = new JAXBElement(new QName(&quot;http://www.w3.org/2000/09/xmldsig#&quot;, tagName), RetrievalMethodType.class, retrievalMethodType);</span>
<span class="fc" id="L277">                                        parentKeyDataList.add(dataJAXB);</span>
<span class="fc bfc" id="L278" title="All 2 branches covered.">                                } else if (dataType.equals(PGPDataType.class.getSimpleName())) {</span>
<span class="fc" id="L279">                                        PGPDataType pgpDataType = new PGPDataType();</span>

<span class="fc bfc" id="L281" title="All 2 branches covered.">                                        for (KeyDataValue pgpDataKDV : modelKeyDataValue.getKeyDataValueList()) {</span>
<span class="fc" id="L282">                                                String pgpDataTagName = pgpDataKDV.getKeyDataName();</span>
<span class="pc bpc" id="L283" title="1 of 2 branches missed.">                                                Object pgpDataContents = pgpDataKDV.getKeyDataValueBytes() != null ? pgpDataKDV.getKeyDataValueBytes() : pgpDataKDV.getKeyDataValueString();</span>
<span class="fc" id="L284">                                                Class pgpDataClazz = pgpDataContents.getClass();</span>
<span class="fc" id="L285">                                                JAXBElement jaxb = new JAXBElement(new QName(&quot;http://www.w3.org/2000/09/xmldsig#&quot;, pgpDataTagName), pgpDataClazz, pgpDataContents);</span>
<span class="fc" id="L286">                                                pgpDataType.getContent().add(jaxb);</span>
<span class="fc" id="L287">                                        }</span>

<span class="fc" id="L289">                                        JAXBElement dataJAXB = new JAXBElement(new QName(&quot;http://www.w3.org/2000/09/xmldsig#&quot;, tagName), PGPDataType.class, pgpDataType);</span>
<span class="fc" id="L290">                                        parentKeyDataList.add(dataJAXB);</span>
<span class="fc bfc" id="L291" title="All 2 branches covered.">                                } else if (dataType.equals(SPKIDataType.class.getSimpleName())) {</span>
<span class="fc" id="L292">                                        SPKIDataType spkiDataType = new SPKIDataType();</span>

<span class="fc bfc" id="L294" title="All 2 branches covered.">                                        for (KeyDataValue spkiDataKDV : modelKeyDataValue.getKeyDataValueList()) {</span>
<span class="fc" id="L295">                                                String spkiDataTagName = spkiDataKDV.getKeyDataName();</span>
<span class="pc bpc" id="L296" title="1 of 2 branches missed.">                                                Object spkiDataContents = spkiDataKDV.getKeyDataValueBytes() != null ? spkiDataKDV.getKeyDataValueBytes() : spkiDataKDV.getKeyDataValueString();</span>
<span class="fc" id="L297">                                                Class spkiDataClazz = spkiDataContents.getClass();</span>
<span class="fc" id="L298">                                                JAXBElement jaxb = new JAXBElement(new QName(&quot;http://www.w3.org/2000/09/xmldsig#&quot;, spkiDataTagName), spkiDataClazz, spkiDataContents);</span>
<span class="fc" id="L299">                                                spkiDataType.getSPKISexpAndAny().add(jaxb);</span>
<span class="fc" id="L300">                                        }</span>

<span class="fc" id="L302">                                        JAXBElement dataJAXB = new JAXBElement(new QName(&quot;http://www.w3.org/2000/09/xmldsig#&quot;, tagName), SPKIDataType.class, spkiDataType);</span>
<span class="fc" id="L303">                                        parentKeyDataList.add(dataJAXB);</span>
<span class="pc bpc" id="L304" title="1 of 2 branches missed.">                                } else if (dataType.equals(KeyValueType.class.getSimpleName())) {</span>
<span class="fc" id="L305">                                        KeyValueType keyValueType = new KeyValueType();</span>
<span class="fc bfc" id="L306" title="All 2 branches covered.">                                        for (KeyDataValue keyValueDataKDV : modelKeyDataValue.getKeyDataValueList()) {</span>
<span class="fc bfc" id="L307" title="All 2 branches covered.">                                                for (KeyDataValue keyValueDataChildKDV : keyValueDataKDV.getKeyDataValueList()) {</span>
<span class="fc" id="L308">                                                        String keyDataDataType = keyValueDataChildKDV.getKeyDataType();</span>
<span class="fc bfc" id="L309" title="All 2 branches covered.">                                                        if (keyDataDataType.equals(&quot;DSAKeyValueType&quot;)) {</span>
<span class="fc" id="L310">                                                                DSAKeyValueType dsaKeyValueType = new DSAKeyValueType();</span>
<span class="fc bfc" id="L311" title="All 2 branches covered.">                                                                for (KeyDataValue dsaKDV : keyValueDataChildKDV.getKeyDataValueList()) {</span>
<span class="fc bfc" id="L312" title="All 2 branches covered.">                                                                        if (&quot;G&quot;.equals(dsaKDV.getKeyDataName())) {</span>
<span class="fc" id="L313">                                                                                dsaKeyValueType.setG(dsaKDV.getKeyDataValueBytes());</span>
<span class="fc bfc" id="L314" title="All 2 branches covered.">                                                                        } else if (&quot;P&quot;.equals(dsaKDV.getKeyDataName())) {</span>
<span class="fc" id="L315">                                                                                dsaKeyValueType.setP(dsaKDV.getKeyDataValueBytes());</span>
<span class="fc bfc" id="L316" title="All 2 branches covered.">                                                                        } else if (&quot;Q&quot;.equals(dsaKDV.getKeyDataName())) {</span>
<span class="fc" id="L317">                                                                                dsaKeyValueType.setQ(dsaKDV.getKeyDataValueBytes());</span>
<span class="fc bfc" id="L318" title="All 2 branches covered.">                                                                        } else if (&quot;Y&quot;.equals(dsaKDV.getKeyDataName())) {</span>
<span class="fc" id="L319">                                                                                dsaKeyValueType.setY(dsaKDV.getKeyDataValueBytes());</span>
<span class="fc bfc" id="L320" title="All 2 branches covered.">                                                                        } else if (&quot;J&quot;.equals(dsaKDV.getKeyDataName())) {</span>
<span class="fc" id="L321">                                                                                dsaKeyValueType.setJ(dsaKDV.getKeyDataValueBytes());</span>
<span class="fc bfc" id="L322" title="All 2 branches covered.">                                                                        } else if (&quot;Seed&quot;.equals(dsaKDV.getKeyDataName())) {</span>
<span class="fc" id="L323">                                                                                dsaKeyValueType.setSeed(dsaKDV.getKeyDataValueBytes());</span>
<span class="pc bpc" id="L324" title="1 of 2 branches missed.">                                                                        } else if (&quot;PgenCounter&quot;.equals(dsaKDV.getKeyDataName())) {</span>
<span class="fc" id="L325">                                                                                dsaKeyValueType.setPgenCounter(dsaKDV.getKeyDataValueBytes());</span>
                                                                        } else {
<span class="nc" id="L327">                                                                                throw new RuntimeException(&quot;Unrecognized dsa type: &quot; + dsaKDV.getKeyDataName());</span>
                                                                        }
<span class="fc" id="L329">                                                                }</span>
<span class="fc" id="L330">                                                                JAXBElement jaxb = new JAXBElement(new QName(&quot;http://www.w3.org/2000/09/xmldsig#&quot;, keyValueDataChildKDV.getKeyDataName()), DSAKeyValueType.class, dsaKeyValueType);</span>
<span class="fc" id="L331">                                                                keyValueType.getContent().add(jaxb);</span>
<span class="pc bpc" id="L332" title="1 of 2 branches missed.">                                                        } else if (keyDataDataType.equals(&quot;RSAKeyValueType&quot;)) {</span>
<span class="fc" id="L333">                                                                RSAKeyValueType rsaKeyValueType = new RSAKeyValueType();</span>
<span class="fc bfc" id="L334" title="All 2 branches covered.">                                                                for (KeyDataValue rsaKDV : keyValueDataChildKDV.getKeyDataValueList()) {</span>
<span class="fc bfc" id="L335" title="All 2 branches covered.">                                                                        if (&quot;Exponent&quot;.equals(rsaKDV.getKeyDataName())) {</span>
<span class="fc" id="L336">                                                                                rsaKeyValueType.setExponent(rsaKDV.getKeyDataValueBytes());</span>
<span class="pc bpc" id="L337" title="1 of 2 branches missed.">                                                                        } else if (&quot;Modulus&quot;.equals(rsaKDV.getKeyDataName())) {</span>
<span class="fc" id="L338">                                                                                rsaKeyValueType.setModulus(rsaKDV.getKeyDataValueBytes());</span>
                                                                        } else {
<span class="nc" id="L340">                                                                                throw new RuntimeException(&quot;Unrecognized dsa type: &quot; + rsaKDV.getKeyDataName());</span>
                                                                        }
<span class="fc" id="L342">                                                                }</span>
<span class="fc" id="L343">                                                                JAXBElement jaxb = new JAXBElement(new QName(&quot;http://www.w3.org/2000/09/xmldsig#&quot;, keyValueDataChildKDV.getKeyDataName()), RSAKeyValueType.class, rsaKeyValueType);</span>
<span class="fc" id="L344">                                                                keyValueType.getContent().add(jaxb);</span>
<span class="fc" id="L345">                                                        } else {</span>
<span class="nc" id="L346">                                                                throw new RuntimeException(&quot;Unrecognized element: &quot; + keyDataDataType);</span>
                                                        }
<span class="fc" id="L348">                                                }</span>
<span class="fc" id="L349">                                        }</span>
<span class="fc" id="L350">                                        JAXBElement dataJAXB = new JAXBElement(new QName(&quot;http://www.w3.org/2000/09/xmldsig#&quot;, tagName), KeyValueType.class, keyValueType);</span>
<span class="fc" id="L351">                                        parentKeyDataList.add(dataJAXB);</span>
<span class="fc" id="L352">                                } else {</span>
<span class="nc" id="L353">                                        throw new RuntimeException(&quot;Unrecognized type: &quot; + dataType);</span>
                                }
<span class="fc" id="L355">                        } else {</span>
<span class="fc bfc" id="L356" title="All 4 branches covered.">                                if (dataType != null &amp;&amp; dataType.equals(X509IssuerSerialType.class.getSimpleName())) {</span>
<span class="fc" id="L357">                                        X509IssuerSerialType x509IssuerSerialType = new X509IssuerSerialType();</span>
<span class="fc" id="L358">                                        x509IssuerSerialType.setX509IssuerName(contentStr);</span>
<span class="fc" id="L359">                                        x509IssuerSerialType.setX509SerialNumber(new BigInteger(contentBytes));</span>
<span class="fc" id="L360">                                        JAXBElement dataJAXB = new JAXBElement(new QName(&quot;http://www.w3.org/2000/09/xmldsig#&quot;, tagName), X509IssuerSerialType.class, x509IssuerSerialType);</span>
<span class="fc" id="L361">                                        parentKeyDataList.add(dataJAXB);</span>
<span class="fc" id="L362">                                } else {</span>
<span class="fc" id="L363">                                        JAXBElement dataJAXB = new JAXBElement(new QName(&quot;http://www.w3.org/2000/09/xmldsig#&quot;, tagName), contents.getClass(), contents);</span>
<span class="fc" id="L364">                                        parentKeyDataList.add(dataJAXB);</span>
                                }
                        }
<span class="fc" id="L367">                }</span>
<span class="fc" id="L368">        }</span>

        public static void mapBusinessNames(List&lt;org.apache.juddi.model.BusinessName&gt; modelNameList,
             List&lt;org.uddi.api_v3.Name&gt; apiNameList)
             throws DispositionReportFaultMessage {
<span class="fc" id="L373">                apiNameList.clear();</span>

<span class="fc bfc" id="L375" title="All 2 branches covered.">                for (org.apache.juddi.model.BusinessName modelName : modelNameList) {</span>
<span class="fc" id="L376">                        org.uddi.api_v3.Name apiName = new org.uddi.api_v3.Name();</span>
<span class="fc" id="L377">                        apiName.setLang(modelName.getLangCode());</span>
<span class="fc" id="L378">                        apiName.setValue(modelName.getName());</span>
<span class="fc" id="L379">                        apiNameList.add(apiName);</span>
<span class="fc" id="L380">                }</span>
<span class="fc" id="L381">        }</span>

        public static void mapBusinessDescriptions(List&lt;org.apache.juddi.model.BusinessDescr&gt; modelDescList,
             List&lt;org.uddi.api_v3.Description&gt; apiDescList)
             throws DispositionReportFaultMessage {
<span class="fc" id="L386">                apiDescList.clear();</span>

<span class="fc bfc" id="L388" title="All 2 branches covered.">                for (org.apache.juddi.model.BusinessDescr modelDesc : modelDescList) {</span>
<span class="fc" id="L389">                        org.uddi.api_v3.Description apiDesc = new org.uddi.api_v3.Description();</span>
<span class="fc" id="L390">                        apiDesc.setLang(modelDesc.getLangCode());</span>
<span class="fc" id="L391">                        apiDesc.setValue(modelDesc.getDescr());</span>
<span class="fc" id="L392">                        apiDescList.add(apiDesc);</span>
<span class="fc" id="L393">                }</span>
<span class="fc" id="L394">        }</span>

        public static void mapDiscoveryUrls(List&lt;org.apache.juddi.model.DiscoveryUrl&gt; modelDiscUrlList,
             org.uddi.api_v3.DiscoveryURLs apiDiscUrls,
             org.uddi.api_v3.BusinessEntity apiBusinessEntity)
             throws DispositionReportFaultMessage {
<span class="pc bpc" id="L400" title="1 of 4 branches missed.">                if (modelDiscUrlList == null || modelDiscUrlList.size() == 0) {</span>
<span class="fc" id="L401">                        return;</span>
                }

<span class="pc bpc" id="L404" title="1 of 2 branches missed.">                if (apiDiscUrls == null) {</span>
<span class="fc" id="L405">                        apiDiscUrls = new org.uddi.api_v3.DiscoveryURLs();</span>
                }

<span class="fc" id="L408">                List&lt;org.uddi.api_v3.DiscoveryURL&gt; apiDiscUrlList = apiDiscUrls.getDiscoveryURL();</span>
<span class="fc" id="L409">                apiDiscUrlList.clear();</span>

<span class="fc bfc" id="L411" title="All 2 branches covered.">                for (org.apache.juddi.model.DiscoveryUrl modelDiscUrl : modelDiscUrlList) {</span>
<span class="fc" id="L412">                        org.uddi.api_v3.DiscoveryURL apiDiscUrl = new org.uddi.api_v3.DiscoveryURL();</span>
<span class="fc" id="L413">                        apiDiscUrl.setUseType(modelDiscUrl.getUseType());</span>
<span class="fc" id="L414">                        String discoveryURL = modelDiscUrl.getUrl();</span>
                        try {
<span class="fc" id="L416">                                String baseUrl = AppConfig.getConfiguration().getString(Property.JUDDI_BASE_URL);</span>
<span class="pc bpc" id="L417" title="1 of 2 branches missed.">                                if (baseUrl == null) {</span>
<span class="nc" id="L418">                                        logger.warn(&quot;Token '&quot; + Property.JUDDI_BASE_URL + &quot;' not found in the juddiv3.xml, defaulting to '&quot;</span>
                                             + Property.DEFAULT_BASE_URL + &quot;'&quot;);
<span class="nc" id="L420">                                        baseUrl = Property.DEFAULT_BASE_URL;</span>
                                }
<span class="fc" id="L422">                                discoveryURL = discoveryURL.replaceAll(&quot;\\$\\{&quot; + Property.JUDDI_BASE_URL + &quot;\\}&quot;, baseUrl);</span>

<span class="fc" id="L424">                                baseUrl = AppConfig.getConfiguration().getString(Property.JUDDI_BASE_URL_SECURE);</span>
<span class="pc bpc" id="L425" title="1 of 2 branches missed.">                                if (baseUrl == null) {</span>
<span class="nc" id="L426">                                        logger.warn(&quot;Token '&quot; + Property.JUDDI_BASE_URL_SECURE + &quot;' not found in the juddiv3.xml, defaulting to '&quot;</span>
                                             + Property.JUDDI_BASE_URL_SECURE + &quot;'&quot;);
<span class="nc" id="L428">                                        baseUrl = Property.DEFAULT_BASE_URL_SECURE;</span>
                                }
<span class="fc" id="L430">                                discoveryURL = discoveryURL.replaceAll(&quot;\\$\\{&quot; + Property.JUDDI_BASE_URL_SECURE + &quot;\\}&quot;, baseUrl);</span>

<span class="nc" id="L432">                        } catch (ConfigurationException e) {</span>
<span class="nc" id="L433">                                logger.error(e.getMessage(), e);</span>
<span class="fc" id="L434">                        }</span>
<span class="fc" id="L435">                        apiDiscUrl.setValue(discoveryURL);</span>
<span class="fc" id="L436">                        apiDiscUrlList.add(apiDiscUrl);</span>
<span class="fc" id="L437">                }</span>
<span class="fc" id="L438">                apiBusinessEntity.setDiscoveryURLs(apiDiscUrls);</span>
<span class="fc" id="L439">        }</span>
        
        public static void mapContact(org.apache.juddi.model.Contact modelContact,
                org.uddi.api_v3.Contact apiContact) throws DispositionReportFaultMessage {
<span class="pc bpc" id="L443" title="1 of 2 branches missed.">                if (apiContact == null) {</span>
<span class="nc" id="L444">                        apiContact = new org.uddi.api_v3.Contact();</span>
                }
<span class="fc" id="L446">                apiContact.setUseType(modelContact.getUseType());</span>

<span class="fc" id="L448">                mapPersonNames(modelContact.getPersonNames(), apiContact.getPersonName());</span>
<span class="fc" id="L449">                mapContactDescriptions(modelContact.getContactDescrs(), apiContact.getDescription());</span>
<span class="fc" id="L450">                mapContactEmails(modelContact.getEmails(), apiContact.getEmail());</span>
<span class="fc" id="L451">                mapContactPhones(modelContact.getPhones(), apiContact.getPhone());</span>
<span class="fc" id="L452">                mapContactAddresses(modelContact.getAddresses(), apiContact.getAddress());</span>

<span class="fc" id="L454">        }</span>

        public static void mapContacts(List&lt;org.apache.juddi.model.Contact&gt; modelContactList,
             org.uddi.api_v3.Contacts apiContacts,
             org.uddi.api_v3.BusinessEntity apiBusinessEntity)
             throws DispositionReportFaultMessage {
<span class="pc bpc" id="L460" title="1 of 4 branches missed.">                if (modelContactList == null || modelContactList.size() == 0) {</span>
<span class="fc" id="L461">                        return;</span>
                }

<span class="fc bfc" id="L464" title="All 2 branches covered.">                if (apiContacts == null) {</span>
<span class="fc" id="L465">                        apiContacts = new org.uddi.api_v3.Contacts();</span>
                }

<span class="fc" id="L468">                List&lt;org.uddi.api_v3.Contact&gt; apiContactList = apiContacts.getContact();</span>
<span class="fc" id="L469">                apiContactList.clear();</span>

<span class="fc bfc" id="L471" title="All 2 branches covered.">                for (org.apache.juddi.model.Contact modelContact : modelContactList) {</span>
<span class="fc" id="L472">                        org.uddi.api_v3.Contact apiContact = new org.uddi.api_v3.Contact();</span>
                        
<span class="fc" id="L474">                        mapContact(modelContact,apiContact);</span>
                      
<span class="fc" id="L476">                        apiContactList.add(apiContact);</span>
<span class="fc" id="L477">                }</span>
<span class="fc" id="L478">                apiBusinessEntity.setContacts(apiContacts);</span>
<span class="fc" id="L479">        }</span>

        public static void mapContactDescriptions(List&lt;org.apache.juddi.model.ContactDescr&gt; modelDescList,
             List&lt;org.uddi.api_v3.Description&gt; apiDescList)
             throws DispositionReportFaultMessage {
<span class="fc" id="L484">                apiDescList.clear();</span>

<span class="fc bfc" id="L486" title="All 2 branches covered.">                for (org.apache.juddi.model.ContactDescr modelDesc : modelDescList) {</span>
<span class="fc" id="L487">                        org.uddi.api_v3.Description apiDesc = new org.uddi.api_v3.Description();</span>
<span class="fc" id="L488">                        apiDesc.setLang(modelDesc.getLangCode());</span>
<span class="fc" id="L489">                        apiDesc.setValue(modelDesc.getDescr());</span>
<span class="fc" id="L490">                        apiDescList.add(apiDesc);</span>
<span class="fc" id="L491">                }</span>
<span class="fc" id="L492">        }</span>

        public static void mapPersonNames(List&lt;org.apache.juddi.model.PersonName&gt; modelPersonNameList,
             List&lt;org.uddi.api_v3.PersonName&gt; apiPersonNameList)
             throws DispositionReportFaultMessage {
<span class="fc" id="L497">                apiPersonNameList.clear();</span>

<span class="fc bfc" id="L499" title="All 2 branches covered.">                for (org.apache.juddi.model.PersonName personName : modelPersonNameList) {</span>
<span class="fc" id="L500">                        org.uddi.api_v3.PersonName apiPersonName = new org.uddi.api_v3.PersonName();</span>
<span class="fc" id="L501">                        apiPersonName.setLang(personName.getLangCode());</span>
<span class="fc" id="L502">                        apiPersonName.setValue(personName.getName());</span>
<span class="fc" id="L503">                        apiPersonNameList.add(apiPersonName);</span>
<span class="fc" id="L504">                }</span>
<span class="fc" id="L505">        }</span>

        public static void mapContactEmails(List&lt;org.apache.juddi.model.Email&gt; modelEmailList,
             List&lt;org.uddi.api_v3.Email&gt; apiEmailList)
             throws DispositionReportFaultMessage {
<span class="fc" id="L510">                apiEmailList.clear();</span>

<span class="fc bfc" id="L512" title="All 2 branches covered.">                for (org.apache.juddi.model.Email modelEmail : modelEmailList) {</span>
<span class="fc" id="L513">                        org.uddi.api_v3.Email apiEmail = new org.uddi.api_v3.Email();</span>
<span class="fc" id="L514">                        apiEmail.setUseType(modelEmail.getUseType());</span>
<span class="fc" id="L515">                        apiEmail.setValue(modelEmail.getEmailAddress());</span>
<span class="fc" id="L516">                        apiEmailList.add(apiEmail);</span>
<span class="fc" id="L517">                }</span>
<span class="fc" id="L518">        }</span>

        public static void mapContactPhones(List&lt;org.apache.juddi.model.Phone&gt; modelPhoneList,
             List&lt;org.uddi.api_v3.Phone&gt; apiPhoneList)
             throws DispositionReportFaultMessage {
<span class="fc" id="L523">                apiPhoneList.clear();</span>

<span class="fc bfc" id="L525" title="All 2 branches covered.">                for (org.apache.juddi.model.Phone modelPhone : modelPhoneList) {</span>
<span class="fc" id="L526">                        org.uddi.api_v3.Phone apiPhone = new org.uddi.api_v3.Phone();</span>
<span class="fc" id="L527">                        apiPhone.setUseType(modelPhone.getUseType());</span>
<span class="fc" id="L528">                        apiPhone.setValue(modelPhone.getPhoneNumber());</span>
<span class="fc" id="L529">                        apiPhoneList.add(apiPhone);</span>
<span class="fc" id="L530">                }</span>
<span class="fc" id="L531">        }</span>

        public static void mapContactAddresses(List&lt;org.apache.juddi.model.Address&gt; modelAddressList,
             List&lt;org.uddi.api_v3.Address&gt; apiAddressList)
             throws DispositionReportFaultMessage {
<span class="fc" id="L536">                apiAddressList.clear();</span>

<span class="fc bfc" id="L538" title="All 2 branches covered.">                for (org.apache.juddi.model.Address modelAddress : modelAddressList) {</span>
<span class="fc" id="L539">                        org.uddi.api_v3.Address apiAddress = new org.uddi.api_v3.Address();</span>
<span class="fc" id="L540">                        apiAddress.setUseType(modelAddress.getUseType());</span>
<span class="fc" id="L541">                        apiAddress.setLang(&quot;&quot;);</span>
<span class="fc" id="L542">                        apiAddress.setSortCode(modelAddress.getSortCode());</span>
<span class="fc" id="L543">                        apiAddress.setTModelKey(modelAddress.getTmodelKey());</span>

<span class="fc" id="L545">                        mapAddressLines(modelAddress.getAddressLines(), apiAddress.getAddressLine());</span>

<span class="fc" id="L547">                        apiAddressList.add(apiAddress);</span>
<span class="fc" id="L548">                }</span>
<span class="fc" id="L549">        }</span>

        public static void mapAddressLines(List&lt;org.apache.juddi.model.AddressLine&gt; modelAddressLineList,
             List&lt;org.uddi.api_v3.AddressLine&gt; apiAddressLineList)
             throws DispositionReportFaultMessage {
<span class="fc" id="L554">                apiAddressLineList.clear();</span>

<span class="fc bfc" id="L556" title="All 2 branches covered.">                for (org.apache.juddi.model.AddressLine modelAddressLine : modelAddressLineList) {</span>
<span class="fc" id="L557">                        org.uddi.api_v3.AddressLine apiAddressLine = new org.uddi.api_v3.AddressLine();</span>
<span class="fc" id="L558">                        apiAddressLine.setKeyName(modelAddressLine.getKeyName());</span>
<span class="fc" id="L559">                        apiAddressLine.setKeyValue(modelAddressLine.getKeyValue());</span>
<span class="fc" id="L560">                        apiAddressLine.setValue(modelAddressLine.getLine());</span>
<span class="fc" id="L561">                        apiAddressLineList.add(apiAddressLine);</span>
<span class="fc" id="L562">                }</span>
<span class="fc" id="L563">        }</span>

        public static void mapBusinessIdentifiers(List&lt;org.apache.juddi.model.BusinessIdentifier&gt; modelIdentifierList,
             org.uddi.api_v3.IdentifierBag apiIdentifierBag,
             org.uddi.api_v3.BusinessEntity apiBusinessEntity)
             throws DispositionReportFaultMessage {
<span class="pc bpc" id="L569" title="1 of 4 branches missed.">                if (modelIdentifierList == null || modelIdentifierList.size() == 0) {</span>
<span class="fc" id="L570">                        return;</span>
                }

<span class="pc bpc" id="L573" title="1 of 2 branches missed.">                if (apiIdentifierBag == null) {</span>
<span class="fc" id="L574">                        apiIdentifierBag = new org.uddi.api_v3.IdentifierBag();</span>
                }

<span class="fc" id="L577">                List&lt;org.uddi.api_v3.KeyedReference&gt; apiKeyedRefList = apiIdentifierBag.getKeyedReference();</span>
<span class="fc" id="L578">                apiKeyedRefList.clear();</span>

<span class="fc bfc" id="L580" title="All 2 branches covered.">                for (org.apache.juddi.model.BusinessIdentifier modelIdentifier : modelIdentifierList) {</span>
<span class="fc" id="L581">                        org.uddi.api_v3.KeyedReference apiKeyedRef = new org.uddi.api_v3.KeyedReference();</span>
<span class="fc" id="L582">                        apiKeyedRef.setTModelKey(modelIdentifier.getTmodelKeyRef());</span>
<span class="fc" id="L583">                        apiKeyedRef.setKeyName(modelIdentifier.getKeyName());</span>
<span class="fc" id="L584">                        apiKeyedRef.setKeyValue(modelIdentifier.getKeyValue());</span>
<span class="fc" id="L585">                        apiKeyedRefList.add(apiKeyedRef);</span>
<span class="fc" id="L586">                }</span>
<span class="fc" id="L587">                apiBusinessEntity.setIdentifierBag(apiIdentifierBag);</span>
<span class="fc" id="L588">        }</span>

        public static void mapBusinessServices(List&lt;org.apache.juddi.model.BusinessService&gt; modelBusinessServiceList,
             List&lt;org.apache.juddi.model.ServiceProjection&gt; modelServiceProjectionList,
             org.uddi.api_v3.BusinessServices apiBusinessServices,
             org.uddi.api_v3.BusinessEntity apiBusinessEntity)
             throws DispositionReportFaultMessage {

<span class="pc bpc" id="L596" title="1 of 2 branches missed.">                if (apiBusinessServices == null) {</span>
<span class="fc" id="L597">                        apiBusinessServices = new org.uddi.api_v3.BusinessServices();</span>
                }

<span class="fc" id="L600">                List&lt;org.uddi.api_v3.BusinessService&gt; apiBusinessServiceList = apiBusinessServices.getBusinessService();</span>
<span class="fc" id="L601">                apiBusinessServiceList.clear();</span>

<span class="pc bpc" id="L603" title="1 of 4 branches missed.">                if (modelBusinessServiceList != null &amp;&amp; modelBusinessServiceList.size() &gt; 0) {</span>
<span class="fc bfc" id="L604" title="All 2 branches covered.">                        for (org.apache.juddi.model.BusinessService modelBusinessService : modelBusinessServiceList) {</span>
<span class="fc" id="L605">                                org.uddi.api_v3.BusinessService apiBusinessService = new org.uddi.api_v3.BusinessService();</span>
<span class="fc" id="L606">                                mapBusinessService(modelBusinessService, apiBusinessService);</span>
<span class="fc" id="L607">                                apiBusinessServiceList.add(apiBusinessService);</span>
<span class="fc" id="L608">                        }</span>
                }

<span class="pc bpc" id="L611" title="1 of 4 branches missed.">                if (modelServiceProjectionList != null &amp;&amp; modelServiceProjectionList.size() &gt; 0) {</span>
<span class="fc bfc" id="L612" title="All 2 branches covered.">                        for (org.apache.juddi.model.ServiceProjection modelServiceProjection : modelServiceProjectionList) {</span>
<span class="fc" id="L613">                                org.uddi.api_v3.BusinessService apiBusinessService = new org.uddi.api_v3.BusinessService();</span>
<span class="fc" id="L614">                                mapBusinessService(modelServiceProjection.getBusinessService(), apiBusinessService);</span>
<span class="fc" id="L615">                                apiBusinessServiceList.add(apiBusinessService);</span>
<span class="fc" id="L616">                        }</span>
                }

<span class="fc bfc" id="L619" title="All 2 branches covered.">                if (apiBusinessServiceList.size() &gt; 0) {</span>
<span class="fc" id="L620">                        apiBusinessEntity.setBusinessServices(apiBusinessServices);</span>
                }
<span class="fc" id="L622">        }</span>

        public static void mapBusinessService(org.apache.juddi.model.BusinessService modelBusinessService,
             org.uddi.api_v3.BusinessService apiBusinessService)
             throws DispositionReportFaultMessage {

<span class="fc" id="L628">                apiBusinessService.setBusinessKey(modelBusinessService.getBusinessEntity().getEntityKey());</span>
<span class="fc" id="L629">                apiBusinessService.setServiceKey(modelBusinessService.getEntityKey());</span>

<span class="fc" id="L631">                mapServiceNames(modelBusinessService.getServiceNames(), apiBusinessService.getName());</span>
<span class="fc" id="L632">                mapServiceDescriptions(modelBusinessService.getServiceDescrs(), apiBusinessService.getDescription());</span>
<span class="fc" id="L633">                mapBindingTemplates(modelBusinessService.getBindingTemplates(), apiBusinessService.getBindingTemplates(), apiBusinessService);</span>
<span class="fc" id="L634">                apiBusinessService.setCategoryBag(mapCategoryBag(modelBusinessService.getCategoryBag(), apiBusinessService.getCategoryBag()));</span>

<span class="fc" id="L636">                mapSignature(modelBusinessService.getSignatures(), apiBusinessService.getSignature());</span>
<span class="fc" id="L637">        }</span>

        public static void mapServiceNames(List&lt;org.apache.juddi.model.ServiceName&gt; modelNameList,
             List&lt;org.uddi.api_v3.Name&gt; apiNameList)
             throws DispositionReportFaultMessage {
<span class="fc" id="L642">                apiNameList.clear();</span>

<span class="fc bfc" id="L644" title="All 2 branches covered.">                for (org.apache.juddi.model.ServiceName modelName : modelNameList) {</span>
<span class="fc" id="L645">                        org.uddi.api_v3.Name apiName = new org.uddi.api_v3.Name();</span>
<span class="fc" id="L646">                        apiName.setLang(modelName.getLangCode());</span>
<span class="fc" id="L647">                        apiName.setValue(modelName.getName());</span>
<span class="fc" id="L648">                        apiNameList.add(apiName);</span>
<span class="fc" id="L649">                }</span>
<span class="fc" id="L650">        }</span>

        public static void mapServiceDescriptions(List&lt;org.apache.juddi.model.ServiceDescr&gt; modelDescList,
             List&lt;org.uddi.api_v3.Description&gt; apiDescList)
             throws DispositionReportFaultMessage {
<span class="fc" id="L655">                apiDescList.clear();</span>

<span class="fc bfc" id="L657" title="All 2 branches covered.">                for (org.apache.juddi.model.ServiceDescr modelDesc : modelDescList) {</span>
<span class="fc" id="L658">                        org.uddi.api_v3.Description apiDesc = new org.uddi.api_v3.Description();</span>
<span class="fc" id="L659">                        apiDesc.setLang(modelDesc.getLangCode());</span>
<span class="fc" id="L660">                        apiDesc.setValue(modelDesc.getDescr());</span>
<span class="fc" id="L661">                        apiDescList.add(apiDesc);</span>
<span class="fc" id="L662">                }</span>
<span class="fc" id="L663">        }</span>

        public static void mapBindingTemplates(List&lt;org.apache.juddi.model.BindingTemplate&gt; modelBindingTemplateList,
             org.uddi.api_v3.BindingTemplates apiBindingTemplates,
             org.uddi.api_v3.BusinessService apiBusinessService)
             throws DispositionReportFaultMessage {
<span class="pc bpc" id="L669" title="1 of 4 branches missed.">                if (modelBindingTemplateList == null || modelBindingTemplateList.size() == 0) {</span>
<span class="fc" id="L670">                        return;</span>
                }

<span class="pc bpc" id="L673" title="1 of 2 branches missed.">                if (apiBindingTemplates == null) {</span>
<span class="fc" id="L674">                        apiBindingTemplates = new org.uddi.api_v3.BindingTemplates();</span>
                }

<span class="fc" id="L677">                List&lt;org.uddi.api_v3.BindingTemplate&gt; apiBindingTemplateList = apiBindingTemplates.getBindingTemplate();</span>
<span class="fc" id="L678">                apiBindingTemplateList.clear();</span>

<span class="fc bfc" id="L680" title="All 2 branches covered.">                for (org.apache.juddi.model.BindingTemplate modelBindingTemplate : modelBindingTemplateList) {</span>
<span class="fc" id="L681">                        org.uddi.api_v3.BindingTemplate apiBindingTemplate = new org.uddi.api_v3.BindingTemplate();</span>
<span class="fc" id="L682">                        mapBindingTemplate(modelBindingTemplate, apiBindingTemplate);</span>
<span class="fc" id="L683">                        apiBindingTemplateList.add(apiBindingTemplate);</span>
<span class="fc" id="L684">                }</span>
<span class="fc" id="L685">                apiBusinessService.setBindingTemplates(apiBindingTemplates);</span>
<span class="fc" id="L686">        }</span>

        public static void mapBindingTemplate(org.apache.juddi.model.BindingTemplate modelBindingTemplate,
             org.uddi.api_v3.BindingTemplate apiBindingTemplate)
             throws DispositionReportFaultMessage {

<span class="fc" id="L692">                apiBindingTemplate.setServiceKey(modelBindingTemplate.getBusinessService().getEntityKey());</span>
<span class="fc" id="L693">                apiBindingTemplate.setBindingKey(modelBindingTemplate.getEntityKey());</span>
<span class="fc" id="L694">                org.uddi.api_v3.AccessPoint apiAccessPoint = new org.uddi.api_v3.AccessPoint();</span>
<span class="fc" id="L695">                apiAccessPoint.setUseType(modelBindingTemplate.getAccessPointType());</span>
<span class="fc" id="L696">                String accessPointValue = modelBindingTemplate.getAccessPointUrl();</span>
<span class="pc bpc" id="L697" title="1 of 2 branches missed.">                if (accessPointValue != null) {</span>
                        try {
<span class="fc" id="L699">                                String baseUrl = AppConfig.getConfiguration().getString(Property.JUDDI_BASE_URL);</span>
<span class="pc bpc" id="L700" title="1 of 2 branches missed.">                                if (baseUrl == null) {</span>
<span class="nc" id="L701">                                        logger.warn(&quot;Token '&quot; + Property.JUDDI_BASE_URL + &quot;' not found in the juddiv3.xml, defaulting to '&quot;</span>
                                             + Property.DEFAULT_BASE_URL + &quot;'&quot;);
<span class="nc" id="L703">                                        baseUrl = Property.DEFAULT_BASE_URL;</span>
                                }
<span class="fc" id="L705">                                accessPointValue = accessPointValue.replaceAll(&quot;\\$\\{&quot; + Property.JUDDI_BASE_URL + &quot;\\}&quot;, baseUrl);</span>

<span class="fc" id="L707">                                baseUrl = AppConfig.getConfiguration().getString(Property.JUDDI_BASE_URL_SECURE);</span>
<span class="pc bpc" id="L708" title="1 of 2 branches missed.">                                if (baseUrl == null) {</span>
<span class="nc" id="L709">                                        logger.warn(&quot;Token '&quot; + Property.JUDDI_BASE_URL_SECURE + &quot;' not found in the juddiv3.xml, defaulting to '&quot;</span>
                                             + Property.JUDDI_BASE_URL_SECURE + &quot;'&quot;);
<span class="nc" id="L711">                                        baseUrl = Property.DEFAULT_BASE_URL_SECURE;</span>
                                }
<span class="fc" id="L713">                                accessPointValue = accessPointValue.replaceAll(&quot;\\$\\{&quot; + Property.JUDDI_BASE_URL_SECURE + &quot;\\}&quot;, baseUrl);</span>
<span class="nc" id="L714">                        } catch (ConfigurationException e) {</span>
<span class="nc" id="L715">                                logger.error(e.getMessage(), e);</span>
<span class="fc" id="L716">                        }</span>
                }
<span class="fc" id="L718">                apiAccessPoint.setValue(accessPointValue);</span>
<span class="fc" id="L719">                apiBindingTemplate.setAccessPoint(apiAccessPoint);</span>
<span class="pc bpc" id="L720" title="1 of 2 branches missed.">                if (modelBindingTemplate.getHostingRedirector() != null) {</span>
<span class="nc" id="L721">                        org.uddi.api_v3.HostingRedirector apiHost = new org.uddi.api_v3.HostingRedirector();</span>
<span class="nc" id="L722">                        apiHost.setBindingKey(modelBindingTemplate.getHostingRedirector());</span>
<span class="nc" id="L723">                        apiBindingTemplate.setHostingRedirector(apiHost);</span>
                }
<span class="fc" id="L725">                mapTModelInstanceDetails(modelBindingTemplate.getTmodelInstanceInfos(), apiBindingTemplate.getTModelInstanceDetails(), apiBindingTemplate);</span>
<span class="fc" id="L726">                mapBindingDescriptions(modelBindingTemplate.getBindingDescrs(), apiBindingTemplate.getDescription());</span>

<span class="fc" id="L728">                apiBindingTemplate.setCategoryBag(mapCategoryBag(modelBindingTemplate.getCategoryBag(), apiBindingTemplate.getCategoryBag()));</span>
<span class="fc" id="L729">                mapSignature(modelBindingTemplate.getSignatures(), apiBindingTemplate.getSignature());</span>
<span class="fc" id="L730">        }</span>

        public static void mapBindingDescriptions(List&lt;org.apache.juddi.model.BindingDescr&gt; modelDescList,
             List&lt;org.uddi.api_v3.Description&gt; apiDescList)
             throws DispositionReportFaultMessage {
<span class="fc" id="L735">                apiDescList.clear();</span>

<span class="fc bfc" id="L737" title="All 2 branches covered.">                for (org.apache.juddi.model.BindingDescr modelDesc : modelDescList) {</span>
<span class="fc" id="L738">                        org.uddi.api_v3.Description apiDesc = new org.uddi.api_v3.Description();</span>
<span class="fc" id="L739">                        apiDesc.setLang(modelDesc.getLangCode());</span>
<span class="fc" id="L740">                        apiDesc.setValue(modelDesc.getDescr());</span>
<span class="fc" id="L741">                        apiDescList.add(apiDesc);</span>
<span class="fc" id="L742">                }</span>
<span class="fc" id="L743">        }</span>

        public static org.uddi.api_v3.CategoryBag mapCategoryBag(org.apache.juddi.model.CategoryBag modelCategoryBag,
             org.uddi.api_v3.CategoryBag apiCategoryBag)
             throws DispositionReportFaultMessage {

<span class="fc bfc" id="L749" title="All 2 branches covered.">                if (modelCategoryBag != null) {</span>
<span class="pc bpc" id="L750" title="1 of 2 branches missed.">                        if (apiCategoryBag == null) {</span>
<span class="fc" id="L751">                                apiCategoryBag = new org.uddi.api_v3.CategoryBag();</span>
                        }

<span class="fc bfc" id="L754" title="All 2 branches covered.">                        for (org.apache.juddi.model.KeyedReference modelKeyedReference : modelCategoryBag.getKeyedReferences()) {</span>
<span class="fc" id="L755">                                org.uddi.api_v3.KeyedReference apiKeyedReference = new org.uddi.api_v3.KeyedReference();</span>
<span class="fc" id="L756">                                apiKeyedReference.setTModelKey(modelKeyedReference.getTmodelKeyRef());</span>
<span class="fc" id="L757">                                apiKeyedReference.setKeyName(modelKeyedReference.getKeyName());</span>
<span class="fc" id="L758">                                apiKeyedReference.setKeyValue(modelKeyedReference.getKeyValue());</span>
<span class="fc" id="L759">                                apiCategoryBag.getKeyedReference().add(apiKeyedReference);</span>
<span class="fc" id="L760">                        }</span>
<span class="fc bfc" id="L761" title="All 2 branches covered.">                        for (org.apache.juddi.model.KeyedReferenceGroup modelKeyedReferenceGroup : modelCategoryBag.getKeyedReferenceGroups()) {</span>
<span class="fc" id="L762">                                org.uddi.api_v3.KeyedReferenceGroup apiKeyedReferenceGroup = new org.uddi.api_v3.KeyedReferenceGroup();</span>

<span class="fc" id="L764">                                mapKeyedReferenceGroup(modelKeyedReferenceGroup, apiKeyedReferenceGroup);</span>

<span class="fc" id="L766">                                apiCategoryBag.getKeyedReferenceGroup().add(apiKeyedReferenceGroup);</span>
<span class="fc" id="L767">                        }</span>
                }
<span class="fc" id="L769">                return apiCategoryBag;</span>
        }

        public static void mapKeyedReferenceGroup(org.apache.juddi.model.KeyedReferenceGroup modelKeyedReferenceGroup,
             org.uddi.api_v3.KeyedReferenceGroup apiKeyedReferenceGroup)
             throws DispositionReportFaultMessage {

<span class="fc" id="L776">                apiKeyedReferenceGroup.setTModelKey(modelKeyedReferenceGroup.getTmodelKey());</span>

<span class="fc bfc" id="L778" title="All 2 branches covered.">                for (org.apache.juddi.model.KeyedReference modelKeyedReference : modelKeyedReferenceGroup.getKeyedReferences()) {</span>
<span class="fc" id="L779">                        org.uddi.api_v3.KeyedReference apiKeyedReference = new org.uddi.api_v3.KeyedReference();</span>
<span class="fc" id="L780">                        apiKeyedReference.setTModelKey(modelKeyedReference.getTmodelKeyRef());</span>
<span class="fc" id="L781">                        apiKeyedReference.setKeyName(modelKeyedReference.getKeyName());</span>
<span class="fc" id="L782">                        apiKeyedReference.setKeyValue(modelKeyedReference.getKeyValue());</span>
<span class="fc" id="L783">                        apiKeyedReferenceGroup.getKeyedReference().add(apiKeyedReference);</span>
<span class="fc" id="L784">                }</span>

<span class="fc" id="L786">        }</span>

        public static void mapTModelInstanceDetails(List&lt;org.apache.juddi.model.TmodelInstanceInfo&gt; modelTModelInstInfoList,
             org.uddi.api_v3.TModelInstanceDetails apiTModelInstDetails,
             org.uddi.api_v3.BindingTemplate apiBindingTemplate)
             throws DispositionReportFaultMessage {
<span class="pc bpc" id="L792" title="1 of 4 branches missed.">                if (modelTModelInstInfoList == null || modelTModelInstInfoList.size() == 0) {</span>
<span class="fc" id="L793">                        return;</span>
                }

<span class="pc bpc" id="L796" title="1 of 2 branches missed.">                if (apiTModelInstDetails == null) {</span>
<span class="fc" id="L797">                        apiTModelInstDetails = new org.uddi.api_v3.TModelInstanceDetails();</span>
                }

<span class="fc" id="L800">                List&lt;org.uddi.api_v3.TModelInstanceInfo&gt; apiTModelInstInfoList = apiTModelInstDetails.getTModelInstanceInfo();</span>
<span class="fc" id="L801">                apiTModelInstInfoList.clear();</span>

<span class="fc bfc" id="L803" title="All 2 branches covered.">                for (org.apache.juddi.model.TmodelInstanceInfo modelTModelInstInfo : modelTModelInstInfoList) {</span>
<span class="fc" id="L804">                        org.uddi.api_v3.TModelInstanceInfo apiTModelInstInfo = new org.uddi.api_v3.TModelInstanceInfo();</span>
<span class="fc" id="L805">                        apiTModelInstInfo.setTModelKey(modelTModelInstInfo.getTmodelKey());</span>
<span class="fc" id="L806">                        mapTModelInstanceInfoDescriptions(modelTModelInstInfo.getTmodelInstanceInfoDescrs(), apiTModelInstInfo.getDescription());</span>
<span class="fc" id="L807">                        mapInstanceDetails(modelTModelInstInfo, apiTModelInstInfo.getInstanceDetails(), apiTModelInstInfo);</span>

<span class="fc" id="L809">                        apiTModelInstInfoList.add(apiTModelInstInfo);</span>
<span class="fc" id="L810">                }</span>
<span class="fc" id="L811">                apiBindingTemplate.setTModelInstanceDetails(apiTModelInstDetails);</span>
<span class="fc" id="L812">        }</span>

        public static void mapTModelInstanceInfoDescriptions(List&lt;org.apache.juddi.model.TmodelInstanceInfoDescr&gt; modelDescList,
             List&lt;org.uddi.api_v3.Description&gt; apiDescList)
             throws DispositionReportFaultMessage {
<span class="fc" id="L817">                apiDescList.clear();</span>

<span class="fc bfc" id="L819" title="All 2 branches covered.">                for (org.apache.juddi.model.TmodelInstanceInfoDescr modelDesc : modelDescList) {</span>
<span class="fc" id="L820">                        org.uddi.api_v3.Description apiDesc = new org.uddi.api_v3.Description();</span>
<span class="fc" id="L821">                        apiDesc.setLang(modelDesc.getLangCode());</span>
<span class="fc" id="L822">                        apiDesc.setValue(modelDesc.getDescr());</span>
<span class="fc" id="L823">                        apiDescList.add(apiDesc);</span>
<span class="fc" id="L824">                }</span>
<span class="fc" id="L825">        }</span>

        public static void mapInstanceDetails(org.apache.juddi.model.TmodelInstanceInfo modelTModelInstInfo,
             org.uddi.api_v3.InstanceDetails apiInstanceDetails,
             org.uddi.api_v3.TModelInstanceInfo apiTModelInstInfo)
             throws DispositionReportFaultMessage {
<span class="pc bpc" id="L831" title="1 of 2 branches missed.">                if (modelTModelInstInfo == null</span>
<span class="pc bpc" id="L832" title="1 of 4 branches missed.">                     || (modelTModelInstInfo.getInstanceParms() == null &amp;&amp; modelTModelInstInfo.getOverviewDocs().size() == 0)) {</span>
<span class="fc" id="L833">                        return;</span>
                }

<span class="pc bpc" id="L836" title="1 of 2 branches missed.">                if (apiInstanceDetails == null) {</span>
<span class="fc" id="L837">                        apiInstanceDetails = new org.uddi.api_v3.InstanceDetails();</span>
                }

                //InstanceParms
<span class="fc" id="L841">                apiInstanceDetails.setInstanceParms(modelTModelInstInfo.getInstanceParms());</span>
                //Descriptions
<span class="fc" id="L843">                List&lt;org.apache.juddi.model.InstanceDetailsDescr&gt; modelInstDetailsDescrList = modelTModelInstInfo.getInstanceDetailsDescrs();</span>
<span class="pc bpc" id="L844" title="1 of 2 branches missed.">                for (org.apache.juddi.model.InstanceDetailsDescr modelInstDetailDescr : modelInstDetailsDescrList) {</span>
<span class="nc" id="L845">                        org.uddi.api_v3.Description apiDesc = new org.uddi.api_v3.Description();</span>
<span class="nc" id="L846">                        apiDesc.setLang(modelInstDetailDescr.getLangCode());</span>
<span class="nc" id="L847">                        apiDesc.setValue(modelInstDetailDescr.getDescr());</span>
<span class="nc" id="L848">                        apiInstanceDetails.getDescription().add(apiDesc);</span>
<span class="nc" id="L849">                }</span>
                //OverviewDoc
<span class="fc" id="L851">                mapOverviewDocs(modelTModelInstInfo.getOverviewDocs(), apiInstanceDetails, null);</span>

<span class="fc" id="L853">                apiTModelInstInfo.setInstanceDetails(apiInstanceDetails);</span>
<span class="fc" id="L854">        }</span>

        public static void mapOverviewDocs(List&lt;org.apache.juddi.model.OverviewDoc&gt; modelOverviewDocs,
             org.uddi.api_v3.InstanceDetails apiInstanceDetails,
             org.uddi.api_v3.TModel apiTModel) {
<span class="fc bfc" id="L859" title="All 2 branches covered.">                for (OverviewDoc modelOverviewDoc : modelOverviewDocs) {</span>
<span class="fc" id="L860">                        org.uddi.api_v3.OverviewDoc apiOverviewDoc = new org.uddi.api_v3.OverviewDoc();</span>

                        //Descriptions
<span class="fc" id="L863">                        List&lt;org.apache.juddi.model.OverviewDocDescr&gt; overviewDocDescrList = modelOverviewDoc.getOverviewDocDescrs();</span>
<span class="fc bfc" id="L864" title="All 2 branches covered.">                        for (org.apache.juddi.model.OverviewDocDescr overviewDocDescr : overviewDocDescrList) {</span>
<span class="fc" id="L865">                                org.uddi.api_v3.Description apiDesc = new org.uddi.api_v3.Description();</span>
<span class="fc" id="L866">                                apiDesc.setLang(overviewDocDescr.getLangCode());</span>
<span class="fc" id="L867">                                apiDesc.setValue(overviewDocDescr.getDescr());</span>
<span class="fc" id="L868">                                apiOverviewDoc.getDescription().add(apiDesc);</span>
<span class="fc" id="L869">                        }</span>
                        //OverviewURL
<span class="fc" id="L871">                        org.uddi.api_v3.OverviewURL apiOverviewURL = new org.uddi.api_v3.OverviewURL();</span>
<span class="fc" id="L872">                        apiOverviewURL.setUseType(modelOverviewDoc.getOverviewUrlUseType());</span>
<span class="fc" id="L873">                        apiOverviewURL.setValue(modelOverviewDoc.getOverviewUrl());</span>
<span class="fc" id="L874">                        apiOverviewDoc.setOverviewURL(apiOverviewURL);</span>
                        //Set the entity on the apiOverviewDoc
<span class="fc bfc" id="L876" title="All 2 branches covered.">                        if (apiInstanceDetails != null) {</span>
<span class="fc" id="L877">                                apiInstanceDetails.getOverviewDoc().add(apiOverviewDoc);</span>
                        } else {
<span class="fc" id="L879">                                apiTModel.getOverviewDoc().add(apiOverviewDoc);</span>
                        }
<span class="fc" id="L881">                }</span>
<span class="fc" id="L882">        }</span>

        public static void mapTModel(org.apache.juddi.model.Tmodel modelTModel,
             org.uddi.api_v3.TModel apiTModel)
             throws DispositionReportFaultMessage {

<span class="fc" id="L888">                apiTModel.setTModelKey(modelTModel.getEntityKey());</span>
<span class="fc" id="L889">                org.uddi.api_v3.Name apiName = new org.uddi.api_v3.Name();</span>
<span class="fc" id="L890">                apiName.setValue(modelTModel.getName());</span>
<span class="fc" id="L891">                apiName.setLang(modelTModel.getLangCode());</span>
<span class="fc" id="L892">                apiTModel.setName(apiName);</span>
<span class="fc" id="L893">                apiTModel.setDeleted(modelTModel.getDeleted());</span>

<span class="fc" id="L895">                mapTModelDescriptions(modelTModel.getTmodelDescrs(), apiTModel.getDescription());</span>

<span class="fc" id="L897">                mapTModelIdentifiers(modelTModel.getTmodelIdentifiers(), apiTModel.getIdentifierBag(), apiTModel);</span>
<span class="fc" id="L898">                apiTModel.setCategoryBag(mapCategoryBag(modelTModel.getCategoryBag(), apiTModel.getCategoryBag()));</span>

<span class="fc" id="L900">                mapOverviewDocs(modelTModel.getOverviewDocs(), null, apiTModel);</span>
<span class="fc" id="L901">                mapSignature(modelTModel.getSignatures(), apiTModel.getSignature());</span>
<span class="fc" id="L902">        }</span>

        public static void mapTModelDescriptions(List&lt;org.apache.juddi.model.TmodelDescr&gt; modelDescList,
             List&lt;org.uddi.api_v3.Description&gt; apiDescList)
             throws DispositionReportFaultMessage {
<span class="fc" id="L907">                apiDescList.clear();</span>

<span class="fc bfc" id="L909" title="All 2 branches covered.">                for (org.apache.juddi.model.TmodelDescr modelDesc : modelDescList) {</span>
<span class="fc" id="L910">                        org.uddi.api_v3.Description apiDesc = new org.uddi.api_v3.Description();</span>
<span class="fc" id="L911">                        apiDesc.setLang(modelDesc.getLangCode());</span>
<span class="fc" id="L912">                        apiDesc.setValue(modelDesc.getDescr());</span>
<span class="fc" id="L913">                        apiDescList.add(apiDesc);</span>
<span class="fc" id="L914">                }</span>
<span class="fc" id="L915">        }</span>

        public static void mapTModelIdentifiers(List&lt;org.apache.juddi.model.TmodelIdentifier&gt; modelIdentifierList,
             org.uddi.api_v3.IdentifierBag apiIdentifierBag,
             org.uddi.api_v3.TModel apiTModel)
             throws DispositionReportFaultMessage {
<span class="pc bpc" id="L921" title="2 of 4 branches missed.">                if (modelIdentifierList == null || modelIdentifierList.size() == 0) {</span>
<span class="fc" id="L922">                        return;</span>
                }

<span class="nc bnc" id="L925" title="All 2 branches missed.">                if (apiIdentifierBag == null) {</span>
<span class="nc" id="L926">                        apiIdentifierBag = new org.uddi.api_v3.IdentifierBag();</span>
                }

<span class="nc" id="L929">                List&lt;org.uddi.api_v3.KeyedReference&gt; apiKeyedRefList = apiIdentifierBag.getKeyedReference();</span>
<span class="nc" id="L930">                apiKeyedRefList.clear();</span>

<span class="nc bnc" id="L932" title="All 2 branches missed.">                for (org.apache.juddi.model.TmodelIdentifier modelIdentifier : modelIdentifierList) {</span>
<span class="nc" id="L933">                        org.uddi.api_v3.KeyedReference apiKeyedRef = new org.uddi.api_v3.KeyedReference();</span>
<span class="nc" id="L934">                        apiKeyedRef.setTModelKey(modelIdentifier.getTmodelKeyRef());</span>
<span class="nc" id="L935">                        apiKeyedRef.setKeyName(modelIdentifier.getKeyName());</span>
<span class="nc" id="L936">                        apiKeyedRef.setKeyValue(modelIdentifier.getKeyValue());</span>
<span class="nc" id="L937">                        apiKeyedRefList.add(apiKeyedRef);</span>
<span class="nc" id="L938">                }</span>
<span class="nc" id="L939">                apiTModel.setIdentifierBag(apiIdentifierBag);</span>
<span class="nc" id="L940">        }</span>

        public static void mapBusinessInfo(org.apache.juddi.model.BusinessEntity modelBusinessEntity,
             org.uddi.api_v3.BusinessInfo apiBusinessInfo)
             throws DispositionReportFaultMessage {

<span class="fc" id="L946">                apiBusinessInfo.setBusinessKey(modelBusinessEntity.getEntityKey());</span>

<span class="fc" id="L948">                mapBusinessNames(modelBusinessEntity.getBusinessNames(), apiBusinessInfo.getName());</span>
<span class="fc" id="L949">                mapBusinessDescriptions(modelBusinessEntity.getBusinessDescrs(), apiBusinessInfo.getDescription());</span>

<span class="fc" id="L951">                mapServiceInfos(modelBusinessEntity.getBusinessServices(), apiBusinessInfo.getServiceInfos(), apiBusinessInfo);</span>

<span class="fc" id="L953">        }</span>

        public static void mapServiceInfos(List&lt;org.apache.juddi.model.BusinessService&gt; modelBusinessServiceList,
             org.uddi.api_v3.ServiceInfos apiServiceInfos,
             org.uddi.api_v3.BusinessInfo apiBusinessInfo)
             throws DispositionReportFaultMessage {
<span class="fc bfc" id="L959" title="All 2 branches covered.">                if (modelBusinessServiceList.size() == 0) {</span>
<span class="fc" id="L960">                        return;</span>
                }
<span class="pc bpc" id="L962" title="1 of 2 branches missed.">                if (apiServiceInfos == null) {</span>
<span class="fc" id="L963">                        apiServiceInfos = new org.uddi.api_v3.ServiceInfos();</span>
                }

<span class="fc" id="L966">                List&lt;org.uddi.api_v3.ServiceInfo&gt; apiServiceInfoList = apiServiceInfos.getServiceInfo();</span>
<span class="fc" id="L967">                apiServiceInfoList.clear();</span>

<span class="fc bfc" id="L969" title="All 2 branches covered.">                for (org.apache.juddi.model.BusinessService modelBusinessService : modelBusinessServiceList) {</span>
<span class="fc" id="L970">                        org.uddi.api_v3.ServiceInfo apiServiceInfo = new org.uddi.api_v3.ServiceInfo();</span>

<span class="fc" id="L972">                        mapServiceInfo(modelBusinessService, apiServiceInfo);</span>

<span class="fc" id="L974">                        apiServiceInfos.getServiceInfo().add(apiServiceInfo);</span>
<span class="fc" id="L975">                }</span>
<span class="fc" id="L976">                apiBusinessInfo.setServiceInfos(apiServiceInfos);</span>
<span class="fc" id="L977">        }</span>

        public static void mapServiceInfo(org.apache.juddi.model.BusinessService modelBusinessService,
             org.uddi.api_v3.ServiceInfo apiServiceInfo)
             throws DispositionReportFaultMessage {

<span class="fc" id="L983">                apiServiceInfo.setBusinessKey(modelBusinessService.getBusinessEntity().getEntityKey());</span>
<span class="fc" id="L984">                apiServiceInfo.setServiceKey(modelBusinessService.getEntityKey());</span>

<span class="fc" id="L986">                mapServiceNames(modelBusinessService.getServiceNames(), apiServiceInfo.getName());</span>
<span class="fc" id="L987">        }</span>

        public static void mapTModelInfo(org.apache.juddi.model.Tmodel modelTModel,
             org.uddi.api_v3.TModelInfo apiTModelInfo)
             throws DispositionReportFaultMessage {

<span class="fc" id="L993">                apiTModelInfo.setTModelKey(modelTModel.getEntityKey());</span>
<span class="fc" id="L994">                org.uddi.api_v3.Name apiName = new org.uddi.api_v3.Name();</span>
<span class="fc" id="L995">                apiName.setValue(modelTModel.getName());</span>
<span class="fc" id="L996">                apiName.setLang(modelTModel.getLangCode());</span>
<span class="fc" id="L997">                apiTModelInfo.setName(apiName);</span>

<span class="fc" id="L999">                mapTModelDescriptions(modelTModel.getTmodelDescrs(), apiTModelInfo.getDescription());</span>

<span class="fc" id="L1001">        }</span>

        public static void mapAuthToken(org.apache.juddi.model.AuthToken modelAuthToken,
             org.uddi.api_v3.AuthToken apiAuthToken)
             throws DispositionReportFaultMessage {
<span class="fc" id="L1006">                apiAuthToken.setAuthInfo(modelAuthToken.getAuthToken());</span>

<span class="fc" id="L1008">        }</span>

        public static void mapPublisherAssertion(org.apache.juddi.model.PublisherAssertion modelPublisherAssertion,
             org.uddi.api_v3.PublisherAssertion apiPublisherAssertion)
             throws DispositionReportFaultMessage {

<span class="fc" id="L1014">                apiPublisherAssertion.setFromKey(modelPublisherAssertion.getId().getFromKey());</span>
<span class="fc" id="L1015">                apiPublisherAssertion.setToKey(modelPublisherAssertion.getId().getToKey());</span>

<span class="fc" id="L1017">                org.uddi.api_v3.KeyedReference keyedRef = new org.uddi.api_v3.KeyedReference();</span>
<span class="fc" id="L1018">                keyedRef.setTModelKey(modelPublisherAssertion.getTmodelKey());</span>
<span class="fc" id="L1019">                keyedRef.setKeyName(modelPublisherAssertion.getKeyName());</span>
<span class="fc" id="L1020">                keyedRef.setKeyValue(modelPublisherAssertion.getKeyValue());</span>

<span class="pc bpc" id="L1022" title="1 of 2 branches missed.">                if (modelPublisherAssertion.getSignatures()!=null &amp;&amp;</span>
<span class="fc bfc" id="L1023" title="All 2 branches covered.">                        !modelPublisherAssertion.getSignatures().isEmpty())</span>
                {
<span class="fc" id="L1025">                        mapSignature(modelPublisherAssertion.getSignatures(), apiPublisherAssertion.getSignature());</span>
                }
<span class="fc" id="L1027">                apiPublisherAssertion.setKeyedReference(keyedRef);</span>
               
<span class="fc" id="L1029">        }</span>

        public static void mapAssertionStatusItem(org.apache.juddi.model.PublisherAssertion modelPublisherAssertion,
             org.uddi.api_v3.AssertionStatusItem apiAssertionStatusItem,
             List&lt;?&gt; businessKeys)
             throws DispositionReportFaultMessage {

<span class="fc" id="L1036">                apiAssertionStatusItem.setFromKey(modelPublisherAssertion.getId().getFromKey());</span>
<span class="fc" id="L1037">                apiAssertionStatusItem.setToKey(modelPublisherAssertion.getId().getToKey());</span>

<span class="fc" id="L1039">                org.uddi.api_v3.KeyedReference keyedRef = new org.uddi.api_v3.KeyedReference();</span>
<span class="fc" id="L1040">                keyedRef.setTModelKey(modelPublisherAssertion.getTmodelKey());</span>
<span class="fc" id="L1041">                keyedRef.setKeyName(modelPublisherAssertion.getKeyName());</span>
<span class="fc" id="L1042">                keyedRef.setKeyValue(modelPublisherAssertion.getKeyValue());</span>

<span class="fc" id="L1044">                apiAssertionStatusItem.setKeyedReference(keyedRef);</span>

<span class="pc bpc" id="L1046" title="1 of 2 branches missed.">                if (&quot;true&quot;.equalsIgnoreCase(modelPublisherAssertion.getFromCheck())</span>
<span class="nc bnc" id="L1047" title="All 2 branches missed.">                     &amp;&amp; &quot;true&quot;.equalsIgnoreCase(modelPublisherAssertion.getToCheck())) {</span>
<span class="nc" id="L1048">                        apiAssertionStatusItem.setCompletionStatus(CompletionStatus.STATUS_COMPLETE);</span>
<span class="pc bpc" id="L1049" title="1 of 2 branches missed.">                } else if (!&quot;true&quot;.equalsIgnoreCase(modelPublisherAssertion.getFromCheck())</span>
<span class="pc bpc" id="L1050" title="1 of 2 branches missed.">                     &amp;&amp; &quot;true&quot;.equalsIgnoreCase(modelPublisherAssertion.getToCheck())) {</span>
<span class="fc" id="L1051">                        apiAssertionStatusItem.setCompletionStatus(CompletionStatus.STATUS_FROM_KEY_INCOMPLETE);</span>
<span class="nc bnc" id="L1052" title="All 2 branches missed.">                } else if (&quot;true&quot;.equalsIgnoreCase(modelPublisherAssertion.getFromCheck())</span>
<span class="nc bnc" id="L1053" title="All 2 branches missed.">                     &amp;&amp; !&quot;true&quot;.equalsIgnoreCase(modelPublisherAssertion.getToCheck())) {</span>
<span class="nc" id="L1054">                        apiAssertionStatusItem.setCompletionStatus(CompletionStatus.STATUS_TO_KEY_INCOMPLETE);</span>
<span class="nc bnc" id="L1055" title="All 2 branches missed.">                } else if (!&quot;true&quot;.equalsIgnoreCase(modelPublisherAssertion.getFromCheck())</span>
<span class="nc bnc" id="L1056" title="All 2 branches missed.">                     &amp;&amp; !&quot;true&quot;.equalsIgnoreCase(modelPublisherAssertion.getToCheck())) {</span>
<span class="nc" id="L1057">                        apiAssertionStatusItem.setCompletionStatus(CompletionStatus.STATUS_BOTH_INCOMPLETE);</span>
                }

<span class="fc" id="L1060">                org.uddi.api_v3.KeysOwned keysOwned = new org.uddi.api_v3.KeysOwned();</span>

                //converting resultList to simple List
<span class="fc" id="L1063">                List&lt;String&gt; businessKeyList = new ArrayList&lt;String&gt;();</span>
<span class="fc bfc" id="L1064" title="All 2 branches covered.">                for (Object businessKey : businessKeys) {</span>
<span class="fc" id="L1065">                        businessKeyList.add(String.valueOf(businessKey));</span>
<span class="fc" id="L1066">                }</span>
<span class="fc" id="L1067">                Collections.sort(businessKeyList);</span>
<span class="pc bpc" id="L1068" title="1 of 2 branches missed.">                if (Collections.binarySearch(businessKeyList, modelPublisherAssertion.getBusinessEntityByFromKey().getEntityKey()) &gt;= 0) {</span>
<span class="fc" id="L1069">                        keysOwned.setFromKey(modelPublisherAssertion.getBusinessEntityByFromKey().getEntityKey());</span>
                }

<span class="pc bpc" id="L1072" title="1 of 2 branches missed.">                if (Collections.binarySearch(businessKeyList, modelPublisherAssertion.getBusinessEntityByToKey().getEntityKey()) &gt;= 0) {</span>
<span class="nc" id="L1073">                        keysOwned.setToKey(modelPublisherAssertion.getBusinessEntityByToKey().getEntityKey());</span>
                }
<span class="pc bpc" id="L1075" title="3 of 4 branches missed.">                if (keysOwned.getFromKey() == null &amp;&amp; keysOwned.getToKey() == null) {</span>
<span class="nc" id="L1076">                        throw new FatalErrorException(new ErrorMessage(&quot;errors.invalidKey.KeysOwned&quot;));</span>
                }
<span class="fc" id="L1078">                apiAssertionStatusItem.setKeysOwned(keysOwned);</span>
<span class="fc" id="L1079">        }</span>

        public static void mapRelatedBusinessInfo(org.apache.juddi.model.PublisherAssertion modelPublisherAssertion,
             org.apache.juddi.model.BusinessEntity modelRelatedBusiness,
             org.uddi.api_v3.Direction direction,
             org.uddi.api_v3.RelatedBusinessInfo apiRelatedBusinessInfo)
             throws DispositionReportFaultMessage {

<span class="fc" id="L1087">                apiRelatedBusinessInfo.setBusinessKey(modelRelatedBusiness.getEntityKey());</span>

<span class="fc" id="L1089">                mapBusinessNames(modelRelatedBusiness.getBusinessNames(), apiRelatedBusinessInfo.getName());</span>
<span class="fc" id="L1090">                mapBusinessDescriptions(modelRelatedBusiness.getBusinessDescrs(), apiRelatedBusinessInfo.getDescription());</span>

<span class="fc" id="L1092">                org.uddi.api_v3.SharedRelationships sharedRelationships = new org.uddi.api_v3.SharedRelationships();</span>
<span class="fc" id="L1093">                sharedRelationships.setDirection(direction);</span>

<span class="fc" id="L1095">                org.uddi.api_v3.KeyedReference keyedRef = new org.uddi.api_v3.KeyedReference();</span>
<span class="fc" id="L1096">                keyedRef.setTModelKey(modelPublisherAssertion.getTmodelKey());</span>
<span class="fc" id="L1097">                keyedRef.setKeyName(modelPublisherAssertion.getKeyName());</span>
<span class="fc" id="L1098">                keyedRef.setKeyValue(modelPublisherAssertion.getKeyValue());</span>
<span class="fc" id="L1099">                sharedRelationships.getKeyedReference().add(keyedRef);</span>

<span class="fc" id="L1101">                apiRelatedBusinessInfo.getSharedRelationships().add(sharedRelationships);</span>
<span class="fc" id="L1102">        }</span>

        public static void mapOperationalInfo(UddiEntity modelUddiEntity,
             OperationalInfo apiOperationalInfo)
             throws DispositionReportFaultMessage {

<span class="fc" id="L1108">                apiOperationalInfo.setCreated(TypeConvertor.convertDateToXMLGregorianCalendar(modelUddiEntity.getCreated()));</span>
<span class="fc" id="L1109">                apiOperationalInfo.setModified(TypeConvertor.convertDateToXMLGregorianCalendar(modelUddiEntity.getModified()));</span>
<span class="fc" id="L1110">                apiOperationalInfo.setModifiedIncludingChildren(TypeConvertor.convertDateToXMLGregorianCalendar(modelUddiEntity.getModifiedIncludingChildren()));</span>
<span class="fc" id="L1111">                apiOperationalInfo.setNodeID(modelUddiEntity.getNodeId());</span>
<span class="fc" id="L1112">                apiOperationalInfo.setAuthorizedName(modelUddiEntity.getAuthorizedName());</span>
<span class="fc" id="L1113">                apiOperationalInfo.setEntityKey(modelUddiEntity.getEntityKey());</span>
<span class="fc" id="L1114">        }</span>

        public static void mapSubscription(org.apache.juddi.model.Subscription modelSubscription,
             org.uddi.sub_v3.Subscription apiSubscription)
             throws DispositionReportFaultMessage {

<span class="fc" id="L1120">                apiSubscription.setSubscriptionKey(modelSubscription.getSubscriptionKey());</span>
<span class="fc" id="L1121">                apiSubscription.setBrief(modelSubscription.isBrief());</span>
<span class="fc" id="L1122">                apiSubscription.setExpiresAfter(TypeConvertor.convertDateToXMLGregorianCalendar(modelSubscription.getExpiresAfter()));</span>
<span class="fc" id="L1123">                apiSubscription.setBindingKey(modelSubscription.getBindingKey());</span>
<span class="fc" id="L1124">                apiSubscription.setMaxEntities(modelSubscription.getMaxEntities());</span>
<span class="fc" id="L1125">                apiSubscription.setNotificationInterval(TypeConvertor.convertStringToDuration(modelSubscription.getNotificationInterval()));</span>

                try {
<span class="fc" id="L1128">                        SubscriptionFilter existingFilter = (SubscriptionFilter) JAXBMarshaller.unmarshallFromString(modelSubscription.getSubscriptionFilter(), JAXBMarshaller.PACKAGE_SUBSCRIPTION);</span>
<span class="fc" id="L1129">                        apiSubscription.setSubscriptionFilter(existingFilter);</span>
<span class="nc" id="L1130">                } catch (JAXBException e) {</span>
<span class="nc" id="L1131">                        logger.error(&quot;JAXB Exception while marshalling subscription filter&quot;, e);</span>
<span class="nc" id="L1132">                        throw new FatalErrorException(new ErrorMessage(&quot;errors.Unspecified&quot;));</span>
<span class="fc" id="L1133">                }</span>
<span class="fc" id="L1134">        }</span>

        public static void mapClientSubscriptionInfo(org.apache.juddi.model.ClientSubscriptionInfo modelClientSubscriptionInfo,
             org.apache.juddi.api_v3.ClientSubscriptionInfo apiClientSubscriptionInfo, EntityManager em)
             throws DispositionReportFaultMessage {

<span class="fc" id="L1140">                apiClientSubscriptionInfo.setSubscriptionKey(modelClientSubscriptionInfo.getSubscriptionKey());</span>
<span class="fc" id="L1141">                GregorianCalendar gcal = new GregorianCalendar();</span>
<span class="fc" id="L1142">                gcal.setTimeInMillis(modelClientSubscriptionInfo.getLastNotified().getTime());</span>
                try {
<span class="fc" id="L1144">                        apiClientSubscriptionInfo.setLastModified(DatatypeFactory.newInstance().newXMLGregorianCalendar(gcal));</span>
<span class="nc" id="L1145">                } catch (DatatypeConfigurationException ex) {</span>
<span class="nc" id="L1146">                        logger.warn(&quot;unable to create DatatypeFactory&quot;, ex);</span>
<span class="fc" id="L1147">                }</span>

<span class="pc bpc" id="L1149" title="1 of 2 branches missed.">                if (modelClientSubscriptionInfo.getFromClerk() != null) {</span>
<span class="fc" id="L1150">                        org.apache.juddi.api_v3.Clerk apiFromClerk = new org.apache.juddi.api_v3.Clerk();</span>
<span class="fc" id="L1151">                        mapClerk(modelClientSubscriptionInfo.getFromClerk(), apiFromClerk,em);</span>
<span class="fc" id="L1152">                        apiClientSubscriptionInfo.setFromClerk(apiFromClerk);</span>
                }
<span class="pc bpc" id="L1154" title="1 of 2 branches missed.">                if (modelClientSubscriptionInfo.getToClerk() != null) {</span>
<span class="nc" id="L1155">                        org.apache.juddi.api_v3.Clerk apiToClerk = new org.apache.juddi.api_v3.Clerk();</span>
<span class="nc" id="L1156">                        mapClerk(modelClientSubscriptionInfo.getToClerk(), apiToClerk,em);</span>
<span class="nc" id="L1157">                        apiClientSubscriptionInfo.setToClerk(apiToClerk);</span>
                }
<span class="fc" id="L1159">        }</span>

        public static void mapClerk(org.apache.juddi.model.Clerk modelClerk,
             org.apache.juddi.api_v3.Clerk apiClerk,EntityManager em)
             throws DispositionReportFaultMessage {

<span class="fc" id="L1165">                apiClerk.setName(modelClerk.getClerkName());</span>
<span class="fc" id="L1166">                apiClerk.setPassword(modelClerk.getCred());</span>
<span class="fc" id="L1167">                apiClerk.setPublisher(modelClerk.getPublisherId());</span>
<span class="pc bpc" id="L1168" title="1 of 2 branches missed.">                if (modelClerk.getNode() != null) {</span>
<span class="fc" id="L1169">                        org.apache.juddi.api_v3.Node apiNode = new org.apache.juddi.api_v3.Node();</span>
<span class="fc" id="L1170">                        mapNode(</span>
<span class="fc" id="L1171">                                em.find(org.apache.juddi.model.Node.class, modelClerk.getNode()) </span>
                               , apiNode);
<span class="fc" id="L1173">                        apiClerk.setNode(apiNode);</span>
                }
<span class="fc" id="L1175">        }</span>

        public static void mapNode(org.apache.juddi.model.Node modelNode,
             org.apache.juddi.api_v3.Node apiNode)
             throws DispositionReportFaultMessage {

<span class="fc" id="L1181">                apiNode.setCustodyTransferUrl(modelNode.getCustodyTransferUrl());</span>
<span class="fc" id="L1182">                apiNode.setFactoryInitial(modelNode.getFactoryInitial());</span>
<span class="fc" id="L1183">                apiNode.setFactoryNamingProvider(modelNode.getFactoryNamingProvider());</span>
<span class="fc" id="L1184">                apiNode.setFactoryURLPkgs(modelNode.getFactoryURLPkgs());</span>
<span class="fc" id="L1185">                apiNode.setInquiryUrl(modelNode.getInquiryUrl());</span>
<span class="fc" id="L1186">                apiNode.setJuddiApiUrl(modelNode.getJuddiApiUrl());</span>
<span class="fc" id="L1187">                apiNode.setName(modelNode.getName());</span>
<span class="fc" id="L1188">                apiNode.setClientName(modelNode.getClientName());</span>
<span class="fc" id="L1189">                apiNode.setProxyTransport(modelNode.getProxyTransport());</span>
<span class="fc" id="L1190">                apiNode.setPublishUrl(modelNode.getPublishUrl());</span>
<span class="fc" id="L1191">                apiNode.setSecurityUrl(modelNode.getSecurityUrl());</span>
<span class="fc" id="L1192">                apiNode.setSubscriptionUrl(modelNode.getSubscriptionUrl());</span>
<span class="fc" id="L1193">                apiNode.setSubscriptionListenerUrl(modelNode.getSubscriptionListenerUrl());</span>
<span class="fc" id="L1194">                apiNode.setReplicationUrl(modelNode.getReplicationUrl());</span>
<span class="fc" id="L1195">        }</span>

        private static Object convertDataToTransformContent(String type, byte[] xformBytes) throws RuntimeException {
                Object transformObject;
<span class="fc bfc" id="L1199" title="All 2 branches covered.">                if (type.equals(String.class.getSimpleName())) {</span>
                        try {
<span class="fc" id="L1201">                                transformObject = new String(xformBytes, &quot;UTF-8&quot;);</span>
<span class="nc" id="L1202">                        } catch (Exception e) {</span>
<span class="nc" id="L1203">                                throw new RuntimeException(&quot;Error decoding string due to: &quot; + e.getMessage(), e);</span>
<span class="fc" id="L1204">                        }</span>
<span class="pc bpc" id="L1205" title="1 of 2 branches missed.">                } else if (type.equals(byte[].class.getSimpleName())) {</span>
<span class="nc" id="L1206">                        transformObject = xformBytes;</span>
<span class="pc bpc" id="L1207" title="1 of 2 branches missed.">                } else if (type.equals(Element.class.getCanonicalName())) {</span>
<span class="fc" id="L1208">                        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();</span>
                         try {
<span class="fc" id="L1210">                                dbf.setFeature(&quot;http://apache.org/xml/features/disallow-doctype-decl&quot;, true);</span>
<span class="fc" id="L1211">                                dbf.setNamespaceAware(true);</span>
<span class="fc" id="L1212">                                dbf.setXIncludeAware(true);</span>

<span class="fc" id="L1214">                                DocumentBuilder db = dbf.newDocumentBuilder();</span>
<span class="fc" id="L1215">                                Document doc = db.parse(new ByteArrayInputStream(xformBytes));</span>
<span class="fc" id="L1216">                                transformObject = doc.getDocumentElement();</span>
<span class="nc" id="L1217">                        } catch (Exception e) {</span>
<span class="nc" id="L1218">                                throw new RuntimeException(&quot;Failed to parse element due to: &quot; + e.getMessage(), e);</span>
<span class="fc" id="L1219">                        }</span>
<span class="fc" id="L1220">                } else {</span>
<span class="nc" id="L1221">                        throw new RuntimeException(&quot;Unrecognized type: &quot; + type);</span>
                }
<span class="fc" id="L1223">                return transformObject;</span>
        }

        public static void mapReplicationConfiguration(ReplicationConfiguration find, org.uddi.repl_v3.ReplicationConfiguration item) throws DispositionReportFaultMessage {
<span class="fc" id="L1227">                item.setMaximumTimeToGetChanges(find.getMaximumTimeToGetChanges());</span>
<span class="fc" id="L1228">                item.setMaximumTimeToSyncRegistry(find.getMaximumTimeToSyncRegistry());</span>
<span class="fc" id="L1229">                item.setSerialNumber(find.getSerialNumber());</span>
                
<span class="fc" id="L1231">                List&lt;SignatureType&gt; sigs = new ArrayList&lt;SignatureType&gt;();</span>
<span class="fc" id="L1232">                mapSignature(find.getSignatures(), sigs);</span>
<span class="fc" id="L1233">                item.getSignature().addAll(sigs);</span>
<span class="fc" id="L1234">                mapOperator(find.getOperator(), item.getOperator());</span>

<span class="fc" id="L1236">                List&lt;org.apache.juddi.model.Contact&gt; modelContactList = new ArrayList&lt;org.apache.juddi.model.Contact&gt;();</span>
<span class="fc" id="L1237">                org.uddi.api_v3.Contacts cs = new Contacts();</span>

<span class="fc" id="L1239">                mapContacts(modelContactList, cs, new BusinessEntity());</span>
<span class="fc" id="L1240">                item.setRegistryContact(new org.uddi.repl_v3.ReplicationConfiguration.RegistryContact());</span>
<span class="pc bpc" id="L1241" title="1 of 2 branches missed.">                if (!cs.getContact().isEmpty()) {</span>
                        
<span class="nc" id="L1243">                        item.getRegistryContact().setContact(cs.getContact().get(0));</span>
                }
                else
                {
<span class="fc" id="L1247">                        item.getRegistryContact().setContact(new Contact());</span>
<span class="fc" id="L1248">                        item.getRegistryContact().getContact().getPersonName().add(new PersonName(&quot;unknown&quot;, null));</span>
                }
<span class="fc" id="L1250">                item.setTimeOfConfigurationUpdate(find.getTimeOfConfigurationUpdate());</span>
<span class="fc" id="L1251">                CommunicationGraph xcom = new CommunicationGraph();</span>

<span class="fc" id="L1253">                mapCommunicationGraph(find, xcom);</span>
<span class="fc" id="L1254">                item.setCommunicationGraph(xcom);</span>
                //(List&lt;org.apache.juddi.model.Contact&gt; modelContactList, 
                //org.uddi.api_v3.Contacts apiContacts,
                //org.uddi.api_v3.BusinessEntity apiBusinessEntity) 
<span class="fc" id="L1258">        }</span>

        private static void mapOperator(List&lt;org.apache.juddi.model.Operator&gt; model, List&lt;Operator&gt; api) throws DispositionReportFaultMessage {
<span class="fc bfc" id="L1261" title="All 2 branches covered.">                for (int i = 0; i &lt; model.size(); i++) {</span>
<span class="fc" id="L1262">                        Operator op = new Operator();</span>
<span class="fc" id="L1263">                        op.setOperatorNodeID(model.get(i).getOperatorNodeID());</span>
<span class="fc" id="L1264">                        op.setSoapReplicationURL(model.get(i).getSoapReplicationURL());</span>
<span class="pc bpc" id="L1265" title="3 of 4 branches missed.">                        switch (model.get(i).getOperatorStatus()) {</span>
                                case NEW:
<span class="nc" id="L1267">                                        op.setOperatorStatus(OperatorStatusType.NEW);</span>
<span class="nc" id="L1268">                                        break;</span>
                                case NORMAL:
<span class="fc" id="L1270">                                        op.setOperatorStatus(OperatorStatusType.NORMAL);</span>
<span class="fc" id="L1271">                                        break;</span>
                                case RESIGNED:
<span class="nc" id="L1273">                                        op.setOperatorStatus(OperatorStatusType.RESIGNED);</span>
                                        break;
                        }
<span class="fc" id="L1276">                        Contacts c = new Contacts();</span>
<span class="fc" id="L1277">                        mapContacts(model.get(i).getContact(), c, new BusinessEntity());</span>
<span class="fc" id="L1278">                        op.getContact().addAll(c.getContact());</span>

<span class="pc bpc" id="L1280" title="1 of 2 branches missed.">                        if (model.get(i).getKeyInfo() != null) {</span>
<span class="pc bpc" id="L1281" title="1 of 2 branches missed.">                                for (int x = 0; x &lt; model.get(i).getKeyInfo().size(); x++) {</span>
<span class="nc" id="L1282">                                        KeyInfoType apiKeyInfo = new KeyInfoType();</span>
<span class="nc" id="L1283">                                        KeyInfo modelKeyInfo = model.get(i).getKeyInfo().get(x);</span>
<span class="nc" id="L1284">                                        apiKeyInfo.setId(modelKeyInfo.getXmlID());</span>
<span class="nc" id="L1285">                                        List&lt;KeyDataValue&gt; modelKeyDataValueList = modelKeyInfo.getKeyDataValue();</span>
<span class="nc" id="L1286">                                        List&lt;Object&gt; apiX509KeyInfoList = apiKeyInfo.getContent();</span>
<span class="nc" id="L1287">                                        mapModelKeyDataValue(modelKeyDataValueList, apiX509KeyInfoList);</span>
<span class="nc" id="L1288">                                        op.getKeyInfo().add(apiKeyInfo);</span>
                                }
                        }
<span class="fc" id="L1291">                        api.add(op);</span>
                }

<span class="fc" id="L1294">        }</span>

        private static void mapCommunicationGraph(org.apache.juddi.model.ReplicationConfiguration model,
             CommunicationGraph api) {

<span class="fc" id="L1299">                mapEdge(model.getEdge(), api.getEdge());</span>
<span class="fc" id="L1300">                mapControlMessages(model.getControlMessage(), api.getControlledMessage());</span>
<span class="fc" id="L1301">                mapEdgeNodes(model.getNode(), api.getNode());</span>

<span class="fc" id="L1303">        }</span>

        private static void mapEdge(List&lt;Edge&gt; model, List&lt;CommunicationGraph.Edge&gt; api) {
<span class="fc" id="L1306">                Iterator&lt;Edge&gt; it = model.iterator();</span>
<span class="fc bfc" id="L1307" title="All 2 branches covered.">                while (it.hasNext()) {</span>
<span class="fc" id="L1308">                        Edge modelEdge = it.next();</span>

<span class="fc" id="L1310">                        CommunicationGraph.Edge apiEdge = new CommunicationGraph.Edge();</span>
<span class="fc" id="L1311">                        apiEdge.setMessageReceiver(modelEdge.getMessageReceiver());</span>
<span class="fc" id="L1312">                        apiEdge.setMessageSender(modelEdge.getMessageSender());</span>

<span class="fc" id="L1314">                        Iterator&lt;ControlMessage&gt; it2 = modelEdge.getMessages().iterator();</span>
<span class="fc bfc" id="L1315" title="All 2 branches covered.">                        while (it2.hasNext()) {</span>
<span class="fc" id="L1316">                                apiEdge.getMessage().add(it2.next().getMessage());</span>
                        }
<span class="fc" id="L1318">                        Iterator&lt;EdgeReceiverAlternate&gt; it3 = modelEdge.getMessageReceiverAlternate().iterator();</span>
<span class="fc bfc" id="L1319" title="All 2 branches covered.">                        while (it3.hasNext()) {</span>
<span class="fc" id="L1320">                                apiEdge.getMessageReceiverAlternate().add(it3.next().getReceiverAlternate());</span>
                        }

<span class="fc" id="L1323">                        api.add(apiEdge);</span>

<span class="fc" id="L1325">                }</span>
<span class="fc" id="L1326">        }</span>

        private static void mapControlMessages(List&lt;ControlMessage&gt; model, List&lt;String&gt; api) {
<span class="fc" id="L1329">                Iterator&lt;ControlMessage&gt; it = model.iterator();</span>
<span class="fc bfc" id="L1330" title="All 2 branches covered.">                while (it.hasNext()) {</span>
<span class="fc" id="L1331">                        api.add(it.next().getMessage());</span>
                }
<span class="fc" id="L1333">        }</span>

        private static void mapEdgeNodes(List&lt;ReplicationConfigurationNode&gt; model, List&lt;String&gt; api) {
<span class="fc" id="L1336">                Iterator&lt;ReplicationConfigurationNode&gt; it = model.iterator();</span>
<span class="fc bfc" id="L1337" title="All 2 branches covered.">                while (it.hasNext()) {</span>
<span class="fc" id="L1338">                        api.add(it.next().getNodeName());</span>
                }
<span class="fc" id="L1340">        }</span>

        public static ChangeRecord mapChangeRecord(org.apache.juddi.model.ChangeRecord cr) {
<span class="pc bpc" id="L1343" title="1 of 2 branches missed.">                if (cr == null) {</span>
<span class="nc" id="L1344">                        return null;</span>
                }
<span class="fc" id="L1346">                ChangeRecord ret = null;</span>

<span class="fc" id="L1348">                StringReader sr = null;</span>
                try {
<span class="fc" id="L1350">                        sr = new StringReader(new String(cr.getContents(), &quot;UTF8&quot;));</span>
<span class="nc" id="L1351">                } catch (UnsupportedEncodingException ex) {</span>
<span class="nc" id="L1352">                        Logger.getLogger(MappingModelToApi.class.getName()).log(Level.SEVERE, null, ex);</span>
<span class="fc" id="L1353">                }</span>
<span class="fc" id="L1354">                ret = (ChangeRecord) XmlUtils.unmarshal(sr, ChangeRecord.class);</span>
                //secret sauce here, if this is -1, that means that the record originated at this node and needs to be populated with the databases record id
<span class="pc bpc" id="L1356" title="2 of 4 branches missed.">                if (cr.getOriginatingUSN() == null || cr.getOriginatingUSN() == -1L) {</span>
<span class="nc" id="L1357">                        ret.setChangeID(new ChangeRecordIDType(cr.getNodeID(), cr.getId()));</span>
                } else {
<span class="fc" id="L1359">                        ret.setChangeID(new ChangeRecordIDType(cr.getNodeID(), cr.getOriginatingUSN()));</span>
                }
<span class="fc" id="L1361">                return ret;</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>