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

Java tutorial

Introduction

Here is the source code for org.apache.juddi.mapping.MappingApiToModel.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.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import javax.xml.bind.JAXB;
import javax.xml.bind.JAXBElement;
import javax.xml.transform.dom.DOMResult;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.juddi.jaxb.JAXBMarshaller;
import org.apache.juddi.model.BindingTemplate;
import org.apache.juddi.model.BusinessService;
import org.apache.juddi.model.CanonicalizationMethod;
import org.apache.juddi.model.KeyInfo;
import org.apache.juddi.model.Publisher;
import org.apache.juddi.model.Reference;
import org.apache.juddi.model.Signature;
import org.apache.juddi.model.SignatureMethod;
import org.apache.juddi.model.SignatureTransform;
import org.apache.juddi.model.SignatureValue;
import org.apache.juddi.model.SignedInfo;
import org.apache.juddi.model.Tmodel;
import org.apache.juddi.model.KeyDataValue;
import org.apache.juddi.model.SignatureTransformDataValue;
import org.uddi.api_v3.Description;
import org.uddi.sub_v3.ObjectFactory;
import org.uddi.v3_service.DispositionReportFaultMessage;
import org.w3._2000._09.xmldsig_.DSAKeyValueType;
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_.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.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSException;
import org.w3c.dom.ls.LSSerializer;

/**
 * Handles mapping from the internal jUDDL API Model to the JAXB/XML/WSDL UDDI
 * data structures
 *
 * @author <a href="mailto:jfaath@apache.org">Jeff Faath</a>
 * @author <a href="mailto:kstam@apache.org">Kurt T Stam</a>
 * @author <a href="mailto:tcunning@apache.org">Tom Cunningham</a>
 * @author <a href="mailto:alexoree@apache.org">Alex O'Ree</a>
 */
public class MappingApiToModel {

    private static Log logger = LogFactory.getLog(MappingApiToModel.class);

    /**
     *
     * @param apiPublisher
     * @param modelPublisher
     * @throws DispositionReportFaultMessage
     */
    public static void mapPublisher(org.apache.juddi.api_v3.Publisher apiPublisher,
            org.apache.juddi.model.Publisher modelPublisher) throws DispositionReportFaultMessage {
        modelPublisher.setAuthorizedName(apiPublisher.getAuthorizedName());
        modelPublisher.setPublisherName(apiPublisher.getPublisherName());
        modelPublisher.setEmailAddress(apiPublisher.getEmailAddress());
        modelPublisher.setIsAdmin(apiPublisher.isIsAdmin());
        modelPublisher.setIsEnabled(apiPublisher.isIsEnabled());
        modelPublisher.setMaxBindingsPerService(apiPublisher.getMaxBindingsPerService());
        modelPublisher.setMaxBusinesses(apiPublisher.getMaxBusinesses());
        modelPublisher.setMaxServicesPerBusiness(apiPublisher.getMaxServicePerBusiness());
        modelPublisher.setMaxTmodels(apiPublisher.getMaxTModels());
        mapPublisherSignatures(apiPublisher.getSignature(), modelPublisher);
    }

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

        modelBusinessEntity.setEntityKey(apiBusinessEntity.getBusinessKey());

        mapBusinessNames(apiBusinessEntity.getName(), modelBusinessEntity.getBusinessNames(), modelBusinessEntity);
        mapBusinessDescriptions(apiBusinessEntity.getDescription(), modelBusinessEntity.getBusinessDescrs(),
                modelBusinessEntity);
        mapDiscoveryUrls(apiBusinessEntity.getDiscoveryURLs(), modelBusinessEntity.getDiscoveryUrls(),
                modelBusinessEntity);
        mapContacts(apiBusinessEntity.getContacts(), modelBusinessEntity.getContacts(), modelBusinessEntity);
        mapBusinessIdentifiers(apiBusinessEntity.getIdentifierBag(), modelBusinessEntity.getBusinessIdentifiers(),
                modelBusinessEntity);
        if (apiBusinessEntity.getCategoryBag() != null) {
            modelBusinessEntity.setCategoryBag(new org.apache.juddi.model.BusinessCategoryBag(modelBusinessEntity));
            mapCategoryBag(apiBusinessEntity.getCategoryBag(), modelBusinessEntity.getCategoryBag());
        }

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

