com.cws.esolutions.core.processors.impl.DNSServiceRequestProcessorImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.cws.esolutions.core.processors.impl.DNSServiceRequestProcessorImpl.java

Source

/*
 * Copyright (c) 2009 - 2017 CaspersBox Web Services
 * 
 * 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 com.cws.esolutions.core.processors.impl;

/*
 * Project: eSolutionsCore
 * Package: com.cws.esolutions.core.processors.impl
 * File: DNSServiceRequestProcessorImpl.java
 *
 * History
 *
 * Author               Date                            Comments
 * ----------------------------------------------------------------------------
 * cws-khuntly   11/23/2008 22:39:20             Created.
 */
import java.util.List;
import java.util.ArrayList;
import java.sql.SQLException;
import java.security.Security;
import org.apache.commons.lang.StringUtils;

import com.cws.esolutions.core.utils.NetworkUtils;
import com.cws.esolutions.security.dto.UserAccount;
import com.cws.esolutions.core.CoreServiceConstants;
import com.cws.esolutions.core.processors.dto.DNSEntry;
import com.cws.esolutions.core.processors.dto.DNSRecord;
import com.cws.esolutions.core.processors.enums.ServerType;
import com.cws.esolutions.security.processors.dto.AuditEntry;
import com.cws.esolutions.core.processors.enums.DNSRecordType;
import com.cws.esolutions.security.processors.enums.AuditType;
import com.cws.esolutions.security.processors.dto.AuditRequest;
import com.cws.esolutions.core.utils.exception.UtilityException;
import com.cws.esolutions.core.processors.dto.DNSServiceRequest;
import com.cws.esolutions.core.processors.dto.DNSServiceResponse;
import com.cws.esolutions.security.processors.dto.RequestHostInfo;
import com.cws.esolutions.core.processors.enums.CoreServicesStatus;
import com.cws.esolutions.core.processors.exception.DNSServiceException;
import com.cws.esolutions.security.services.dto.AccessControlServiceRequest;
import com.cws.esolutions.security.services.dto.AccessControlServiceResponse;
import com.cws.esolutions.security.processors.exception.AuditServiceException;
import com.cws.esolutions.core.processors.interfaces.IDNSServiceRequestProcessor;
import com.cws.esolutions.security.services.exception.AccessControlServiceException;

/**
 * @see com.cws.esolutions.core.processors.interfaces.IDNSServiceRequestProcessor
 */
