blob: 3899a709cc994ff8b3e4522a55aba27eda476489 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 flex.tools.debugger.cli;
import java.util.Vector;
import java.util.Iterator;
import flash.tools.debugger.Location;
import flash.tools.debugger.expression.ValueExp;
/**
* An object that relates a CLI debugger breakpoint with an associated set
* of CLI commands to perform.
*
* A breakpoint can be enabled or disabled. It can be set such
* that it disabled or deletes itself after being hit N times.
*/
public class BreakAction
{
// return values for getStatus()
public final static int RESOLVED = 1;
public final static int UNRESOLVED = 2;
public final static int AMBIGUOUS = 3;
public final static int NOCODE = 4; // there is no executable code at the specified line
/**
* This will be null if the user typed in a breakpoint expression which
* did not match any currently loaded location, but we have saved it
* (with status == UNRESOLVED) in case it gets resolved later when another
* SWF or ABC gets loaded.
*/
private LocationCollection m_where; // may be null
/**
* This will be null if the breakpoint was created via the
* <code>BreakAction(String unresolvedLocation)</code> constructor.
*/
private String m_breakpointExpression; // may be null
private Vector<String> m_commands;
private boolean m_enabled;
private boolean m_autoDelete;
private boolean m_autoDisable;
private boolean m_silent;
private boolean m_singleSwf; // is breakpoint meant for a single swf only
private int m_id;
private int m_hits;
private ValueExp m_condition;
private String m_conditionString;
private int m_status;
private boolean m_propagable;
public BreakAction(LocationCollection c) throws NullPointerException
{
m_where = c;
m_where.first().getFile(); // force NullPointerException if l == null
m_status = RESOLVED;
init();
}
public BreakAction(String unresolvedLocation)
{
m_breakpointExpression = unresolvedLocation;
m_status = UNRESOLVED;
init();
}
private void init()
{
m_id = BreakIdentifier.next();
m_commands = new Vector<String>();
m_propagable = true;
}
/* getters */
public int getCommandCount() { return m_commands.size(); }
public String commandAt(int i) { return m_commands.elementAt(i); }
public Location getLocation() { return (m_where != null) ? m_where.first() : null; }
public LocationCollection getLocations() { return m_where; }
public int getId() { return m_id; }
public int getHits() { return m_hits; }
public boolean isEnabled() { return m_enabled; }
public boolean isAutoDisable() { return m_autoDisable; }
public boolean isAutoDelete() { return m_autoDelete; }
public boolean isSilent() { return m_silent; }
public boolean isSingleSwf() { return m_singleSwf; }
public ValueExp getCondition() { return m_condition; }
public String getConditionString() { return m_conditionString; }
public String getBreakpointExpression() { return m_breakpointExpression; }
public int getStatus() { return m_status; }
public boolean isPropagable() { return m_propagable; }
/* setters */
public void addCommand(String cmd) { m_commands.add(cmd); }
public void clearCommands() { m_commands.clear(); }
public void addLocation(Location l) { m_where.add(l); }
public void setEnabled(boolean enable) { m_enabled = enable; }
public void setAutoDisable(boolean disable) { m_autoDisable = disable; }
public void setAutoDelete(boolean delete) { m_autoDelete = delete; }
public void setSilent(boolean silent) { m_silent = silent; }
public void setCondition(ValueExp c, String s) { m_condition = c; m_conditionString = s; }
public void clearCondition() { setCondition(null, ""); } //$NON-NLS-1$
public void hit() { m_hits++; }
public void clearHits() { m_hits = 0; }
public void setSingleSwf(boolean singleSwf) { m_singleSwf = singleSwf; }
public void setBreakpointExpression(String expr) { m_breakpointExpression = expr; }
public void setStatus(int status) { m_status = status; }
public void setPropagable(boolean propagable) { m_propagable = propagable; }
public void setLocations(LocationCollection loc)
{
m_where = loc;
if (loc != null)
setStatus(RESOLVED);
}
/*
* Check to see if our location matches the requested one
*/
public boolean locationMatches(int fileId, int line, int isolateId)
{
boolean match = false;
LocationCollection col = getLocations();
if (col != null)
{
Iterator itr = col.iterator();
// probe all locations looking for a match
while(!match && itr.hasNext())
{
Location l = (Location)itr.next();
if (l != null && l.getFile().getId() == fileId && l.getLine() == line && (isolateId == -1 || l.getIsolateId() == isolateId))
match = true;
}
}
return match;
}
}