001 // Copyright 2008 Waterken Inc. under the terms of the MIT X license 002 // found at http://www.opensource.org/licenses/mit-license.html 003 package org.waterken.trace; 004 005 import java.lang.reflect.Method; 006 import java.lang.reflect.Modifier; 007 008 import org.joe_e.reflect.Reflection; 009 import org.ref_send.log.Comment; 010 import org.ref_send.log.Event; 011 import org.ref_send.log.Fulfilled; 012 import org.ref_send.log.Got; 013 import org.ref_send.log.Pipelined; 014 import org.ref_send.log.Problem; 015 import org.ref_send.log.Progressed; 016 import org.ref_send.log.Rejected; 017 import org.ref_send.log.Resolved; 018 import org.ref_send.log.Returned; 019 import org.ref_send.log.Sent; 020 import org.ref_send.log.SentIf; 021 import org.ref_send.promise.Log; 022 import org.ref_send.promise.Receiver; 023 024 /** 025 * Event logging infrastructure. 026 */ 027 public final class 028 EventSender { 029 private EventSender() {} 030 031 /** 032 * Constructs a log event generator. 033 * @param stderr log event output factory 034 * @param mark event counter 035 * @param tracer stack tracer 036 */ 037 static public Log 038 make(final Receiver<Event> stderr, final Marker mark, final Tracer tracer) { 039 class LogX extends Log { 040 static private final long serialVersionUID = 1L; 041 042 public @Override void 043 comment(final String text) { 044 stderr.apply(new Comment(mark.apply(), tracer.timestamp(), 045 tracer.traceHere(), text)); 046 } 047 048 public @Override void 049 problem(final Exception reason) { 050 stderr.apply(new Problem(mark.apply(), tracer.timestamp(), 051 tracer.traceException(reason), 052 tracer.readException(reason), reason)); 053 } 054 055 public @Override void 056 got(final String message, final Class<?> concrete, Method method) { 057 if (null != concrete && null != method && 058 !Modifier.isStatic(method.getModifiers())) { 059 try { 060 method = Reflection.method(concrete, method.getName(), 061 method.getParameterTypes()); 062 } catch (final NoSuchMethodException e) { 063 // Log abstract method if concrete one cannot be found. 064 } 065 } 066 stderr.apply(new Got(mark.apply(), tracer.timestamp(), 067 null!=method ? tracer.traceMember(method) : null, message)); 068 } 069 070 public @Override void 071 sent(final String message) { 072 stderr.apply(new Sent(mark.apply(), tracer.timestamp(), 073 tracer.traceHere(), message)); 074 } 075 076 public @Override void 077 returned(final String message) { 078 stderr.apply(new Returned(mark.apply(), tracer.timestamp(), 079 null, message)); 080 } 081 082 public @Override void 083 sentIf(final boolean pipelined, 084 final String message, final String condition) { 085 if (pipelined) { 086 stderr.apply(new Pipelined(mark.apply(), tracer.timestamp(), 087 tracer.traceHere(), 088 message, condition)); 089 } else { 090 stderr.apply(new SentIf(mark.apply(), tracer.timestamp(), 091 tracer.traceHere(), 092 message, condition)); 093 } 094 } 095 096 public @Override void 097 resolved(final String condition) { 098 stderr.apply(new Resolved(mark.apply(), tracer.timestamp(), 099 tracer.traceHere(), condition)); 100 } 101 102 public @Override void 103 fulfilled(final String condition) { 104 stderr.apply(new Fulfilled(mark.apply(), tracer.timestamp(), 105 tracer.traceHere(), condition)); 106 } 107 108 public @Override void 109 rejected(final String condition, final Exception reason) { 110 stderr.apply(new Rejected(mark.apply(), tracer.timestamp(), 111 tracer.traceHere(),condition,reason)); 112 } 113 114 public @Override void 115 progressed(final String condition) { 116 stderr.apply(new Progressed(mark.apply(), tracer.timestamp(), 117 tracer.traceHere(), condition)); 118 } 119 } 120 return new LogX(); 121 } 122 }