org.apache.juddi.mapping.MappingModelToApi.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.juddi.mapping.MappingModelToApi.java

Source

/*
 * Copyright 2001-2008 The Apache Software Foundation.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * 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 "AS IS" 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.io.ByteArrayInputStream;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
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.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.SignatureTransformDataValue;
import org.apache.juddi.subscription.TypeConvertor;
import org.apache.juddi.v3.error.ErrorMessage;
import org.apache.juddi.v3.error.FatalErrorException;
import org.uddi.api_v3.CompletionStatus;
import org.uddi.api_v3.OperationalInfo;
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.w3._2000._09.xmldsig_.X509IssuerSerialType;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

/**
 * @author <a href="mailto:jfaath@apache.org">Jeff Faath</a>
 * @author <a href="mailto:kstam@apache.org">Kurt T Stam</a>
 */
public class MappingModelToApi {
    private static Log logger = LogFactory.getLog(MappingModelToApi.class);

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

        apiPublisher.setAuthorizedName(modelPublisher.getAuthorizedName());
        apiPublisher.setPublisherName(modelPublisher.getPublisherName());
        apiPublisher.setEmailAddress(modelPublisher.getEmailAddress());
        apiPublisher.setIsAdmin(modelPublisher.getIsAdmin());
        apiPublisher.setIsEnabled(modelPublisher.getIsEnabled());
        apiPublisher.setMaxBindingsPerService(modelPublisher.getMaxBindingsPerService());
        apiPublisher.setMaxBusinesses(modelPublisher.getMaxBusinesses());
        apiPublisher.setMaxServicePerBusiness(modelPublisher.getMaxServicesPerBusiness());
        apiPublisher.setMaxTModels(modelPublisher.getMaxTmodels());
        mapSignature(modelPublisher.getSignatures(), apiPublisher.getSignature());
    }

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

        apiBusinessEntity.setBusinessKey(modelBusinessEntity.getEntityKey());

        mapBusinessNames(modelBusinessEntity.getBusinessNames(), apiBusinessEntity.getName());
        mapBusinessDescriptions(modelBusinessEntity.getBusinessDescrs(), apiBusinessEntity.getDescription());

        mapDiscoveryUrls(modelBusinessEntity.getDiscoveryUrls(), apiBusinessEntity.getDiscoveryURLs(),
                apiBusinessEntity);
        mapContacts(modelBusinessEntity.getContacts(), apiBusinessEntity.getContacts(), apiBusinessEntity);
        mapBusinessIdentifiers(modelBusinessEntity.getBusinessIdentifiers(), apiBusinessEntity.getIdentifierBag(),
                apiBusinessEntity);
        apiBusinessEntity.setCategoryBag(
                mapCategoryBag(modelBusinessEntity.getCategoryBag(), apiBusinessEntity.getCategoryBag()));

        mapBusinessServices(modelBusinessEntity.getBusinessServices(), modelBusinessEntity.getServiceProjections(),
                apiBusinessEntity.getBusinessServices(), apiBusinessEntity);

        mapSignature(modelBusinessEntity.getSignatures(), apiBusinessEntity.getSignature());
    }

    public static void mapSignature(List<org.apache.juddi.model.Signature> signatureList,
            List<org.w3._2000._09.xmldsig_.SignatureType> apiSignatureList) throws DispositionReportFaultMessage {
        apiSignatureList.clear();
        for (org.apache.juddi.model.Signature modelSig : signatureList) {
            SignatureType apiSignature = new SignatureType();
            apiSignature.setId(modelSig.getXmlID());

            SignedInfo modelSignedInfo = modelSig.getSignedInfo();
            SignedInfoType apiSignedInfoType = new SignedInfoType();
            apiSignature.setSignedInfo(apiSignedInfoType);
            // Canonicalization method
            CanonicalizationMethod modelCanonMethod = modelSignedInfo.getCanonicalizationMethod();
            CanonicalizationMethodType apiCanonMethod = new CanonicalizationMethodType();
            apiCanonMethod.setAlgorithm(modelCanonMethod.getAlgorithm());
            apiSignedInfoType.setCanonicalizationMethod(apiCanonMethod);

            // Signature Method
            String sigAlg = modelSignedInfo.getSignatureMethod().getAlgorithm();
            SignatureMethodType apiSigMethod = new SignatureMethodType();
            apiSigMethod.setAlgorithm(sigAlg);
            apiSignedInfoType.setSignatureMethod(apiSigMethod);

            // References
            List<Reference> modelReferenceList = modelSignedInfo.getReference();
            List<ReferenceType> apiReferenceList = apiSignedInfoType.getReference();
            for (Reference modelRef : modelReferenceList) {
                ReferenceType apiRef = new ReferenceType();
                String refUri = modelRef.getUri();
                if (refUri == null) {
                    refUri = "";
                }
                apiRef.setURI(refUri);

                List<SignatureTransform> modelSigTransformList = modelRef.getTransforms();
                TransformsType apiTransformsType = apiRef.getTransforms();
                if (apiTransformsType == null) {
                    apiTransformsType = new TransformsType();
                    apiRef.setTransforms(apiTransformsType);
                }
                List<TransformType> apiTransformList = apiTransformsType.getTransform();
                for (SignatureTransform modelSigTransform : modelSigTransformList) {
                    String modelTransformAlgStr = modelSigTransform.getTransform();
                    TransformType apiTransform = new TransformType();
                    apiTransform.setAlgorithm(modelTransformAlgStr);

                    List<SignatureTransformDataValue> sigTransformSDVList = modelSigTransform
                            .getSignatureTransformDataValue();
                    for (SignatureTransformDataValue sigTransformSDV : sigTransformSDVList) {
                        String type = sigTransformSDV.getContentType();
                        byte[] xformBytes = sigTransformSDV.getContentBytes();
                        Object transformObject = convertDataToTransformContent(type, xformBytes);
                        apiTransform.getContent().add(transformObject);
                    }

                    apiTransformList.add(apiTransform);
                }

                String digestMethodStr = modelRef.getDigestMethod();
                byte[] digestValBytes = modelRef.getDigestValue();

                DigestMethodType apiDigestMethod = new DigestMethodType();
                apiDigestMethod.setAlgorithm(digestMethodStr);
                apiRef.setDigestMethod(apiDigestMethod);
                apiRef.setDigestValue(digestValBytes);

                apiReferenceList.add(apiRef);
            }

            // Signature Value
            SignatureValueType apiSignatureValue = new SignatureValueType();
            SignatureValue modelSigValue = modelSig.getSignatureValue();
            apiSignatureValue.setId(modelSigValue.getXmlID());
            apiSignatureValue.setValue(modelSigValue.getValue());

            apiSignature.setSignatureValue(apiSignatureValue);

            KeyInfoType apiKeyInfo = new KeyInfoType();
            KeyInfo modelKeyInfo = modelSig.getKeyInfo();
            apiKeyInfo.setId(modelKeyInfo.getXmlID());

            List<KeyDataValue> modelKeyDataValueList = modelKeyInfo.getKeyDataValue();
            List<Object> apiX509KeyInfoList = apiKeyInfo.getContent();
            mapModelKeyDataValue(modelKeyDataValueList, apiX509KeyInfoList);
            apiSignature.setKeyInfo(apiKeyInfo);
            apiSignatureList.add(apiSignature);
        }
    }

    private static void mapModelKeyDataValue(List<KeyDataValue> modelKeyDataValueList,
            List<Object> parentKeyDataList) {
        for (KeyDataValue modelKeyDataValue : modelKeyDataValueList) {
            String tagName = modelKeyDataValue.getKeyDataName();
            String dataType = modelKeyDataValue.getKeyDataType();
            byte[] contentBytes = modelKeyDataValue.getKeyDataValueBytes();
            String contentStr = modelKeyDataValue.getKeyDataValueString();
            Object contents = contentBytes != null ? contentBytes : contentStr;

            if (contents == null) {
                List<Object> childKeyDataList = new ArrayList<Object>();
                if (dataType.equals(X509DataType.class.getSimpleName())) {
                    X509DataType x509DataType = new X509DataType();
                    mapModelKeyDataValue(modelKeyDataValue.getKeyDataValueList(), childKeyDataList);
                    x509DataType.getX509IssuerSerialOrX509SKIOrX509SubjectName().addAll(childKeyDataList);
                    JAXBElement dataJAXB = new JAXBElement(new QName("http://www.w3.org/2000/09/xmldsig#", tagName),
                            X509DataType.class, x509DataType);
                    parentKeyDataList.add(dataJAXB);
                } else if (dataType.equals(RetrievalMethodType.class.getSimpleName())) {
                    RetrievalMethodType retrievalMethodType = new RetrievalMethodType();
                    TransformsType transformsType = new TransformsType();
                    for (KeyDataValue retrievalMethodKDV : modelKeyDataValue.getKeyDataValueList()) {
                        if (retrievalMethodKDV.getKeyDataName().equals("Transform")) {
                            TransformType tType = new TransformType();
                            tType.setAlgorithm(retrievalMethodKDV.getKeyDataValueString());

                            for (KeyDataValue transformContentKDV : retrievalMethodKDV.getKeyDataValueList()) {
                                String type = transformContentKDV.getKeyDataType();
                                byte[] xformBytes = transformContentKDV.getKeyDataValueBytes();
                                Object transformObject = convertDataToTransformContent(type, xformBytes);
                                tType.getContent().add(transformObject);
                            }

                            transformsType.getTransform().add(tType);
                        } else if (retrievalMethodKDV.getKeyDataName().equals("Type")) {
                            retrievalMethodType.setType(retrievalMethodKDV.getKeyDataValueString());
                        } else if (retrievalMethodKDV.getKeyDataName().equals("URI")) {
                            retrievalMethodType.setURI(retrievalMethodKDV.getKeyDataValueString());
                        } else {
                            throw new RuntimeException(
                                    "Unrecognized key data type: " + retrievalMethodKDV.getKeyDataType());
                        }
                    }
                    if (transformsType.getTransform() != null && !transformsType.getTransform().isEmpty()) {
                        retrievalMethodType.setTransforms(transformsType);
                    }
                    JAXBElement dataJAXB = new JAXBElement(new QName("http://www.w3.org/2000/09/xmldsig#", tagName),
                            RetrievalMethodType.class, retrievalMethodType);
                    parentKeyDataList.add(dataJAXB);
                } else if (dataType.equals(PGPDataType.class.getSimpleName())) {
                    PGPDataType pgpDataType = new PGPDataType();

                    for (KeyDataValue pgpDataKDV : modelKeyDataValue.getKeyDataValueList()) {
                        String pgpDataTagName = pgpDataKDV.getKeyDataName();
                        Object pgpDataContents = pgpDataKDV.getKeyDataValueBytes() != null
                                ? pgpDataKDV.getKeyDataValueBytes()
                                : pgpDataKDV.getKeyDataValueString();
                        Class pgpDataClazz = pgpDataContents.getClass();
                        JAXBElement jaxb = new JAXBElement(
                                new QName("http://www.w3.org/2000/09/xmldsig#", pgpDataTagName), pgpDataClazz,
                                pgpDataContents);
                        pgpDataType.getContent().add(jaxb);
                    }

                    JAXBElement dataJAXB = new JAXBElement(new QName("http://www.w3.org/2000/09/xmldsig#", tagName),
                            PGPDataType.class, pgpDataType);
                    parentKeyDataList.add(dataJAXB);
                } else if (dataType.equals(SPKIDataType.class.getSimpleName())) {
                    SPKIDataType spkiDataType = new SPKIDataType();

                    for (KeyDataValue spkiDataKDV : modelKeyDataValue.getKeyDataValueList()) {
                        String spkiDataTagName = spkiDataKDV.getKeyDataName();
                        Object spkiDataContents = spkiDataKDV.getKeyDataValueBytes() != null
                                ? spkiDataKDV.getKeyDataValueBytes()
                                : spkiDataKDV.getKeyDataValueString();
                        Class spkiDataClazz = spkiDataContents.getClass();
                        JAXBElement jaxb = new JAXBElement(
                                new QName("http://www.w3.org/2000/09/xmldsig#", spkiDataTagName), spkiDataClazz,
                                spkiDataContents);
                        spkiDataType.getSPKISexpAndAny().add(jaxb);
                    }

                    JAXBElement dataJAXB = new JAXBElement(new QName("http://www.w3.org/2000/09/xmldsig#", tagName),
                            SPKIDataType.class, spkiDataType);
                    parentKeyDataList.add(dataJAXB);
                } else if (dataType.equals(KeyValueType.class.getSimpleName())) {
                    KeyValueType keyValueType = new KeyValueType();
                    for (KeyDataValue keyValueDataKDV : modelKeyDataValue.getKeyDataValueList()) {
                        for (KeyDataValue keyValueDataChildKDV : keyValueDataKDV.getKeyDataValueList()) {
                            String keyDataDataType = keyValueDataChildKDV.getKeyDataType();
                            if (keyDataDataType.equals("DSAKeyValueType")) {
                                DSAKeyValueType dsaKeyValueType = new DSAKeyValueType();
                                for (KeyDataValue dsaKDV : keyValueDataChildKDV.getKeyDataValueList()) {
                                    if ("G".equals(dsaKDV.getKeyDataName())) {
                                        dsaKeyValueType.setG(dsaKDV.getKeyDataValueBytes());
                                    } else if ("P".equals(dsaKDV.getKeyDataName())) {
                                        dsaKeyValueType.setP(dsaKDV.getKeyDataValueBytes());
                                    } else if ("Q".equals(dsaKDV.getKeyDataName())) {
                                        dsaKeyValueType.setQ(dsaKDV.getKeyDataValueBytes());
                                    } else if ("Y".equals(dsaKDV.getKeyDataName())) {
                                        dsaKeyValueType.setY(dsaKDV.getKeyDataValueBytes());
                                    } else if ("J".equals(dsaKDV.getKeyDataName())) {
                                        dsaKeyValueType.setJ(dsaKDV.getKeyDataValueBytes());
                                    } else if ("Seed".equals(dsaKDV.getKeyDataName())) {
                                        dsaKeyValueType.setSeed(dsaKDV.getKeyDataValueBytes());
                                    } else if ("PgenCounter".equals(dsaKDV.getKeyDataName())) {
                                        dsaKeyValueType.setPgenCounter(dsaKDV.getKeyDataValueBytes());
                                    } else {
                                        throw new RuntimeException(
                                                "Unrecognized dsa type: " + dsaKDV.getKeyDataName());
                                    }
                                }
                                JAXBElement jaxb = new JAXBElement(
                                        new QName("http://www.w3.org/2000/09/xmldsig#",
                                                keyValueDataChildKDV.getKeyDataName()),
                                        DSAKeyValueType.class, dsaKeyValueType);
                                keyValueType.getContent().add(jaxb);
                            } else if (keyDataDataType.equals("RSAKeyValueType")) {
                                RSAKeyValueType rsaKeyValueType = new RSAKeyValueType();
                                for (KeyDataValue rsaKDV : keyValueDataChildKDV.getKeyDataValueList()) {
                                    if ("Exponent".equals(rsaKDV.getKeyDataName())) {
                                        rsaKeyValueType.setExponent(rsaKDV.getKeyDataValueBytes());
                                    } else if ("Modulus".equals(rsaKDV.getKeyDataName())) {
                                        rsaKeyValueType.setModulus(rsaKDV.getKeyDataValueBytes());
                                    } else {
                                        throw new RuntimeException(
                                                "Unrecognized dsa type: " + rsaKDV.getKeyDataName());
                                    }
                                }
                                JAXBElement jaxb = new JAXBElement(
                                        new QName("http://www.w3.org/2000/09/xmldsig#",
                                                keyValueDataChildKDV.getKeyDataName()),
                                        RSAKeyValueType.class, rsaKeyValueType);
                                keyValueType.getContent().add(jaxb);
                            } else {
                                throw new RuntimeException("Unrecognized element: " + keyDataDataType);
                            }
                        }
                    }
                    JAXBElement dataJAXB = new JAXBElement(new QName("http://www.w3.org/2000/09/xmldsig#", tagName),
                            KeyValueType.class, keyValueType);
                    parentKeyDataList.add(dataJAXB);
                } else {
                    throw new RuntimeException("Unrecognized type: " + dataType);
                }
            } else {
                if (dataType != null && dataType.equals(X509IssuerSerialType.class.getSimpleName())) {
                    X509IssuerSerialType x509IssuerSerialType = new X509IssuerSerialType();
                    x509IssuerSerialType.setX509IssuerName(contentStr);
                    x509IssuerSerialType.setX509SerialNumber(new BigInteger(contentBytes));
                    JAXBElement dataJAXB = new JAXBElement(new QName("http://www.w3.org/2000/09/xmldsig#", tagName),
                            X509IssuerSerialType.class, x509IssuerSerialType);
                    parentKeyDataList.add(dataJAXB);
                } else {
                    JAXBElement dataJAXB = new JAXBElement(new QName("http://www.w3.org/2000/09/xmldsig#", tagName),
                            contents.getClass(), contents);
                    parentKeyDataList.add(dataJAXB);
                }
            }
        }
    }

    public static void mapBusinessNames(List<org.apache.juddi.model.BusinessName> modelNameList,
            List<org.uddi.api_v3.Name> apiNameList) throws DispositionReportFaultMessage {
        apiNameList.clear();

        for (org.apache.juddi.model.BusinessName modelName : modelNameList) {
            org.uddi.api_v3.Name apiName = new org.uddi.api_v3.Name();
            apiName.setLang(modelName.getLangCode());
            apiName.setValue(modelName.getName());
            apiNameList.add(apiName);
        }
    }

    public static void mapBusinessDescriptions(List<org.apache.juddi.model.BusinessDescr> modelDescList,
            List<org.uddi.api_v3.Description> apiDescList) throws DispositionReportFaultMessage {
        apiDescList.clear();

        for (org.apache.juddi.model.BusinessDescr modelDesc : modelDescList) {
            org.uddi.api_v3.Description apiDesc = new org.uddi.api_v3.Description();
            apiDesc.setLang(modelDesc.getLangCode());
            apiDesc.setValue(modelDesc.getDescr());
            apiDescList.add(apiDesc);
        }
    }

    public static void mapDiscoveryUrls(List<org.apache.juddi.model.DiscoveryUrl> modelDiscUrlList,
            org.uddi.api_v3.DiscoveryURLs apiDiscUrls, org.uddi.api_v3.BusinessEntity apiBusinessEntity)
            throws DispositionReportFaultMessage {
        if (modelDiscUrlList == null || modelDiscUrlList.size() == 0)
            return;

        if (apiDiscUrls == null)
            apiDiscUrls = new org.uddi.api_v3.DiscoveryURLs();

        List<org.uddi.api_v3.DiscoveryURL> apiDiscUrlList = apiDiscUrls.getDiscoveryURL();
        apiDiscUrlList.clear();

        for (org.apache.juddi.model.DiscoveryUrl modelDiscUrl : modelDiscUrlList) {
            org.uddi.api_v3.DiscoveryURL apiDiscUrl = new org.uddi.api_v3.DiscoveryURL();
            apiDiscUrl.setUseType(modelDiscUrl.getUseType());
            String discoveryURL = modelDiscUrl.getUrl();
            try {
                String baseUrl = AppConfig.getConfiguration().getString(Property.JUDDI_BASE_URL);
                if (baseUrl == null) {
                    logger.warn("Token '" + Property.JUDDI_BASE_URL
                            + "' not found in the juddiv3.xml, defaulting to '" + Property.DEFAULT_BASE_URL + "'");
                    baseUrl = Property.DEFAULT_BASE_URL;
                }
                discoveryURL = discoveryURL.replaceAll("\\$\\{" + Property.JUDDI_BASE_URL + "\\}", baseUrl);

                baseUrl = AppConfig.getConfiguration().getString(Property.JUDDI_BASE_URL_SECURE);
                if (baseUrl == null) {
                    logger.warn("Token '" + Property.JUDDI_BASE_URL_SECURE
                            + "' not found in the juddiv3.xml, defaulting to '" + Property.JUDDI_BASE_URL_SECURE
                            + "'");
                    baseUrl = Property.DEFAULT_BASE_URL_SECURE;
                }
                discoveryURL = discoveryURL.replaceAll("\\$\\{" + Property.JUDDI_BASE_URL_SECURE + "\\}", baseUrl);

            } catch (ConfigurationException e) {
                logger.error(e.getMessage(), e);
            }
            apiDiscUrl.setValue(discoveryURL);
            apiDiscUrlList.add(apiDiscUrl);
        }
        apiBusinessEntity.setDiscoveryURLs(apiDiscUrls);
    }

    public static void mapContacts(List<org.apache.juddi.model.Contact> modelContactList,
            org.uddi.api_v3.Contacts apiContacts, org.uddi.api_v3.BusinessEntity apiBusinessEntity)
            throws DispositionReportFaultMessage {
        if (modelContactList == null || modelContactList.size() == 0)
            return;

        if (apiContacts == null)
            apiContacts = new org.uddi.api_v3.Contacts();

        List<org.uddi.api_v3.Contact> apiContactList = apiContacts.getContact();
        apiContactList.clear();

        for (org.apache.juddi.model.Contact modelContact : modelContactList) {
            org.uddi.api_v3.Contact apiContact = new org.uddi.api_v3.Contact();
            apiContact.setUseType(modelContact.getUseType());

            mapPersonNames(modelContact.getPersonNames(), apiContact.getPersonName());
            mapContactDescriptions(modelContact.getContactDescrs(), apiContact.getDescription());
            mapContactEmails(modelContact.getEmails(), apiContact.getEmail());
            mapContactPhones(modelContact.getPhones(), apiContact.getPhone());
            mapContactAddresses(modelContact.getAddresses(), apiContact.getAddress());

            apiContactList.add(apiContact);
        }
        apiBusinessEntity.setContacts(apiContacts);
    }

    public static void mapContactDescriptions(List<org.apache.juddi.model.ContactDescr> modelDescList,
            List<org.uddi.api_v3.Description> apiDescList) throws DispositionReportFaultMessage {
        apiDescList.clear();

        for (org.apache.juddi.model.ContactDescr modelDesc : modelDescList) {
            org.uddi.api_v3.Description apiDesc = new org.uddi.api_v3.Description();
            apiDesc.setLang(modelDesc.getLangCode());
            apiDesc.setValue(modelDesc.getDescr());
            apiDescList.add(apiDesc);
        }
    }

    public static void mapPersonNames(List<org.apache.juddi.model.PersonName> modelPersonNameList,
            List<org.uddi.api_v3.PersonName> apiPersonNameList) throws DispositionReportFaultMessage {
        apiPersonNameList.clear();

        for (org.apache.juddi.model.PersonName personName : modelPersonNameList) {
            org.uddi.api_v3.PersonName apiPersonName = new org.uddi.api_v3.PersonName();
            apiPersonName.setLang(personName.getLangCode());
            apiPersonName.setValue(personName.getName());
            apiPersonNameList.add(apiPersonName);
        }
    }

    public static void mapContactEmails(List<org.apache.juddi.model.Email> modelEmailList,
            List<org.uddi.api_v3.Email> apiEmailList) throws DispositionReportFaultMessage {
        apiEmailList.clear();

        for (org.apache.juddi.model.Email modelEmail : modelEmailList) {
            org.uddi.api_v3.Email apiEmail = new org.uddi.api_v3.Email();
            apiEmail.setUseType(modelEmail.getUseType());
            apiEmail.setValue(modelEmail.getEmailAddress());
            apiEmailList.add(apiEmail);
        }
    }

    public static void mapContactPhones(List<org.apache.juddi.model.Phone> modelPhoneList,
            List<org.uddi.api_v3.Phone> apiPhoneList) throws DispositionReportFaultMessage {
        apiPhoneList.clear();

        for (org.apache.juddi.model.Phone modelPhone : modelPhoneList) {
            org.uddi.api_v3.Phone apiPhone = new org.uddi.api_v3.Phone();
            apiPhone.setUseType(modelPhone.getUseType());
            apiPhone.setValue(modelPhone.getPhoneNumber());
            apiPhoneList.add(apiPhone);
        }
    }

    public static void mapContactAddresses(List<org.apache.juddi.model.Address> modelAddressList,
            List<org.uddi.api_v3.Address> apiAddressList) throws DispositionReportFaultMessage {
        apiAddressList.clear();

        for (org.apache.juddi.model.Address modelAddress : modelAddressList) {
            org.uddi.api_v3.Address apiAddress = new org.uddi.api_v3.Address();
            apiAddress.setUseType(modelAddress.getUseType());
            apiAddress.setLang("");
            apiAddress.setSortCode(modelAddress.getSortCode());
            apiAddress.setTModelKey(modelAddress.getTmodelKey());

            mapAddressLines(modelAddress.getAddressLines(), apiAddress.getAddressLine());

            apiAddressList.add(apiAddress);
        }
    }

    public static void mapAddressLines(List<org.apache.juddi.model.AddressLine> modelAddressLineList,
            List<org.uddi.api_v3.AddressLine> apiAddressLineList) throws DispositionReportFaultMessage {
        apiAddressLineList.clear();

        for (org.apache.juddi.model.AddressLine modelAddressLine : modelAddressLineList) {
            org.uddi.api_v3.AddressLine apiAddressLine = new org.uddi.api_v3.AddressLine();
            apiAddressLine.setKeyName(modelAddressLine.getKeyName());
            apiAddressLine.setKeyValue(modelAddressLine.getKeyValue());
            apiAddressLine.setValue(modelAddressLine.getLine());
            apiAddressLineList.add(apiAddressLine);
        }
    }

    public static void mapBusinessIdentifiers(List<org.apache.juddi.model.BusinessIdentifier> modelIdentifierList,
            org.uddi.api_v3.IdentifierBag apiIdentifierBag, org.uddi.api_v3.BusinessEntity apiBusinessEntity)
            throws DispositionReportFaultMessage {
        if (modelIdentifierList == null || modelIdentifierList.size() == 0)
            return;

        if (apiIdentifierBag == null)
            apiIdentifierBag = new org.uddi.api_v3.IdentifierBag();

        List<org.uddi.api_v3.KeyedReference> apiKeyedRefList = apiIdentifierBag.getKeyedReference();
        apiKeyedRefList.clear();

        for (org.apache.juddi.model.BusinessIdentifier modelIdentifier : modelIdentifierList) {
            org.uddi.api_v3.KeyedReference apiKeyedRef = new org.uddi.api_v3.KeyedReference();
            apiKeyedRef.setTModelKey(modelIdentifier.getTmodelKeyRef());
            apiKeyedRef.setKeyName(modelIdentifier.getKeyName());
            apiKeyedRef.setKeyValue(modelIdentifier.getKeyValue());
            apiKeyedRefList.add(apiKeyedRef);
        }
        apiBusinessEntity.setIdentifierBag(apiIdentifierBag);
    }

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

        if (apiBusinessServices == null)
            apiBusinessServices = new org.uddi.api_v3.BusinessServices();

        List<org.uddi.api_v3.BusinessService> apiBusinessServiceList = apiBusinessServices.getBusinessService();
        apiBusinessServiceList.clear();

        if (modelBusinessServiceList != null && modelBusinessServiceList.size() > 0) {
            for (org.apache.juddi.model.BusinessService modelBusinessService : modelBusinessServiceList) {
                org.uddi.api_v3.BusinessService apiBusinessService = new org.uddi.api_v3.BusinessService();
                mapBusinessService(modelBusinessService, apiBusinessService);
                apiBusinessServiceList.add(apiBusinessService);
            }
        }

        if (modelServiceProjectionList != null && modelServiceProjectionList.size() > 0) {
            for (org.apache.juddi.model.ServiceProjection modelServiceProjection : modelServiceProjectionList) {
                org.uddi.api_v3.BusinessService apiBusinessService = new org.uddi.api_v3.BusinessService();
                mapBusinessService(modelServiceProjection.getBusinessService(), apiBusinessService);
                apiBusinessServiceList.add(apiBusinessService);
            }
        }

        if (apiBusinessServiceList.size() > 0)
            apiBusinessEntity.setBusinessServices(apiBusinessServices);
    }

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

        apiBusinessService.setBusinessKey(modelBusinessService.getBusinessEntity().getEntityKey());
        apiBusinessService.setServiceKey(modelBusinessService.getEntityKey());

        mapServiceNames(modelBusinessService.getServiceNames(), apiBusinessService.getName());
        mapServiceDescriptions(modelBusinessService.getServiceDescrs(), apiBusinessService.getDescription());
        mapBindingTemplates(modelBusinessService.getBindingTemplates(), apiBusinessService.getBindingTemplates(),
                apiBusinessService);
        apiBusinessService.setCategoryBag(
                mapCategoryBag(modelBusinessService.getCategoryBag(), apiBusinessService.getCategoryBag()));

        mapSignature(modelBusinessService.getSignatures(), apiBusinessService.getSignature());
    }

    public static void mapServiceNames(List<org.apache.juddi.model.ServiceName> modelNameList,
            List<org.uddi.api_v3.Name> apiNameList) throws DispositionReportFaultMessage {
        apiNameList.clear();

        for (org.apache.juddi.model.ServiceName modelName : modelNameList) {
            org.uddi.api_v3.Name apiName = new org.uddi.api_v3.Name();
            apiName.setLang(modelName.getLangCode());
            apiName.setValue(modelName.getName());
            apiNameList.add(apiName);
        }
    }

    public static void mapServiceDescriptions(List<org.apache.juddi.model.ServiceDescr> modelDescList,
            List<org.uddi.api_v3.Description> apiDescList) throws DispositionReportFaultMessage {
        apiDescList.clear();

        for (org.apache.juddi.model.ServiceDescr modelDesc : modelDescList) {
            org.uddi.api_v3.Description apiDesc = new org.uddi.api_v3.Description();
            apiDesc.setLang(modelDesc.getLangCode());
            apiDesc.setValue(modelDesc.getDescr());
            apiDescList.add(apiDesc);
        }
    }

    public static void mapBindingTemplates(List<org.apache.juddi.model.BindingTemplate> modelBindingTemplateList,
            org.uddi.api_v3.BindingTemplates apiBindingTemplates,
            org.uddi.api_v3.BusinessService apiBusinessService) throws DispositionReportFaultMessage {
        if (modelBindingTemplateList == null || modelBindingTemplateList.size() == 0)
            return;

        if (apiBindingTemplates == null)
            apiBindingTemplates = new org.uddi.api_v3.BindingTemplates();

        List<org.uddi.api_v3.BindingTemplate> apiBindingTemplateList = apiBindingTemplates.getBindingTemplate();
        apiBindingTemplateList.clear();

        for (org.apache.juddi.model.BindingTemplate modelBindingTemplate : modelBindingTemplateList) {
            org.uddi.api_v3.BindingTemplate apiBindingTemplate = new org.uddi.api_v3.BindingTemplate();
            mapBindingTemplate(modelBindingTemplate, apiBindingTemplate);
            apiBindingTemplateList.add(apiBindingTemplate);
        }
        apiBusinessService.setBindingTemplates(apiBindingTemplates);
    }

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

        apiBindingTemplate.setServiceKey(modelBindingTemplate.getBusinessService().getEntityKey());
        apiBindingTemplate.setBindingKey(modelBindingTemplate.getEntityKey());
        org.uddi.api_v3.AccessPoint apiAccessPoint = new org.uddi.api_v3.AccessPoint();
        apiAccessPoint.setUseType(modelBindingTemplate.getAccessPointType());
        String accessPointValue = modelBindingTemplate.getAccessPointUrl();
        if (accessPointValue != null) {
            try {
                String baseUrl = AppConfig.getConfiguration().getString(Property.JUDDI_BASE_URL);
                if (baseUrl == null) {
                    logger.warn("Token '" + Property.JUDDI_BASE_URL
                            + "' not found in the juddiv3.xml, defaulting to '" + Property.DEFAULT_BASE_URL + "'");
                    baseUrl = Property.DEFAULT_BASE_URL;
                }
                accessPointValue = accessPointValue.replaceAll("\\$\\{" + Property.JUDDI_BASE_URL + "\\}", baseUrl);

                baseUrl = AppConfig.getConfiguration().getString(Property.JUDDI_BASE_URL_SECURE);
                if (baseUrl == null) {
                    logger.warn("Token '" + Property.JUDDI_BASE_URL_SECURE
                            + "' not found in the juddiv3.xml, defaulting to '" + Property.JUDDI_BASE_URL_SECURE
                            + "'");
                    baseUrl = Property.DEFAULT_BASE_URL_SECURE;
                }
                accessPointValue = accessPointValue.replaceAll("\\$\\{" + Property.JUDDI_BASE_URL_SECURE + "\\}",
                        baseUrl);
            } catch (ConfigurationException e) {
                logger.error(e.getMessage(), e);
            }
        }
        apiAccessPoint.setValue(accessPointValue);
        apiBindingTemplate.setAccessPoint(apiAccessPoint);
        if (modelBindingTemplate.getHostingRedirector() != null) {
            org.uddi.api_v3.HostingRedirector apiHost = new org.uddi.api_v3.HostingRedirector();
            apiHost.setBindingKey(modelBindingTemplate.getHostingRedirector());
            apiBindingTemplate.setHostingRedirector(apiHost);
        }
        mapTModelInstanceDetails(modelBindingTemplate.getTmodelInstanceInfos(),
                apiBindingTemplate.getTModelInstanceDetails(), apiBindingTemplate);
        mapBindingDescriptions(modelBindingTemplate.getBindingDescrs(), apiBindingTemplate.getDescription());

        apiBindingTemplate.setCategoryBag(
                mapCategoryBag(modelBindingTemplate.getCategoryBag(), apiBindingTemplate.getCategoryBag()));
        mapSignature(modelBindingTemplate.getSignatures(), apiBindingTemplate.getSignature());
    }

    public static void mapBindingDescriptions(List<org.apache.juddi.model.BindingDescr> modelDescList,
            List<org.uddi.api_v3.Description> apiDescList) throws DispositionReportFaultMessage {
        apiDescList.clear();

        for (org.apache.juddi.model.BindingDescr modelDesc : modelDescList) {
            org.uddi.api_v3.Description apiDesc = new org.uddi.api_v3.Description();
            apiDesc.setLang(modelDesc.getLangCode());
            apiDesc.setValue(modelDesc.getDescr());
            apiDescList.add(apiDesc);
        }
    }

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

        if (modelCategoryBag != null) {
            if (apiCategoryBag == null)
                apiCategoryBag = new org.uddi.api_v3.CategoryBag();

            for (org.apache.juddi.model.KeyedReference modelKeyedReference : modelCategoryBag
                    .getKeyedReferences()) {
                org.uddi.api_v3.KeyedReference apiKeyedReference = new org.uddi.api_v3.KeyedReference();
                apiKeyedReference.setTModelKey(modelKeyedReference.getTmodelKeyRef());
                apiKeyedReference.setKeyName(modelKeyedReference.getKeyName());
                apiKeyedReference.setKeyValue(modelKeyedReference.getKeyValue());
                apiCategoryBag.getKeyedReference().add(apiKeyedReference);
            }
            for (org.apache.juddi.model.KeyedReferenceGroup modelKeyedReferenceGroup : modelCategoryBag
                    .getKeyedReferenceGroups()) {
                org.uddi.api_v3.KeyedReferenceGroup apiKeyedReferenceGroup = new org.uddi.api_v3.KeyedReferenceGroup();

                mapKeyedReferenceGroup(modelKeyedReferenceGroup, apiKeyedReferenceGroup);

                apiCategoryBag.getKeyedReferenceGroup().add(apiKeyedReferenceGroup);
            }
        }
        return apiCategoryBag;
    }

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

        apiKeyedReferenceGroup.setTModelKey(modelKeyedReferenceGroup.getTmodelKey());

        for (org.apache.juddi.model.KeyedReference modelKeyedReference : modelKeyedReferenceGroup
                .getKeyedReferences()) {
            org.uddi.api_v3.KeyedReference apiKeyedReference = new org.uddi.api_v3.KeyedReference();
            apiKeyedReference.setTModelKey(modelKeyedReference.getTmodelKeyRef());
            apiKeyedReference.setKeyName(modelKeyedReference.getKeyName());
            apiKeyedReference.setKeyValue(modelKeyedReference.getKeyValue());
            apiKeyedReferenceGroup.getKeyedReference().add(apiKeyedReference);
        }

    }

    public static void mapTModelInstanceDetails(
            List<org.apache.juddi.model.TmodelInstanceInfo> modelTModelInstInfoList,
            org.uddi.api_v3.TModelInstanceDetails apiTModelInstDetails,
            org.uddi.api_v3.BindingTemplate apiBindingTemplate) throws DispositionReportFaultMessage {
        if (modelTModelInstInfoList == null || modelTModelInstInfoList.size() == 0)
            return;

        if (apiTModelInstDetails == null)
            apiTModelInstDetails = new org.uddi.api_v3.TModelInstanceDetails();

        List<org.uddi.api_v3.TModelInstanceInfo> apiTModelInstInfoList = apiTModelInstDetails
                .getTModelInstanceInfo();
        apiTModelInstInfoList.clear();

        for (org.apache.juddi.model.TmodelInstanceInfo modelTModelInstInfo : modelTModelInstInfoList) {
            org.uddi.api_v3.TModelInstanceInfo apiTModelInstInfo = new org.uddi.api_v3.TModelInstanceInfo();
            apiTModelInstInfo.setTModelKey(modelTModelInstInfo.getTmodelKey());
            mapTModelInstanceInfoDescriptions(modelTModelInstInfo.getTmodelInstanceInfoDescrs(),
                    apiTModelInstInfo.getDescription());
            mapInstanceDetails(modelTModelInstInfo, apiTModelInstInfo.getInstanceDetails(), apiTModelInstInfo);

            apiTModelInstInfoList.add(apiTModelInstInfo);
        }
        apiBindingTemplate.setTModelInstanceDetails(apiTModelInstDetails);
    }

    public static void mapTModelInstanceInfoDescriptions(
            List<org.apache.juddi.model.TmodelInstanceInfoDescr> modelDescList,
            List<org.uddi.api_v3.Description> apiDescList) throws DispositionReportFaultMessage {
        apiDescList.clear();

        for (org.apache.juddi.model.TmodelInstanceInfoDescr modelDesc : modelDescList) {
            org.uddi.api_v3.Description apiDesc = new org.uddi.api_v3.Description();
            apiDesc.setLang(modelDesc.getLangCode());
            apiDesc.setValue(modelDesc.getDescr());
            apiDescList.add(apiDesc);
        }
    }

    public static void mapInstanceDetails(org.apache.juddi.model.TmodelInstanceInfo modelTModelInstInfo,
            org.uddi.api_v3.InstanceDetails apiInstanceDetails,
            org.uddi.api_v3.TModelInstanceInfo apiTModelInstInfo) throws DispositionReportFaultMessage {
        if (modelTModelInstInfo == null || (modelTModelInstInfo.getInstanceParms() == null
                && modelTModelInstInfo.getOverviewDocs().size() == 0))
            return;

        if (apiInstanceDetails == null)
            apiInstanceDetails = new org.uddi.api_v3.InstanceDetails();

        //InstanceParms
        apiInstanceDetails.setInstanceParms(modelTModelInstInfo.getInstanceParms());
        //Descriptions
        List<org.apache.juddi.model.InstanceDetailsDescr> modelInstDetailsDescrList = modelTModelInstInfo
                .getInstanceDetailsDescrs();
        for (org.apache.juddi.model.InstanceDetailsDescr modelInstDetailDescr : modelInstDetailsDescrList) {
            org.uddi.api_v3.Description apiDesc = new org.uddi.api_v3.Description();
            apiDesc.setLang(modelInstDetailDescr.getLangCode());
            apiDesc.setValue(modelInstDetailDescr.getDescr());
            apiInstanceDetails.getDescription().add(apiDesc);
        }
        //OverviewDoc
        mapOverviewDocs(modelTModelInstInfo.getOverviewDocs(), apiInstanceDetails, null);

        apiTModelInstInfo.setInstanceDetails(apiInstanceDetails);
    }

    public static void mapOverviewDocs(List<org.apache.juddi.model.OverviewDoc> modelOverviewDocs,
            org.uddi.api_v3.InstanceDetails apiInstanceDetails, org.uddi.api_v3.TModel apiTModel) {
        for (OverviewDoc modelOverviewDoc : modelOverviewDocs) {
            org.uddi.api_v3.OverviewDoc apiOverviewDoc = new org.uddi.api_v3.OverviewDoc();

            //Descriptions
            List<org.apache.juddi.model.OverviewDocDescr> overviewDocDescrList = modelOverviewDoc
                    .getOverviewDocDescrs();
            for (org.apache.juddi.model.OverviewDocDescr overviewDocDescr : overviewDocDescrList) {
                org.uddi.api_v3.Description apiDesc = new org.uddi.api_v3.Description();
                apiDesc.setLang(overviewDocDescr.getLangCode());
                apiDesc.setValue(overviewDocDescr.getDescr());
                apiOverviewDoc.getDescription().add(apiDesc);
            }
            //OverviewURL
            org.uddi.api_v3.OverviewURL apiOverviewURL = new org.uddi.api_v3.OverviewURL();
            apiOverviewURL.setUseType(modelOverviewDoc.getOverviewUrlUseType());
            apiOverviewURL.setValue(modelOverviewDoc.getOverviewUrl());
            apiOverviewDoc.setOverviewURL(apiOverviewURL);
            //Set the entity on the apiOverviewDoc
            if (apiInstanceDetails != null) {
                apiInstanceDetails.getOverviewDoc().add(apiOverviewDoc);
            } else {
                apiTModel.getOverviewDoc().add(apiOverviewDoc);
            }
        }
    }

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

        apiTModel.setTModelKey(modelTModel.getEntityKey());
        org.uddi.api_v3.Name apiName = new org.uddi.api_v3.Name();
        apiName.setValue(modelTModel.getName());
        apiName.setLang(modelTModel.getLangCode());
        apiTModel.setName(apiName);
        apiTModel.setDeleted(modelTModel.getDeleted());

        mapTModelDescriptions(modelTModel.getTmodelDescrs(), apiTModel.getDescription());

        mapTModelIdentifiers(modelTModel.getTmodelIdentifiers(), apiTModel.getIdentifierBag(), apiTModel);
        apiTModel.setCategoryBag(mapCategoryBag(modelTModel.getCategoryBag(), apiTModel.getCategoryBag()));

        mapOverviewDocs(modelTModel.getOverviewDocs(), null, apiTModel);
        mapSignature(modelTModel.getSignatures(), apiTModel.getSignature());
    }

    public static void mapTModelDescriptions(List<org.apache.juddi.model.TmodelDescr> modelDescList,
            List<org.uddi.api_v3.Description> apiDescList) throws DispositionReportFaultMessage {
        apiDescList.clear();

        for (org.apache.juddi.model.TmodelDescr modelDesc : modelDescList) {
            org.uddi.api_v3.Description apiDesc = new org.uddi.api_v3.Description();
            apiDesc.setLang(modelDesc.getLangCode());
            apiDesc.setValue(modelDesc.getDescr());
            apiDescList.add(apiDesc);
        }
    }

    public static void mapTModelIdentifiers(List<org.apache.juddi.model.TmodelIdentifier> modelIdentifierList,
            org.uddi.api_v3.IdentifierBag apiIdentifierBag, org.uddi.api_v3.TModel apiTModel)
            throws DispositionReportFaultMessage {
        if (modelIdentifierList == null || modelIdentifierList.size() == 0)
            return;

        if (apiIdentifierBag == null)
            apiIdentifierBag = new org.uddi.api_v3.IdentifierBag();

        List<org.uddi.api_v3.KeyedReference> apiKeyedRefList = apiIdentifierBag.getKeyedReference();
        apiKeyedRefList.clear();

        for (org.apache.juddi.model.TmodelIdentifier modelIdentifier : modelIdentifierList) {
            org.uddi.api_v3.KeyedReference apiKeyedRef = new org.uddi.api_v3.KeyedReference();
            apiKeyedRef.setTModelKey(modelIdentifier.getTmodelKeyRef());
            apiKeyedRef.setKeyName(modelIdentifier.getKeyName());
            apiKeyedRef.setKeyValue(modelIdentifier.getKeyValue());
            apiKeyedRefList.add(apiKeyedRef);
        }
        apiTModel.setIdentifierBag(apiIdentifierBag);
    }

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

        apiBusinessInfo.setBusinessKey(modelBusinessEntity.getEntityKey());

        mapBusinessNames(modelBusinessEntity.getBusinessNames(), apiBusinessInfo.getName());
        mapBusinessDescriptions(modelBusinessEntity.getBusinessDescrs(), apiBusinessInfo.getDescription());

        mapServiceInfos(modelBusinessEntity.getBusinessServices(), apiBusinessInfo.getServiceInfos(),
                apiBusinessInfo);

    }

    public static void mapServiceInfos(List<org.apache.juddi.model.BusinessService> modelBusinessServiceList,
            org.uddi.api_v3.ServiceInfos apiServiceInfos, org.uddi.api_v3.BusinessInfo apiBusinessInfo)
            throws DispositionReportFaultMessage {
        if (modelBusinessServiceList.size() == 0)
            return;
        if (apiServiceInfos == null)
            apiServiceInfos = new org.uddi.api_v3.ServiceInfos();

        List<org.uddi.api_v3.ServiceInfo> apiServiceInfoList = apiServiceInfos.getServiceInfo();
        apiServiceInfoList.clear();

        for (org.apache.juddi.model.BusinessService modelBusinessService : modelBusinessServiceList) {
            org.uddi.api_v3.ServiceInfo apiServiceInfo = new org.uddi.api_v3.ServiceInfo();

            mapServiceInfo(modelBusinessService, apiServiceInfo);

            apiServiceInfos.getServiceInfo().add(apiServiceInfo);
        }
        apiBusinessInfo.setServiceInfos(apiServiceInfos);
    }

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

        apiServiceInfo.setBusinessKey(modelBusinessService.getBusinessEntity().getEntityKey());
        apiServiceInfo.setServiceKey(modelBusinessService.getEntityKey());

        mapServiceNames(modelBusinessService.getServiceNames(), apiServiceInfo.getName());
    }

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

        apiTModelInfo.setTModelKey(modelTModel.getEntityKey());
        org.uddi.api_v3.Name apiName = new org.uddi.api_v3.Name();
        apiName.setValue(modelTModel.getName());
        apiName.setLang(modelTModel.getLangCode());
        apiTModelInfo.setName(apiName);

        mapTModelDescriptions(modelTModel.getTmodelDescrs(), apiTModelInfo.getDescription());

    }

    public static void mapAuthToken(org.apache.juddi.model.AuthToken modelAuthToken,
            org.uddi.api_v3.AuthToken apiAuthToken) throws DispositionReportFaultMessage {
        apiAuthToken.setAuthInfo(modelAuthToken.getAuthToken());

    }

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

        apiPublisherAssertion.setFromKey(modelPublisherAssertion.getId().getFromKey());
        apiPublisherAssertion.setToKey(modelPublisherAssertion.getId().getToKey());

        org.uddi.api_v3.KeyedReference keyedRef = new org.uddi.api_v3.KeyedReference();
        keyedRef.setTModelKey(modelPublisherAssertion.getTmodelKey());
        keyedRef.setKeyName(modelPublisherAssertion.getKeyName());
        keyedRef.setKeyValue(modelPublisherAssertion.getKeyValue());

        apiPublisherAssertion.setKeyedReference(keyedRef);
    }

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

        apiAssertionStatusItem.setFromKey(modelPublisherAssertion.getId().getFromKey());
        apiAssertionStatusItem.setToKey(modelPublisherAssertion.getId().getToKey());

        org.uddi.api_v3.KeyedReference keyedRef = new org.uddi.api_v3.KeyedReference();
        keyedRef.setTModelKey(modelPublisherAssertion.getTmodelKey());
        keyedRef.setKeyName(modelPublisherAssertion.getKeyName());
        keyedRef.setKeyValue(modelPublisherAssertion.getKeyValue());

        apiAssertionStatusItem.setKeyedReference(keyedRef);

        if ("true".equalsIgnoreCase(modelPublisherAssertion.getFromCheck())
                && "true".equalsIgnoreCase(modelPublisherAssertion.getToCheck()))
            apiAssertionStatusItem.setCompletionStatus(CompletionStatus.STATUS_COMPLETE);
        else if (!"true".equalsIgnoreCase(modelPublisherAssertion.getFromCheck())
                && "true".equalsIgnoreCase(modelPublisherAssertion.getToCheck()))
            apiAssertionStatusItem.setCompletionStatus(CompletionStatus.STATUS_FROM_KEY_INCOMPLETE);
        else if ("true".equalsIgnoreCase(modelPublisherAssertion.getFromCheck())
                && !"true".equalsIgnoreCase(modelPublisherAssertion.getToCheck()))
            apiAssertionStatusItem.setCompletionStatus(CompletionStatus.STATUS_TO_KEY_INCOMPLETE);
        else if (!"true".equalsIgnoreCase(modelPublisherAssertion.getFromCheck())
                && !"true".equalsIgnoreCase(modelPublisherAssertion.getToCheck()))
            apiAssertionStatusItem.setCompletionStatus(CompletionStatus.STATUS_BOTH_INCOMPLETE);

        org.uddi.api_v3.KeysOwned keysOwned = new org.uddi.api_v3.KeysOwned();

        //converting resultList to simple List
        List<String> businessKeyList = new ArrayList<String>();
        for (Object businessKey : businessKeys) {
            businessKeyList.add(String.valueOf(businessKey));
        }
        Collections.sort(businessKeyList);
        if (Collections.binarySearch(businessKeyList,
                modelPublisherAssertion.getBusinessEntityByFromKey().getEntityKey()) >= 0)
            keysOwned.setFromKey(modelPublisherAssertion.getBusinessEntityByFromKey().getEntityKey());

        if (Collections.binarySearch(businessKeyList,
                modelPublisherAssertion.getBusinessEntityByToKey().getEntityKey()) >= 0)
            keysOwned.setToKey(modelPublisherAssertion.getBusinessEntityByToKey().getEntityKey());
        if (keysOwned.getFromKey() == null && keysOwned.getToKey() == null) {
            throw new FatalErrorException(new ErrorMessage("errors.invalidKey.KeysOwned"));
        }
        apiAssertionStatusItem.setKeysOwned(keysOwned);
    }

    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 {

        apiRelatedBusinessInfo.setBusinessKey(modelRelatedBusiness.getEntityKey());

        mapBusinessNames(modelRelatedBusiness.getBusinessNames(), apiRelatedBusinessInfo.getName());
        mapBusinessDescriptions(modelRelatedBusiness.getBusinessDescrs(), apiRelatedBusinessInfo.getDescription());

        org.uddi.api_v3.SharedRelationships sharedRelationships = new org.uddi.api_v3.SharedRelationships();
        sharedRelationships.setDirection(direction);

        org.uddi.api_v3.KeyedReference keyedRef = new org.uddi.api_v3.KeyedReference();
        keyedRef.setTModelKey(modelPublisherAssertion.getTmodelKey());
        keyedRef.setKeyName(modelPublisherAssertion.getKeyName());
        keyedRef.setKeyValue(modelPublisherAssertion.getKeyValue());
        sharedRelationships.getKeyedReference().add(keyedRef);

        apiRelatedBusinessInfo.getSharedRelationships().add(sharedRelationships);
    }

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

        apiOperationalInfo
                .setCreated(TypeConvertor.convertDateToXMLGregorianCalendar(modelUddiEntity.getCreated()));
        apiOperationalInfo
                .setModified(TypeConvertor.convertDateToXMLGregorianCalendar(modelUddiEntity.getModified()));
        apiOperationalInfo.setModifiedIncludingChildren(
                TypeConvertor.convertDateToXMLGregorianCalendar(modelUddiEntity.getModifiedIncludingChildren()));
        apiOperationalInfo.setNodeID(modelUddiEntity.getNodeId());
        apiOperationalInfo.setAuthorizedName(modelUddiEntity.getAuthorizedName());
        apiOperationalInfo.setEntityKey(modelUddiEntity.getEntityKey());
    }

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

        apiSubscription.setSubscriptionKey(modelSubscription.getSubscriptionKey());
        apiSubscription.setBrief(modelSubscription.isBrief());
        apiSubscription.setExpiresAfter(
                TypeConvertor.convertDateToXMLGregorianCalendar(modelSubscription.getExpiresAfter()));
        apiSubscription.setBindingKey(modelSubscription.getBindingKey());
        apiSubscription.setMaxEntities(modelSubscription.getMaxEntities());
        apiSubscription.setNotificationInterval(
                TypeConvertor.convertStringToDuration(modelSubscription.getNotificationInterval()));

        try {
            SubscriptionFilter existingFilter = (SubscriptionFilter) JAXBMarshaller.unmarshallFromString(
                    modelSubscription.getSubscriptionFilter(), JAXBMarshaller.PACKAGE_SUBSCRIPTION);
            apiSubscription.setSubscriptionFilter(existingFilter);
        } catch (JAXBException e) {
            logger.error("JAXB Exception while marshalling subscription filter", e);
            throw new FatalErrorException(new ErrorMessage("errors.Unspecified"));
        }
    }

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

        apiClientSubscriptionInfo.setSubscriptionKey(modelClientSubscriptionInfo.getSubscriptionKey());
        GregorianCalendar gcal = new GregorianCalendar();
        gcal.setTimeInMillis(modelClientSubscriptionInfo.getLastNotified().getTime());
        try {
            apiClientSubscriptionInfo.setLastModified(DatatypeFactory.newInstance().newXMLGregorianCalendar(gcal));
        } catch (DatatypeConfigurationException ex) {
            logger.warn("unable to create DatatypeFactory", ex);
        }

        if (modelClientSubscriptionInfo.getFromClerk() != null) {
            org.apache.juddi.api_v3.Clerk apiFromClerk = new org.apache.juddi.api_v3.Clerk();
            mapClerk(modelClientSubscriptionInfo.getFromClerk(), apiFromClerk);
            apiClientSubscriptionInfo.setFromClerk(apiFromClerk);
        }
        if (modelClientSubscriptionInfo.getToClerk() != null) {
            org.apache.juddi.api_v3.Clerk apiToClerk = new org.apache.juddi.api_v3.Clerk();
            mapClerk(modelClientSubscriptionInfo.getToClerk(), apiToClerk);
            apiClientSubscriptionInfo.setToClerk(apiToClerk);
        }
    }

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

        apiClerk.setName(modelClerk.getClerkName());
        apiClerk.setPassword(modelClerk.getCred());
        apiClerk.setPublisher(modelClerk.getPublisherId());
        if (modelClerk.getNode() != null) {
            org.apache.juddi.api_v3.Node apiNode = new org.apache.juddi.api_v3.Node();
            mapNode(modelClerk.getNode(), apiNode);
            apiClerk.setNode(apiNode);
        }
    }

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

        apiNode.setCustodyTransferUrl(modelNode.getCustodyTransferUrl());
        apiNode.setFactoryInitial(modelNode.getFactoryInitial());
        apiNode.setFactoryNamingProvider(modelNode.getFactoryNamingProvider());
        apiNode.setFactoryURLPkgs(modelNode.getFactoryURLPkgs());
        apiNode.setInquiryUrl(modelNode.getInquiryUrl());
        apiNode.setJuddiApiUrl(modelNode.getJuddiApiUrl());
        apiNode.setName(modelNode.getName());
        apiNode.setClientName(modelNode.getClientName());
        apiNode.setProxyTransport(modelNode.getProxyTransport());
        apiNode.setPublishUrl(modelNode.getPublishUrl());
        apiNode.setSecurityUrl(modelNode.getSecurityUrl());
        apiNode.setSubscriptionUrl(modelNode.getSubscriptionUrl());
    }

    private static Object convertDataToTransformContent(String type, byte[] xformBytes) throws RuntimeException {
        Object transformObject;
        if (type.equals(String.class.getSimpleName())) {
            try {
                transformObject = new String(xformBytes, "UTF-8");
            } catch (Exception e) {
                throw new RuntimeException("Error decoding string due to: " + e.getMessage(), e);
            }
        } else if (type.equals(byte[].class.getSimpleName())) {
            transformObject = xformBytes;
        } else if (type.equals(Element.class.getCanonicalName())) {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            dbf.setNamespaceAware(true);
            dbf.setXIncludeAware(true);
            try {
                DocumentBuilder db = dbf.newDocumentBuilder();
                Document doc = db.parse(new ByteArrayInputStream(xformBytes));
                transformObject = doc.getDocumentElement();
            } catch (Exception e) {
                throw new RuntimeException("Failed to parse element due to: " + e.getMessage(), e);
            }
        } else {
            throw new RuntimeException("Unrecognized type: " + type);
        }
        return transformObject;
    }
}