com.microsoft.exchange.autodiscover.AbstractExchangeAutodiscoverService.java Source code

Java tutorial

Introduction

Here is the source code for com.microsoft.exchange.autodiscover.AbstractExchangeAutodiscoverService.java

Source

/**
 * See the NOTICE file distributed with this work
 * for additional information regarding copyright ownership.
 * Board of Regents of the University of Wisconsin System
 * licenses this file to you 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.microsoft.exchange.autodiscover;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.validator.routines.EmailValidator;
import org.apache.http.entity.ContentType;

import com.microsoft.exchange.exception.AutodiscoverException;

public abstract class AbstractExchangeAutodiscoverService implements ExchangeAutodiscoverService {

    protected Log log = LogFactory.getLog(this.getClass());

    /**
     * Don't use this.  all you should need is an email address to discover an EWS ENDPOINT
     */
    @Deprecated
    protected static final String AUTODISCOVER_URL = "https://autodiscover-s.outlook.com/autodiscover/autodiscover.xml";

    private static final String TEXT_XML = "text/xml";
    private static final String UTF_8 = "UTF-8";

    private static final ContentType CONTENT_TYPE = ContentType.create(TEXT_XML, UTF_8);

    private static final List<String> SCHEMES;
    private static final List<String> AUTODISCOVER_ENDPOINT_PATTERNS;
    static {
        List<String> autoDiscoverEndpoints = new ArrayList<String>();
        autoDiscoverEndpoints.add("{scheme}://{domain}/autodiscover/autodiscover.{serviceSuffix}");
        autoDiscoverEndpoints.add("{scheme}://autodiscover.{domain}/autodiscover/autodiscover.{serviceSuffix}");
        //fallback pattern
        //autoDiscoverEndpoints.add("https://autodiscover-s.outlook.com/autodiscover/autodiscover.{serviceSuffix}");
        AUTODISCOVER_ENDPOINT_PATTERNS = Collections.unmodifiableList(autoDiscoverEndpoints);

        //prefer https, see: http://msdn.microsoft.com/en-us/library/office/jj900169(v=exchg.150).aspx
        List<String> schemes = new ArrayList<String>();
        schemes.add("https");
        schemes.add("http");
        SCHEMES = Collections.unmodifiableList(schemes);
    }

    protected ContentType getContentType() {
        return CONTENT_TYPE;
    }

    /**
     * 
     * @return the url suffix for the autodiscover service.
     * 
     * POX = .xml
     * SOAP = .svc
     */
    abstract protected String getServiceSuffix();

    @Override
    public List<String> getPotentialAutodiscoverEndpoints(String email) {
        String domain = null;
        List<String> potentialEndpoints = new ArrayList<String>();
        try {
            domain = extractDomainFromEmail(email);
        } catch (AutodiscoverException e) {
            log.error("Failed to generate potential autodiscover urls for email = " + email, e);
            return potentialEndpoints;
        }
        for (String scheme : SCHEMES) {
            for (String pattern : AUTODISCOVER_ENDPOINT_PATTERNS) {
                String uri = pattern.replace("{scheme}", scheme);
                uri = uri.replace("{domain}", domain);
                uri = uri.replace("{serviceSuffix}", getServiceSuffix());
                if (!potentialEndpoints.contains(uri)) {
                    potentialEndpoints.add(uri);
                }
            }
        }
        return potentialEndpoints;
    }

    /*
     * validate the given email address and extract the domain.  Throw an exception if not found.
     */
    protected String extractDomainFromEmail(String email) throws AutodiscoverException {
        EmailValidator validator = EmailValidator.getInstance(false);
        if (StringUtils.isNotBlank(email) && validator.isValid(email)) {
            String domain = StringUtils.substringAfter(email, "@");
            if (StringUtils.isNotBlank(domain)) {
                return domain;
            }
        }
        throw new AutodiscoverException("INVALID EMAIL: " + email);
    }
}