/* (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.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; /** * A generic service object invocation logger based on EMF reflection * @author Justin DeOliveira, TOPP */ public class EMFLogger extends RequestObjectLogger { public EMFLogger(String logPackage) { super(logPackage); } @Override protected boolean isRequestObject(Object obj) { return obj instanceof EObject; } protected void log(Object obj, int level, StringBuffer log) { EObject object = (EObject) obj; List properties = object.eClass().getEAllStructuralFeatures(); for (Iterator p = properties.iterator(); p.hasNext();) { EStructuralFeature property = (EStructuralFeature) p.next(); Object value = object.eGet(property); // skip empty properties if(value == null || (value instanceof Collection && ((Collection) value).isEmpty()) || (value instanceof Map && ((Map) value).isEmpty())) { continue; } log.append("\n"); for (int i = 0; i < level; i++) log.append(" "); if (value instanceof EObject && (level < 3)) { log.append(property.getName()); log.append(":"); log((EObject) value, level + 1, log); } else if(value instanceof Collection) { log(property.getName(), (Collection) value, level + 1, log); } else { log.append(property.getName()); log.append(" = " + value); } } } protected void log(String property, Collection collection, int level, StringBuffer log) { int count = 0; for (Object o : collection) { String pc = property + "[" + count + "]"; if(o instanceof EObject) { log.append(pc); log.append(":"); log((EObject) o, level, log); } else if(o instanceof Collection){ log(pc, (Collection) o, level + 1, log); } else { log.append(pc).append(" = " + o); } } } }