blob: 73bc07444319dd837b3275a252ec19dcbd0cc7f9 [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.HashMap;
import flash.localization.LocalizationManager;
import flash.tools.debugger.events.DivideByZeroFault;
import flash.tools.debugger.events.ExceptionFault;
import flash.tools.debugger.events.InvalidTargetFault;
import flash.tools.debugger.events.InvalidURLFault;
import flash.tools.debugger.events.InvalidWithFault;
import flash.tools.debugger.events.ProtoLimitFault;
import flash.tools.debugger.events.RecursionLimitFault;
import flash.tools.debugger.events.ScriptTimeoutFault;
import flash.tools.debugger.events.StackUnderFlowFault;
/**
* FaultActions proivdes a convenient wrapper for housing the user specified
* behaviour for a set of faults (aka text strings)
*
* The underlying data structure is a HashMap that maps strings (i.e. fault
* names) to Integers. The integers are used as bit fields for holding
* the state of setting per fault.
*
* Add new actions by calling addAction("name")
*/
public class FaultActions
{
HashMap<String, Integer> m_faults = new HashMap<String, Integer>();
HashMap<String, String> m_description = new HashMap<String, String>(); // @todo should really use an object within the faults map for this
HashMap<String, Integer> m_actions = new HashMap<String, Integer>();
int m_nextBitForAction = 0x1; // the next bit to use for the action
private FaultActions() {}
Integer get(String o) { return m_faults.get(o); }
Integer getAction(String o) { return m_actions.get(o); }
void put(String k, Integer v){ m_faults.put(k,v); }
/* getters */
public void clear() { m_faults.clear(); }
public int size() { return m_faults.size(); }
public Object[] names() { return m_faults.keySet().toArray(); }
public Object[] actions() { return m_actions.keySet().toArray(); }
public boolean exists(String k) { return (get(k) == null) ? false : true; }
public void putDescription(String k, String v) { m_description.put(k,v); }
public String getDescription(String k) { return (m_description.get(k) == null) ? "" : m_description.get(k); } //$NON-NLS-1$
/**
* Add a new fault to the table, with all actions disabled
*/
public void add(String k)
{
put(k, new Integer(0));
}
/**
* Add a new action type to the table
*/
public void addAction(String k)
{
Integer v = new Integer(m_nextBitForAction++);
m_actions.put(k,v);
}
/**
* Check if the given fault has the action set or not
*/
public boolean is(String fault, String action)
{
int mask = getAction(action).intValue();
int bits = get(fault).intValue();
boolean set = ( (bits & mask) == mask ) ? true : false;
return set;
}
/**
* Sets the action bits as appropriate for the given fault
* and action
*/
public int action(String fault, String action)
{
// first check if fault is legal
Integer current = get(fault);
if (current == null)
throw new IllegalArgumentException(fault);
// check for no?
boolean no = action.startsWith("no"); //$NON-NLS-1$
if (no)
action = action.substring(2);
// do the search for action
Integer bit = getAction(action);
if (bit == null)
throw new IllegalArgumentException(action);
// now do the math
int old = current.intValue();
int mask = bit.intValue();
int n = (old & (~mask)); // turn it off
n = (no) ? n : (n | mask); // leave it off or turn it on
put(fault, new Integer(n));
return n;
}
public static class FaultActionsBuilder {
private final LocalizationManager localizationManager;
public FaultActionsBuilder(LocalizationManager localizationManager) {
super();
this.localizationManager = localizationManager;
}
public FaultActions build() {
FaultActions faultActions = new FaultActions();
populateFaultTable(faultActions);
return faultActions;
}
private void populateFaultTable(FaultActions faultActions) {
// possible actions for our fault table
faultActions.addAction("stop"); //$NON-NLS-1$
faultActions.addAction("print"); //$NON-NLS-1$
// the faults we support
faultActions.add(InvalidTargetFault.name);
faultActions.add(RecursionLimitFault.name);
faultActions.add(InvalidWithFault.name);
faultActions.add(ProtoLimitFault.name);
faultActions.add(InvalidURLFault.name);
faultActions.add(ExceptionFault.name);
faultActions.add(StackUnderFlowFault.name);
faultActions.add(DivideByZeroFault.name);
faultActions.add(ScriptTimeoutFault.name);
// faultActions.add(ConsoleErrorFault.name);
// nice description of the faults
faultActions.putDescription(
InvalidTargetFault.name,
getLocalizationManager().getLocalizedTextString(
"invalidTargetFault")); //$NON-NLS-1$
faultActions.putDescription(
RecursionLimitFault.name,
getLocalizationManager().getLocalizedTextString(
"recursionLimitFault")); //$NON-NLS-1$
faultActions.putDescription(
InvalidWithFault.name,
getLocalizationManager().getLocalizedTextString(
"invalidWithFault")); //$NON-NLS-1$
faultActions.putDescription(
ProtoLimitFault.name,
getLocalizationManager().getLocalizedTextString(
"protoLimitFault")); //$NON-NLS-1$
faultActions.putDescription(
InvalidURLFault.name,
getLocalizationManager().getLocalizedTextString(
"invalidUrlFault")); //$NON-NLS-1$
faultActions.putDescription(
ExceptionFault.name,
getLocalizationManager().getLocalizedTextString(
"exceptionFault")); //$NON-NLS-1$
faultActions.putDescription(
StackUnderFlowFault.name,
getLocalizationManager().getLocalizedTextString(
"stackUnderflowFault")); //$NON-NLS-1$
faultActions.putDescription(
DivideByZeroFault.name,
getLocalizationManager().getLocalizedTextString(
"divideByZeroFault")); //$NON-NLS-1$
faultActions.putDescription(
ScriptTimeoutFault.name,
getLocalizationManager().getLocalizedTextString(
"scriptTimeoutFault")); //$NON-NLS-1$
// faultActions.putDescription(ConsoleErrorFault.name,
// "ActionScript recoverable error");
// default values for the faults
faultActions.action(InvalidTargetFault.name, "stop"); //$NON-NLS-1$
faultActions.action(InvalidTargetFault.name, "print"); //$NON-NLS-1$
faultActions.action(RecursionLimitFault.name, "stop"); //$NON-NLS-1$
faultActions.action(RecursionLimitFault.name, "print"); //$NON-NLS-1$
faultActions.action(InvalidWithFault.name, "stop"); //$NON-NLS-1$
faultActions.action(InvalidWithFault.name, "print"); //$NON-NLS-1$
faultActions.action(ProtoLimitFault.name, "stop"); //$NON-NLS-1$
faultActions.action(ProtoLimitFault.name, "print"); //$NON-NLS-1$
faultActions.action(InvalidURLFault.name, "stop"); //$NON-NLS-1$
faultActions.action(InvalidURLFault.name, "print"); //$NON-NLS-1$
faultActions.action(ExceptionFault.name, "stop"); //$NON-NLS-1$
faultActions.action(ExceptionFault.name, "print"); //$NON-NLS-1$
faultActions.action(StackUnderFlowFault.name, "stop"); //$NON-NLS-1$
faultActions.action(StackUnderFlowFault.name, "print"); //$NON-NLS-1$
faultActions.action(DivideByZeroFault.name, "stop"); //$NON-NLS-1$
faultActions.action(DivideByZeroFault.name, "print"); //$NON-NLS-1$
faultActions.action(ScriptTimeoutFault.name, "stop"); //$NON-NLS-1$
faultActions.action(ScriptTimeoutFault.name, "print"); //$NON-NLS-1$
// faultActions.action(ConsoleErrorFault.name, "print"); //$NON-NLS-1$
// faultActions.action(ConsoleErrorFault.name, "stop"); //$NON-NLS-1$
}
private LocalizationManager getLocalizationManager() {
return localizationManager;
}
}
}