001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.wicket.spring.test;
018
019import java.io.IOException;
020import java.io.Serializable;
021import java.lang.annotation.Annotation;
022import java.util.Locale;
023import java.util.Map;
024
025import org.springframework.beans.BeansException;
026import org.springframework.beans.factory.BeanFactory;
027import org.springframework.beans.factory.NoSuchBeanDefinitionException;
028import org.springframework.beans.factory.ObjectProvider;
029import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
030import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
031import org.springframework.beans.factory.support.DefaultListableBeanFactory;
032import org.springframework.beans.factory.support.RootBeanDefinition;
033import org.springframework.context.ApplicationContext;
034import org.springframework.context.ApplicationEvent;
035import org.springframework.context.MessageSourceResolvable;
036import org.springframework.context.NoSuchMessageException;
037import org.springframework.context.support.AbstractApplicationContext;
038import org.springframework.core.ResolvableType;
039import org.springframework.core.io.Resource;
040
041/**
042 * Mock application context object. This mock context allows easy creation of unit tests by allowing
043 * the user to put bean instances into the context.
044 * 
045 * @author Igor Vaynberg (ivaynberg)
046 * 
047 */
048public class ApplicationContextMock extends AbstractApplicationContext implements Serializable
049{
050        private static final long serialVersionUID = 1L;
051
052        private final DefaultListableBeanFactory beanFactory;
053        private final long startupTime;
054
055        public ApplicationContextMock() {
056                this.beanFactory = new DefaultListableBeanFactory();
057                beanFactory.setSerializationId(ApplicationContextMock.class.getName());
058                startupTime = System.currentTimeMillis();
059        }
060
061        /**
062         * puts bean with the given name into the context
063         * 
064         * @param name
065         * @param bean
066         */
067        public <T extends Object> void putBean(final String name, final T bean)
068        {
069                beanFactory.registerBeanDefinition(name, new RootBeanDefinition((Class<T>)bean.getClass(), () -> bean));
070        }
071
072        /**
073         * puts bean with into the context. bean object's class name will be used as the bean name.
074         * 
075         * @param bean
076         */
077        public void putBean(final Object bean)
078        {
079                putBean(bean.getClass().getName(), bean);
080        }
081
082        @Override
083        public Object getBean(final String name) throws BeansException
084        {
085                return beanFactory.getBean(name);
086        }
087
088        @Override
089        public Object getBean(final String name, final Object... args) throws BeansException
090        {
091                return beanFactory.getBean(name, args);
092        }
093
094        @Override
095        @SuppressWarnings({ "unchecked" })
096        public <T> T getBean(String name, Class<T> requiredType) throws BeansException
097        {
098                return beanFactory.getBean(name, requiredType);
099        }
100
101        @Override
102        @SuppressWarnings({ "unchecked" })
103        public <T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException
104        {
105                return beanFactory.getBeansOfType(type);
106        }
107
108        @Override
109        public <T> T getBean(Class<T> requiredType) throws BeansException
110        {
111                return beanFactory.getBean(requiredType);
112        }
113
114        @Override
115        public <T> T getBean(Class<T> requiredType, Object... objects) throws BeansException
116        {
117                return beanFactory.getBean(requiredType, objects);
118        }
119
120        @Override
121        public <T> ObjectProvider<T> getBeanProvider(Class<T> aClass)
122        {
123                return beanFactory.getBeanProvider(aClass);
124        }
125
126        @Override
127        public <T> ObjectProvider<T> getBeanProvider(ResolvableType resolvableType)
128        {
129                return beanFactory.getBeanProvider(resolvableType);
130        }
131
132        @Override
133        public Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType)
134                throws BeansException
135        {
136                return beanFactory.getBeansWithAnnotation(annotationType);
137        }
138
139        @Override
140        public <A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType)
141        {
142                return beanFactory.findAnnotationOnBean(beanName, annotationType);
143        }
144
145        @Override
146        public ApplicationContext getParent()
147        {
148                return null;
149        }
150
151        @Override
152        public String getDisplayName()
153        {
154                return ApplicationContextMock.class.getSimpleName();
155        }
156
157        @Override
158        public long getStartupDate()
159        {
160                return startupTime;
161        }
162
163        @Override
164        public void publishEvent(final ApplicationEvent event)
165        {
166                throw new UnsupportedOperationException();
167        }
168
169        @Override
170        public void publishEvent(Object o)
171        {
172                throw new UnsupportedOperationException();
173        }
174
175        @Override
176        public boolean containsBeanDefinition(final String beanName)
177        {
178                return beanFactory.containsBean(beanName);
179        }
180
181        @Override
182        public int getBeanDefinitionCount()
183        {
184                return beanFactory.getBeanDefinitionCount();
185        }
186
187        @Override
188        public String[] getBeanDefinitionNames()
189        {
190                return beanFactory.getBeanDefinitionNames();
191        }
192
193        @Override
194        public <T> ObjectProvider<T> getBeanProvider(final Class<T> aClass, final boolean b) {
195                return beanFactory.getBeanProvider(aClass, b);
196        }
197
198        @Override
199        public <T> ObjectProvider<T> getBeanProvider(final ResolvableType resolvableType, final boolean b) {
200                return beanFactory.getBeanProvider(resolvableType, b);
201        }
202
203        @Override
204        public String[] getBeanNamesForType(ResolvableType resolvableType)
205        {
206                return beanFactory.getBeanNamesForType(resolvableType);
207        }
208
209        @Override
210        public String[] getBeanNamesForType(ResolvableType resolvableType, boolean includeNonSingletons, boolean allowEagerInit)
211        {
212                return beanFactory.getBeanNamesForType(resolvableType, includeNonSingletons, allowEagerInit);
213        }
214
215        @Override
216        public String[] getBeanNamesForType(final Class type)
217        {
218                return beanFactory.getBeanNamesForType(type);
219        }
220
221        @Override
222        public String[] getBeanNamesForType(Class type, boolean includeNonSingletons,
223                boolean allowEagerInit)
224        {
225                return beanFactory.getBeanNamesForType(type, includeNonSingletons, allowEagerInit);
226        }
227
228        @Override
229        public <T> Map<String, T> getBeansOfType(Class<T> type, boolean includeNonSingletons,
230                boolean allowEagerInit) throws BeansException
231        {
232                return beanFactory.getBeansOfType(type, includeNonSingletons, allowEagerInit);
233        }
234
235        @Override
236        public String[] getBeanNamesForAnnotation(Class<? extends Annotation> aClass)
237        {
238                return beanFactory.getBeanNamesForAnnotation(aClass);
239        }
240
241        @Override
242        public boolean containsBean(final String name)
243        {
244                return beanFactory.containsBean(name);
245        }
246
247        @Override
248        public boolean isSingleton(final String name) throws NoSuchBeanDefinitionException
249        {
250                return beanFactory.isSingleton(name);
251        }
252
253        @Override
254        public Class<?> getType(final String name) throws NoSuchBeanDefinitionException
255        {
256                return beanFactory.getType(name);
257        }
258
259        @Override
260        public Class<?> getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException
261        {
262                return beanFactory.getType(name, allowFactoryBeanInit);
263        }
264
265        @Override
266        public String[] getAliases(final String name) throws NoSuchBeanDefinitionException
267        {
268                return beanFactory.getAliases(name);
269        }
270
271        @Override
272        public BeanFactory getParentBeanFactory()
273        {
274                return beanFactory.getParentBeanFactory();
275        }
276
277        @Override
278        public String getMessage(final String code, final Object[] args, final String defaultMessage,
279                final Locale locale)
280        {
281                throw new UnsupportedOperationException();
282        }
283
284        @Override
285        public String getMessage(final String code, final Object[] args, final Locale locale)
286                throws NoSuchMessageException
287        {
288                throw new UnsupportedOperationException();
289        }
290
291        @Override
292        public String getMessage(final MessageSourceResolvable resolvable, final Locale locale)
293                throws NoSuchMessageException
294        {
295                throw new UnsupportedOperationException();
296        }
297
298        @Override
299        public Resource[] getResources(final String locationPattern) throws IOException
300        {
301                throw new UnsupportedOperationException();
302        }
303
304        @Override
305        protected void refreshBeanFactory() throws BeansException, IllegalStateException {
306        }
307
308        @Override
309        protected void closeBeanFactory() {
310        }
311
312        @Override
313        public ConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException {
314                return beanFactory;
315        }
316
317        @Override
318        public Resource getResource(final String location)
319        {
320                throw new UnsupportedOperationException();
321        }
322
323        @Override
324        public AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException
325        {
326                return beanFactory;
327        }
328
329        @Override
330        public boolean containsLocalBean(final String name)
331        {
332                return beanFactory.containsLocalBean(name);
333        }
334
335        @Override
336        public boolean isPrototype(final String name) throws NoSuchBeanDefinitionException
337        {
338                return beanFactory.isPrototype(name);
339        }
340
341        @Override
342        public boolean isTypeMatch(String s, ResolvableType resolvableType) throws NoSuchBeanDefinitionException
343        {
344                return beanFactory.isTypeMatch(s, resolvableType);
345        }
346
347        @Override
348        public boolean isTypeMatch(final String name, final Class targetType)
349                throws NoSuchBeanDefinitionException
350        {
351                return beanFactory.isTypeMatch(name, targetType);
352        }
353}