/* Copyright (c) 2001 - 2007 TOPP - www.openplans.org. All rights reserved.
* This code is licensed under the GPL 2.0 license, availible at the root
* application directory.
*/
package org.geoserver.ows.util;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Logger;
/**
* A generic service object invocation logger based on EMF reflection
* @author Justin DeOliveira, TOPP
*/
public class EMFLogger implements MethodInterceptor {
/**
* Logging instance
*/
Logger logger;
public EMFLogger(String logPackage) {
logger = org.geotools.util.logging.Logging.getLogger(logPackage);
}
public Object invoke(MethodInvocation invocation) throws Throwable {
StringBuffer log = new StringBuffer();
log.append("\n" + "Request: " + invocation.getMethod().getName());
if (invocation.getArguments().length > 0) {
EObject requestBean = null;
for (int i = 0; i < invocation.getArguments().length; i++) {
Object argument = (Object) invocation.getArguments()[i];
if (argument instanceof EObject) {
requestBean = (EObject) argument;
break;
}
}
if (requestBean != null) {
log(requestBean, 1, log);
}
}
Object result = invocation.proceed();
logger.info(log.toString());
return result;
}
void log(EObject object, int level, StringBuffer log) {
List properties = object.eClass().getEAllStructuralFeatures();
for (Iterator p = properties.iterator(); p.hasNext();) {
EStructuralFeature property = (EStructuralFeature) p.next();
Object value = object.eGet(property);
log.append("\n");
for (int i = 0; i < level; i++)
log.append("\t");
log.append(property.getName());
if (value instanceof EObject && (level < 2)) {
log.append(":");
log((EObject) value, level + 1, log);
} else {
log.append(" = " + value);
}
}
}
}