protected synchronized AbstractProxy getAvailableProxy(String owner) {
    if (this.proxy.acquireLock(owner)) {
      return proxy;
    } else {
      Iterator iter = this.alternateProxies.iterator();
      while (iter.hasNext()) {
        AbstractProxy alternateProxy = (AbstractProxy) iter.next();
        if (alternateProxy.acquireLock(owner)) {
          return alternateProxy;
        }
      }

      if (this.alternateProxies.size() == maxProxies) {
        Logger.defaultLogger()
            .error(
                "Maximum number of proxies ("
                    + maxProxies
                    + ") reached - Unable to create another proxy",
                "getAvailableProxy");
        Logger.defaultLogger().info("Main Proxy : " + this.proxy.getOwnerId());
        Iterator piter = this.alternateProxies.iterator();
        while (piter.hasNext()) {
          AbstractProxy px = (AbstractProxy) piter.next();
          Logger.defaultLogger().info("Alternate Proxy : " + px.getOwnerId());
        }
        return null;
      } else {
        Logger.defaultLogger()
            .info(
                "Creating a new proxy on "
                    + this.proxy.toString()
                    + " : "
                    + +(this.alternateProxies.size() + 1)
                    + " th.");
        AbstractProxy newProxy = this.proxy.cloneProxy();
        newProxy.acquireLock(owner);
        this.alternateProxies.add(newProxy);
        return newProxy;
      }
    }
  }