37package com.jogamp.opengl;
39import java.lang.reflect.*;
40import java.util.StringTokenizer;
42import com.jogamp.common.util.ReflectionUtil;
44import jogamp.opengl.*;
50 public static final boolean DEBUG = Debug.debug(
"GLPipelineFactory");
91 public static final GL create(
final String pipelineClazzBaseName,
final Class<?> reqInterface,
final GL downstream,
final Object[] additionalArgs) {
92 Class<?> downstreamClazz = downstream.getClass();
93 Class<?> upstreamClazz =
null;
94 Class<?> interfaceClazz =
null;
97 System.out.println(
"GLPipelineFactory: Start "+downstreamClazz.getName()+
", req. Interface: "+reqInterface+
" -> "+pipelineClazzBaseName);
104 final Class<?>[] clazzes = downstreamClazz.getInterfaces();
105 for(
int i=clazzes.length-1;
null==upstreamClazz && i>=0; i--) {
107 System.out.println(
"GLPipelineFactory: Try "+downstreamClazz.getName()+
" Interface["+i+
"]: "+clazzes[i].getName());
109 if( reqInterface !=
null && !reqInterface.getName().equals(clazzes[i].getName()) ) {
111 System.out.println(
"GLPipelineFactory: requested Interface "+reqInterface+
" is _not_ "+ clazzes[i].getName());
115 if( ! clazzes[i].isInstance(downstream) ) {
117 System.out.println(
"GLPipelineFactory: "+downstream.getClass().getName() +
" is _not_ instance of "+ clazzes[i].getName());
122 System.out.println(
"GLPipelineFactory: "+downstream.getClass().getName() +
" _is_ instance of "+ clazzes[i].getName());
125 upstreamClazz = getUpstreamClazz(clazzes[i], pipelineClazzBaseName);
126 if(
null != upstreamClazz ) {
127 interfaceClazz = clazzes[i];
131 if(
null==upstreamClazz) {
132 downstreamClazz = downstreamClazz.getSuperclass();
134 }
while (
null!=downstreamClazz &&
null==upstreamClazz);
137 if(
null==upstreamClazz) {
138 throw new GLException(
"No pipeline ("+pipelineClazzBaseName+
"*) available for :"+downstream.getClass().getName());
142 System.out.println(
"GLPipelineFactory: Got : "+ upstreamClazz.getName()+
", base interface: "+interfaceClazz.getName());
145 final Class<?>[] cstrArgTypes =
new Class<?>[ 1 + ( (
null==additionalArgs ) ? 0 : additionalArgs.length ) ] ;
148 cstrArgTypes[i++] = interfaceClazz;
149 for(
int j=0;
null!=additionalArgs && j<additionalArgs.length; j++) {
150 cstrArgTypes[i++] = additionalArgs[j].getClass();
154 final Constructor<?> cstr = ReflectionUtil.getConstructor(upstreamClazz, cstrArgTypes);
155 Object instance =
null;
157 final Object[] cstrArgs =
new Object[ 1 + ( (
null==additionalArgs ) ? 0 : additionalArgs.length ) ] ;
160 cstrArgs[i++] = downstream;
161 for(
int j=0;
null!=additionalArgs && j<additionalArgs.length; j++) {
162 cstrArgs[i++] = additionalArgs[j];
165 instance = cstr.newInstance( cstrArgs ) ;
166 }
catch (
final Throwable t) { t.printStackTrace(); }
168 throw new GLException(
"Error: Couldn't create instance of pipeline: "+upstreamClazz.getName()+
169 " ( "+getArgsClassNameList(downstreamClazz, additionalArgs) +
" )");
171 if( ! (instance instanceof
GL) ) {
172 throw new GLException(
"Error: "+upstreamClazz.getName()+
" not an instance of GL");
174 return (
GL) instance;
177 private static final String getArgsClassNameList(
final Class<?> arg0,
final Object[] args) {
178 final StringBuilder sb =
new StringBuilder();
179 sb.append(arg0.getName());
181 for(
int j=0; j<args.length; j++) {
183 sb.append(args[j].getClass().getName());
186 return sb.toString();
189 private static final Class<?> getUpstreamClazz(
final Class<?> downstreamClazz,
final String pipelineClazzBaseName) {
190 final String downstreamClazzName = downstreamClazz.getName();
192 final StringTokenizer st =
new StringTokenizer(downstreamClazzName,
".");
193 String downstreamClazzBaseName = downstreamClazzName;
194 while(st.hasMoreTokens()) {
195 downstreamClazzBaseName = st.nextToken();
197 final String upstreamClazzName = pipelineClazzBaseName+downstreamClazzBaseName;
199 Class<?> upstreamClazz =
null;
201 upstreamClazz = Class.forName(upstreamClazzName,
true, GLPipelineFactory.class.getClassLoader());
202 }
catch (
final Throwable e) { e.printStackTrace(); }
204 return upstreamClazz;
A generic exception for OpenGL errors used throughout the binding as a substitute for RuntimeExceptio...
Factory for pipelining GL instances.
static final boolean DEBUG
static final GL create(final String pipelineClazzBaseName, final Class<?> reqInterface, final GL downstream, final Object[] additionalArgs)
Creates a pipelined GL instance using the given downstream downstream and optional arguments addition...