1 /**
2  * Copyright (c) 2008, http://www.snakeyaml.org
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.yaml.snakeyaml.introspector;
17 
18 import java.beans.PropertyDescriptor;
19 
20 import org.yaml.snakeyaml.error.YAMLException;
21 
22 /**
23  * <p>
24  * A <code>MethodProperty</code> is a <code>Property</code> which is accessed
25  * through accessor methods (setX, getX). It is possible to have a
26  * <code>MethodProperty</code> which has only setter, only getter, or both. It
27  * is not possible to have a <code>MethodProperty</code> which has neither
28  * setter nor getter.
29  * </p>
30  */
31 public class MethodProperty extends GenericProperty {
32 
33     private final PropertyDescriptor property;
34     private final boolean readable;
35     private final boolean writable;
36 
MethodProperty(PropertyDescriptor property)37     public MethodProperty(PropertyDescriptor property) {
38         super(property.getName(), property.getPropertyType(),
39                 property.getReadMethod() == null ? null : property.getReadMethod()
40                         .getGenericReturnType());
41         this.property = property;
42         this.readable = property.getReadMethod() != null;
43         this.writable = property.getWriteMethod() != null;
44     }
45 
46     @Override
set(Object object, Object value)47     public void set(Object object, Object value) throws Exception {
48         property.getWriteMethod().invoke(object, value);
49     }
50 
51     @Override
get(Object object)52     public Object get(Object object) {
53         try {
54             property.getReadMethod().setAccessible(true);// issue 50
55             return property.getReadMethod().invoke(object);
56         } catch (Exception e) {
57             throw new YAMLException("Unable to find getter for property '" + property.getName()
58                     + "' on object " + object + ":" + e);
59         }
60     }
61 
62     @Override
isWritable()63     public boolean isWritable() {
64         return writable;
65     }
66 
67     @Override
isReadable()68     public boolean isReadable() {
69         return readable;
70     }
71 }