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.util.Arrays; 015 import java.util.HashSet; 016 017 import org.fusesource.hawtjni.runtime.FieldFlag; 018 import org.fusesource.hawtjni.runtime.JniField; 019 import org.fusesource.hawtjni.runtime.T32; 020 021 import static org.fusesource.hawtjni.generator.util.TextSupport.*; 022 import static org.fusesource.hawtjni.runtime.FieldFlag.*; 023 024 /** 025 * 026 * @author <a href="http://hiramchirino.com">Hiram Chirino</a> 027 */ 028 public class ReflectField implements JNIField { 029 030 private ReflectClass parent; 031 private Field field; 032 private ReflectType type; 033 private JniField annotation; 034 private HashSet<FieldFlag> flags; 035 private boolean allowConversion; 036 037 public ReflectField(ReflectClass parent, Field field) { 038 this.parent = parent; 039 this.field = field; 040 lazyLoad(); 041 } 042 043 public int hashCode() { 044 return field.hashCode(); 045 } 046 047 public boolean equals(Object obj) { 048 if (!(obj instanceof ReflectField)) 049 return false; 050 return ((ReflectField) obj).field.equals(field); 051 } 052 053 public String toString() { 054 return field.toString(); 055 } 056 057 /////////////////////////////////////////////////////////////////// 058 // JNIField interface methods 059 /////////////////////////////////////////////////////////////////// 060 061 public JNIClass getDeclaringClass() { 062 return parent; 063 } 064 065 public int getModifiers() { 066 return field.getModifiers(); 067 } 068 069 public String getName() { 070 return field.getName(); 071 } 072 073 public JNIType getType() { 074 return type.asType32(allowConversion); 075 } 076 077 public JNIType getType64() { 078 return type.asType64(allowConversion); 079 } 080 081 public String getAccessor() { 082 return annotation == null ? "" : annotation.accessor(); 083 } 084 085 public String getCast() { 086 String rc = annotation == null ? "" : annotation.cast().trim(); 087 return cast(rc); 088 } 089 090 public boolean isPointer() { 091 if( annotation == null ) { 092 return false; 093 } 094 return getFlag(POINTER_FIELD) || ( type.getWrappedClass() == Long.TYPE && getCast().endsWith("*)") ); 095 } 096 097 public String getConditional() { 098 String parentConditional = getDeclaringClass().getConditional(); 099 String myConditional = annotation == null ? null : emptyFilter(annotation.conditional()); 100 if( parentConditional!=null ) { 101 if( myConditional!=null ) { 102 return parentConditional+" && "+myConditional; 103 } else { 104 return parentConditional; 105 } 106 } 107 return myConditional; 108 } 109 110 public boolean getFlag(FieldFlag flag) { 111 return flags.contains(flag); 112 } 113 114 /////////////////////////////////////////////////////////////////// 115 // Helper methods 116 /////////////////////////////////////////////////////////////////// 117 static public String emptyFilter(String value) { 118 if( value==null || value.length()==0 ) 119 return null; 120 return value; 121 } 122 123 private void lazyLoad() { 124 this.type = new ReflectType(field.getType()); 125 this.annotation = this.field.getAnnotation(JniField.class); 126 this.flags = new HashSet<FieldFlag>(); 127 if( this.annotation!=null ) { 128 this.flags.addAll(Arrays.asList(this.annotation.flags())); 129 } 130 131 allowConversion = this.field.getAnnotation(T32.class)!=null; 132 } 133 134 }