MentaBean

Rev

Rev 61 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
38 soliveira 1
/*
2
 * This program is free software: you can redistribute it and/or modify
3
 * it under the terms of the GNU General Public License as published by
4
 * the Free Software Foundation, either version 3 of the License, or
5
 * (at your option) any later version.
6
 *
7
 * This program is distributed in the hope that it will be useful,
8
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10
 * GNU General Public License for more details.
11
 *
12
 * You should have received a copy of the GNU General Public License
13
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
14
 *
15
 * MentaBean => http://www.mentabean.org
16
 * Author: Sergio Oliveira Jr. (sergio.oliveira.jr@gmail.com)
17
 */
18
package org.mentabean.type;
19
 
20
import java.lang.reflect.Method;
21
import java.sql.PreparedStatement;
22
import java.sql.ResultSet;
23
import java.sql.SQLException;
24
import java.sql.Types;
25
 
26
import org.mentabean.BeanException;
27
import org.mentabean.DBType;
28
 
29
public class EnumIdType implements DBType<Enum<?>> {
30
 
31
        private final Class<? extends Enum<?>> enumType;
32
        private final Method fromIdMethod;
33
        private final Method getIdMethod;
34
 
61 soliveira 35
        private boolean canBeNull = false;
36
 
37
        @Override
38
        public boolean canBeNull() {
39
                return canBeNull;
40
        }
41
 
42
        public EnumIdType nullable(boolean flag) {
43
                EnumIdType d = new EnumIdType(enumType);
44
                d.canBeNull = flag;
45
                return d;
46
        }
47
 
38 soliveira 48
        public EnumIdType(final Class<? extends Enum<?>> enumType) {
49
                this.enumType = enumType;
50
                this.fromIdMethod = getFromIdMethod(enumType);
51
                this.getIdMethod = getGetIdMethod(enumType);
52
        }
61 soliveira 53
 
54
        @Override
55
        public String getAnsiType() {
56
                return "smallint";
57
        }
58
 
38 soliveira 59
        private static Method getFromIdMethod(Class<? extends Enum<?>> enumType) {
61 soliveira 60
 
38 soliveira 61
                try {
61 soliveira 62
 
38 soliveira 63
                        return enumType.getMethod("fromId", int.class);
61 soliveira 64
                } catch (Exception e) {
65
 
38 soliveira 66
                        throw new BeanException("Cannot find fromId(int) method from enum class: " + enumType, e);
67
                }
68
        }
61 soliveira 69
 
38 soliveira 70
        private static Method getGetIdMethod(Class<? extends Enum<?>> enumType) {
61 soliveira 71
 
38 soliveira 72
                try {
61 soliveira 73
 
38 soliveira 74
                        return enumType.getMethod("getId", (Class[]) null);
61 soliveira 75
                } catch (Exception e) {
76
 
38 soliveira 77
                        throw new BeanException("Cannot find getId() method from enum class: " + enumType, e);
78
                }
79
        }
61 soliveira 80
 
38 soliveira 81
        private Enum<?> fromId(int id) {
82
                try {
83
                        return (Enum<?>) fromIdMethod.invoke(null, id);
61 soliveira 84
                } catch (Exception e) {
38 soliveira 85
                        throw new BeanException(e);
86
                }
87
        }
61 soliveira 88
 
38 soliveira 89
        private int getId(Enum<?> theEnum) {
90
                try {
91
                        return (Integer) getIdMethod.invoke(theEnum, (Object[]) null);
61 soliveira 92
                } catch (Exception e) {
38 soliveira 93
                        throw new BeanException(e);
94
                }
61 soliveira 95
        }
38 soliveira 96
 
97
        @Override
98
        public String toString() {
99
 
100
                return this.getClass().getSimpleName() + ": " + enumType.getSimpleName();
101
        }
102
 
103
        @Override
104
        public Enum<?> getFromResultSet(final ResultSet rset, final int index) throws SQLException {
105
 
106
                final int id = rset.getInt(index);
107
 
108
                if (rset.wasNull()) {
109
                        return null;
110
                }
111
 
112
                return fromId(id);
113
        }
114
 
115
        @Override
116
        public Enum<?> getFromResultSet(final ResultSet rset, final String field) throws SQLException {
117
 
118
                final int id = rset.getInt(field);
119
 
120
                if (rset.wasNull()) {
121
                        return null;
122
                }
123
 
124
                return fromId(id);
125
        }
126
 
127
        @Override
128
        public Class<? extends Object> getTypeClass() {
129
 
130
                return enumType;
131
        }
132
 
133
        @Override
134
        public void bindToStmt(final PreparedStatement stmt, final int index, final Enum<?> value) throws SQLException {
135
 
136
                if (value == null) {
137
 
138
                        stmt.setNull(index, Types.INTEGER);
139
 
187 erico 140
                        //Support for overwritten enums (superclass on left)
141
                } else if (enumType.isAssignableFrom(value.getClass())) {
38 soliveira 142
 
143
                        final int id = getId(value);
144
 
145
                        stmt.setInt(index, id);
146
 
147
                } else {
148
 
187 erico 149
                        throw new IllegalArgumentException("Value '"+value+"' from '"+value.getClass()+"' is not an enum!");
38 soliveira 150
                }
151
        }
61 soliveira 152
 
38 soliveira 153
        public static enum Test {
61 soliveira 154
 
38 soliveira 155
                T1(1), T2(2), T3(3);
61 soliveira 156
 
38 soliveira 157
                private final int id;
61 soliveira 158
 
38 soliveira 159
                private Test(int id) {
160
                        this.id = id;
161
                }
61 soliveira 162
 
163
                public int getId() {
164
                        return id;
165
                }
166
 
38 soliveira 167
                public static Test fromId(int id) {
61 soliveira 168
                        for (Test t : Test.values()) {
169
                                if (t.getId() == id) {
170
                                        return t;
171
                                }
38 soliveira 172
                        }
173
                        return null;
174
                }
175
        }
61 soliveira 176
 
38 soliveira 177
        public static void main(String[] args) throws Exception {
178
 
179
                EnumIdType eit = new EnumIdType(Test.class);
61 soliveira 180
 
38 soliveira 181
                System.out.println(eit.fromId(2));
61 soliveira 182
 
38 soliveira 183
                System.out.println(eit.getId(Test.T3));
61 soliveira 184
 
38 soliveira 185
        }
186
}