    001// Copyright 2014 The Apache Software Foundation
    002//
    003// Licensed under the Apache License, Version 2.0 (the "License");
    004// you may not use this file except in compliance with the License.
    005// You may obtain a copy of the License at
    006//
    007// http://www.apache.org/licenses/LICENSE-2.0
    008//
    009// Unless required by applicable law or agreed to in writing, software
    010// distributed under the License is distributed on an "AS IS" BASIS,
    011// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    012// See the License for the specific language governing permissions and
    013// limitations under the License.
    014
    015package org.apache.tapestry5.ioc.internal;
    016
    017import org.apache.tapestry5.commons.ObjectCreator;
    018import org.apache.tapestry5.commons.ObjectLocator;
    019import org.apache.tapestry5.commons.util.CollectionFactory;
    020import org.apache.tapestry5.ioc.ModuleBuilderSource;
    021import org.apache.tapestry5.ioc.OperationTracker;
    022import org.apache.tapestry5.ioc.def.StartupDef;
    023import org.apache.tapestry5.ioc.internal.util.InjectionResources;
    024import org.apache.tapestry5.ioc.internal.util.InternalUtils;
    025import org.apache.tapestry5.ioc.internal.util.MapInjectionResources;
    026import org.slf4j.Logger;
    027
    028import java.lang.reflect.InvocationTargetException;
    029import java.lang.reflect.Method;
    030import java.util.Map;
    031
    032public class StartupDefImpl implements StartupDef
    033{
    034    private final Method startupMethod;
    035
    036    public StartupDefImpl(Method contributorMethod)
    037    {
    038        this.startupMethod = contributorMethod;
    039    }
    040
    041    @Override
    042    public void invoke(final ModuleBuilderSource moduleBuilderSource,
    043                       final OperationTracker tracker,
    044                       final ObjectLocator locator,
    045                       final Logger logger)
    046    {
    047
    048        tracker.run(String.format("Invoking startup method %s.", InternalUtils.asString(startupMethod)),
    049                new Runnable()
    050                {
    051                    @Override
    052                    public void run()
    053                    {
    054                        Map<Class, Object> resourceMap = CollectionFactory.newMap();
    055
    056                        resourceMap.put(ObjectLocator.class, locator);
    057                        resourceMap.put(Logger.class, logger);
    058
    059                        InjectionResources injectionResources = new MapInjectionResources(resourceMap);
    060
    061                        Throwable fail = null;
    062
    063                        Object moduleInstance = InternalUtils.isStatic(startupMethod) ? null : moduleBuilderSource.getModuleBuilder();
    064
    065                        try
    066                        {
    067                            ObjectCreator[] parameters = InternalUtils.calculateParametersForMethod(startupMethod, locator,
    068                                    injectionResources, tracker);
    069
    070                            startupMethod.invoke(moduleInstance, InternalUtils.realizeObjects(parameters));
    071                        } catch (InvocationTargetException ex)
    072                        {
    073                            fail = ex.getTargetException();
    074                        } catch (RuntimeException ex)
    075                        {
    076                            throw ex;
    077                        } catch (Exception ex)
    078                        {
    079                            fail = ex;
    080                        }
    081
    082                        if (fail != null)
    083                        {
    084                            throw new RuntimeException(fail);
    085                        }
    086
    087                    }
    088                });
    089    }
    090}