blob: 6955195a2a3938278eaf0db60dc5735f264e1b6a [file] [log] [blame]
/*
* 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;
}
}