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.annotation.Annotation;
014 import java.util.Arrays;
015 import java.util.HashSet;
016
017 import org.fusesource.hawtjni.runtime.ArgFlag;
018 import org.fusesource.hawtjni.runtime.JniArg;
019 import org.fusesource.hawtjni.runtime.T32;
020
021 import static org.fusesource.hawtjni.generator.util.TextSupport.*;
022 import static org.fusesource.hawtjni.runtime.ArgFlag.*;
023
024 /**
025 *
026 * @author <a href="http://hiramchirino.com">Hiram Chirino</a>
027 */
028 public class ReflectParameter implements JNIParameter {
029
030 private ReflectMethod method;
031 private ReflectType type;
032 private int parameter;
033
034 private JniArg annotation;
035 private boolean allowConversion;
036 private HashSet<ArgFlag> flags;
037
038 public ReflectParameter(ReflectMethod method, int parameter, Annotation[] annotations) {
039 this.method = method;
040 this.parameter = parameter;
041 this.type = new ReflectType(method.getWrapedMethod().getParameterTypes()[parameter]);
042 this.flags = new HashSet<ArgFlag>();
043 if( annotations!=null ) {
044 for (Annotation annotation : annotations) {
045 if( annotation instanceof JniArg ) {
046 this.annotation = (JniArg) annotation;
047 this.flags.addAll(Arrays.asList(this.annotation.flags()));
048 } else if( annotation instanceof T32 ) {
049 this.allowConversion = true;
050 }
051 }
052 }
053 }
054
055 public String getCast() {
056 String rc = annotation == null ? "" : annotation.cast();
057 return cast(rc);
058 }
059
060 public boolean isPointer() {
061 if( annotation == null ) {
062 return false;
063 }
064 return getFlag(POINTER_ARG) || ( type.getWrappedClass() == Long.TYPE && getCast().endsWith("*)") );
065 }
066
067 public JNIMethod getMethod() {
068 return method;
069 }
070
071 public boolean getFlag(ArgFlag flag) {
072 return flags.contains(flag);
073 }
074
075 public JNIType getType32() {
076 return type.asType32(allowConversion);
077 }
078
079 public JNIType getType64() {
080 return type.asType64(allowConversion);
081 }
082
083 public JNIClass getTypeClass() {
084 ReflectType type = (ReflectType) getType32();
085 return new ReflectClass(type.getWrappedClass());
086 }
087
088 public int getParameter() {
089 return parameter;
090 }
091
092 }