public java.util.List<ReconnectResult> autoFind(final ProcessCallBack feedback) throws InterruptedException { StatsManager.I().track("reconnectAutoFind/start"); final java.util.List<ReconnectResult> scripts = new ArrayList<ReconnectResult>(); for (final RouterPlugin plg : ReconnectPluginController.this.plugins) { if (Thread.currentThread().isInterrupted()) { throw new InterruptedException(); } if (plg instanceof UPNPRouterPlugin || plg instanceof LiveHeaderReconnect) { try { feedback.setStatus(plg, null); java.util.List<ReconnectResult> founds = plg.runDetectionWizard(feedback); if (founds != null) { scripts.addAll(founds); } if (scripts.size() > 0) { break; } } catch (InterruptedException e) { throw e; } catch (Exception e) { } } } if (scripts.size() > 0) { HashMap<String, String> map = new HashMap<String, String>(); map.put("plg", scripts.get(0).getInvoker().getPlugin().getID()); StatsManager.I().track("reconnectAutoFind/success", map); } else { StatsManager.I().track("reconnectAutoFind/failed"); } if (JsonConfig.create(ReconnectConfig.class).getOptimizationRounds() > 1 && scripts.size() > 0) { int i = 1; long bestTime = Long.MAX_VALUE; long optiduration = 0; for (ReconnectResult found : scripts) { bestTime = Math.min(bestTime, found.getSuccessDuration()); optiduration += found.getSuccessDuration() * (JsonConfig.create(ReconnectConfig.class).getOptimizationRounds() - 1) * 1.5; } try { Dialog.getInstance() .showConfirmDialog( 0, _GUI.T.AutoDetectAction_actionPerformed_dooptimization_title(), _GUI.T.AutoDetectAction_actionPerformed_dooptimization_msg( scripts.size(), TimeFormatter.formatMilliSeconds(optiduration, 0), TimeFormatter.formatMilliSeconds(bestTime, 0)), new AbstractIcon(IconKey.ICON_OK, 32), _GUI.T.AutoDetectAction_run_optimization(), _GUI.T.AutoDetectAction_skip_optimization()); feedback.setProgress(this, 0); for (int ii = 0; ii < scripts.size(); ii++) { ReconnectResult found = scripts.get(ii); feedback.setStatusString( this, _GUI.T.AutoDetectAction_run_optimize(found.getInvoker().getName())); final int step = ii; found.optimize( new ProcessCallBackAdapter() { public void setProgress(Object caller, int percent) { feedback.setProgress( caller, (step) * (100 / scripts.size()) + percent / scripts.size()); } public void setStatusString(Object caller, String string) { feedback.setStatusString(caller, _GUI.T.AutoDetectAction_run_optimize(string)); } }); } } catch (DialogNoAnswerException e) { } } try { Collections.sort( scripts, new Comparator<ReconnectResult>() { public int compare(ReconnectResult o1, ReconnectResult o2) { return new Long(o1.getAverageSuccessDuration()) .compareTo(new Long(o2.getAverageSuccessDuration())); } }); } catch (final Throwable e) { org.appwork.utils.logging2.extmanager.LoggerFactory.getDefaultLogger().log(e); } return scripts; }