/******************************************************************************* * Copyright (c) 2016 Rogue Wave Software, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Rogue Wave Software, Inc. - initial API and implementation *******************************************************************************/ package org.eclipse.che.plugin.zdb.server.variables; import static org.eclipse.che.plugin.zdb.server.expressions.IDbgDataFacet.Facet.KIND_ARRAY_MEMBER; import static org.eclipse.che.plugin.zdb.server.expressions.IDbgDataFacet.Facet.KIND_OBJECT_MEMBER; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.eclipse.che.api.debug.shared.model.VariablePath; import org.eclipse.che.api.debug.shared.model.impl.VariablePathImpl; import org.eclipse.che.plugin.zdb.server.expressions.IDbgDataType.DataType; import org.eclipse.che.plugin.zdb.server.expressions.IDbgExpression; /** * PHP Zend debugger specific variable. * * @author Bartlomiej Laczkowski */ public class ZendDbgVariable implements IDbgVariable { private final IDbgExpression zendDbgExpression; private final VariablePath variablePath; private final String name; private List<IDbgVariable> variables; private boolean isComplete; public ZendDbgVariable(VariablePath variablePath, IDbgExpression zendDbgExpression) { this.variablePath = variablePath; this.zendDbgExpression = zendDbgExpression; this.name = createName(zendDbgExpression); this.variables = Collections.emptyList(); this.isComplete = zendDbgExpression.getChildrenCount() == zendDbgExpression.getChildren().size(); } @Override public boolean isExistInformation() { return true; } @Override public String getName() { return name; } @Override public String getValue() { if (zendDbgExpression.getDataType() == DataType.PHP_STRING) return '"' + zendDbgExpression.getValue() + '"'; return zendDbgExpression.getValue(); } @Override public String getType() { return zendDbgExpression.getDataType().getText(); } @Override public boolean isPrimitive() { switch (zendDbgExpression.getDataType()) { case PHP_BOOL: case PHP_FLOAT: case PHP_INT: case PHP_STRING: case PHP_NULL: case PHP_UNINITIALIZED: return true; default: return false; } } @Override public List<IDbgVariable> getVariables() { return variables; } @Override public VariablePath getVariablePath() { return variablePath; } @Override public void setValue(String newValue) { if (zendDbgExpression.setValue(newValue)) { // Re-evaluate underlying expression isComplete = false; makeComplete(); } } @Override public void makeComplete() { if (!isComplete) { // Evaluate wrapped expression to fetch all child variables zendDbgExpression.evaluate(); variables = new ArrayList<>(); int childId = 0; for (IDbgExpression child : zendDbgExpression.getChildren()) { List<String> childPath = new ArrayList<>(variablePath.getPath()); childPath.add(String.valueOf(childId++)); variables.add(new ZendDbgVariable(new VariablePathImpl(childPath), child)); } isComplete = true; } } private String createName(IDbgExpression expression) { String name = expression.getExpression(); if (expression.hasFacet(KIND_OBJECT_MEMBER)) { name = name.substring(name.lastIndexOf(":") + 1); } else if (expression.hasFacet(KIND_ARRAY_MEMBER)) { name = '[' + name + ']'; } return name; } }