com.helger.smtp.failed.FailedMailDataMicroTypeConverter.java Source code

Java tutorial

Introduction

Here is the source code for com.helger.smtp.failed.FailedMailDataMicroTypeConverter.java

Source

/**
 * Copyright (C) 2014-2015 Philip Helger (www.helger.com)
 * philip[at]helger[dot]com
 *
 * 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.helger.smtp.failed;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;

import org.joda.time.DateTime;
import org.joda.time.LocalDateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.helger.commons.microdom.IMicroElement;
import com.helger.commons.microdom.convert.IMicroTypeConverter;
import com.helger.commons.microdom.convert.MicroTypeConverter;
import com.helger.commons.microdom.impl.MicroElement;
import com.helger.commons.microdom.utils.MicroUtils;
import com.helger.commons.string.StringHelper;
import com.helger.datetime.config.PDTConfig;
import com.helger.smtp.IEmailData;
import com.helger.smtp.ISMTPSettings;
import com.helger.smtp.impl.EmailData;
import com.helger.smtp.impl.SMTPSettings;
import com.helger.web.datetime.PDTWebDateUtils;

public final class FailedMailDataMicroTypeConverter implements IMicroTypeConverter {
    private static final Logger s_aLogger = LoggerFactory.getLogger(FailedMailDataMicroTypeConverter.class);
    private static final String ATTR_ID = "id";
    private static final String ATTR_ERRORDT = "errordt";
    private static final String ATTR_ORIGINALSENTDT = "originalsentdt";
    private static final String ELEMENT_SMTPSETTINGS = "smtpsettings";
    private static final String ELEMENT_EMAILDATA = "emaildata";
    private static final String ELEMENT_ERRORMSG = "errormsg";

    @Nonnull
    public IMicroElement convertToMicroElement(@Nonnull final Object aSource, @Nullable final String sNamespaceURI,
            @Nonnull final String sTagName) {
        final FailedMailData aFailedMail = (FailedMailData) aSource;
        final IMicroElement eFailedMail = new MicroElement(sNamespaceURI, sTagName);

        eFailedMail.setAttribute(ATTR_ID, aFailedMail.getID());
        eFailedMail.setAttribute(ATTR_ERRORDT, PDTWebDateUtils.getAsStringXSD(aFailedMail.getErrorDateTime()));

        if (aFailedMail.getOriginalSentDateTime() != null)
            eFailedMail.setAttribute(ATTR_ORIGINALSENTDT,
                    PDTWebDateUtils.getAsStringXSD(aFailedMail.getOriginalSentDateTime()));

        // SMTP settings
        eFailedMail.appendChild(MicroTypeConverter.convertToMicroElement(aFailedMail.getSMTPSettings(),
                sNamespaceURI, ELEMENT_SMTPSETTINGS));

        // email data
        eFailedMail.appendChild(MicroTypeConverter.convertToMicroElement(aFailedMail.getEmailData(), sNamespaceURI,
                ELEMENT_EMAILDATA));

        if (StringHelper.hasText(aFailedMail.getMessageDisplayText()))
            eFailedMail.appendElement(sNamespaceURI, ELEMENT_ERRORMSG)
                    .appendText(aFailedMail.getMessageDisplayText());
        return eFailedMail;
    }

    @Nullable
    public FailedMailData convertToNative(@Nonnull final IMicroElement eFailedMail) {
        final String sID = eFailedMail.getAttributeValue(ATTR_ID);
        if (sID == null) {
            s_aLogger.error("Failed to read ID");
            return null;
        }

        // Read error date/time
        final String sErrorDT = eFailedMail.getAttributeValue(ATTR_ERRORDT);
        if (sErrorDT == null) {
            s_aLogger.error("Failed to read error date/time");
            return null;
        }
        LocalDateTime aErrorDT = PDTWebDateUtils.getLocalDateTimeFromXSD(sErrorDT);
        if (aErrorDT == null)
            aErrorDT = PDTWebDateUtils.getLocalDateTimeFromW3C(sErrorDT);
        if (aErrorDT == null) {
            s_aLogger.error("Failed to parse error date '" + sErrorDT + "'");
            return null;
        }

        // read original sent date/time
        final String sOriginalSentDT = eFailedMail.getAttributeValue(ATTR_ORIGINALSENTDT);
        DateTime aOriginalSentDT = null;
        if (sOriginalSentDT != null) {
            aOriginalSentDT = PDTWebDateUtils.getDateTimeFromXSD(sOriginalSentDT);
            if (aOriginalSentDT == null)
                aOriginalSentDT = PDTWebDateUtils.getDateTimeFromW3C(sOriginalSentDT);
        }
        if (aOriginalSentDT != null)
            aOriginalSentDT = aOriginalSentDT.withChronology(PDTConfig.getDefaultChronology());

        // SMTP settings
        final IMicroElement eSMTPSettings = eFailedMail.getFirstChildElement(ELEMENT_SMTPSETTINGS);
        if (eSMTPSettings == null) {
            s_aLogger.error("Failed to get child element of SMTP settings!");
            return null;
        }
        final ISMTPSettings aSMTPSettings = MicroTypeConverter.convertToNative(eSMTPSettings, SMTPSettings.class);

        // email data (may be null)
        final IMicroElement eEmailData = eFailedMail.getFirstChildElement(ELEMENT_EMAILDATA);
        final IEmailData aEmailData = MicroTypeConverter.convertToNative(eEmailData, EmailData.class);

        // error message
        final String sErrorMessage = MicroUtils.getChildTextContent(eFailedMail, ELEMENT_ERRORMSG);
        final Exception aError = StringHelper.hasNoText(sErrorMessage) ? null : new Exception(sErrorMessage);

        return new FailedMailData(sID, aErrorDT, aSMTPSettings, aOriginalSentDT, aEmailData, aError);
    }
}