001 // Copyright 2006, 2007 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.services;
016
017 import org.apache.tapestry5.ioc.services.Builtin;
018 import org.apache.tapestry5.ioc.services.ClassFactory;
019 import org.apache.tapestry5.ioc.services.DefaultImplementationBuilder;
020 import org.apache.tapestry5.ioc.services.PipelineBuilder;
021 import org.slf4j.Logger;
022
023 import java.util.List;
024
025 public class PipelineBuilderImpl implements PipelineBuilder
026 {
027 private final ClassFactory classFactory;
028
029 private final DefaultImplementationBuilder defaultImplementationBuilder;
030
031 public PipelineBuilderImpl(@Builtin ClassFactory classFactory,
032
033 DefaultImplementationBuilder defaultImplementationBuilder)
034 {
035 this.classFactory = classFactory;
036 this.defaultImplementationBuilder = defaultImplementationBuilder;
037 }
038
039 public <S, F> S build(Logger logger, Class<S> serviceInterface, Class<F> filterInterface, List<F> filters)
040 {
041 S terminator = defaultImplementationBuilder.createDefaultImplementation(serviceInterface);
042
043 return build(logger, serviceInterface, filterInterface, filters, terminator);
044 }
045
046 public <S, F> S build(Logger logger, Class<S> serviceInterface, Class<F> filterInterface, List<F> filters,
047 S terminator)
048 {
049 if (filters.isEmpty()) return terminator;
050
051 BridgeBuilder<S, F> bb = new BridgeBuilder<S, F>(logger, serviceInterface, filterInterface, classFactory);
052
053 // The first bridge will point to the terminator.
054 // Like service decorators, we work deepest (last)
055 // to shallowest (first)
056
057 S next = terminator;
058 int count = filters.size();
059
060 for (int i = count - 1; i >= 0; i--)
061 {
062 F filter = filters.get(i);
063
064 next = bb.instantiateBridge(next, filter);
065 }
066
067 return next;
068 }
069
070 }