// Copyright 2009, 2011 The Apache Software Foundation
//
// 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.apache.tapestry5.ioc.internal;
import java.util.List;
import org.apache.tapestry5.ioc.ObjectCreator;
import org.apache.tapestry5.ioc.ServiceAdvisor;
import org.apache.tapestry5.ioc.def.ServiceDef3;
import org.apache.tapestry5.ioc.services.AspectDecorator;
import org.apache.tapestry5.ioc.services.AspectInterceptorBuilder;
/**
* Equivalent of {@link org.apache.tapestry5.ioc.internal.InterceptorStackBuilder}, but works using an
* {@link org.apache.tapestry5.ioc.services.AspectInterceptorBuilder} that receives advice from
* {@link org.apache.tapestry5.ioc.ServiceAdvisor}s.
*
* @since 5.1.0.0
*/
public class AdvisorStackBuilder implements ObjectCreator
{
private final ServiceDef3 serviceDef;
private final ObjectCreator delegate;
private final AspectDecorator aspectDecorator;
private final InternalRegistry registry;
/**
* @param serviceDef
* the service that is ultimately being constructed
* @param delegate
* responsible for creating the object to be decorated
* @param aspectDecorator
* used to create the {@link org.apache.tapestry5.ioc.services.AspectInterceptorBuilder} passed to each
* {@link org.apache.tapestry5.ioc.ServiceAdvisor}
* @param registry
*/
public AdvisorStackBuilder(ServiceDef3 serviceDef, ObjectCreator delegate, AspectDecorator aspectDecorator,
InternalRegistry registry)
{
this.serviceDef = serviceDef;
this.delegate = delegate;
this.registry = registry;
this.aspectDecorator = aspectDecorator;
}
@Override
public Object createObject()
{
Object service = delegate.createObject();
List<ServiceAdvisor> advisors = registry.findAdvisorsForService(serviceDef);
if (advisors.isEmpty())
return service;
final AspectInterceptorBuilder builder = aspectDecorator.createBuilder(serviceDef.getServiceInterface(),
service, serviceDef, String.format("<AspectProxy for %s(%s)>", serviceDef.getServiceId(), serviceDef
.getServiceInterface().getName()));
for (final ServiceAdvisor advisor : advisors)
{
registry.run("Invoking " + advisor, new Runnable()
{
@Override
public void run()
{
advisor.advise(builder);
}
});
}
return builder.build();
}
}