public class DNSServiceRequestProcessorImpl implements IDNSServiceRequestProcessor {
    /**
     * @see com.cws.esolutions.core.processors.interfaces.IDNSServiceRequestProcessor#performLookup(com.cws.esolutions.core.processors.dto.DNSServiceRequest)
     */
    public DNSServiceResponse performLookup(DNSServiceRequest request) throws DNSServiceException {
        final String methodName = IDNSServiceRequestProcessor.CNAME
                + "#performLookup(final DNSServiceRequest request) throws DNSServiceException";

        if (DEBUG) {
            DEBUGGER.debug(methodName);
            DEBUGGER.debug("DNSServiceRequest: {}", request);
        }

        DNSServiceResponse response = new DNSServiceResponse();

        final DNSRecord dnsRecord = request.getRecord();
        final String currentTimeout = Security.getProperty("networkaddress.cache.ttl");

        if (DEBUG) {
            DEBUGGER.debug("DNSRecord: {}", dnsRecord);
            DEBUGGER.debug("currentTimeout: {}", currentTimeout);
        }

        try {
            // no authorization required for service lookup
            if ((StringUtils.isNotEmpty(request.getResolverHost())) || (request.getUseSystemResolver())) {
                List<List<String>> responseData = NetworkUtils.executeDNSLookup(request.getResolverHost(),
                        dnsRecord.getRecordName(), dnsRecord.getRecordType().toString(), request.getSearchPath());

                if (DEBUG) {
                    DEBUGGER.debug("responseData: {}", responseData);
                }

                List<DNSRecord> responseRecords = new ArrayList<DNSRecord>();

                for (List<String> responseInfo : responseData) {
                    if (DEBUG) {
                        DEBUGGER.debug("responseInfo: {}", responseInfo);
                    }

                    DNSRecord responseRecord = new DNSRecord();
                    responseRecord.setRecordAddress(responseInfo.get(0));
                    responseRecord.setRecordName(responseInfo.get(1));
                    responseRecord.setRecordType(DNSRecordType.valueOf(responseInfo.get(2)));

                    if (DEBUG) {
                        DEBUGGER.debug("responseRecord: {}", responseRecord);
                    }

                    responseRecords.add(responseRecord);

                    if (DEBUG) {
                        DEBUGGER.debug("responseRecords: {}", responseRecords);
                    }
                }

                response.setDnsRecords(responseRecords);
                response.setRequestStatus(CoreServicesStatus.SUCCESS);
            } else {
                // this will run through the available slave servers
                List<Object[]> serverList = dao.getServersByAttribute(ServerType.DNSSLAVE.name(), 0);

                if (DEBUG) {
                    DEBUGGER.debug("serverList: {}", serverList);
                }

                if ((serverList != null) && (serverList.size() != 0)) {
                    List<DNSRecord> responseRecords = new ArrayList<DNSRecord>();

                    for (Object[] data : serverList) {
                        if (DEBUG) {
                            DEBUGGER.debug("Value: {}", data);
                        }

                        String serverName = (String) data[15];

                        if (DEBUG) {
                            DEBUGGER.debug("serverName: {}", serverName);
                        }

                        List<List<String>> responseData = NetworkUtils.executeDNSLookup(serverName,
                                dnsRecord.getRecordName(), dnsRecord.getRecordType().toString(),
                                request.getSearchPath());

                        if (DEBUG) {
                            DEBUGGER.debug("responseData: {}", responseData);
                        }

                        for (List<String> responseInfo : responseData) {
                            if (DEBUG) {
                                DEBUGGER.debug("responseInfo: {}", responseInfo);
                            }

                            DNSRecord responseRecord = new DNSRecord();
                            responseRecord.setRecordAddress(responseInfo.get(0));
                            responseRecord.setRecordName(responseInfo.get(1));
                            responseRecord.setRecordType(DNSRecordType.valueOf(responseInfo.get(2)));

                            if (DEBUG) {
                                DEBUGGER.debug("responseRecord: {}", responseRecord);
                            }

                            responseRecords.add(responseRecord);

                            if (DEBUG) {
                                DEBUGGER.debug("responseRecords: {}", responseRecords);
                            }
                        }
                    }

                    response.setDnsRecords(responseRecords);
                    response.setRequestStatus(CoreServicesStatus.SUCCESS);
                } else {
                    response.setRequestStatus(CoreServicesStatus.FAILURE);
                }
            }
        } catch (UtilityException ux) {
            ERROR_RECORDER.error(ux.getMessage(), ux);

            throw new DNSServiceException(ux.getMessage(), ux);
        } catch (SQLException sqx) {
            ERROR_RECORDER.error(sqx.getMessage(), sqx);

            throw new DNSServiceException(sqx.getMessage(), sqx);
        } finally {
            // reset java dns timeout
            try {
                Security.setProperty("networkaddress.cache.ttl", currentTimeout);
            } catch (NullPointerException npx) {
            }
        }

        return response;
    }

