com.gistlabs.mechanize.impl.MechanizeInitializer.java Source code

Java tutorial

Introduction

Here is the source code for com.gistlabs.mechanize.impl.MechanizeInitializer.java

Source

/**
 * Copyright (C) 2012-2014 Gist Labs, LLC. (http://gistlabs.com)
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */
package com.gistlabs.mechanize.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.StringTokenizer;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.gistlabs.mechanize.ResourceFactory;
import com.gistlabs.mechanize.exceptions.MechanizeExceptionFactory;

/**
 * <p>This will initialize Mechanize (at static load time) with Page types identified by content matches.</p>
 * 
 * <p>Mechanize supports different Page types, mapped by ContentType. The system property "mechanize.page.factories" is a
 * comma-separated list of classnames for the default Page types. Today this is com.gistlabs.mechanize.HtmlPage and
 * com.gistlabs.mechanize.ContentPage. Modify this property ONLY if you want to change the default loaded Page types.
 * The system property "mechanize.page.factories.ext" is a also loaded, and provides the typical way for framework extenders
 * to add custom content types, or MechanizeAgent.registerPageType(Class).</p>
    
 * 
 * @author jheintz
 *
 */
class MechanizeInitializer {
    private static final Log log = LogFactory.getLog(MechanizeInitializer.class);

    public static final String MECHANIZE_PAGE_FACTORIES = "mechanize.page.factories";
    public static final String MECHANIZE_PAGE_FACTORIES_EXT = "mechanize.page.factories.ext";
    public static final String DEFAULT_FACTORIES = "com.gistlabs.mechanize.document.html.HtmlDocumentFactory, com.gistlabs.mechanize.impl.DefaultResourceFactory, com.gistlabs.mechanize.document.json.JsonDocumentFactory";

    static void initialize() {
        processFactoriesClassNames(getClassNames(MECHANIZE_PAGE_FACTORIES, DEFAULT_FACTORIES));
        processFactoriesClassNames(getClassNames(MECHANIZE_PAGE_FACTORIES_EXT, ""));
        try {
            loadProperties();
        } catch (Exception e) {
            log.fatal("Failed to load /mechanize.properties file", e);
            throw MechanizeExceptionFactory.newException(e);
        }
    }

    protected static void loadProperties() throws Exception {
        Properties properties = new Properties();
        properties.load(MechanizeInitializer.class.getResourceAsStream("/mechanize.properties"));
        MechanizeAgent.setVersion(properties.getProperty("mechanize.version"));
    }

    protected static void processFactoriesClassNames(final List<String> factoryClassNames) {
        for (String factoryClassName : factoryClassNames)
            try {
                @SuppressWarnings("unchecked")
                Class<ResourceFactory> pageFactoryClass = (Class<ResourceFactory>) Class.forName(factoryClassName);
                ResourceFactory pageFactory = pageFactoryClass.newInstance();
                MechanizeAgent.registerFactory(pageFactory);
            } catch (Exception e) {
                // TODO add logging...
                throw MechanizeExceptionFactory.newInitializationException(e);
            }
    }

    static List<String> getClassNames(final String forSystemProperty, final String orDefaultValue) {
        List<String> result = new ArrayList<String>();
        String propertyValue = System.getProperty(forSystemProperty);

        if (propertyValue == null || "".equals(propertyValue))
            propertyValue = orDefaultValue;

        StringTokenizer tokenizer = new StringTokenizer(propertyValue, ",");
        while (tokenizer.hasMoreTokens())
            result.add(tokenizer.nextToken().trim());

        return result;
    }
}