001 // Copyright 2004, 2005 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.hivemind.impl; 016 017 import org.apache.commons.logging.Log; 018 import org.apache.hivemind.ApplicationRuntimeException; 019 import org.apache.hivemind.InterceptorStack; 020 import org.apache.hivemind.definition.InterceptorDefinition; 021 import org.apache.hivemind.internal.Module; 022 import org.apache.hivemind.internal.ServicePoint; 023 import org.apache.hivemind.util.ToStringBuilder; 024 025 /** 026 * Implementation of the {@link org.apache.hivemind.InterceptorStack} interface; localizes 027 * error checking in one place. 028 * 029 * @author Howard Lewis Ship 030 */ 031 public final class InterceptorStackImpl implements InterceptorStack 032 { 033 private final Log _log; 034 035 private InterceptorDefinition _interceptorDefinition; 036 private ServicePoint _sep; 037 private Class _interfaceClass; 038 private Object _top; 039 040 public InterceptorStackImpl(Log log, ServicePoint sep, Object root) 041 { 042 _log = log; 043 _sep = sep; 044 _top = root; 045 _interfaceClass = sep.getServiceInterface(); 046 } 047 048 public String toString() 049 { 050 ToStringBuilder builder = new ToStringBuilder(this); 051 builder.append("contribution", _interceptorDefinition); 052 builder.append("interfaceClass", _interfaceClass); 053 builder.append("top", _top); 054 055 return builder.toString(); 056 } 057 058 public String getServiceExtensionPointId() 059 { 060 return _sep.getExtensionPointId(); 061 } 062 063 public Module getServiceModule() 064 { 065 return _sep.getModule(); 066 } 067 068 public Class getServiceInterface() 069 { 070 return _interfaceClass; 071 } 072 073 public Object peek() 074 { 075 return _top; 076 } 077 078 public void push(Object interceptor) 079 { 080 if (interceptor == null) 081 throw new ApplicationRuntimeException( 082 ImplMessages.nullInterceptor(_interceptorDefinition, _sep), 083 _interceptorDefinition.getLocation(), 084 null); 085 086 if (!_interfaceClass.isAssignableFrom(interceptor.getClass())) 087 throw new ApplicationRuntimeException( 088 ImplMessages.interceptorDoesNotImplementInterface( 089 interceptor, 090 _interceptorDefinition, 091 _sep, 092 _interfaceClass), 093 _interceptorDefinition.getLocation(), 094 null); 095 096 _top = interceptor; 097 } 098 099 /** 100 * Invoked to process the next interceptor contribution; these should 101 * be processed in ascending order. 102 * 103 */ 104 105 public void process(InterceptorDefinition interceptorDefinition) 106 { 107 if (_log.isDebugEnabled()) 108 _log.debug("Applying interceptor factory " + interceptorDefinition.getName()); 109 110 // And now we can finally do this! 111 try 112 { 113 _interceptorDefinition = interceptorDefinition; 114 Module contributingModule = getServiceModule().getRegistry().getModule(interceptorDefinition.getModuleId()); 115 _interceptorDefinition.getInterceptorConstructor().constructServiceInterceptor(this, contributingModule); 116 } 117 finally 118 { 119 _interceptorDefinition = null; 120 } 121 } 122 123 public Log getServiceLog() 124 { 125 return _log; 126 } 127 }