    /**
     * @see com.cws.esolutions.core.processors.interfaces.IDNSServiceRequestProcessor#createNewService(com.cws.esolutions.core.processors.dto.DNSServiceRequest)
     */
    public DNSServiceResponse createNewService(final DNSServiceRequest request) throws DNSServiceException {
        final String methodName = IDNSServiceRequestProcessor.CNAME
                + "#createNewService(final DNSServiceRequest request) throws DNSServiceException";

        if (DEBUG) {
            DEBUGGER.debug(methodName);
            DEBUGGER.debug("DNSServiceRequest: {}" + request);
        }

        DNSServiceResponse response = new DNSServiceResponse();

        final DNSEntry entry = request.getDnsEntry();
        final UserAccount userAccount = request.getUserAccount();
        final RequestHostInfo reqInfo = request.getRequestInfo();

        if (DEBUG) {
            DEBUGGER.debug("DNSEntry: {}", entry);
            DEBUGGER.debug("UserAccount: {}", userAccount);
            DEBUGGER.debug("RequestHostInfo: {}", reqInfo);
        }

        try {
            // this will require admin and service authorization
            AccessControlServiceRequest accessRequest = new AccessControlServiceRequest();
            accessRequest.setUserAccount(userAccount);
            accessRequest.setServiceGuid(request.getServiceId());

            if (DEBUG) {
                DEBUGGER.debug("AccessControlServiceRequest: {}", accessRequest);
            }

            AccessControlServiceResponse accessResponse = accessControl.isUserAuthorized(accessRequest);

            if (DEBUG) {
                DEBUGGER.debug("AccessControlServiceResponse accessResponse: {}", accessResponse);
            }

            if (!(accessResponse.getIsUserAuthorized())) {
                // unauthorized
                response.setRequestStatus(CoreServicesStatus.UNAUTHORIZED);

                // audit
                try {
                    AuditEntry auditEntry = new AuditEntry();
                    auditEntry.setHostInfo(reqInfo);
                    auditEntry.setAuditType(AuditType.CREATEDNSRECORD);
                    auditEntry.setAuthorized(Boolean.FALSE);
                    auditEntry.setUserAccount(userAccount);
                    auditEntry.setApplicationId(request.getApplicationId());
                    auditEntry.setApplicationName(request.getApplicationName());

                    if (DEBUG) {
                        DEBUGGER.debug("AuditEntry: {}", auditEntry);
                    }

                    AuditRequest auditRequest = new AuditRequest();
                    auditRequest.setAuditEntry(auditEntry);

                    if (DEBUG) {
                        DEBUGGER.debug("AuditRequest: {}", auditRequest);
                    }

                    auditor.auditRequest(auditRequest);
                } catch (AuditServiceException asx) {
                    ERROR_RECORDER.error(asx.getMessage(), asx);
                }

                return response;
            }

            // here we're going to generate the actual file given the provided
            // data. at this point everything should already be in the database
            // we could generate the zone file without having a "zone data" field,
            // but the zone data field makes it somewhat easier, since its already
            // been created for presentation/approval to the requestor
            List<DNSRecord> apexRecords = entry.getApexRecords();

            if (DEBUG) {
                DEBUGGER.debug("apexRecords: {}", apexRecords);
            }

            StringBuilder pBuilder = new StringBuilder()
                    .append("$ORIGIN " + entry.getOrigin() + CoreServiceConstants.LINE_BREAK)
                    .append("$TTL " + entry.getLifetime() + CoreServiceConstants.LINE_BREAK)
                    .append(entry.getSiteName() + " IN SOA " + entry.getMaster() + " " + entry.getOwner() + " ("
                            + CoreServiceConstants.LINE_BREAK)
                    .append("       " + entry.getSerialNumber() + "," + CoreServiceConstants.LINE_BREAK)
                    .append("       " + entry.getRefresh() + "," + CoreServiceConstants.LINE_BREAK)
                    .append("       " + entry.getRetry() + "," + CoreServiceConstants.LINE_BREAK)
                    .append("       " + entry.getExpiry() + "," + CoreServiceConstants.LINE_BREAK)
                    .append("       " + entry.getMinimum() + "," + CoreServiceConstants.LINE_BREAK)
                    .append("       )" + CoreServiceConstants.LINE_BREAK);

            for (DNSRecord record : apexRecords) {
                if (DEBUG) {
                    DEBUGGER.debug("DNSRecord: {}", record);
                }

                switch (record.getRecordType()) {
                case MX:
                    pBuilder.append("       " + record.getRecordClass() + "    " + record.getRecordType() + "    "
                            + record.getRecordPriority() + "    " + record.getRecordAddress()
                            + CoreServiceConstants.LINE_BREAK);

                    break;
                default:
                    pBuilder.append("       " + record.getRecordClass() + "    " + record.getRecordType() + "    "
                            + record.getRecordAddress() + CoreServiceConstants.LINE_BREAK);

                    break;
                }
            }

            if ((entry.getSubRecords() != null) && (entry.getSubRecords().size() != 0)) {
                pBuilder.append(CoreServiceConstants.LINE_BREAK);
                pBuilder.append("$ORIGIN " + entry.getSiteName() + "." + CoreServiceConstants.LINE_BREAK); // always put the site name as the initial origin

                for (DNSRecord record : entry.getSubRecords()) {
                    if (DEBUG) {
                        DEBUGGER.debug("DNSRecord: {}", record);
                    }

                    if (!(StringUtils.equals(record.getRecordOrigin(), "."))
                            || StringUtils.equals(record.getRecordOrigin(), entry.getSiteName())) {
                        if (!(StringUtils.contains(pBuilder.toString(), record.getRecordOrigin()))) {
                            pBuilder.append(CoreServiceConstants.LINE_BREAK);
                            pBuilder.append(
                                    "$ORIGIN " + record.getRecordOrigin() + "." + CoreServiceConstants.LINE_BREAK);
                        }
                    }

                    switch (record.getRecordType()) {
                    case MX:
                        pBuilder.append("       " + record.getRecordClass() + "    " + record.getRecordType()
                                + "    " + record.getRecordPriority() + "    " + record.getRecordAddress()
                                + CoreServiceConstants.LINE_BREAK);

                        break;
                    case SRV:
                        if (StringUtils.isNotEmpty(record.getRecordName())) {
                            pBuilder.append(record.getRecordService() + "." + record.getRecordProtocol() + "    "
                                    + record.getRecordName() + "    " + record.getRecordLifetime() + "    "
                                    + record.getRecordClass() + "    " + record.getRecordType() + "    "
                                    + record.getRecordPriority() + "    " + record.getRecordWeight() + "    "
                                    + record.getRecordPort() + "    " + record.getRecordAddress()
                                    + CoreServiceConstants.LINE_BREAK);
                        } else {
                            pBuilder.append(record.getRecordService() + "." + record.getRecordProtocol() + "    "
                                    + record.getRecordLifetime() + "    " + record.getRecordClass() + "    "
                                    + record.getRecordType() + "    " + record.getRecordPriority() + "    "
                                    + record.getRecordWeight() + "    " + record.getRecordPort() + "    "
                                    + record.getRecordAddress() + CoreServiceConstants.LINE_BREAK);
                        }

                        break;
                    default:
                        if ((record.getRecordAddress() != null) && (record.getRecordAddresses() == null)) {
                            pBuilder.append(record.getRecordName() + "    " + record.getRecordClass() + "    "
                                    + record.getRecordType() + "    " + record.getRecordAddress()
                                    + CoreServiceConstants.LINE_BREAK);
                        } else {
                            pBuilder.append(record.getRecordName() + "    " + record.getRecordClass() + "    "
                                    + record.getRecordType() + "    " + record.getRecordAddresses().get(0)
                                    + CoreServiceConstants.LINE_BREAK);

                            for (int x = 1; x != record.getRecordAddresses().size(); x++) {
                                if (DEBUG) {
                                    DEBUGGER.debug("recordAddress: {}: ", record.getRecordAddresses().get(x));
                                }

                                pBuilder.append("    " + record.getRecordClass() + "    " + record.getRecordType()
                                        + "    " + record.getRecordAddresses().get(x)
                                        + CoreServiceConstants.LINE_BREAK);
                            }
                        }

                        break;
                    }
                }
            }

            // return the successful response back and the zone data
            response.setRequestStatus(CoreServicesStatus.SUCCESS);
            response.setZoneData(pBuilder);
        } catch (SecurityException sx) {
            ERROR_RECORDER.error(sx.getMessage(), sx);

            throw new DNSServiceException(sx.getMessage(), sx);
        } catch (AccessControlServiceException acsx) {
            ERROR_RECORDER.error(acsx.getMessage(), acsx);

            throw new DNSServiceException(acsx.getMessage(), acsx);
        } finally {
            // audit
            try {
                AuditEntry auditEntry = new AuditEntry();
                auditEntry.setHostInfo(reqInfo);
                auditEntry.setAuditType(AuditType.CREATEDNSRECORD);
                auditEntry.setUserAccount(userAccount);
                auditEntry.setAuthorized(Boolean.TRUE);
                auditEntry.setApplicationId(request.getApplicationId());
                auditEntry.setApplicationName(request.getApplicationName());

                if (DEBUG) {
                    DEBUGGER.debug("AuditEntry: {}", auditEntry);
                }

                AuditRequest auditRequest = new AuditRequest();
                auditRequest.setAuditEntry(auditEntry);

                if (DEBUG) {
                    DEBUGGER.debug("AuditRequest: {}", auditRequest);
                }

                auditor.auditRequest(auditRequest);
            } catch (AuditServiceException asx) {
                ERROR_RECORDER.error(asx.getMessage(), asx);
            }
        }

        return response;
    }

