home *** CD-ROM | disk | FTP | other *** search
/ PC World 1998 October / PCWorld_1998-10_cd.bin / software / prehled / inprise / JSAMPLES.Z / ResourcedDataSetExceptionHandler.java < prev    next >
Text File  |  1998-05-08  |  7KB  |  152 lines

  1. /*
  2.  * Copyright (c) 1997-1998 Borland International, Inc. All Rights Reserved.
  3.  * 
  4.  * This SOURCE CODE FILE, which has been provided by Borland as part
  5.  * of a Borland product for use ONLY by licensed users of the product,
  6.  * includes CONFIDENTIAL and PROPRIETARY information of Borland.  
  7.  *
  8.  * USE OF THIS SOFTWARE IS GOVERNED BY THE TERMS AND CONDITIONS 
  9.  * OF THE LICENSE STATEMENT AND LIMITED WARRANTY FURNISHED WITH
  10.  * THE PRODUCT.
  11.  *
  12.  * IN PARTICULAR, YOU WILL INDEMNIFY AND HOLD BORLAND, ITS RELATED
  13.  * COMPANIES AND ITS SUPPLIERS, HARMLESS FROM AND AGAINST ANY CLAIMS
  14.  * OR LIABILITIES ARISING OUT OF THE USE, REPRODUCTION, OR DISTRIBUTION
  15.  * OF YOUR PROGRAMS, INCLUDING ANY CLAIMS OR LIABILITIES ARISING OUT OF
  16.  * OR RESULTING FROM THE USE, MODIFICATION, OR DISTRIBUTION OF PROGRAMS
  17.  * OR FILES CREATED FROM, BASED ON, AND/OR DERIVED FROM THIS SOURCE
  18.  * CODE FILE.
  19.  */
  20. package borland.samples.intl.application;
  21.  
  22. import java.awt.*;
  23. import java.text.*;
  24. import java.util.*;
  25. import borland.jbcl.control.*;
  26. import borland.jbcl.dataset.*;
  27.  
  28. import borland.samples.intl.beans.*;
  29. import borland.samples.intl.beans.event.*;
  30.  
  31. /**
  32.  * Resourceable DataSetExceptionHandler for the application.  In
  33.  * AppDataModule's constructor, ResourcedDataSetExceptionHandler is
  34.  * registered as the handler for DataSetExceptions for the
  35.  * application.  Doing so results in our error handler, rather than
  36.  * the standard handler, being called whenever a DataSetException
  37.  * occurs.  By examining the Exception event's error code or message,
  38.  * we can localize error messages displayed to the user for the proper
  39.  * locale.  It is possible to provide error handlers to display
  40.  * localized messages for specific error conditions, e.g, on
  41.  * 'addError' or 'deleteError' events.  However, in this application
  42.  * we take advantage of the fact that all errors are funneled into a
  43.  * single error handler.
  44.  */
  45. public class ResourcedDataSetExceptionHandler implements ExceptionListener, LocaleChangeListener {
  46.   private AppDataModule appDataModule;
  47.   ResourceBundle textRes = java.util.ResourceBundle.getBundle("borland.samples.intl.application.resources.TextRes",
  48.                                                     LocaleChangeManager.getLocale());
  49.   ResourceBundle textRes2 = java.util.ResourceBundle.getBundle("borland.samples.intl.gui.resources.TextRes",
  50.                                                      LocaleChangeManager.getLocale());
  51.   protected MessageFormat formattedMessage = new MessageFormat(textRes.getString("enter_value"));
  52.  
  53.   public ResourcedDataSetExceptionHandler(AppDataModule appDataModule) {
  54.     this.appDataModule = appDataModule;
  55.     LocaleChangeManager.getLocaleChangeManager().addLocaleChangeListener(this);
  56.   }
  57.  
  58.   public void exception(ExceptionEvent event) {
  59.     Component component = event.getComponent();
  60.     Frame frame = null;
  61.  
  62.     while (component != null) {
  63.       if (component instanceof Frame) {
  64.         frame = (Frame) component;
  65.         break;
  66.       }
  67.       component = component.getParent();
  68.     }
  69.  
  70.     if (frame == null) {
  71.       frame = new Frame();
  72.     }
  73.     Message message = new Message();
  74.     message.setFrame(frame);
  75.     Object [] messageArgs;
  76.     String messageString = null;
  77.     int errorCode;
  78.  
  79.     if (event.getException() instanceof DataSetException) {
  80.       errorCode = ((DataSetException) event.getException()).getErrorCode();
  81.     } else {
  82.       errorCode = -1;
  83.     }
  84.  
  85.     // At least one required field is missing.
  86.     // Find the empty field and display its name in an error message dialog.
  87.     if (errorCode == ValidationException.INVALID_ROW_VALUES) {
  88.       try {
  89.         if (event.getDataSet() == appDataModule.getOrderDataSet()) {
  90.           String [] requiredFields = new String [] { "payment_method", "credit_card_no", "card_expiration_date" };
  91.  
  92.           for (int i = 0; i < requiredFields.length; i++) {
  93.             if (appDataModule.getOrderDataSet().getString(requiredFields[i]).length() == 0) {
  94.               messageArgs = new Object [] { textRes2.getString(requiredFields[i]) };
  95.               messageString = formattedMessage.format(messageArgs);
  96.               break;
  97.             }
  98.           }
  99.         } else if (event.getDataSet() == appDataModule.getCustomerDataSet()) {
  100.           String [] requiredFields = new String [] { "last_name", "first_name", "address1", "city", "province",
  101.                                                        "country" };
  102.           for (int i = 0; i < requiredFields.length; i++) {
  103.             if (appDataModule.getCustomerDataSet().getString(requiredFields[i]).length() == 0) {
  104.               messageArgs = new Object [] { textRes.getString(requiredFields[i]) };
  105.               messageString = formattedMessage.format(messageArgs);
  106.               break;
  107.             }
  108.           }
  109.         }
  110.       } catch (Exception e) {
  111.         borland.jbcl.util.Diagnostic.printStackTrace(e);
  112.       }
  113.       // A value in a column is less than the minimum allowed value.
  114.       // Since the only minimum validation constraint we placed was on the
  115.       // credit card expiration date field, display a localized
  116.       // message indicating that the credit card has already expired.
  117.     } else if ((errorCode == ValidationException.LESS_THAN_MIN) &&
  118.                ((ValidationException) event.getException()).getErrorColumn().getColumnName().equals("card_expiration_date")) {
  119.         messageString = textRes.getString("card_expired");
  120.       // One or more characters necessary to satisfy an edit mask pattern
  121.       // are missing.
  122.     } else if (errorCode == ValidationException.INVALID_FORMAT) {
  123.       messageString = textRes.getString("format_error");
  124.       // User tried to edit a value in a read-only column.
  125.     } else if (errorCode == ValidationException.READ_ONLY_COLUMN) {
  126.       messageString = textRes.getString("read_only");
  127.       // User tried inserting, deleting, or indirectly posting a row
  128.       // which we deliberately denied using setEnableInsert
  129.       // or setEnableDelete false.  Silently ignore it.
  130.     } else if ((errorCode == ValidationException.INSERT_NOT_ALLOWED) ||
  131.                (errorCode == ValidationException.DELETE_NOT_ALLOWED)) {
  132.       return;
  133.     }
  134.  
  135.     // If we didn't have a localized message for the error condition,
  136.     // go ahead and display the message in the language of the current
  137.     // locale.
  138.     if (messageString == null) {
  139.       messageString = event.getException().getMessage();
  140.     }
  141.  
  142.     message.setLabels(new String[] {textRes.getString("OK")});
  143.     message.setMessage(messageString);
  144.     message.setVisible(true);
  145.   }
  146.  
  147.   public void localeChanged(LocaleChangeEvent e) {
  148.     textRes = java.util.ResourceBundle.getBundle("borland.samples.intl.application.resources.TextRes", e.getLocale());
  149.     textRes2 = java.util.ResourceBundle.getBundle("borland.samples.intl.gui.resources.TextRes", e.getLocale());
  150.   }
  151. }
  152.