001// ______________________________________________________
002// Generated by sql2java - https://github.com/10km/sql2java-2-6-7 (custom branch) 
003// modified by guyadong from
004// sql2java original version https://sourceforge.net/projects/sql2java/ 
005// JDBC driver used at code generation time: com.mysql.jdbc.Driver
006// template: ibean.converter.java.vm
007// ______________________________________________________
008package net.gdface.facelog.db;
009import java.lang.reflect.ParameterizedType;
010import java.lang.reflect.Type;
011import java.util.ArrayList;
012import java.util.Collection;
013import java.util.HashMap;
014import java.util.List;
015import java.util.Map;
016import java.util.Map.Entry;
017
018/**
019 * 
020 * @author guyadong
021 *
022 * @param <L> left type
023 * @param <R> right type
024 */
025public interface IBeanConverter<L,R> {
026
027    /**
028     * Default abstract implementation of {@link IBeanConverter}<br>
029     * 
030     * @author guyadong
031     *
032     * @param <L> left type
033     * @param <R> right type
034     */
035    public static abstract class  AbstractHandle <L,R>implements IBeanConverter<L, R> {
036        /** L type  */
037        protected final Class<?> leftType;
038        /** R type  */
039        protected final Class<?> rightType;
040        private static Class<?> getRawClass(Type type){
041            if(type instanceof Class<?>){
042                return (Class<?>) type;
043            } else if(type instanceof ParameterizedType){
044                return getRawClass(((ParameterizedType) type).getRawType());
045            } else{
046                throw new IllegalArgumentException("invalid type");
047            }
048        }
049        public AbstractHandle() {
050            Type superClass = getClass().getGenericSuperclass();
051            this.leftType = getRawClass(((ParameterizedType) superClass).getActualTypeArguments()[0]);
052            this.rightType = getRawClass(((ParameterizedType) superClass).getActualTypeArguments()[1]);
053        }
054        public AbstractHandle(Class<L> leftClass,Class<R> rightClass) {
055            this.leftType = leftClass;
056            this.rightType = rightClass;
057        }
058        /** 
059         * copy right TO left, left and right must not be null
060         * @param left
061         * @param right
062         */
063        protected abstract void doFromRight(L left, R right);
064        /** 
065         * copy left TO right, left and right must not be null 
066         * @param left
067         * @param right
068         */
069        protected abstract void doToRight(L left, R right);
070        /**
071         *  Creates a new  L instance by calling constructor with an empty argument list<br>
072         *  you must override the method if the L class haven't default constructor.
073         * @return
074         */
075        @SuppressWarnings("unchecked")
076        protected L newInstanceL(){ return (L) newInstance(this.leftType); }
077        /**
078         *  Creates a new R instance by calling constructor with an empty argument list<br>
079         *  you must override the method if the R class haven't default constructor.
080         * @return
081         */
082        @SuppressWarnings("unchecked")
083        protected R newInstanceR(){ return (R) newInstance(this.rightType); }
084        
085        protected  static<T> T newInstance(Class<T>clazz){
086            try {
087                return (T) clazz.newInstance();
088            } catch (InstantiationException e) {
089                throw new RuntimeException(e);
090            } catch (IllegalAccessException e) {
091                throw new RuntimeException(e);
092            }
093        }
094        @Override
095        public L fromRight(L left, R right) {
096            if(null != right && null != left){
097                this.doFromRight(left, right);
098            }            
099            return left;
100        }
101
102        @Override
103        public R toRight(L left, R right) {
104            if(null != left && null != right){
105                this.doToRight(left, right);
106            }
107            return right;
108        }
109
110        @Override
111        public L fromRight(R bean) {
112            return null == bean? null : fromRight(newInstanceL(),bean);
113        }
114
115        @Override
116        public R toRight(L bean) {
117            return null == bean? null : toRight(bean,newInstanceR());
118        }
119
120        @Override
121        public R[] toRight(L[] lefts, R[] rights) {
122            if(null != lefts && null != rights){
123                if( lefts.length != rights.length){
124                    throw new IllegalArgumentException("mismatched length between left and right array");
125                }
126                for(int i=0;i<lefts.length;++i){
127                    this.toRight(lefts[i],rights[i]);
128                }
129            }
130            return rights;
131        }
132
133        @Override
134        public L[] fromRight(L[] lefts, R[] rights) {
135            if(null != rights && null != lefts){
136                if( lefts.length != rights.length){
137                    throw new IllegalArgumentException("mismatched length between left and right array");
138                }
139                for(int i=0;i<lefts.length;++i){
140                    this.fromRight(lefts[i],rights[i]);
141                }
142            }
143            return lefts;
144        }
145        
146        @SuppressWarnings("unchecked")
147        @Override
148        public R[] toRight(L[] lefts) {
149            R[] rights = null;
150            if(null != lefts){
151                rights = (R[])java.lang.reflect.Array.newInstance(rightType,lefts.length) ;
152                for(int i=0;i<lefts.length;++i){
153                    rights[i] = toRight(lefts[i]);
154                }
155            }
156            return rights;
157        }
158
159        @SuppressWarnings("unchecked")
160        @Override
161        public L[] fromRight(R[] rights) {
162            L[] lefts = null;
163            if(null != rights){
164                lefts = (L[])java.lang.reflect.Array.newInstance(leftType,rights.length) ;
165                for(int i=0;i<rights.length;++i){
166                    lefts[i] = fromRight(rights[i]);
167                }
168            }
169            return lefts;
170        }
171
172        @Override
173        public List<R> toRight(Collection<L> beans) {
174            if(null==beans){
175                return null;
176            }
177            ArrayList<R> rights = new ArrayList<R>(beans.size());
178            for(L g:beans){
179                rights.add(this.toRight(g));
180            }
181            return rights;
182        }
183
184        @Override
185        public List<L> fromRight(Collection<R> beans) {
186            if(null==beans){
187                return null;
188            }
189            ArrayList<L> lefts = new ArrayList<L>(beans.size());
190            for(R n:beans){
191                lefts.add(this.fromRight(n));
192            }
193            return lefts;
194        }
195
196        @Override
197        public List<R> toRight(List<L> lefts, List<R> rights) {
198            if(null != lefts && null != rights){
199                if( lefts.size() != rights.size()){
200                    throw new IllegalArgumentException("mismatched length between left and right list");
201                }
202                for(int i=0;i<lefts.size();++i){
203                    this.toRight(lefts.get(i),rights.get(i));
204                }
205            }
206            return rights;
207        }
208
209        @Override
210        public List<L> fromRight(List<L> lefts, List<R> rights) {
211            if(null != rights && null != lefts){
212                if( lefts.size() != rights.size()){
213                    throw new IllegalArgumentException("mismatched length between left and right list");
214                }
215                for(int i=0;i<lefts.size();++i){
216                    this.fromRight(lefts.get(i),rights.get(i));
217                }
218            }
219            return lefts;
220        }
221
222        @Override
223        public List<R> toRight(List<L> lefts) {
224            List<R> rights = null;
225            if(null != lefts ){
226                rights  = new ArrayList<>();
227                for(L l:lefts){
228                    rights.add(toRight(l));
229                }
230            }
231            return rights;    
232        }
233
234        @Override
235        public List<L> fromRight(List<R> rights) {
236            List<L> lefts = null;
237            if(null != rights ){
238                lefts  = new ArrayList<>();
239                for(R r:rights){
240                    lefts.add(fromRight(r));
241                }
242            }
243            return lefts;            
244        }
245        @Override
246        public<V> Map<R,V> toRightKey(Map<L,V> lmap) {
247            if(null == lmap){
248                return null;
249            }
250            HashMap<R,V> rmap = new HashMap<R,V>(16);
251            for(Entry<L, V> entry:lmap.entrySet()){
252                rmap.put(this.toRight(entry.getKey()),entry.getValue());
253            }
254            return rmap;
255        }
256        @Override
257        public<K> Map<K,R> toRightValue(Map<K,L> lmap) {
258            if(null == lmap){
259                return null;
260            }
261            HashMap<K, R> rmap = new HashMap<K, R>(16);
262            for(Entry<K, L> entry:lmap.entrySet()){
263                rmap.put(entry.getKey(), this.toRight(entry.getValue()));
264            }
265            return rmap;
266        }
267        @Override
268        public<V> Map<L,V> fromRightKey(Map<R,V> rmap) {
269            if(null == rmap){
270                return null;
271            }
272            HashMap<L,V> lmap = new HashMap<L,V>(16);
273            for(Entry<R, V> entry:rmap.entrySet()){
274                lmap.put(this.fromRight(entry.getKey()),entry.getValue());
275            }
276            return lmap;
277        }
278        @Override
279        public<K> Map<K,L> fromRightValue(Map<K,R> rmap) {
280            if(null == rmap){
281                return null;
282            }
283            HashMap<K, L> lmap = new HashMap<K, L>(16);
284            for(Entry<K, R> entry:rmap.entrySet()){
285                lmap.put(entry.getKey(), this.fromRight(entry.getValue()));
286            }
287            return lmap;
288        }
289        @Override
290        public Map<R,R> toRight(Map<L,L> lmap) {
291            if(null == lmap){
292                return null;
293            }
294            HashMap<R,R> rmap = new HashMap<R,R>(16);
295            for(Entry<L, L> entry:lmap.entrySet()){
296                rmap.put(this.toRight(entry.getKey()),this.toRight(entry.getValue()));
297            }
298            return rmap;
299        }
300        @Override
301        public Map<L,L> fromRight(Map<R,R> rmap) {
302            if(null == rmap){
303                return null;
304            }
305            HashMap<L,L> lmap = new HashMap<L,L>(16);
306            for(Entry<R, R> entry:rmap.entrySet()){
307                lmap.put(this.fromRight(entry.getKey()),this.fromRight(entry.getValue()));
308            }
309            return lmap;
310        }
311    }
312
313    /**
314     * copy right TO left
315     * @param left
316     * @param right
317     * @return left,or new instance if left is null
318     */
319    public L fromRight(L left, R right);
320    
321    /**
322     * copy left TO right
323     * @param left
324     * @param right
325     * @return right,or new instance if right is null
326     */
327    public R toRight(L left, R right);
328    /**
329     * return an new instance converted from R bean
330     * @param bean
331     * @return L bean
332     */
333    public L fromRight(R bean);
334    /**
335     * return an new instance converted from L bean
336     * @param bean
337     * @return R bean
338     */
339    public R toRight( L bean);
340    /**
341     * copy rights TO lefts
342     * @param lefts
343     * @param rights
344     * @return lefts,or new array if lefts is null
345     */
346    public L[] fromRight(L[] lefts,R[] rights);
347    /**
348     * copy lefts TO rights
349     * @param lefts
350     * @param rights
351     * @return rights,or new array if rights is null
352     */
353    public R[] toRight(L[] lefts,R[] rights);
354    /**
355     * return an new array converted from R beans
356     * @param beans
357     * @return L bean array
358     */
359    public L[] fromRight(R[] beans);
360    /**
361     * an new array converted from L beans
362     * @param beans
363     * @return R bean array
364     */
365    public R[] toRight(L[] beans);
366    /**
367     * copy rights TO lefts
368     * @param lefts
369     * @param rights
370     * @return lefts,or new array if lefts is null
371     */
372    public List<L> fromRight(List<L> lefts,List<R> rights);
373    /**
374     * copy lefts TO rights
375     * @param lefts
376     * @param rights
377     * @return rights,or new array if rights is null
378     */
379    public List<R> toRight(List<L> lefts,List<R> rights);
380    /**
381     * return an new list converted from R beans
382     * @param beans
383     * @return L bean list
384     */
385    public List<L> fromRight(List<R> beans);
386    /**
387     * return an new list converted from L beans
388     * @param beans
389     * @return R bean list
390     */
391    public List<R> toRight(List<L> beans);
392    /**
393     * return an new list converted from R beans
394     * @param beans
395     * @return L bean list
396     */
397    public List<L> fromRight(Collection<R> beans);
398    /**
399     * an new list converted from L beans
400     * @param beans
401     * @return R bean list
402     */
403    public List<R> toRight(Collection<L> beans);
404    
405    /**
406     * return an new map with R key converted from map with L key
407     * @param lmap
408     * @return Map with R key
409     */
410    public <V> Map<R,V> toRightKey(Map<L,V> lmap);
411    /**
412     * return an new map with R value converted from map with L value
413     * @param lmap
414     * @return Map with R value
415     */
416    public <K> Map<K,R> toRightValue(Map<K,L> lmap);
417    /**
418     * return an new map with L key converted from map with R key
419     * @param rmap
420     * @return Map with L key
421     */
422    public <V> Map<L,V> fromRightKey(Map<R,V> rmap);
423    /**
424     * return an new map with L value converted from map with R value
425     * @param rmap
426     * @return Map with L value
427     */
428    public <K> Map<K,L> fromRightValue(Map<K,R> rmap);
429    /**
430     * an new map with R key and  R value converted from map with L key and L value
431     * @param lmap
432     * @return Map with R key and value
433     */
434    public Map<R,R> toRight(Map<L,L> lmap);
435    /**
436     * return an new map with L key and  L value converted from map with R key and R value
437     * @param rmap
438     * @return Map with L key and value
439     */
440    public Map<L,L> fromRight(Map<R,R> rmap);
441}