/* * Copyright 2006 Niclas Hedhman. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * implied. * * See the License for the specific language governing permissions and * limitations under the License. */ package org.qi4j.logging.trace; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import org.qi4j.api.Qi4j; import org.qi4j.api.common.Optional; import org.qi4j.api.composite.Composite; import org.qi4j.api.concern.ConcernOf; import org.qi4j.api.injection.scope.Service; import org.qi4j.api.injection.scope.Structure; import org.qi4j.logging.trace.service.TraceService; public abstract class AbstractTraceConcern extends ConcernOf<InvocationHandler> implements InvocationHandler { @Structure private Qi4j api; @Optional @Service protected TraceService traceService; private Composite thisComposite; private Class compositeType; public AbstractTraceConcern( Composite thisComposite ) { this.thisComposite = thisComposite; compositeType = thisComposite.getClass().getInterfaces()[ 0 ]; } @Override public Object invoke( Object proxy, Method method, Object[] args ) throws Throwable { boolean doTrace = traceService != null && doTrace(); Object result; long entryTime = 0; long timeStamp = 0; try { if( doTrace ) { entryTime = System.currentTimeMillis(); timeStamp = System.nanoTime(); } result = next.invoke( proxy, method, args ); if( doTrace ) { long duration = System.nanoTime() - timeStamp; traceService.traceSuccess( compositeType, api.dereference( thisComposite ), method, args, result, entryTime, duration ); } } catch( Throwable t ) { if( doTrace ) { long duration = System.nanoTime() - timeStamp; Composite object = api.dereference( thisComposite ); traceService.traceException( compositeType, object, method, args, t, entryTime, duration ); } throw t; } return result; } protected boolean doTrace() { return true; } }