        mapBusinessSignature(apiBusinessEntity.getSignature(), modelBusinessEntity);
    }

    private static List<Signature> mapApiSignaturesToModelSignatures(
            List<org.w3._2000._09.xmldsig_.SignatureType> apiSignatures) throws DispositionReportFaultMessage {
        List<Signature> modelSignatures = new ArrayList<Signature>();
        modelSignatures.clear();
        for (org.w3._2000._09.xmldsig_.SignatureType signatureType : apiSignatures) {
            Signature modelSignature = new Signature();

            org.w3._2000._09.xmldsig_.SignedInfoType apiSignedInfo = signatureType.getSignedInfo();
            SignedInfo modelSignedInfo = new SignedInfo();
            modelSignature.setSignedInfo(modelSignedInfo);

            String canonicalizationAlgMethod = apiSignedInfo.getCanonicalizationMethod().getAlgorithm();
            CanonicalizationMethod modelCanonMethod = new CanonicalizationMethod();
            modelSignedInfo.setCanonicalizationMethod(modelCanonMethod);
            modelCanonMethod.setAlgorithm(canonicalizationAlgMethod);

            SignatureMethod modelSigMethod = new SignatureMethod();
            modelSignedInfo.setSignatureMethod(modelSigMethod);
            String sigMethod = apiSignedInfo.getSignatureMethod().getAlgorithm();
            modelSigMethod.setAlgorithm(sigMethod);

            List<org.w3._2000._09.xmldsig_.ReferenceType> apiReferenceList = apiSignedInfo.getReference();
            for (org.w3._2000._09.xmldsig_.ReferenceType apiReference : apiReferenceList) {
                Reference ref = mapReference(modelSignedInfo, apiReference);
                modelSignedInfo.getReference().add(ref);
            }

            modelSignedInfo.setCanonicalizationMethod(modelCanonMethod);

            org.w3._2000._09.xmldsig_.SignatureValueType apiSignatureValue = signatureType.getSignatureValue();
            SignatureValue modelSignatureValue = new SignatureValue();
            byte[] signatureValueBytes = apiSignatureValue.getValue();
            String signatureValueXmlID = apiSignatureValue.getId();
            modelSignatureValue.setValue(signatureValueBytes);
            modelSignatureValue.setXmlID(signatureValueXmlID);
            modelSignature.setSignatureValue(modelSignatureValue);

            org.w3._2000._09.xmldsig_.KeyInfoType apiKeyInfo = signatureType.getKeyInfo();
            String apiKeyInfoXmlID = apiKeyInfo.getId();
            KeyInfo modelKeyInfo = new KeyInfo();
            modelSignature.setKeyInfo(modelKeyInfo);
            modelKeyInfo.setXmlID(apiKeyInfoXmlID);

            List<Object> apiKeyInfoContentList = apiKeyInfo.getContent();
            List<KeyDataValue> keyInfoDataValues = modelKeyInfo.getKeyDataValue();
            for (Object apiKeyInfoContentObj : apiKeyInfoContentList) {
                if (apiKeyInfoContentObj instanceof JAXBElement) {
                    JAXBElement apiKeyInfoContentJAXB = (JAXBElement) apiKeyInfoContentObj;
                    String apiKeyInfoContentTagName = apiKeyInfoContentJAXB.getName().getLocalPart();
                    if (apiKeyInfoContentJAXB.getValue() instanceof X509DataType) {
                        KeyDataValue modelX509KeyData = mapX509DataType(apiKeyInfoContentJAXB, modelKeyInfo);
                        keyInfoDataValues.add(modelX509KeyData);
                    } else if (apiKeyInfoContentTagName.equals("KeyName")) {
                        KeyDataValue modelKeyNameKDV = mapKeyName(apiKeyInfoContentJAXB);
                        modelKeyNameKDV.setKeyInfo(modelKeyInfo);
                        keyInfoDataValues.add(modelKeyNameKDV);
                    } else if (apiKeyInfoContentTagName.equals("KeyValue")) {
                        KeyDataValue modelKeyValueKDV = mapKeyValue(apiKeyInfoContentJAXB, keyInfoDataValues);
                        modelKeyValueKDV.setKeyInfo(modelKeyInfo);
                        keyInfoDataValues.add(modelKeyValueKDV);
                    } else if (apiKeyInfoContentTagName.equals("MgmtData")) {
                        KeyDataValue modelKeyValueKDV = new KeyDataValue();
                        modelKeyValueKDV.setKeyDataName(apiKeyInfoContentTagName);
                        modelKeyValueKDV.setKeyDataType("String");
                        modelKeyValueKDV.setKeyDataValueString((String) apiKeyInfoContentJAXB.getValue());
                        modelKeyValueKDV.setKeyInfo(modelKeyInfo);
                        keyInfoDataValues.add(modelKeyValueKDV);
                    } else if (apiKeyInfoContentTagName.equals("RetrievalMethod")) {
                        RetrievalMethodType retrievalMethodType = (RetrievalMethodType) apiKeyInfoContentJAXB
                                .getValue();
                        KeyDataValue retrievalMethodTypeKDV = mapRetrievalMethod(apiKeyInfoContentTagName,
                                modelKeyInfo, retrievalMethodType);
                        keyInfoDataValues.add(retrievalMethodTypeKDV);
                    } else if (apiKeyInfoContentTagName.equals("PGPData")) {
                        PGPDataType pgpDataType = (PGPDataType) apiKeyInfoContentJAXB.getValue();
                        KeyDataValue pgpDataTypeKDV = mapPGPDataType(apiKeyInfoContentTagName, modelKeyInfo,
                                pgpDataType);
                        keyInfoDataValues.add(pgpDataTypeKDV);
                    } else if (apiKeyInfoContentTagName.equals("SPKIData")) {
                        SPKIDataType spkiDataType = (SPKIDataType) apiKeyInfoContentJAXB.getValue();
                        KeyDataValue spkiDataTypeKDV = mapSPKIDataType(apiKeyInfoContentTagName, modelKeyInfo,
                                spkiDataType);
                        keyInfoDataValues.add(spkiDataTypeKDV);
                    } else {
                        throw new RuntimeException("Unrecognized tag: " + apiKeyInfoContentTagName + " type: "
                                + apiKeyInfoContentJAXB.getValue().getClass().getCanonicalName());
                    }
                }
            }

            modelSignatures.add(modelSignature);
        }
        return modelSignatures;
    }

    /**
     *
     * @param apiSignatures
     * @param modelBusinessService
     * @throws DispositionReportFaultMessage
     */
    public static void mapBusinessServiceSignature(List<org.w3._2000._09.xmldsig_.SignatureType> apiSignatures,
            BusinessService modelBusinessService) throws DispositionReportFaultMessage {
        List<Signature> modelSignatures = mapApiSignaturesToModelSignatures(apiSignatures);
        for (Signature modelSignature : modelSignatures) {
            modelSignature.setBusinessService(modelBusinessService);
        }
        modelBusinessService.setSignatures(modelSignatures);
    }

    /**
     *
     * @param apiSignatures
     * @param modelTmodel
     * @throws DispositionReportFaultMessage
     */
    public static void mapTmodelSignatures(List<org.w3._2000._09.xmldsig_.SignatureType> apiSignatures,
            Tmodel modelTmodel) throws DispositionReportFaultMessage {
        List<Signature> modelSignatures = mapApiSignaturesToModelSignatures(apiSignatures);
        for (Signature modelSignature : modelSignatures) {
            modelSignature.setTmodel(modelTmodel);
        }
        modelTmodel.setSignatures(modelSignatures);
    }

    /**
     *
     * @param apiSignatures
     * @param modelBindingTemplate
     * @throws DispositionReportFaultMessage
     */
    public static void mapBindingTemplateSignatures(List<org.w3._2000._09.xmldsig_.SignatureType> apiSignatures,
            BindingTemplate modelBindingTemplate) throws DispositionReportFaultMessage {
        List<Signature> modelSignatures = mapApiSignaturesToModelSignatures(apiSignatures);
        for (Signature modelSignature : modelSignatures) {
            modelSignature.setBindingTemplate(modelBindingTemplate);
        }
        modelBindingTemplate.setSignatures(modelSignatures);
    }

    /**
     *
     * @param apiSignatures
     * @param modelPublisher
     * @throws DispositionReportFaultMessage
     */
    public static void mapPublisherSignatures(List<org.w3._2000._09.xmldsig_.SignatureType> apiSignatures,
            Publisher modelPublisher) throws DispositionReportFaultMessage {
        List<Signature> modelSignatures = mapApiSignaturesToModelSignatures(apiSignatures);
        for (Signature modelSignature : modelSignatures) {
            modelSignature.setPublisher(modelPublisher);
        }
        modelPublisher.setSignatures(modelSignatures);
    }

    /**
     *
     * @param apiSignatures
     * @param modelBusinessEntity
     * @throws DispositionReportFaultMessage
     */
    public static void mapBusinessSignature(List<org.w3._2000._09.xmldsig_.SignatureType> apiSignatures,
            org.apache.juddi.model.BusinessEntity modelBusinessEntity) throws DispositionReportFaultMessage {
        List<Signature> modelSignatures = mapApiSignaturesToModelSignatures(apiSignatures);
        for (Signature modelSignature : modelSignatures) {
            modelSignature.setBusinessEntity(modelBusinessEntity);
        }
        modelBusinessEntity.setSignatures(modelSignatures);
    }

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

        for (org.uddi.api_v3.Name apiName : apiNameList) {
            modelNameList.add(new org.apache.juddi.model.BusinessName(modelBusinessEntity, apiName.getLang(),
                    apiName.getValue()));
        }
    }

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

        for (org.uddi.api_v3.Description apiDesc : apiDescList) {
            modelDescList.add(new org.apache.juddi.model.BusinessDescr(modelBusinessEntity, apiDesc.getLang(),
                    apiDesc.getValue()));
        }
    }

    /**
     *
     * @param apiDiscUrls
     * @param modelDiscUrlList
     * @param modelBusinessEntity
     * @throws DispositionReportFaultMessage
     */
    public static void mapDiscoveryUrls(org.uddi.api_v3.DiscoveryURLs apiDiscUrls,
            List<org.apache.juddi.model.DiscoveryUrl> modelDiscUrlList,
            org.apache.juddi.model.BusinessEntity modelBusinessEntity) throws DispositionReportFaultMessage {
        modelDiscUrlList.clear();

        if (apiDiscUrls != null) {
            List<org.uddi.api_v3.DiscoveryURL> apiDiscUrlList = apiDiscUrls.getDiscoveryURL();
            for (org.uddi.api_v3.DiscoveryURL apiDiscUrl : apiDiscUrlList) {
                modelDiscUrlList.add(new org.apache.juddi.model.DiscoveryUrl(modelBusinessEntity,
                        apiDiscUrl.getUseType(), apiDiscUrl.getValue()));
            }
        }
    }

    /**
     *
     * @param apiContacts
     * @param modelContactList
     * @param modelBusinessEntity
     * @throws DispositionReportFaultMessage
     */
    public static void mapContacts(org.uddi.api_v3.Contacts apiContacts,
            List<org.apache.juddi.model.Contact> modelContactList,
            org.apache.juddi.model.BusinessEntity modelBusinessEntity) throws DispositionReportFaultMessage {
        modelContactList.clear();

        if (apiContacts != null) {
            List<org.uddi.api_v3.Contact> apiContactList = apiContacts.getContact();
            for (org.uddi.api_v3.Contact apiContact : apiContactList) {
                org.apache.juddi.model.Contact modelContact = new org.apache.juddi.model.Contact(
                        modelBusinessEntity);
                modelContact.setUseType(apiContact.getUseType());

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

                modelContactList.add(modelContact);
            }
        }
    }

    /**
     *
     * @param apiDescList
     * @param modelDescList
     * @param modelContact
     * @param businessKey
     * @throws DispositionReportFaultMessage
     */
    public static void mapContactDescriptions(List<org.uddi.api_v3.Description> apiDescList,
            List<org.apache.juddi.model.ContactDescr> modelDescList, org.apache.juddi.model.Contact modelContact,
            String businessKey) throws DispositionReportFaultMessage {
        modelDescList.clear();

        for (org.uddi.api_v3.Description apiDesc : apiDescList) {
            modelDescList.add(
                    new org.apache.juddi.model.ContactDescr(modelContact, apiDesc.getLang(), apiDesc.getValue()));
        }
    }

    /**
     *
     * @param apiPersonNameList
     * @param modelPersonNameList
     * @param modelContact
     * @param businessKey
     * @throws DispositionReportFaultMessage
     */
    public static void mapPersonNames(List<org.uddi.api_v3.PersonName> apiPersonNameList,
            List<org.apache.juddi.model.PersonName> modelPersonNameList,
            org.apache.juddi.model.Contact modelContact, String businessKey) throws DispositionReportFaultMessage {
        modelPersonNameList.clear();

        for (org.uddi.api_v3.PersonName apiPersonName : apiPersonNameList) {
            modelPersonNameList.add(new org.apache.juddi.model.PersonName(modelContact, apiPersonName.getLang(),
                    apiPersonName.getValue()));
        }
    }

    /**
     *
     * @param apiEmailList
     * @param modelEmailList
     * @param modelContact
     * @param businessKey
     * @throws DispositionReportFaultMessage
     */
    public static void mapContactEmails(List<org.uddi.api_v3.Email> apiEmailList,
            List<org.apache.juddi.model.Email> modelEmailList, org.apache.juddi.model.Contact modelContact,
            String businessKey) throws DispositionReportFaultMessage {
        modelEmailList.clear();

        for (org.uddi.api_v3.Email apiEmail : apiEmailList) {
            modelEmailList.add(
                    new org.apache.juddi.model.Email(modelContact, apiEmail.getUseType(), apiEmail.getValue()));
        }
    }

    /**
     *
     * @param apiPhoneList
     * @param modelPhoneList
     * @param modelContact
     * @param businessKey
     * @throws DispositionReportFaultMessage
     */
    public static void mapContactPhones(List<org.uddi.api_v3.Phone> apiPhoneList,
            List<org.apache.juddi.model.Phone> modelPhoneList, org.apache.juddi.model.Contact modelContact,
            String businessKey) throws DispositionReportFaultMessage {
        modelPhoneList.clear();

        for (org.uddi.api_v3.Phone apiPhone : apiPhoneList) {
            modelPhoneList.add(
                    new org.apache.juddi.model.Phone(modelContact, apiPhone.getUseType(), apiPhone.getValue()));
        }
    }

    /**
     *
     * @param apiAddressList
     * @param modelAddressList
     * @param modelContact
     * @param businessKey
     * @throws DispositionReportFaultMessage
     */
    public static void mapContactAddresses(List<org.uddi.api_v3.Address> apiAddressList,
            List<org.apache.juddi.model.Address> modelAddressList, org.apache.juddi.model.Contact modelContact,
            String businessKey) throws DispositionReportFaultMessage {
        modelAddressList.clear();

        for (org.uddi.api_v3.Address apiAddress : apiAddressList) {
            org.apache.juddi.model.Address modelAddress = new org.apache.juddi.model.Address(modelContact);
            modelAddress.setSortCode(apiAddress.getSortCode());
            modelAddress.setTmodelKey(apiAddress.getTModelKey());
            modelAddress.setUseType(apiAddress.getUseType());

            mapAddressLines(apiAddress.getAddressLine(), modelAddress.getAddressLines(), modelAddress, businessKey,
                    modelContact.getId());

            modelAddressList.add(modelAddress);
        }
    }

    /**
     *
     * @param apiAddressLineList
     * @param modelAddressLineList
     * @param modelAddress
     * @param businessKey
     * @param contactId
     * @throws DispositionReportFaultMessage
     */
    public static void mapAddressLines(List<org.uddi.api_v3.AddressLine> apiAddressLineList,
            List<org.apache.juddi.model.AddressLine> modelAddressLineList,
            org.apache.juddi.model.Address modelAddress, String businessKey, Long contactId)
            throws DispositionReportFaultMessage {
        modelAddressLineList.clear();

        for (org.uddi.api_v3.AddressLine apiAddressLine : apiAddressLineList) {
            modelAddressLineList.add(new org.apache.juddi.model.AddressLine(modelAddress, apiAddressLine.getValue(),
                    apiAddressLine.getKeyName(), apiAddressLine.getKeyValue()));
        }
    }

    /**
     *
     * @param apiIdentifierBag
     * @param modelIdentifierList
     * @param modelBusinessEntity
     * @throws DispositionReportFaultMessage
     */
    public static void mapBusinessIdentifiers(org.uddi.api_v3.IdentifierBag apiIdentifierBag,
            List<org.apache.juddi.model.BusinessIdentifier> modelIdentifierList,
            org.apache.juddi.model.BusinessEntity modelBusinessEntity) throws DispositionReportFaultMessage {
        modelIdentifierList.clear();

        if (apiIdentifierBag != null) {
            List<org.uddi.api_v3.KeyedReference> apiKeyedRefList = apiIdentifierBag.getKeyedReference();
            for (org.uddi.api_v3.KeyedReference apiKeyedRef : apiKeyedRefList) {
                modelIdentifierList.add(new org.apache.juddi.model.BusinessIdentifier(modelBusinessEntity,
                        apiKeyedRef.getTModelKey(), apiKeyedRef.getKeyName(), apiKeyedRef.getKeyValue()));
            }
        }
    }

    /**
     *
     * @param apiBusinessServices
     * @param modelBusinessServiceList
     * @param modelServiceProjectionList
     * @param modelBusinessEntity
     * @throws DispositionReportFaultMessage
     */
    public static void mapBusinessServices(org.uddi.api_v3.BusinessServices apiBusinessServices,
            List<org.apache.juddi.model.BusinessService> modelBusinessServiceList,
            List<org.apache.juddi.model.ServiceProjection> modelServiceProjectionList,
            org.apache.juddi.model.BusinessEntity modelBusinessEntity) throws DispositionReportFaultMessage {
        modelBusinessServiceList.clear();
        if (apiBusinessServices != null) {
            List<org.uddi.api_v3.BusinessService> apiBusinessServiceList = apiBusinessServices.getBusinessService();
            for (org.uddi.api_v3.BusinessService apiBusinessService : apiBusinessServiceList) {
                org.apache.juddi.model.BusinessService modelBusinessService = new org.apache.juddi.model.BusinessService();

                // If the parent businessEntity key and the service businessEntity key (if provided) do not match, it's a projection.
                if (apiBusinessService.getBusinessKey() != null && apiBusinessService.getBusinessKey().length() > 0
                        && !modelBusinessEntity.getEntityKey()
                                .equalsIgnoreCase(apiBusinessService.getBusinessKey())) {

                    modelBusinessService.setEntityKey(apiBusinessService.getServiceKey());
                    org.apache.juddi.model.ServiceProjection modelServiceProjection = new org.apache.juddi.model.ServiceProjection(
                            modelBusinessEntity, modelBusinessService);

                    modelServiceProjectionList.add(modelServiceProjection);
                } else {
                    mapBusinessService(apiBusinessService, modelBusinessService, modelBusinessEntity);
                    modelBusinessServiceList.add(modelBusinessService);
                }
            }
        }
    }

    /**
     *
     * @param apiBusinessService
     * @param modelBusinessService
     * @param modelBusinessEntity
     * @throws DispositionReportFaultMessage
     */
    public static void mapBusinessService(org.uddi.api_v3.BusinessService apiBusinessService,
            org.apache.juddi.model.BusinessService modelBusinessService,
            org.apache.juddi.model.BusinessEntity modelBusinessEntity) throws DispositionReportFaultMessage {

        modelBusinessService.setBusinessEntity(modelBusinessEntity);
        modelBusinessService.setEntityKey(apiBusinessService.getServiceKey());

        mapServiceNames(apiBusinessService.getName(), modelBusinessService.getServiceNames(), modelBusinessService);
        mapServiceDescriptions(apiBusinessService.getDescription(), modelBusinessService.getServiceDescrs(),
                modelBusinessService);
        if (apiBusinessService.getCategoryBag() != null) {
            modelBusinessService
                    .setCategoryBag(new org.apache.juddi.model.ServiceCategoryBag(modelBusinessService));
            mapCategoryBag(apiBusinessService.getCategoryBag(), modelBusinessService.getCategoryBag());
        }

        mapBindingTemplates(apiBusinessService.getBindingTemplates(), modelBusinessService.getBindingTemplates(),
                modelBusinessService);
        mapBusinessServiceSignature(apiBusinessService.getSignature(), modelBusinessService);
    }

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

        for (org.uddi.api_v3.Name apiName : apiNameList) {
            modelNameList.add(new org.apache.juddi.model.ServiceName(modelBusinessService, apiName.getLang(),
                    apiName.getValue()));
        }
    }

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

        for (org.uddi.api_v3.Description apiDesc : apiDescList) {
            modelDescList.add(new org.apache.juddi.model.ServiceDescr(modelBusinessService, apiDesc.getLang(),
                    apiDesc.getValue()));
        }
    }

    /**
     *
     * @param apiBindingTemplates
     * @param modelBindingTemplateList
     * @param modelBusinessService
     * @throws DispositionReportFaultMessage
     */
    public static void mapBindingTemplates(org.uddi.api_v3.BindingTemplates apiBindingTemplates,
            List<org.apache.juddi.model.BindingTemplate> modelBindingTemplateList,
            org.apache.juddi.model.BusinessService modelBusinessService) throws DispositionReportFaultMessage {
        modelBindingTemplateList.clear();

        if (apiBindingTemplates != null) {
            List<org.uddi.api_v3.BindingTemplate> apiBindingTemplateList = apiBindingTemplates.getBindingTemplate();
            for (org.uddi.api_v3.BindingTemplate apiBindingTemplate : apiBindingTemplateList) {
                org.apache.juddi.model.BindingTemplate modelBindingTemplate = new org.apache.juddi.model.BindingTemplate();

                mapBindingTemplate(apiBindingTemplate, modelBindingTemplate, modelBusinessService);

                modelBindingTemplateList.add(modelBindingTemplate);
            }
        }
    }

    /**
     *
     * @param apiBindingTemplate
     * @param modelBindingTemplate
     * @param modelBusinessService
     * @throws DispositionReportFaultMessage
     */
    public static void mapBindingTemplate(org.uddi.api_v3.BindingTemplate apiBindingTemplate,
            org.apache.juddi.model.BindingTemplate modelBindingTemplate,
            org.apache.juddi.model.BusinessService modelBusinessService) throws DispositionReportFaultMessage {

        modelBindingTemplate.setBusinessService(modelBusinessService);
        modelBindingTemplate.setEntityKey(apiBindingTemplate.getBindingKey());
        if (apiBindingTemplate.getAccessPoint() != null) {
            modelBindingTemplate.setAccessPointType(apiBindingTemplate.getAccessPoint().getUseType());
            modelBindingTemplate.setAccessPointUrl(apiBindingTemplate.getAccessPoint().getValue());
        }
        if (apiBindingTemplate.getHostingRedirector() != null) {
            modelBindingTemplate.setHostingRedirector(apiBindingTemplate.getHostingRedirector().getBindingKey());
        }

        mapBindingDescriptions(apiBindingTemplate.getDescription(), modelBindingTemplate.getBindingDescrs(),
                modelBindingTemplate);
        if (apiBindingTemplate.getCategoryBag() != null) {
            modelBindingTemplate
                    .setCategoryBag(new org.apache.juddi.model.BindingCategoryBag(modelBindingTemplate));
            mapCategoryBag(apiBindingTemplate.getCategoryBag(), modelBindingTemplate.getCategoryBag());
        }
        mapTModelInstanceDetails(apiBindingTemplate.getTModelInstanceDetails(),
                modelBindingTemplate.getTmodelInstanceInfos(), modelBindingTemplate);
        mapBindingTemplateSignatures(apiBindingTemplate.getSignature(), modelBindingTemplate);
    }

    /**
     *
     * @param apiDescList
     * @param modelDescList
     * @param modelBindingTemplate
     * @throws DispositionReportFaultMessage
     */
    public static void mapBindingDescriptions(List<org.uddi.api_v3.Description> apiDescList,
            List<org.apache.juddi.model.BindingDescr> modelDescList,
            org.apache.juddi.model.BindingTemplate modelBindingTemplate) throws DispositionReportFaultMessage {
        modelDescList.clear();
        for (org.uddi.api_v3.Description apiDesc : apiDescList) {
            modelDescList.add(new org.apache.juddi.model.BindingDescr(modelBindingTemplate, apiDesc.getLang(),
                    apiDesc.getValue()));
        }
    }

    /**
     *
     * @param apiCategoryBag
     * @param modelCategoryBag
     * @throws DispositionReportFaultMessage
     */
    public static void mapCategoryBag(org.uddi.api_v3.CategoryBag apiCategoryBag,
            org.apache.juddi.model.CategoryBag modelCategoryBag) throws DispositionReportFaultMessage {

        if (apiCategoryBag != null) {
            List<org.uddi.api_v3.KeyedReference> krList = apiCategoryBag.getKeyedReference();
            for (Object elem : krList) {
                if (elem instanceof org.uddi.api_v3.KeyedReference) {
                    List<org.apache.juddi.model.KeyedReference> modelKeyedReferences = modelCategoryBag
                            .getKeyedReferences();
                    //modelKeyedReferences.clear();
                    org.uddi.api_v3.KeyedReference apiKeyedReference = (org.uddi.api_v3.KeyedReference) elem;
                    modelKeyedReferences.add(new org.apache.juddi.model.KeyedReference(modelCategoryBag,
                            apiKeyedReference.getTModelKey(), apiKeyedReference.getKeyName(),
                            apiKeyedReference.getKeyValue()));
                }
            }
            List<org.uddi.api_v3.KeyedReferenceGroup> krgList = apiCategoryBag.getKeyedReferenceGroup();
            for (org.uddi.api_v3.KeyedReferenceGroup elem : krgList) {
                if (elem instanceof org.uddi.api_v3.KeyedReferenceGroup) {
                    org.uddi.api_v3.KeyedReferenceGroup apiKeyedReferenceGroup = (org.uddi.api_v3.KeyedReferenceGroup) elem;

                    org.apache.juddi.model.KeyedReferenceGroup modelKeyedReferenceGroup = new org.apache.juddi.model.KeyedReferenceGroup();
                    List<org.apache.juddi.model.KeyedReferenceGroup> modelKeyedReferenceGroups = modelCategoryBag
                            .getKeyedReferenceGroups();
                    //modelKeyedReferenceGroups.clear();

                    mapKeyedReferenceGroup(apiKeyedReferenceGroup, modelKeyedReferenceGroup, modelCategoryBag);

                    modelKeyedReferenceGroups.add(modelKeyedReferenceGroup);
                }
            }
        }
    }

    /**
     *
     * @param apiKeyedReferenceGroup
     * @param modelKeyedReferenceGroup
     * @param modelCategoryBag
     * @throws DispositionReportFaultMessage
     */
    public static void mapKeyedReferenceGroup(org.uddi.api_v3.KeyedReferenceGroup apiKeyedReferenceGroup,
            org.apache.juddi.model.KeyedReferenceGroup modelKeyedReferenceGroup,
            org.apache.juddi.model.CategoryBag modelCategoryBag) throws DispositionReportFaultMessage {
        if (apiKeyedReferenceGroup != null) {
            modelKeyedReferenceGroup.setCategoryBag(modelCategoryBag);
            modelKeyedReferenceGroup.setTmodelKey(apiKeyedReferenceGroup.getTModelKey());

            if (apiKeyedReferenceGroup.getKeyedReference() != null) {
                List<org.apache.juddi.model.KeyedReference> modelKeyedReferences = modelKeyedReferenceGroup
                        .getKeyedReferences();
                for (org.uddi.api_v3.KeyedReference apiKeyedReference : apiKeyedReferenceGroup
                        .getKeyedReference()) {
                    modelKeyedReferences.add(new org.apache.juddi.model.KeyedReference(modelKeyedReferenceGroup,
                            apiKeyedReference.getTModelKey(), apiKeyedReference.getKeyName(),
                            apiKeyedReference.getKeyValue()));
                }
            }

        }

    }

    /**
     *
     * @param apiTModelInstDetails
     * @param modelTModelInstInfoList
     * @param modelBindingTemplate
     * @throws DispositionReportFaultMessage
     */
    public static void mapTModelInstanceDetails(org.uddi.api_v3.TModelInstanceDetails apiTModelInstDetails,
            List<org.apache.juddi.model.TmodelInstanceInfo> modelTModelInstInfoList,
            org.apache.juddi.model.BindingTemplate modelBindingTemplate) throws DispositionReportFaultMessage {
        modelTModelInstInfoList.clear();

        if (apiTModelInstDetails != null) {
            List<org.uddi.api_v3.TModelInstanceInfo> apiTModelInstInfoList = apiTModelInstDetails
                    .getTModelInstanceInfo();
            for (org.uddi.api_v3.TModelInstanceInfo apiTModelInstInfo : apiTModelInstInfoList) {
                org.apache.juddi.model.TmodelInstanceInfo modelTModelInstInfo = new org.apache.juddi.model.TmodelInstanceInfo(
                        modelBindingTemplate, apiTModelInstInfo.getTModelKey());

                mapTModelInstanceInfoDescriptions(apiTModelInstInfo.getDescription(),
                        modelTModelInstInfo.getTmodelInstanceInfoDescrs(), modelTModelInstInfo);
                mapInstanceDetails(apiTModelInstInfo.getInstanceDetails(), modelTModelInstInfo);

                modelTModelInstInfoList.add(modelTModelInstInfo);
            }
        }
    }

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

        for (org.uddi.api_v3.Description apiDesc : apiDescList) {
            modelDescList.add(new org.apache.juddi.model.TmodelInstanceInfoDescr(modelTModelInstInfo,
                    apiDesc.getLang(), apiDesc.getValue()));
        }
    }

    /**
     *
     * @param apiInstanceDetails
     * @param modelTmodelInstInfo
     * @throws DispositionReportFaultMessage
     */
    public static void mapInstanceDetails(org.uddi.api_v3.InstanceDetails apiInstanceDetails,
            org.apache.juddi.model.TmodelInstanceInfo modelTmodelInstInfo) throws DispositionReportFaultMessage {
        modelTmodelInstInfo.getInstanceDetailsDescrs().clear();

        if (apiInstanceDetails != null) {
            List<org.uddi.api_v3.Description> descriptions = apiInstanceDetails.getDescription();
            List<org.uddi.api_v3.OverviewDoc> overviewdocs = apiInstanceDetails.getOverviewDoc();
            for (org.uddi.api_v3.Description apiDesc : descriptions) {
                org.apache.juddi.model.InstanceDetailsDescr modelInstanceDetailsDescr = new org.apache.juddi.model.InstanceDetailsDescr(
                        modelTmodelInstInfo, apiDesc.getLang(), apiDesc.getValue());
                modelTmodelInstInfo.getInstanceDetailsDescrs().add(modelInstanceDetailsDescr);
            }
            for (org.uddi.api_v3.OverviewDoc apiOverviewDoc : overviewdocs) {
                org.apache.juddi.model.OverviewDoc modelOverviewDoc = new org.apache.juddi.model.OverviewDoc(
                        modelTmodelInstInfo);
                mapOverviewDoc(apiOverviewDoc, modelOverviewDoc);
                modelTmodelInstInfo.getOverviewDocs().add(modelOverviewDoc);
            }
            modelTmodelInstInfo.setInstanceParms((String) apiInstanceDetails.getInstanceParms());
        }
    }

    /**
     *
     * @param apiOverviewDoc
     * @param modelOverviewDoc
     * @throws DispositionReportFaultMessage
     */
    public static void mapOverviewDoc(org.uddi.api_v3.OverviewDoc apiOverviewDoc,
            org.apache.juddi.model.OverviewDoc modelOverviewDoc) throws DispositionReportFaultMessage {
        if (apiOverviewDoc != null) {

            List<Description> descContent = apiOverviewDoc.getDescription();
            for (Object elem : descContent) {
                org.uddi.api_v3.Description description = (org.uddi.api_v3.Description) elem;
                if (description != null) {
                    org.apache.juddi.model.OverviewDocDescr modelOverviewDocDescr = new org.apache.juddi.model.OverviewDocDescr(
                            modelOverviewDoc, description.getLang(), description.getValue());
                    modelOverviewDoc.getOverviewDocDescrs().add(modelOverviewDocDescr);
                }
            }

            org.uddi.api_v3.OverviewURL elem = apiOverviewDoc.getOverviewURL();
            if (elem instanceof org.uddi.api_v3.OverviewURL) {
                org.uddi.api_v3.OverviewURL overviewURL = elem;
                modelOverviewDoc.setOverviewUrl(overviewURL.getValue());
                modelOverviewDoc.setOverviewUrlUseType(overviewURL.getUseType());
            }

        }
    }

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

        modelTModel.setEntityKey(apiTModel.getTModelKey());
        modelTModel.setName(apiTModel.getName().getValue());
        modelTModel.setLangCode(apiTModel.getName().getLang());
        modelTModel.setDeleted(apiTModel.isDeleted());

        mapTModelDescriptions(apiTModel.getDescription(), modelTModel.getTmodelDescrs(), modelTModel);
        mapTModelIdentifiers(apiTModel.getIdentifierBag(), modelTModel.getTmodelIdentifiers(), modelTModel);
        if (apiTModel.getCategoryBag() != null) {
            modelTModel.setCategoryBag(new org.apache.juddi.model.TmodelCategoryBag(modelTModel));
            mapCategoryBag(apiTModel.getCategoryBag(), modelTModel.getCategoryBag());
        }
        mapTModelOverviewDocs(apiTModel.getOverviewDoc(), modelTModel.getOverviewDocs(), modelTModel);
        mapTmodelSignatures(apiTModel.getSignature(), modelTModel);
    }

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

        for (org.uddi.api_v3.Description apiDesc : apiDescList) {
            modelDescList.add(
                    new org.apache.juddi.model.TmodelDescr(modelTModel, apiDesc.getLang(), apiDesc.getValue()));
        }
    }

    /**
     *
     * @param apiIdentifierBag
     * @param modelIdentifierList
     * @param modelTModel
     * @throws DispositionReportFaultMessage
     */
    public static void mapTModelIdentifiers(org.uddi.api_v3.IdentifierBag apiIdentifierBag,
            List<org.apache.juddi.model.TmodelIdentifier> modelIdentifierList,
            org.apache.juddi.model.Tmodel modelTModel) throws DispositionReportFaultMessage {
        modelIdentifierList.clear();

        if (apiIdentifierBag != null) {
            List<org.uddi.api_v3.KeyedReference> apiKeyedRefList = apiIdentifierBag.getKeyedReference();
            for (org.uddi.api_v3.KeyedReference apiKeyedRef : apiKeyedRefList) {
                modelIdentifierList.add(new org.apache.juddi.model.TmodelIdentifier(modelTModel,
                        apiKeyedRef.getTModelKey(), apiKeyedRef.getKeyName(), apiKeyedRef.getKeyValue()));
            }
        }
    }

    /**
     *
     * @param apiOverviewDocList
     * @param modelOverviewDocList
     * @param modelTmodel
     * @throws DispositionReportFaultMessage
     */
    public static void mapTModelOverviewDocs(List<org.uddi.api_v3.OverviewDoc> apiOverviewDocList,
            List<org.apache.juddi.model.OverviewDoc> modelOverviewDocList,
            org.apache.juddi.model.Tmodel modelTmodel) throws DispositionReportFaultMessage {
        modelOverviewDocList.clear();

        for (org.uddi.api_v3.OverviewDoc apiOverviewDoc : apiOverviewDocList) {
            org.apache.juddi.model.OverviewDoc modelOverviewDoc = new org.apache.juddi.model.OverviewDoc(
                    modelTmodel);
            mapOverviewDoc(apiOverviewDoc, modelOverviewDoc);
            modelTmodel.getOverviewDocs().add(modelOverviewDoc);
        }
    }

    /**
     *
     * @param apiPubAssertion
     * @param modelPubAssertion
     * @throws DispositionReportFaultMessage
     */
    public static void mapPublisherAssertion(org.uddi.api_v3.PublisherAssertion apiPubAssertion,
            org.apache.juddi.model.PublisherAssertion modelPubAssertion) throws DispositionReportFaultMessage {

        modelPubAssertion.setId(new org.apache.juddi.model.PublisherAssertionId(apiPubAssertion.getFromKey(),
                apiPubAssertion.getToKey()));

        org.apache.juddi.model.BusinessEntity beFrom = new org.apache.juddi.model.BusinessEntity();
        beFrom.setEntityKey(apiPubAssertion.getFromKey());
        modelPubAssertion.setBusinessEntityByFromKey(beFrom);

        org.apache.juddi.model.BusinessEntity beTo = new org.apache.juddi.model.BusinessEntity();
        beFrom.setEntityKey(apiPubAssertion.getToKey());
        modelPubAssertion.setBusinessEntityByToKey(beTo);

        org.uddi.api_v3.KeyedReference apiKeyedRef = apiPubAssertion.getKeyedReference();
        if (apiKeyedRef != null) {
            modelPubAssertion.setTmodelKey(apiKeyedRef.getTModelKey());
            modelPubAssertion.setKeyName(apiKeyedRef.getKeyName());
            modelPubAssertion.setKeyValue(apiKeyedRef.getKeyValue());
        }
    }

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

        modelSubscription.setSubscriptionKey(apiSubscription.getSubscriptionKey());
        modelSubscription.setBindingKey(apiSubscription.getBindingKey());
        if (apiSubscription.getNotificationInterval() != null) {
            modelSubscription.setNotificationInterval(apiSubscription.getNotificationInterval().toString());
        }
        modelSubscription.setMaxEntities(apiSubscription.getMaxEntities());
        if (apiSubscription.getExpiresAfter() != null) {
            GregorianCalendar gc = apiSubscription.getExpiresAfter().toGregorianCalendar();
            modelSubscription.setExpiresAfter(new Date(gc.getTimeInMillis()));
        }

        if (apiSubscription.isBrief() != null) {
            modelSubscription.setBrief(apiSubscription.isBrief());
        } else {
            modelSubscription.setBrief(Boolean.FALSE);
        }

        String rawFilter = JAXBMarshaller.marshallToString(
                new ObjectFactory().createSubscriptionFilter(apiSubscription.getSubscriptionFilter()),
                "org.uddi.sub_v3");
        logger.debug("marshalled subscription filter:  " + rawFilter);
        modelSubscription.setSubscriptionFilter(rawFilter);

    }

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

        modelClientSubscriptionInfo.setLastNotified(new Date());
        modelClientSubscriptionInfo.setSubscriptionKey(apiClientSubscriptionInfo.getSubscriptionKey());
        if (apiClientSubscriptionInfo.getFromClerk() != null) {
            org.apache.juddi.model.Clerk modelClerk = new org.apache.juddi.model.Clerk();
            mapClerk(apiClientSubscriptionInfo.getFromClerk(), modelClerk);
            modelClientSubscriptionInfo.setFromClerk(modelClerk);
        }
        if (apiClientSubscriptionInfo.getToClerk() != null) {
            org.apache.juddi.model.Clerk modelToClerk = new org.apache.juddi.model.Clerk();
            mapClerk(apiClientSubscriptionInfo.getToClerk(), modelToClerk);
            modelClientSubscriptionInfo.setToClerk(modelToClerk);
        }

    }

    /**
     *
     * @param apiClerk
     * @param modelClerk
     */
    public static void mapClerk(org.apache.juddi.api_v3.Clerk apiClerk, org.apache.juddi.model.Clerk modelClerk) {
        if (apiClerk != null) {

            modelClerk.setClerkName(apiClerk.getName());
            modelClerk.setCred(apiClerk.getPassword());
            modelClerk.setPublisherId(apiClerk.getPublisher());
            if (apiClerk.getNode() != null) {
                org.apache.juddi.model.Node modelNode = new org.apache.juddi.model.Node();
                mapNode(apiClerk.getNode(), modelNode);
                modelClerk.setNode(modelNode);
            }
        }
    }

    /**
     *
     * @param apiNode
     * @param modelNode
     */
    public static void mapNode(org.apache.juddi.api_v3.Node apiNode, org.apache.juddi.model.Node modelNode) {
        if (apiNode != null) {

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

    private static Reference mapReference(SignedInfo modelSignedInfo, ReferenceType apiReference) {
        Reference ref = new Reference();
        ref.setSignedInfo(modelSignedInfo);
        String refUri = apiReference.getURI();
        if (refUri == null) {
            refUri = "";
        }
        ref.setUri(refUri);
        List<org.w3._2000._09.xmldsig_.TransformType> apiTransformList = apiReference.getTransforms()
                .getTransform();
        for (org.w3._2000._09.xmldsig_.TransformType apiTransform : apiTransformList) {
            SignatureTransform modelTransform = new SignatureTransform();
            modelTransform.setReference(ref);
            modelTransform.setTransform(apiTransform.getAlgorithm());

            for (Object xform : apiTransform.getContent()) {
                SignatureTransformDataValue sdv = mapSignatureTransformDataValue(xform);
                sdv.setSignatureTransform(modelTransform);
                modelTransform.getSignatureTransformDataValue().add(sdv);
            }

            ref.getTransforms().add(modelTransform);
        }
        String digestMethodStr = apiReference.getDigestMethod().getAlgorithm();
        byte[] digestValueBytes = apiReference.getDigestValue();
        ref.setDigestMethod(digestMethodStr);
        ref.setDigestValue(digestValueBytes);
        return ref;
    }

    private static KeyDataValue mapX509DataType(JAXBElement apiKeyInfoContentJAXB, KeyInfo modelKeyInfo)
            throws RuntimeException {
        X509DataType apiKeyInfoContent = (X509DataType) apiKeyInfoContentJAXB.getValue();
        KeyDataValue modelX509KeyData = new KeyDataValue();
        modelX509KeyData.setKeyDataType(X509DataType.class.getSimpleName());
        modelX509KeyData.setKeyDataName(apiKeyInfoContentJAXB.getName().getLocalPart());
        modelX509KeyData.setKeyInfo(modelKeyInfo);
        List<Object> x509IssuerSerialOrX509SKIOrX509SubjectNameList = apiKeyInfoContent
                .getX509IssuerSerialOrX509SKIOrX509SubjectName();
        for (Object x509IssuerSerialOrX509SKIOrX509SubjectNameObj : x509IssuerSerialOrX509SKIOrX509SubjectNameList) {
            JAXBElement x509IssuerSerialOrX509SKIOrX509SubjectNameJAXB = (JAXBElement) x509IssuerSerialOrX509SKIOrX509SubjectNameObj;
            String tagName = x509IssuerSerialOrX509SKIOrX509SubjectNameJAXB.getName().getLocalPart();
            Object x509IssuerSerialOrX509SKIOrX509SubjectName = x509IssuerSerialOrX509SKIOrX509SubjectNameJAXB
                    .getValue();

            KeyDataValue modelKeyInfoValue = new KeyDataValue();
            modelKeyInfoValue.setKeyDataName(tagName);
            if (x509IssuerSerialOrX509SKIOrX509SubjectName instanceof byte[]) {
                modelKeyInfoValue.setKeyDataValueBytes((byte[]) x509IssuerSerialOrX509SKIOrX509SubjectName);
            } else if (x509IssuerSerialOrX509SKIOrX509SubjectName instanceof String) {
                modelKeyInfoValue.setKeyDataValueString((String) x509IssuerSerialOrX509SKIOrX509SubjectName);
            } else if (x509IssuerSerialOrX509SKIOrX509SubjectName instanceof X509IssuerSerialType) {
                modelKeyInfoValue.setKeyDataType(X509IssuerSerialType.class.getSimpleName());
                X509IssuerSerialType x509IssuerSerialType = (X509IssuerSerialType) x509IssuerSerialOrX509SKIOrX509SubjectName;
                modelKeyInfoValue.setKeyDataValueString(x509IssuerSerialType.getX509IssuerName());
                modelKeyInfoValue.setKeyDataValueBytes(x509IssuerSerialType.getX509SerialNumber().toByteArray());
            } else if (x509IssuerSerialOrX509SKIOrX509SubjectName != null) {
                throw new RuntimeException("Unrecognized Value for Element: " + tagName + ": "
                        + x509IssuerSerialOrX509SKIOrX509SubjectName.getClass().getCanonicalName());
            }
            modelKeyInfoValue.setKeyDataValue(modelX509KeyData);
            modelX509KeyData.getKeyDataValueList().add(modelKeyInfoValue);
        }
        return modelX509KeyData;
    }

    private static KeyDataValue mapKeyName(JAXBElement apiKeyInfoContentJAXB) {
        KeyDataValue modelKeyNameKDV = new KeyDataValue();
        modelKeyNameKDV.setKeyDataType(String.class.getSimpleName());
        modelKeyNameKDV.setKeyDataName(apiKeyInfoContentJAXB.getName().getLocalPart());
        modelKeyNameKDV.setKeyDataValueString((String) apiKeyInfoContentJAXB.getValue());
        return modelKeyNameKDV;
    }

    private static KeyDataValue mapKeyValue(JAXBElement apiKeyInfoContentJAXB,
            List<KeyDataValue> keyInfoDataValues) {
        KeyValueType kvt = (KeyValueType) apiKeyInfoContentJAXB.getValue();
        KeyDataValue modelKeyValueKDV = new KeyDataValue();
        modelKeyValueKDV.setKeyDataType(KeyValueType.class.getSimpleName());
        modelKeyValueKDV.setKeyDataName(apiKeyInfoContentJAXB.getName().getLocalPart());
        keyInfoDataValues.add(modelKeyValueKDV);
        List<Object> kvObjList = kvt.getContent();
        for (Object kvObj : kvObjList) {
            if (kvObj instanceof JAXBElement) {
                JAXBElement kvJAXB = (JAXBElement) kvObj;
                Object childVal = kvJAXB.getValue();

                KeyDataValue childKDV = new KeyDataValue();
                childKDV.setKeyDataValue(modelKeyValueKDV);
                childKDV.setKeyDataName(kvJAXB.getName().getLocalPart());
                childKDV.setKeyDataType(childVal.getClass().getSimpleName());
                modelKeyValueKDV.getKeyDataValueList().add(childKDV);

                if (childVal instanceof DSAKeyValueType) {
                    DSAKeyValueType dsaKeyVal = (DSAKeyValueType) childVal;
                    String dsaKeyValueTagName = kvJAXB.getName().getLocalPart();
                    KeyDataValue dsaKeyValKDV = new KeyDataValue(null, DSAKeyValueType.class.getSimpleName(),
                            dsaKeyValueTagName, null, null, childKDV);
                    childKDV.getKeyDataValueList().add(dsaKeyValKDV);

                    KeyDataValue gValKDV = new KeyDataValue(null, byte[].class.getSimpleName(), "G",
                            dsaKeyVal.getG(), null, dsaKeyValKDV);
                    dsaKeyValKDV.getKeyDataValueList().add(gValKDV);

                    KeyDataValue jValKDV = new KeyDataValue(null, byte[].class.getSimpleName(), "J",
                            dsaKeyVal.getJ(), null, dsaKeyValKDV);
                    dsaKeyValKDV.getKeyDataValueList().add(jValKDV);

                    KeyDataValue pValKDV = new KeyDataValue(null, byte[].class.getSimpleName(), "P",
                            dsaKeyVal.getP(), null, dsaKeyValKDV);
                    dsaKeyValKDV.getKeyDataValueList().add(pValKDV);

                    KeyDataValue pGenCounterValKDV = new KeyDataValue(null, byte[].class.getSimpleName(),
                            "PgenCounter", dsaKeyVal.getPgenCounter(), null, dsaKeyValKDV);
                    dsaKeyValKDV.getKeyDataValueList().add(pGenCounterValKDV);

                    KeyDataValue qValKDV = new KeyDataValue(null, byte[].class.getSimpleName(), "Q",
                            dsaKeyVal.getQ(), null, dsaKeyValKDV);
                    dsaKeyValKDV.getKeyDataValueList().add(qValKDV);

                    KeyDataValue seedValKDV = new KeyDataValue(null, byte[].class.getSimpleName(), "Seed",
                            dsaKeyVal.getSeed(), null, dsaKeyValKDV);
                    dsaKeyValKDV.getKeyDataValueList().add(seedValKDV);

                    KeyDataValue yValKDV = new KeyDataValue(null, byte[].class.getSimpleName(), "Y",
                            dsaKeyVal.getY(), null, dsaKeyValKDV);
                    dsaKeyValKDV.getKeyDataValueList().add(yValKDV);
                } else if (childVal instanceof RSAKeyValueType) {
                    RSAKeyValueType rsaKeyVal = (RSAKeyValueType) childVal;
                    String rsaKeyValueTagName = kvJAXB.getName().getLocalPart();
                    KeyDataValue rsaKeyValKDV = new KeyDataValue(null, RSAKeyValueType.class.getSimpleName(),
                            rsaKeyValueTagName, null, null, childKDV);
                    childKDV.getKeyDataValueList().add(rsaKeyValKDV);

                    KeyDataValue exponentValKDV = new KeyDataValue(null, byte[].class.getSimpleName(), "Exponent",
                            rsaKeyVal.getExponent(), null, rsaKeyValKDV);
                    rsaKeyValKDV.getKeyDataValueList().add(exponentValKDV);

                    KeyDataValue modulusValKDV = new KeyDataValue(null, byte[].class.getSimpleName(), "Modulus",
                            rsaKeyVal.getModulus(), null, rsaKeyValKDV);
                    rsaKeyValKDV.getKeyDataValueList().add(modulusValKDV);
                }
            }
        }
        return modelKeyValueKDV;
    }

    private static KeyDataValue mapRetrievalMethod(String apiKeyInfoContentTagName, KeyInfo modelKeyInfo,
            RetrievalMethodType retrievalMethodType) {
        KeyDataValue retrievalMethodTypeKDV = new KeyDataValue();
        retrievalMethodTypeKDV.setKeyDataName(apiKeyInfoContentTagName);
        retrievalMethodTypeKDV.setKeyDataType(RetrievalMethodType.class.getSimpleName());
        retrievalMethodTypeKDV.setKeyInfo(modelKeyInfo);
        KeyDataValue uriKDV = new KeyDataValue();
        uriKDV.setKeyDataName("URI");
        uriKDV.setKeyDataType(String.class.getSimpleName());
        uriKDV.setKeyDataValue(retrievalMethodTypeKDV);
        uriKDV.setKeyDataValueString(retrievalMethodType.getURI());
        retrievalMethodTypeKDV.getKeyDataValueList().add(uriKDV);
        KeyDataValue typeKDV = new KeyDataValue();
        typeKDV.setKeyDataName("Type");
        typeKDV.setKeyDataType(String.class.getSimpleName());
        typeKDV.setKeyDataValue(retrievalMethodTypeKDV);
        typeKDV.setKeyDataValueString(retrievalMethodType.getType());
        retrievalMethodTypeKDV.getKeyDataValueList().add(typeKDV);
        TransformsType transformsType = retrievalMethodType.getTransforms();
        if (transformsType != null) {
            List<TransformType> tTypeList = transformsType.getTransform();
            for (TransformType tType : tTypeList) {
                KeyDataValue transformKDV = new KeyDataValue();
                transformKDV.setKeyDataName("Transform");
                transformKDV.setKeyDataType(String.class.getSimpleName());
                transformKDV.setKeyDataValue(retrievalMethodTypeKDV);
                transformKDV.setKeyDataValueString(tType.getAlgorithm());

                for (Object xform : tType.getContent()) {
                    SignatureTransformDataValue stdv = mapSignatureTransformDataValue(xform);
                    KeyDataValue transformContentKDV = new KeyDataValue();
                    transformContentKDV.setKeyDataType(stdv.getContentType());
                    transformContentKDV.setKeyDataValueBytes(stdv.getContentBytes());
                    transformContentKDV.setKeyDataValue(transformKDV);
                    transformKDV.getKeyDataValueList().add(transformContentKDV);
                }

                retrievalMethodTypeKDV.getKeyDataValueList().add(transformKDV);
            }
        }
        return retrievalMethodTypeKDV;
    }

    private static KeyDataValue mapPGPDataType(String apiKeyInfoContentTagName, KeyInfo modelKeyInfo,
            PGPDataType pgpDataType) {
        KeyDataValue pgpDataTypeKDV = new KeyDataValue();
        pgpDataTypeKDV.setKeyDataName(apiKeyInfoContentTagName);
        pgpDataTypeKDV.setKeyDataType(PGPDataType.class.getSimpleName());
        pgpDataTypeKDV.setKeyInfo(modelKeyInfo);

        List<Object> pgpDataValues = pgpDataType.getContent();
        for (Object pgpDataValue : pgpDataValues) {
            if (pgpDataValue instanceof JAXBElement) {
                JAXBElement pgpDataJAXB = (JAXBElement) pgpDataValue;
                String tagName = pgpDataJAXB.getName().getLocalPart();

                KeyDataValue keyIDKDV = new KeyDataValue();
                keyIDKDV.setKeyDataName(tagName);
                keyIDKDV.setKeyDataValue(pgpDataTypeKDV);
                if (pgpDataJAXB.getValue() instanceof String) {
                    keyIDKDV.setKeyDataValueString((String) pgpDataJAXB.getValue());
                } else {
                    keyIDKDV.setKeyDataValueBytes((byte[]) pgpDataJAXB.getValue());
                }
                pgpDataTypeKDV.getKeyDataValueList().add(keyIDKDV);
            }
        }
        return pgpDataTypeKDV;
    }

    private static KeyDataValue mapSPKIDataType(String apiKeyInfoContentTagName, KeyInfo modelKeyInfo,
            SPKIDataType spkiDataType) {
        KeyDataValue spkiDataTypeKDV = new KeyDataValue();
        spkiDataTypeKDV.setKeyDataName(apiKeyInfoContentTagName);
        spkiDataTypeKDV.setKeyDataType(SPKIDataType.class.getSimpleName());
        spkiDataTypeKDV.setKeyInfo(modelKeyInfo);

        List<Object> spkiDataValues = spkiDataType.getSPKISexpAndAny();
        for (Object spkiDataValue : spkiDataValues) {
            if (spkiDataValue instanceof JAXBElement) {
                JAXBElement spkiDataJAXB = (JAXBElement) spkiDataValue;
                String tagName = spkiDataJAXB.getName().getLocalPart();

                KeyDataValue keyIDKDV = new KeyDataValue();
                keyIDKDV.setKeyDataName(tagName);
                keyIDKDV.setKeyDataValue(spkiDataTypeKDV);
                if (spkiDataJAXB.getValue() instanceof String) {
                    keyIDKDV.setKeyDataValueString((String) spkiDataJAXB.getValue());
                } else {
                    keyIDKDV.setKeyDataValueBytes((byte[]) spkiDataJAXB.getValue());
                }
                spkiDataTypeKDV.getKeyDataValueList().add(keyIDKDV);
            } else {
                throw new RuntimeException("Unrecognized type: " + spkiDataValue.getClass().getCanonicalName());
            }
        }
        return spkiDataTypeKDV;
    }

    private static SignatureTransformDataValue mapSignatureTransformDataValue(Object xform) {
        SignatureTransformDataValue sdv = new SignatureTransformDataValue();
        if (xform instanceof String) {
            sdv.setContentType(String.class.getSimpleName());
            String xformStr = xform.toString();
            byte[] xformBytes = xformStr.getBytes();
            sdv.setContentBytes(xformBytes);
        } else if (xform instanceof Element) {
            sdv.setContentType(Element.class.getCanonicalName());
            Element xformEl = (Element) xform;
            String str = serializeTransformElement(xformEl);
            try {
                sdv.setContentBytes(str.getBytes("UTF-8"));
            } catch (Exception e) {
                throw new RuntimeException("Failed to encode string due to: " + e.getMessage(), e);
            }
        } else if (xform instanceof byte[]) {
            sdv.setContentType(byte[].class.getSimpleName());
            sdv.setContentBytes((byte[]) xform);
        } else if (xform instanceof JAXBElement) {
            sdv.setContentType(Element.class.getCanonicalName());
            JAXBElement xformJAXB = (JAXBElement) xform;
            DOMResult domResult = new DOMResult();
            JAXB.marshal(xformJAXB, domResult);
            Element xformEl = ((Document) domResult.getNode()).getDocumentElement();
            String str = serializeTransformElement(xformEl);
            try {
                sdv.setContentBytes(str.getBytes("UTF-8"));
            } catch (Exception e) {
                throw new RuntimeException("Failed to encode string due to: " + e.getMessage(), e);
            }
        } else {
            throw new RuntimeException("Unrecognized type: " + xform.getClass().getCanonicalName());
        }
        return sdv;
    }

    private static String serializeTransformElement(Element xformEl) throws DOMException, LSException {
        Document document = xformEl.getOwnerDocument();
        DOMImplementationLS domImplLS = (DOMImplementationLS) document.getImplementation();
        LSSerializer serializer = domImplLS.createLSSerializer();
        //        serializer.getDomConfig().setParameter("namespaces", true);
        //        serializer.getDomConfig().setParameter("namespace-declarations", true);
        serializer.getDomConfig().setParameter("canonical-form", false);
        serializer.getDomConfig().setParameter("xml-declaration", false);
        String str = serializer.writeToString(xformEl);
        return str;
    }
}