    /**
     * @see com.cws.esolutions.core.processors.interfaces.IDNSServiceRequestProcessor#pushNewService(com.cws.esolutions.core.processors.dto.DNSServiceRequest)
     */
    public DNSServiceResponse pushNewService(final DNSServiceRequest request) throws DNSServiceException {
        final String methodName = IDNSServiceRequestProcessor.CNAME
                + "#pushNewService(final DNSServiceRequest request) throws DNSServiceException";

        if (DEBUG) {
            DEBUGGER.debug(methodName);
            DEBUGGER.debug("DNSServiceRequest: {}" + request);
        }

        DNSServiceResponse response = new DNSServiceResponse();

        final DNSEntry entry = request.getDnsEntry();
        final UserAccount userAccount = request.getUserAccount();
        final RequestHostInfo reqInfo = request.getRequestInfo();

        if (DEBUG) {
            DEBUGGER.debug("DNSEntry: {}", entry);
            DEBUGGER.debug("UserAccount: {}", userAccount);
            DEBUGGER.debug("RequestHostInfo: {}", reqInfo);
        }

        try {
            // this will require admin and service authorization
            AccessControlServiceRequest accessRequest = new AccessControlServiceRequest();
            accessRequest.setUserAccount(userAccount);
            accessRequest.setServiceGuid(request.getServiceId());

            if (DEBUG) {
                DEBUGGER.debug("AccessControlServiceRequest: {}", accessRequest);
            }

            AccessControlServiceResponse accessResponse = accessControl.isUserAuthorized(accessRequest);

            if (DEBUG) {
                DEBUGGER.debug("AccessControlServiceResponse: {}", accessResponse);
            }

            if (!(accessResponse.getIsUserAuthorized())) {
                // unauthorized
                response.setRequestStatus(CoreServicesStatus.UNAUTHORIZED);

                // audit
                try {
                    AuditEntry auditEntry = new AuditEntry();
                    auditEntry.setHostInfo(reqInfo);
                    auditEntry.setAuditType(AuditType.CREATEDNSRECORD);
                    auditEntry.setAuthorized(Boolean.FALSE);
                    auditEntry.setUserAccount(userAccount);
                    auditEntry.setApplicationId(request.getApplicationId());
                    auditEntry.setApplicationName(request.getApplicationName());

                    if (DEBUG) {
                        DEBUGGER.debug("AuditEntry: {}", auditEntry);
                    }

                    AuditRequest auditRequest = new AuditRequest();
                    auditRequest.setAuditEntry(auditEntry);

                    if (DEBUG) {
                        DEBUGGER.debug("AuditRequest: {}", auditRequest);
                    }

                    auditor.auditRequest(auditRequest);
                } catch (AuditServiceException asx) {
                    ERROR_RECORDER.error(asx.getMessage(), asx);
                }

                return response;
            }

            // build me
        } catch (SecurityException sx) {
            ERROR_RECORDER.error(sx.getMessage(), sx);

            throw new DNSServiceException(sx.getMessage(), sx);
        } catch (AccessControlServiceException acsx) {
            ERROR_RECORDER.error(acsx.getMessage(), acsx);

            throw new DNSServiceException(acsx.getMessage(), acsx);
        } finally {
            // audit
            try {
                AuditEntry auditEntry = new AuditEntry();
                auditEntry.setHostInfo(reqInfo);
                auditEntry.setAuditType(AuditType.PUSHDNSRECORD);
                auditEntry.setAuthorized(Boolean.TRUE);
                auditEntry.setUserAccount(userAccount);
                auditEntry.setApplicationId(request.getApplicationId());
                auditEntry.setApplicationName(request.getApplicationName());

                if (DEBUG) {
                    DEBUGGER.debug("AuditEntry: {}", auditEntry);
                }

                AuditRequest auditRequest = new AuditRequest();
                auditRequest.setAuditEntry(auditEntry);

                if (DEBUG) {
                    DEBUGGER.debug("AuditRequest: {}", auditRequest);
                }

                auditor.auditRequest(auditRequest);
            } catch (AuditServiceException asx) {
                ERROR_RECORDER.error(asx.getMessage(), asx);
            }
        }

        return response;
    }

