001// Copyright 2006, 2008, 2010 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.services;
016
017import org.apache.tapestry5.ioc.ObjectCreator;
018import org.apache.tapestry5.ioc.services.PerThreadValue;
019import org.apache.tapestry5.ioc.services.PerthreadManager;
020
021/**
022 * Provides per-thread implementations of services.
023 */
024public class PerThreadServiceCreator implements ObjectCreator
025{
026    private final PerThreadValue<Object> perThreadValue;
027
028    private final ObjectCreator delegate;
029
030    public PerThreadServiceCreator(PerthreadManager perthreadManager, ObjectCreator delegate)
031    {
032        perThreadValue = perthreadManager.createValue();
033
034        this.delegate = delegate;
035    }
036
037    /**
038     * For each thread, the first call will use the delegate {@link org.apache.tapestry5.ioc.ObjectCreator} to create
039     * an instance, and later calls will reuse the same per-thread instance. The instance is stored in the
040     * {@link org.apache.tapestry5.ioc.services.PerthreadManager} and will be released at the end of the request.
041     */
042    public Object createObject()
043    {
044        if (perThreadValue.exists())
045            return perThreadValue.get();
046
047        return perThreadValue.set(delegate.createObject());
048    }
049}