| /* |
| * 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; |
| } |
| } |
| } |