/* (c) 2014 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.ows.util; import java.util.logging.Level; import java.util.logging.Logger; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; /** * Logs the properties of a request object passed into an operation of an * ows service. * * @author Justin Deoliveira, OpenGeo * */ public class RequestObjectLogger implements MethodInterceptor { /** * Logging instance */ Logger logger; public RequestObjectLogger(String logPackage) { logger = org.geotools.util.logging.Logging.getLogger(logPackage); } public Object invoke(MethodInvocation invocation) throws Throwable { if (!logger.isLoggable(Level.INFO)) { return invocation.proceed(); } StringBuffer log = new StringBuffer(); log.append("\n" + "Request: " + invocation.getMethod().getName()); if (invocation.getArguments().length > 0) { Object requestBean = null; for (int i = 0; i < invocation.getArguments().length; i++) { Object argument = (Object) invocation.getArguments()[i]; if (isRequestObject(argument)) { requestBean = (Object) argument; break; } } if (requestBean != null) { log(requestBean, 1, log); } } Object result = invocation.proceed(); logger.info(log.toString()); return result; } /** * Determines if an object is the request object. * <p> * Subclasses should override this to do explict checks for the request object. * </p> */ protected boolean isRequestObject(Object obj) { return true; } protected void log(Object object, int level, StringBuffer log) { ClassProperties props = OwsUtils.getClassProperties(object.getClass()); for (String prop : props.properties()) { if ("class".equalsIgnoreCase(prop)) continue; Object value = OwsUtils.get(object, prop); log.append("\n"); for (int i = 0; i < level; i++) log.append("\t"); log.append(prop).append(" = ").append(value); } } }