blob: dd0c92bb8e6f62ca8a006732c3c277900b5c0304 [file] [log] [blame]
/*
* This file is part of the QuickServer library
* Copyright (C) QuickServer.org
*
* Use, modification, copying and distribution of this software is subject to
* the terms and conditions of the GNU Lesser General Public License.
* You should have received a copy of the GNU LGP License along with this
* library; if not, you can download a copy from <http://www.quickserver.org/>.
*
* For questions, suggestions, bug-reports, enhancement-requests etc.
* visit http://www.quickserver.org
*
*/
package org.quickserver.net.server.impl;
import java.io.*;
import java.util.*;
import java.util.logging.*;
import org.quickserver.util.pool.*;
import org.quickserver.net.server.*;
import java.util.regex.*;
/**
* Optimistic Client Identifier implementation.
* @author Akshathkumar Shetty
* @since 1.4.5
*/
public class OptimisticClientIdentifier extends BasicClientIdentifier {
private static final Logger logger = Logger.getLogger(OptimisticClientIdentifier.class.getName());
private ClientIdentifier backupClientIdentifier;
private static final int MAX_TRY_COUNT = 4;
public ClientHandler findFirstClientById(String id) {
return findFirstClientById(id, 0);
}
private ClientHandler findFirstClientById(String id, int callCount) {
ClientHandler foundClientHandler = null;
try {
Iterator iterator = findAllClient();
while(iterator.hasNext()) {
foundClientHandler = checkClientId(
(ClientHandler) iterator.next(), id);
if(foundClientHandler!=null) break;
}//endof while
} catch(ConcurrentModificationException e) {
if(callCount<MAX_TRY_COUNT) {
//start over again.
foundClientHandler = findFirstClientById(id, ++callCount);
} else {
logger.finest("Going for backup..");
foundClientHandler = getBackupClientIdentifier().findFirstClientById(id);
}
}
return foundClientHandler;
}
public Iterator findAllClientById(String pattern) {
return findAllClientById(pattern, 0);
}
private Iterator findAllClientById(String pattern, int callCount) {
ArrayList list = new ArrayList();
Pattern p = Pattern.compile(pattern);
ClientHandler foundClientHandler = null;
try {
Iterator iterator = findAllClient();
while(iterator.hasNext()) {
foundClientHandler = checkClientId(
(ClientHandler) iterator.next(), p);
if(foundClientHandler!=null)
list.add(foundClientHandler);
}//endof while
} catch(ConcurrentModificationException e) {
if(callCount<MAX_TRY_COUNT) {
//start over again.
list = null;
return findAllClientById(pattern, ++callCount);
} else {
logger.finest("Going for backup..");
return getBackupClientIdentifier().findAllClientById(pattern);
}
}
return list.iterator();
}
public ClientHandler findClientByKey(String key) {
return findClientByKey(key, 0);
}
private ClientHandler findClientByKey(String key, int callCount) {
ClientHandler foundClientHandler = null;
try {
Iterator iterator = findAllClient();
while(iterator.hasNext()) {
foundClientHandler = checkClientKey(
(ClientHandler) iterator.next(), key);
if(foundClientHandler!=null) break;
}//endof while
} catch(ConcurrentModificationException e) {
if(callCount<MAX_TRY_COUNT) {
//start over again.
foundClientHandler = findClientByKey(key, ++callCount);
} else {
logger.finest("Going for backup..");
foundClientHandler = getBackupClientIdentifier().findClientByKey(key);
}
}
return foundClientHandler;
}
public Iterator findAllClientByKey(String pattern) {
return findAllClientByKey(pattern, 0);
}
private Iterator findAllClientByKey(String pattern, int callCount) {
ArrayList list = new ArrayList();
Pattern p = Pattern.compile(pattern);
ClientHandler foundClientHandler = null;
try {
Iterator iterator = findAllClient();
while(iterator.hasNext()) {
foundClientHandler = checkClientKey(
(ClientHandler) iterator.next(), p);
if(foundClientHandler!=null)
list.add(foundClientHandler);
foundClientHandler = null;
}//endof while
} catch(ConcurrentModificationException e) {
if(callCount<MAX_TRY_COUNT) {
//start over again.
list = null;
return findAllClientByKey(pattern, ++callCount);
} else {
logger.finest("Going for backup..");
return getBackupClientIdentifier().findAllClientByKey(pattern);
}
}
return list.iterator();
}
private synchronized ClientIdentifier getBackupClientIdentifier() {
if(backupClientIdentifier==null) {
backupClientIdentifier = new SyncClientIdentifier();
backupClientIdentifier.setClientHandlerPool(clientHandlerPool);
}
return backupClientIdentifier;
}
}