1e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson/*
2e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Copyright (c) 2007 Mockito contributors
3e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * This program is made available under the terms of the MIT License.
4e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */
5e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpackage org.mockito.internal.configuration.injection.filter;
6e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
7e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.exceptions.Reporter;
8e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.util.reflection.BeanPropertySetter;
9e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport org.mockito.internal.util.reflection.FieldSetter;
10e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
11e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.lang.reflect.Field;
12e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.util.Collection;
13e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
14e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson/**
15e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * This node returns an actual injecter which will be either :
16e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson *
17e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * <ul>
18e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * <li>an {@link OngoingInjecter} that do nothing if a candidate couldn't be found</li>
19e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * <li>an {@link OngoingInjecter} that will try to inject the candidate trying first the property setter then if not possible try the field access</li>
20e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * </ul>
21e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */
22e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpublic class FinalMockCandidateFilter implements MockCandidateFilter {
23e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public OngoingInjecter filterCandidate(final Collection<Object> mocks, final Field field, final Object fieldInstance) {
24e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        if(mocks.size() == 1) {
25e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            final Object matchingMock = mocks.iterator().next();
26e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
27e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            return new OngoingInjecter() {
28e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                public Object thenInject() {
29e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                    try {
30e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                        if (!new BeanPropertySetter(fieldInstance, field).set(matchingMock)) {
31e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                            new FieldSetter(fieldInstance, field).set(matchingMock);
32e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                        }
33e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                    } catch (RuntimeException e) {
34e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                        new Reporter().cannotInjectDependency(field, matchingMock, e);
35e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                    }
36e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                    return matchingMock;
37e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                }
38e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            };
39e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
40e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
41e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return new OngoingInjecter() {
42e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            public Object thenInject() {
43e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson                return null;
44e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            }
45e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        };
46e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
47e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
48e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson}
49