/** * 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; } }