001 /******************************************************************************* 002 * Copyright (c) 2009 Progress Software, Inc. 003 * Copyright (c) 2004, 2008 IBM Corporation and others. 004 * 005 * All rights reserved. This program and the accompanying materials 006 * are made available under the terms of the Eclipse Public License v1.0 007 * which accompanies this distribution, and is available at 008 * http://www.eclipse.org/legal/epl-v10.html 009 * 010 *******************************************************************************/ 011 package org.fusesource.hawtjni.generator.model; 012 013 import java.lang.reflect.Field; 014 import java.lang.reflect.Method; 015 import java.lang.reflect.Modifier; 016 import java.util.ArrayList; 017 import java.util.Arrays; 018 import java.util.HashSet; 019 import java.util.List; 020 021 import org.fusesource.hawtjni.runtime.ClassFlag; 022 import org.fusesource.hawtjni.runtime.JniClass; 023 024 /** 025 * 026 * @author <a href="http://hiramchirino.com">Hiram Chirino</a> 027 */ 028 public class ReflectClass implements JNIClass { 029 030 private Class<?> clazz; 031 private ArrayList<ReflectField> fields; 032 private ArrayList<ReflectMethod> methods; 033 private JniClass annotation; 034 private HashSet<ClassFlag> flags; 035 036 public ReflectClass(Class<?> clazz) { 037 this.clazz = clazz; 038 } 039 040 public String toString() { 041 return clazz.toString(); 042 } 043 public int hashCode() { 044 return clazz.hashCode(); 045 } 046 public boolean equals(Object obj) { 047 if (!(obj instanceof ReflectClass)) 048 return false; 049 return ((ReflectClass) obj).clazz.equals(clazz); 050 } 051 052 public Class<?> getWrapedClass() { 053 return clazz; 054 } 055 056 /////////////////////////////////////////////////////////////////// 057 // JNIClass interface methods 058 /////////////////////////////////////////////////////////////////// 059 060 public String getName() { 061 return clazz.getName(); 062 } 063 064 public JNIClass getSuperclass() { 065 return new ReflectClass(clazz.getSuperclass()); 066 } 067 068 public String getSimpleName() { 069 return clazz.getSimpleName(); 070 } 071 072 public List<JNIField> getDeclaredFields() { 073 lazyLoad(); 074 return new ArrayList<JNIField>(fields); 075 } 076 077 public List<JNIMethod> getDeclaredMethods() { 078 lazyLoad(); 079 return new ArrayList<JNIMethod>(methods); 080 } 081 082 public List<JNIMethod> getNativeMethods() { 083 ArrayList<JNIMethod> rc = new ArrayList<JNIMethod>(); 084 for (JNIMethod method : getDeclaredMethods()) { 085 if ((method.getModifiers() & Modifier.NATIVE) == 0) 086 continue; 087 rc.add(method); 088 } 089 return rc; 090 } 091 092 public String getConditional() { 093 lazyLoad(); 094 return annotation == null ? null : emptyFilter(annotation.conditional()); 095 } 096 097 public boolean getGenerate() { 098 return !getFlag(ClassFlag.CLASS_SKIP); 099 } 100 101 public boolean getFlag(ClassFlag flag) { 102 lazyLoad(); 103 return flags.contains(flag); 104 } 105 106 /////////////////////////////////////////////////////////////////// 107 // Helper methods 108 /////////////////////////////////////////////////////////////////// 109 static public String emptyFilter(String value) { 110 if( value==null || value.length()==0 ) 111 return null; 112 return value; 113 } 114 115 private void lazyLoad() { 116 if (fields != null) 117 return; 118 119 this.annotation = this.clazz.getAnnotation(JniClass.class); 120 this.flags = new HashSet<ClassFlag>(); 121 if( this.annotation!=null ) { 122 this.flags.addAll(Arrays.asList(this.annotation.flags())); 123 } 124 125 Field[] fields = clazz.getDeclaredFields(); 126 this.fields = new ArrayList<ReflectField>(fields.length); 127 for (Field field : fields) { 128 this.fields.add(new ReflectField(this, field)); 129 } 130 Method[] methods = clazz.getDeclaredMethods(); 131 this.methods = new ArrayList<ReflectMethod>(methods.length); 132 for (int i = 0; i < methods.length; i++) { 133 this.methods.add(new ReflectMethod(this, methods[i])); 134 } 135 } 136 137 }