/** @return */ private boolean awaitInitializationTime() { // Check if we're still on startup lock final long delay = this.timeOfStartup + this.startupLock - System.currentTimeMillis(); if (delay > 0) { // If we are, halt this thread until lock time has passed. Unfortunatly the lookup is a // bit "unstable" during the first few miliseconds. try { java.lang.Thread.sleep(delay); } catch (final InterruptedException e) { e.printStackTrace(); return false; } } return true; }
/** * @param plugin * @param options * @return . */ @Override public Collection<DiscoveredPlugin> discover( final Class<? extends Plugin> plugin, final DiscoverOption... options) { this.logger.status("discover/start", "plugin", plugin); // Wait until init is done ... try { this.startupLatch.await(); } catch (final InterruptedException e) { return new ArrayList<DiscoveredPlugin>(); } // Timelock: Wait for a certain time to pass since startup if (this.lockMode.equals("timelock")) { if (awaitInitializationTime() == false) return new ArrayList<DiscoveredPlugin>(); } // Onepass: Wait for the discover to execute once if (this.lockMode.equals("onepass")) { // Also wait some time here, otherwise we won't find all plugins in all cases awaitInitializationTime(); // Wait at least one discoverThreadTurn final long lastDisoverValue = this.discoverThreadCounter.get(); final long startOfWait = System.currentTimeMillis(); while (this.discoverThreadCounter.get() == lastDisoverValue) { try { java.lang.Thread.sleep(100); } catch (final InterruptedException e) { e.printStackTrace(); return new ArrayList<DiscoveredPlugin>(); } // Safety check if (System.currentTimeMillis() > startOfWait + 1000) throw new IllegalStateException("We are waiting way too long."); } } this.logger.status("discover/end"); // Eventually resolve the request. return resolve(plugin, options); }