/** {@inheritDoc} */
  @Override
  public boolean execute(IActionHandler actionHandler, final Map<String, Object> context) {
    String chartUrl =
        ResourceProviderServlet.computeLocalResourceDownloadUrl(
            getChartDescriptor().getUrl(), true);
    String chartData =
        getJdbcTemplate()
            .execute(
                new ConnectionCallback<String>() {

                  @Override
                  public String doInConnection(Connection con) throws SQLException {
                    return getChartDescriptor()
                        .getData(
                            getChartModel(context),
                            con,
                            getTranslationProvider(context),
                            getLocale(context));
                  }
                });
    IResource resource;
    try {
      resource =
          new MemoryResource(
              null,
              "text/xml",
              StringUtils.prependUtf8Bom(chartData).getBytes(StandardCharsets.UTF_8.name()));
    } catch (UnsupportedEncodingException ex) {
      throw new ActionException(ex);
    }
    String resourceId = ResourceManager.getInstance().register(resource);
    Map<String, String> flashContext = new LinkedHashMap<>();
    Dimension d = getChartDescriptor().getDimension();
    flashContext.put("chartWidth", Integer.toString(d.getWidth() - 20));
    flashContext.put("chartHeight", Integer.toString(d.getHeight() - 100));
    flashContext.put("dataURL", ResourceProviderServlet.computeDownloadUrl(resourceId));
    List<G> chartActions = new ArrayList<>();
    for (IDisplayableAction action : getActions()) {
      IView<E> view = getView(context);
      chartActions.add(
          getActionFactory(context).createAction(action, actionHandler, view, getLocale(context)));
    }
    getController(context)
        .displayFlashObject(
            chartUrl,
            flashContext,
            chartActions,
            getTranslationProvider(context)
                .getTranslation(getChartDescriptor().getTitle(), getLocale(context)),
            getSourceComponent(context),
            context,
            d,
            false);
    return super.execute(actionHandler, context);
  }
  /** {@inheritDoc} */
  @Override
  public void displayDialog(
      JComponent mainView,
      List<Action> actions,
      String title,
      JComponent sourceComponent,
      Map<String, Object> context,
      Dimension dimension,
      boolean reuseCurrent,
      boolean modal) {
    displayModalDialog(mainView, context, reuseCurrent);
    final JDialog dialog;
    Window window = SwingUtil.getVisibleWindow(sourceComponent);
    boolean newDialog = true;
    if (window instanceof JDialog) {
      if (reuseCurrent) {
        dialog = (JDialog) window;
        dialog.getContentPane().removeAll();
        newDialog = false;
      } else {
        dialog = new JDialog((JDialog) window, title, modal);
      }
    } else {
      dialog = new JDialog((Frame) window, title, modal);
    }

    Box buttonBox = new Box(BoxLayout.LINE_AXIS);
    buttonBox.setBorder(new EmptyBorder(new Insets(5, 10, 5, 10)));

    JButton defaultButton = null;
    for (Action action : actions) {
      JButton actionButton = new JButton();
      SwingUtil.configureButton(actionButton);
      actionButton.setAction(action);
      buttonBox.add(actionButton);
      buttonBox.add(Box.createHorizontalStrut(10));
      if (defaultButton == null) {
        defaultButton = actionButton;
      }
    }
    JPanel actionPanel = new JPanel();
    actionPanel.setLayout(new BorderLayout());
    actionPanel.add(buttonBox, BorderLayout.EAST);

    if (dimension != null) {
      mainView.setPreferredSize(
          new java.awt.Dimension(dimension.getWidth(), dimension.getHeight()));
    }
    JPanel mainPanel = new JPanel();
    mainPanel.setLayout(new BorderLayout());
    mainPanel.add(mainView, BorderLayout.CENTER);
    mainPanel.add(actionPanel, BorderLayout.SOUTH);
    dialog.getContentPane().add(mainPanel);
    dialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
    if (defaultButton != null) {
      dialog.getRootPane().setDefaultButton(defaultButton);
    }
    dialog.pack();
    if (newDialog) {
      SwingUtil.centerInParent(dialog);
    }
    dialog.setVisible(true);
  }