| /******************************************************************************* |
| * Copyright (c) 2007 Chase Technology Ltd - http://www.chasetechnology.co.uk |
| * 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: |
| * Doug Satchwell (Chase Technology Ltd) - initial API and implementation |
| * David Carver (STAR) - bug 214235 - Changed max value size to 2meg. |
| *******************************************************************************/ |
| package org.eclipse.wst.xsl.jaxp.debug.debugger; |
| |
| /** |
| * An abstract class that XSL processor implementations can subclass for their variables. |
| * |
| * @author Doug Satchwell |
| * @author David Carver |
| */ |
| public abstract class Variable |
| { |
| private static int idSequence = 0; |
| |
| /** |
| * The constant denoting a local scope variable. |
| */ |
| public static final String LOCAL_SCOPE = "L"; //$NON-NLS-1$ |
| /** |
| * The constant denoting a tunnel scope variable. |
| */ |
| public static final String TUNNEL_SCOPE = "T"; //$NON-NLS-1$ |
| /** |
| * The constant denoting a global scope variable. |
| */ |
| public static final String GLOBAL_SCOPE = "G"; //$NON-NLS-1$ |
| |
| protected final static int MAXIMUM_VALUE_SIZE = 2097152; |
| |
| protected static final String UNRESOLVED = "unresolved"; //$NON-NLS-1$ |
| protected static final String BOOLEAN = "boolean"; //$NON-NLS-1$ |
| protected static final String NUMBER = "number"; //$NON-NLS-1$ |
| protected static final String STRING = "string"; //$NON-NLS-1$ |
| protected static final String NODESET = "nodeset"; //$NON-NLS-1$ |
| protected static final String OBJECT = "object"; //$NON-NLS-1$ |
| protected static final String UNKNOWN = "unknown"; //$NON-NLS-1$ |
| |
| protected final String name; |
| protected final String scope; |
| protected final int slotNumber; |
| |
| private int id; |
| |
| /** |
| * Create a new instance of this with the given name, scope and slot number. |
| * |
| * @param name the name of this |
| * @param scope the scope of this |
| * @param slotNumber the slot number of this |
| */ |
| public Variable(String name, String scope, int slotNumber) |
| { |
| this.name = name; |
| this.scope = scope; |
| this.slotNumber = slotNumber; |
| this.id = idSequence++; |
| } |
| |
| /** |
| * Get the id used for this. |
| * |
| * @return the variable id |
| */ |
| public int getId() |
| { |
| return id; |
| } |
| |
| /** |
| * Get the variable name. |
| * |
| * @return the variable name |
| */ |
| public String getName() |
| { |
| return name; |
| } |
| |
| /** |
| * Get the type of this variable e.g. string, or node |
| * |
| * @return the variable type |
| */ |
| public abstract String getType(); |
| |
| /** |
| * Get the scope of this variable - one of <code>LOCAL_SCOPE</code>, <code>TUNNEL_SCOPE</code> or <code>GLOBAL_SCOPE</code>. |
| * |
| * @return the variable scope |
| */ |
| public String getScope() |
| { |
| return scope; |
| } |
| |
| /** |
| * Get the current value of this variable as a String. |
| * |
| * @return the value of this |
| */ |
| public abstract String getValue(); |
| |
| /** |
| * Get the first line of the value truncating to <code>MAXIMUM_VALUE_SIZE</code> where necessary. |
| * |
| * @return the first line of the value |
| */ |
| public String getValueFirstLine() |
| { |
| String value = getValue(); |
| if (value != null) |
| { |
| // make sure it is not too long |
| value = value.replace('\n', '.'); |
| if (value.length() > MAXIMUM_VALUE_SIZE) |
| value = value.substring(0, MAXIMUM_VALUE_SIZE); |
| } |
| else |
| value = ""; //$NON-NLS-1$ |
| return value; |
| } |
| |
| /** |
| * Get the slot number for this. |
| * |
| * @return the slot number |
| */ |
| public int getSlotNumber() |
| { |
| return slotNumber; |
| } |
| |
| public int hashCode() |
| { |
| return 3 * scope.hashCode() + 5 * slotNumber; |
| } |
| |
| public boolean equals(Object obj) |
| { |
| if (obj == this) |
| return true; |
| if (obj instanceof Variable) |
| { |
| Variable v = (Variable) obj; |
| return v.scope.equals(scope) && slotNumber == v.slotNumber; |
| } |
| return false; |
| } |
| |
| } |