    001    // Copyright 2011 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
    015    package org.apache.tapestry5.ioc.internal.util;
    016
    017    import org.apache.tapestry5.ioc.Invokable;
    018    import org.apache.tapestry5.ioc.ObjectCreator;
    019    import org.apache.tapestry5.ioc.OperationTracker;
    020
    021    import java.util.List;
    022
    023    /**
    024     * Encapsulates the initial construction of an object instance, followed by a series
    025     * {@link InitializationPlan}s to initialize fields and invoke other methods of the constructed object.
    026     *
    027     * @since 5.3
    028     */
    029    public class ConstructionPlan<T> implements ObjectCreator<T>
    030    {
    031        private final OperationTracker tracker;
    032
    033        private final String description;
    034
    035        private final Invokable<T> instanceConstructor;
    036
    037        private List<InitializationPlan> initializationPlans;
    038
    039        public ConstructionPlan(OperationTracker tracker, String description, Invokable<T> instanceConstructor)
    040        {
    041            this.tracker = tracker;
    042            this.description = description;
    043            this.instanceConstructor = instanceConstructor;
    044        }
    045
    046        public ConstructionPlan add(InitializationPlan plan)
    047        {
    048            if (initializationPlans == null)
    049            {
    050                initializationPlans = CollectionFactory.newList();
    051            }
    052
    053            initializationPlans.add(plan);
    054
    055            return this;
    056        }
    057
    058        public T createObject()
    059        {
    060            T result = tracker.invoke(description, instanceConstructor);
    061
    062            if (initializationPlans != null)
    063            {
    064                executeInitializationPLans(result);
    065            }
    066
    067            return result;
    068        }
    069
    070        private void executeInitializationPLans(final T newInstance)
    071        {
    072            for (final InitializationPlan<T> plan : initializationPlans)
    073            {
    074                tracker.run(plan.getDescription(), new Runnable()
    075                {
    076                    public void run()
    077                    {
    078                        plan.initialize(newInstance);
    079                    }
    080                });
    081            }
    082        }
    083    }