    /**
     * @see com.cws.esolutions.core.processors.interfaces.IDNSServiceRequestProcessor#addRecordToEntry(DNSServiceRequest)
     */
    public DNSServiceResponse addRecordToEntry(final DNSServiceRequest request) throws DNSServiceException {
        final String methodName = IDNSServiceRequestProcessor.CNAME
                + "#addRecordToEntry(final DNSServiceRequest request) throws DNSServiceException";

        if (DEBUG) {
            DEBUGGER.debug(methodName);
            DEBUGGER.debug("DNSServiceRequest: {}", request);
        }

        final DNSServiceResponse response = new DNSServiceResponse();
        final DNSEntry dnsEntry = request.getDnsEntry();
        final UserAccount userAccount = request.getUserAccount();
        final RequestHostInfo reqInfo = request.getRequestInfo();

        if (DEBUG) {
            DEBUGGER.debug("DNSEntry: {}", dnsEntry);
            DEBUGGER.debug("UserAccount: {}", userAccount);
            DEBUGGER.debug("RequestHostInfo: {}", reqInfo);
        }

        try {
            // this will require admin and service authorization
            AccessControlServiceRequest accessRequest = new AccessControlServiceRequest();
            accessRequest.setUserAccount(userAccount);
            accessRequest.setServiceGuid(request.getServiceId());

            if (DEBUG) {
                DEBUGGER.debug("AccessControlServiceRequest: {}", accessRequest);
            }

            AccessControlServiceResponse accessResponse = accessControl.isUserAuthorized(accessRequest);

            if (DEBUG) {
                DEBUGGER.debug("AccessControlServiceResponse accessResponse: {}", accessResponse);
            }

            if (!(accessResponse.getIsUserAuthorized())) {
                // unauthorized
                response.setRequestStatus(CoreServicesStatus.UNAUTHORIZED);

                // audit
                try {
                    AuditEntry auditEntry = new AuditEntry();
                    auditEntry.setHostInfo(reqInfo);
                    auditEntry.setAuditType(AuditType.CREATEDNSRECORD);
                    auditEntry.setAuthorized(Boolean.FALSE);
                    auditEntry.setUserAccount(userAccount);
                    auditEntry.setApplicationId(request.getApplicationId());
                    auditEntry.setApplicationName(request.getApplicationName());

                    if (DEBUG) {
                        DEBUGGER.debug("AuditEntry: {}", auditEntry);
                    }

                    AuditRequest auditRequest = new AuditRequest();
                    auditRequest.setAuditEntry(auditEntry);

                    if (DEBUG) {
                        DEBUGGER.debug("AuditRequest: {}", auditRequest);
                    }

                    auditor.auditRequest(auditRequest);
                } catch (AuditServiceException asx) {
                    ERROR_RECORDER.error(asx.getMessage(), asx);
                }

                return response;
            }

            // build me
        } catch (SecurityException sx) {
            ERROR_RECORDER.error(sx.getMessage(), sx);

            throw new DNSServiceException(sx.getMessage(), sx);
        } catch (AccessControlServiceException acsx) {
            ERROR_RECORDER.error(acsx.getMessage(), acsx);

            throw new DNSServiceException(acsx.getMessage(), acsx);
        } finally {
            // audit
            try {
                AuditEntry auditEntry = new AuditEntry();
                auditEntry.setHostInfo(reqInfo);
                auditEntry.setAuditType(AuditType.CREATEDNSRECORD);
                auditEntry.setUserAccount(userAccount);
                auditEntry.setAuthorized(Boolean.TRUE);
                auditEntry.setApplicationId(request.getApplicationId());
                auditEntry.setApplicationName(request.getApplicationName());

                if (DEBUG) {
                    DEBUGGER.debug("AuditEntry: {}", auditEntry);
                }

                AuditRequest auditRequest = new AuditRequest();
                auditRequest.setAuditEntry(auditEntry);

                if (DEBUG) {
                    DEBUGGER.debug("AuditRequest: {}", auditRequest);
                }

                auditor.auditRequest(auditRequest);
            } catch (AuditServiceException asx) {
                ERROR_RECORDER.error(asx.getMessage(), asx);
            }
        }

        return response;
    }

