/** * Copyright 2010 JBoss Inc * * 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.drools.eclipse.debug; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.drools.eclipse.DroolsEclipsePlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.ILogicalStructureType; import org.eclipse.debug.core.model.IStackFrame; import org.eclipse.debug.core.model.IValue; import org.eclipse.debug.core.model.IVariable; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; /** * A generic Drools debug view content provider. * * @author <a href="mailto:kris_verlaenen@hotmail.com">kris verlaenen </a> */ public class DroolsDebugViewContentProvider implements ITreeContentProvider { private Map parentCache; public DroolsDebugViewContentProvider() { parentCache = new HashMap(10); } public Object[] getChildren(Object parent) { return null; } public Object[] getElements(Object parent) { Object[] result = getChildren(parent); if (result != null && result.length == 0) { return new Object[] { getEmptyString() }; } return result; } protected String getEmptyString() { return "Empty"; } protected void cache(Object parent, Object[] children) { for (int i = 0; i < children.length; i++) { parentCache.put(children[i], parent); } } public Object getParent(Object item) { return parentCache.get(item); } public void dispose() { parentCache= null; } protected void clearCache() { if (parentCache != null) { parentCache.clear(); } } public void removeCache(Object[] children) { if (parentCache == null) { return; } for (int i = 0; i < children.length; i++) { parentCache.remove(children[i]); } } public boolean hasChildren(Object element) { try { if (element instanceof IVariable) { IValue v = ((IVariable)element).getValue(); return v != null && v.hasVariables(); } if (element instanceof IValue) { return ((IValue)element).hasVariables(); } if (element instanceof IStackFrame) { return ((IStackFrame)element).hasVariables(); } } catch (DebugException e) { DroolsEclipsePlugin.log(e); return false; } return false; } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { clearCache(); } public List getCachedDecendants(Object parent) { Iterator children = parentCache.keySet().iterator(); List cachedChildren = new ArrayList(10); while (children.hasNext()) { Object child = children.next(); if (isCachedDecendant(child, parent)) { cachedChildren.add(child); } } return cachedChildren; } protected boolean isCachedDecendant(Object child, Object parent) { Object p = getParent(child); while (p != null) { if (p.equals(parent)) { return true; } p = getParent(p); } return false; } protected IValue getLogicalValue(IValue value, List previousStructureIds) { ILogicalStructureType[] types = DebugPlugin.getLogicalStructureTypes(value); if (types.length > 0) { ILogicalStructureType type = DebugPlugin.getDefaultStructureType(types); if (type != null && !previousStructureIds.contains(type.getId())) { try { value = type.getLogicalStructure(value); previousStructureIds.add(type.getId()); return getLogicalValue(value, previousStructureIds); } catch (CoreException e) { // unable to display logical structure } } } return value; } }