001 // Copyright 2006, 2007, 2008, 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; 016 017 import java.lang.reflect.Method; 018 import java.util.Set; 019 020 import org.apache.tapestry5.func.F; 021 import org.apache.tapestry5.func.Flow; 022 import org.apache.tapestry5.func.Mapper; 023 import org.apache.tapestry5.ioc.AnnotationProvider; 024 import org.apache.tapestry5.ioc.ObjectCreator; 025 import org.apache.tapestry5.ioc.ServiceBuilderResources; 026 import org.apache.tapestry5.ioc.def.ServiceDef3; 027 import org.apache.tapestry5.ioc.internal.services.AnnotationProviderChain; 028 import org.apache.tapestry5.ioc.internal.util.InternalUtils; 029 030 public class ServiceDefImpl implements ServiceDef3 031 { 032 private final Class serviceInterface; 033 034 private final Class serviceImplementation; 035 036 private final String serviceId; 037 038 private final String scope; 039 040 private final boolean eagerLoad; 041 042 private final ObjectCreatorSource source; 043 044 private final Set<Class> markers; 045 046 private final boolean preventDecoration; 047 048 /** 049 * @param serviceInterface 050 * interface implemented by the service (or the service implementation class, for 051 * non-proxied services) 052 * @param serviceImplementation 053 * service implementation class if exists 054 * @param serviceId 055 * unique id for the service 056 * @param markers 057 * set of marker annotation classes (will be retained not copied) 058 * @param scope 059 * scope of the service (i.e., {@link org.apache.tapestry5.ioc.ScopeConstants#DEFAULT}). 060 * @param eagerLoad 061 * if true, the service is realized at startup, rather than on-demand 062 * @param preventDecoration 063 * if true, the service may not be decorated 064 * @param source 065 * used to create the service implementation when needed 066 */ 067 ServiceDefImpl(Class serviceInterface, Class serviceImplementation, String serviceId, Set<Class> markers, 068 String scope, boolean eagerLoad, boolean preventDecoration, ObjectCreatorSource source) 069 { 070 this.serviceInterface = serviceInterface; 071 this.serviceImplementation = serviceImplementation; 072 this.serviceId = serviceId; 073 this.scope = scope; 074 this.eagerLoad = eagerLoad; 075 this.preventDecoration = preventDecoration; 076 this.source = source; 077 078 this.markers = markers; 079 } 080 081 @Override 082 public String toString() 083 { 084 return source.getDescription(); 085 } 086 087 public ObjectCreator createServiceCreator(ServiceBuilderResources resources) 088 { 089 return source.constructCreator(resources); 090 } 091 092 public String getServiceId() 093 { 094 return serviceId; 095 } 096 097 public Class getServiceInterface() 098 { 099 return serviceInterface; 100 } 101 102 public String getServiceScope() 103 { 104 return scope; 105 } 106 107 public boolean isEagerLoad() 108 { 109 return eagerLoad; 110 } 111 112 public Set<Class> getMarkers() 113 { 114 return markers; 115 } 116 117 public boolean isPreventDecoration() 118 { 119 return preventDecoration; 120 } 121 122 private Flow<Class> searchPath() 123 { 124 return F.flow(serviceImplementation, serviceInterface).removeNulls(); 125 } 126 127 public AnnotationProvider getClassAnnotationProvider() 128 { 129 return AnnotationProviderChain.create(searchPath().map(InternalUtils.CLASS_TO_AP_MAPPER).toList()); 130 } 131 132 public AnnotationProvider getMethodAnnotationProvider(final String methodName, final Class... argumentTypes) 133 { 134 return AnnotationProviderChain.create(searchPath().map(new Mapper<Class, Method>() 135 { 136 public Method map(Class element) 137 { 138 return InternalUtils.findMethod(element, methodName, argumentTypes); 139 } 140 }).map(InternalUtils.METHOD_TO_AP_MAPPER).toList()); 141 } 142 }