protected ReconnectResult validate(ReconnectResult ret) throws InterruptedException, ReconnectException { ret.setInvoker(this); // Make sure that we are online if (IPController.getInstance().getIpState().isOffline()) { IPController.getInstance().invalidate(); Thread.sleep(1000); IPController.getInstance().validate(); if (IPController.getInstance().getIpState().isOffline()) { throw new ReconnectException(_GUI._.ReconnectInvoker_validate_offline_()); } } logger.info("IP BEFORE=" + IPController.getInstance().getIP()); try { IPController.getInstance().invalidate(); ret.setStartTime(System.currentTimeMillis()); testRun(); Thread.sleep(1 * 1000); IPController ipc = IPController.getInstance(); if (ipc.validate()) { // wow this hsa been fast logger.info("Successful: REconnect has been very fast!"); ret.setSuccess(true); ret.setOfflineTime(System.currentTimeMillis()); ret.setSuccessTime(System.currentTimeMillis()); return ret; } logger.info("Script done. Wait for offline"); do { // wait until we are offline Thread.sleep(1 * 1000); if (!ipc.validate() && !ipc.getIpState().isOffline() && (System.currentTimeMillis() - ret.getStartTime()) > OFFLINE_TIMEOUT) { // we are not offline after 30 seconds logger.info("Disconnect failed. Still online after " + OFFLINE_TIMEOUT + " ms"); return ret; } } while (!ipc.getIpState().isOffline() && ipc.isInvalidated()); ret.setOfflineTime(System.currentTimeMillis()); logger.info("Offline after " + ret.getOfflineDuration() + " ms"); if (ipc.isInvalidated()) { logger.info("Wait for online status"); // we have to wait LOOOONG here. reboot may take its time final long endTime = System.currentTimeMillis() + 450 * 1000; while (System.currentTimeMillis() < endTime) { /* ip change detected then we can stop */ long s = System.currentTimeMillis(); if (Thread.currentThread().isInterrupted()) { throw new InterruptedException(); } if (ipc.validate()) { ret.setSuccessTime(System.currentTimeMillis()); ret.setSuccess(true); logger.info("Successful: REconnect after " + ret.getSuccessDuration() + " ms"); return ret; // } if (!ipc.getIpState().isOffline()) { logger.info("Failed. returned from offline. But no new ip"); return ret; } Thread.sleep(Math.max(0, 1000 - (System.currentTimeMillis() - s))); } logger.info("Connect failed! Maybe router restart is required. This should NEVER happen!"); return ret; } else { ret.setSuccessTime(System.currentTimeMillis()); ret.setSuccess(true); logger.info("Successful: REconnect after " + ret.getSuccessDuration() + " ms"); return ret; } } finally { logger.info("IP AFTER=" + IPController.getInstance().getIP()); } }