001: /*
002: * Copyright (c) 2003-2007 JGoodies Karsten Lentzsch. All Rights Reserved.
003: *
004: * Redistribution and use in source and binary forms, with or without
005: * modification, are permitted provided that the following conditions are met:
006: *
007: * o Redistributions of source code must retain the above copyright notice,
008: * this list of conditions and the following disclaimer.
009: *
010: * o Redistributions in binary form must reproduce the above copyright notice,
011: * this list of conditions and the following disclaimer in the documentation
012: * and/or other materials provided with the distribution.
013: *
014: * o Neither the name of JGoodies Karsten Lentzsch nor the names of
015: * its contributors may be used to endorse or promote products derived
016: * from this software without specific prior written permission.
017: *
018: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
020: * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
021: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
022: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
023: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
024: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
025: * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
026: * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
027: * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
028: * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
029: */
030:
031: package com.jgoodies.validation.tutorial.performance;
032:
033: import java.awt.EventQueue;
034:
035: import com.jgoodies.validation.util.ValidationUtils;
036:
037: /**
038: * Provides a validation service that simulates a slow back-end operation.
039: * A server-side service may be slow due to database requests,
040: * heavy computations, slow network transport, etc.
041: * The JGoodies Validation tutorial demonstrates approaches to handle
042: * this situation: delayed validation, background validation,
043: * client-side pre-validation, client-side caching.<p>
044: *
045: * The above techniques apply if the costs to check for valid data
046: * are significantly lower than the costs to look up valid choices,
047: * or if you cannot look up or compute the valid choices.
048: * If the valid choices can be provided at affordable costs,
049: * a client may choose to present the valid choices, instead
050: * of complaining about invalid data.
051: *
052: * @author Karsten Lentzsch
053: * @version $Revision: 1.6 $
054: */
055: public final class BackendService {
056:
057: /**
058: * Example container numbers that all consist of 5 digits.
059: */
060: private static final String[] CONTAINER_NUMBERS = { "12345",
061: "23456", "34567", "45678", "56789" };
062:
063: private static final int DEFAULT_DELAY = 1000; // ms
064:
065: private BackendService() {
066: // Suppresses default constructor, ensuring non-instantiability.
067: }
068:
069: // Screen Position ********************************************************
070:
071: /**
072: * Checks and answers if the given container number is valid.
073: * Since all valid container numbers consist of 5 digits,
074: * a client-side validator may check the length and characters
075: * before asking this service.
076: *
077: * @param containerNumber the container number to be checked
078: * @return true if the given number is valid
079: */
080: public static boolean isValidContainerNumber(String containerNumber) {
081: boolean isEDT = EventQueue.isDispatchThread();
082: System.out.println("Server validation("
083: + (isEDT ? "EDT" : "background") + "): "
084: + containerNumber);
085: sleep(DEFAULT_DELAY);
086: if (ValidationUtils.isBlank(containerNumber))
087: return false;
088: for (String element : CONTAINER_NUMBERS) {
089: if (element.equals(containerNumber)) {
090: return true;
091: }
092: }
093: return false;
094: }
095:
096: // Helper Code ************************************************************
097:
098: /**
099: * Sleeps for the given <code>milliseconds</code>
100: * catching a potential InterruptedException.
101: *
102: * @param milliseconds the time to sleep in milliseconds
103: */
104: private static void sleep(long milliseconds) {
105: try {
106: Thread.sleep(milliseconds);
107: } catch (InterruptedException e) {
108: // Do nothing on interrupt.
109: }
110: }
111:
112: }
|