OSDN Git Service

Change directory structure.
[dvibrowser/dvi2epub.git] / src / main / java / jp / sourceforge / dvibrowser / dvi2epub / reflect / MemberWalker.java
diff --git a/src/main/java/jp/sourceforge/dvibrowser/dvi2epub/reflect/MemberWalker.java b/src/main/java/jp/sourceforge/dvibrowser/dvi2epub/reflect/MemberWalker.java
new file mode 100644 (file)
index 0000000..f6ca769
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2012, Takeyuki Nagao
+ * All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the
+ * following conditions are met:
+ * 
+ *  * Redistributions of source code must retain the above
+ *    copyright notice, this list of conditions and the
+ *    following disclaimer.
+ *  * Redistributions in binary form must reproduce the above
+ *    copyright notice, this list of conditions and the
+ *    following disclaimer in the documentation and/or other
+ *    materials provided with the distribution.
+ *    
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ */
+
+package jp.sourceforge.dvibrowser.dvi2epub.reflect;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Member;
+import java.lang.reflect.Method;
+
+public class MemberWalker {
+       private final MemberWalkerHandler handler;
+
+       public MemberWalker(MemberWalkerHandler handler) {
+               this.handler = handler;
+               if (handler == null) {
+                       throw new NullPointerException("Handler can't be null.");
+               }
+       }
+
+       protected boolean wantMember(Object t, Member member)
+                       throws MemberWalkerException {
+               return handler.wantMember(t, member);
+       }
+
+       public void walk(Object t) throws MemberWalkerException {
+               if (t == null)
+                       throw new NullPointerException("Cannot walk about null object.");
+
+               if (t.getClass().isPrimitive())
+                       return;
+
+               for (Class<?> cls = t.getClass();; cls = cls.getSuperclass()) {
+                       for (Method method : cls.getDeclaredMethods()) {
+                               if (!wantMember(t, method))
+                                       continue;
+                               method.setAccessible(true);
+                               handler.processMethod(t, method);
+                       }
+                       for (Field field : cls.getDeclaredFields()) {
+                               if (!wantMember(t, field))
+                                       continue;
+                               field.setAccessible(true);
+                               handler.processField(t, field);
+                       }
+                       if (cls == Object.class)
+                               break;
+               }
+       }
+}
\ No newline at end of file