/* * Copyright 2004-2012 the Seasar Foundation and the Others. * * 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 org.seasar.mayaa.impl; import java.io.InputStream; import java.util.Iterator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.seasar.mayaa.FactoryFactory; import org.seasar.mayaa.UnifiedFactory; import org.seasar.mayaa.cycle.scope.ApplicationScope; import org.seasar.mayaa.impl.cycle.web.ApplicationScopeImpl; import org.seasar.mayaa.impl.factory.UnifiedFactoryHandler; import org.seasar.mayaa.impl.source.ApplicationSourceDescriptor; import org.seasar.mayaa.impl.util.IOUtil; import org.seasar.mayaa.impl.util.StringUtil; import org.seasar.mayaa.impl.util.XMLUtil; import org.seasar.mayaa.source.SourceDescriptor; /** * @author Masataka Kurihara (Gluegent, Inc.) */ public class FactoryFactoryImpl extends FactoryFactory implements CONST_IMPL { private static final long serialVersionUID = -1393736148065197812L; private static final Log LOG = LogFactory.getLog(FactoryFactoryImpl.class); protected boolean checkInterface(Class clazz) { if (clazz != null && clazz.isInterface() && UnifiedFactory.class.isAssignableFrom(clazz)) { return true; } return false; } protected UnifiedFactory marshallFactory( Class interfaceClass, Object context, SourceDescriptor source, UnifiedFactory beforeFactory) { if (source == null) { throw new IllegalArgumentException(); } String systemID = source.getSystemID(); UnifiedFactory factory; if (source.exists()) { if (LOG.isInfoEnabled()) { LOG.info("marshall factory: " + source.getSystemID()); } UnifiedFactoryHandler handler = new UnifiedFactoryHandler(interfaceClass, beforeFactory); InputStream stream = source.getInputStream(); try { XMLUtil.parse(handler, stream, PUBLIC_FACTORY10, systemID, true, true, false); } catch (Throwable t) { if (LOG.isErrorEnabled()) { LOG.error("Factory parse error on " + systemID, t); } factory = beforeFactory; } finally { IOUtil.close(stream); } factory = handler.getUnifiedFactory(); } else { factory = beforeFactory; } if (factory != null) { factory.setUnderlyingContext(context); } return factory; } protected UnifiedFactory getFactory( Class interfaceClass, Object context) { if (checkInterface(interfaceClass) == false || context == null) { throw new IllegalArgumentException(); } String systemID = interfaceClass.getName(); SourceDescriptor source = MarshallUtil.getDefaultSource( systemID, UnifiedFactoryHandler.class); UnifiedFactory factory = marshallFactory( interfaceClass, context, source, null); Iterator it = MarshallUtil.iterateMetaInfSources(systemID); while (it.hasNext()) { source = (SourceDescriptor) it.next(); factory = marshallFactory(interfaceClass, context, source, factory); } source = getBootstrapSource( ApplicationSourceDescriptor.WEB_INF, systemID); factory = marshallFactory(interfaceClass, context, source, factory); return factory; } protected ApplicationScope getApplicationScope(Object context) { ApplicationScope application = new ApplicationScopeImpl(); application.setUnderlyingContext(context); return application; } protected SourceDescriptor getBootstrapSource( String root, String systemID, Object context) { ApplicationSourceDescriptor appSource = new ApplicationSourceDescriptor(); if (StringUtil.hasValue(root)) { appSource.setRoot(root); } appSource.setSystemID(systemID); appSource.setApplicationScope(getApplicationScope(context)); return appSource; } }