    /**
     * @see com.cws.esolutions.core.processors.interfaces.IDNSServiceRequestProcessor#performSiteTransfer(com.cws.esolutions.core.processors.dto.DNSServiceRequest)
     */
    public DNSServiceResponse performSiteTransfer(final DNSServiceRequest request) throws DNSServiceException {
        final String methodName = IDNSServiceRequestProcessor.CNAME
                + "#performSiteTransfer(final DNSServiceRequest request) throws DNSServiceException";

        if (DEBUG) {
            DEBUGGER.debug(methodName);
            DEBUGGER.debug("DNSServiceRequest: {}" + request);
        }

        DNSServiceResponse response = new DNSServiceResponse();

        final UserAccount userAccount = request.getUserAccount();
        final RequestHostInfo reqInfo = request.getRequestInfo();

        if (DEBUG) {
            DEBUGGER.debug("UserAccount: {}", userAccount);
            DEBUGGER.debug("RequestHostInfo: {}", reqInfo);
        }

        try {
            // this will require admin and service authorization
            AccessControlServiceRequest accessRequest = new AccessControlServiceRequest();
            accessRequest.setUserAccount(userAccount);
            accessRequest.setServiceGuid(request.getServiceId());

            if (DEBUG) {
                DEBUGGER.debug("AccessControlServiceRequest: {}", accessRequest);
            }

            AccessControlServiceResponse accessResponse = accessControl.isUserAuthorized(accessRequest);

            if (DEBUG) {
                DEBUGGER.debug("AccessControlServiceResponse accessResponse: {}", accessResponse);
            }

            if (!(accessResponse.getIsUserAuthorized())) {
                // unauthorized
                response.setRequestStatus(CoreServicesStatus.UNAUTHORIZED);

                // audit
                try {
                    AuditEntry auditEntry = new AuditEntry();
                    auditEntry.setHostInfo(reqInfo);
                    auditEntry.setAuditType(AuditType.CREATEDNSRECORD);
                    auditEntry.setUserAccount(userAccount);
                    auditEntry.setAuthorized(Boolean.FALSE);
                    auditEntry.setApplicationId(request.getApplicationId());
                    auditEntry.setApplicationName(request.getApplicationName());

                    if (DEBUG) {
                        DEBUGGER.debug("AuditEntry: {}", auditEntry);
                    }

                    AuditRequest auditRequest = new AuditRequest();
                    auditRequest.setAuditEntry(auditEntry);

                    if (DEBUG) {
                        DEBUGGER.debug("AuditRequest: {}", auditRequest);
                    }

                    auditor.auditRequest(auditRequest);
                } catch (AuditServiceException asx) {
                    ERROR_RECORDER.error(asx.getMessage(), asx);
                }

                return response;
            }

            // TODO: build
            // this will take the IP address in the "masters" clause and 
            // change it to whatever the new one is. then it pushes the file
            // out to the associated servers and continues from there to the
            // slaves
        } catch (SecurityException sx) {
            ERROR_RECORDER.error(sx.getMessage(), sx);

            throw new DNSServiceException(sx.getMessage(), sx);
        } catch (AccessControlServiceException acsx) {
            ERROR_RECORDER.error(acsx.getMessage(), acsx);

            throw new DNSServiceException(acsx.getMessage(), acsx);
        } finally {
            try {
                AuditEntry auditEntry = new AuditEntry();
                auditEntry.setHostInfo(reqInfo);
                auditEntry.setAuditType(AuditType.SITETXFR);
                auditEntry.setUserAccount(userAccount);
                auditEntry.setAuthorized(Boolean.TRUE);
                auditEntry.setApplicationId(request.getApplicationId());
                auditEntry.setApplicationName(request.getApplicationName());

                if (DEBUG) {
                    DEBUGGER.debug("AuditEntry: {}", auditEntry);
                }

                AuditRequest auditRequest = new AuditRequest();
                auditRequest.setAuditEntry(auditEntry);

                if (DEBUG) {
                    DEBUGGER.debug("AuditRequest: {}", auditRequest);
                }

                auditor.auditRequest(auditRequest);
            } catch (AuditServiceException asx) {
                ERROR_RECORDER.error(asx.getMessage(), asx);
            }
        }

        return response;
    }
}