/* * SonarQube * Copyright (C) 2009-2017 SonarSource SA * mailto:info AT sonarsource DOT com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package org.sonar.ce; import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import org.sonar.ce.taskprocessor.CeWorkerFactory; import static com.google.common.base.Preconditions.checkState; /** * Provide the set of worker's UUID in a non clustered SonarQube instance */ public class StandaloneCeDistributedInformation implements CeDistributedInformation { private final CeWorkerFactory ceCeWorkerFactory; private Set<String> workerUUIDs; private Lock cleanJobLock = new NonConcurrentLock(); public StandaloneCeDistributedInformation(CeWorkerFactory ceCeWorkerFactory) { this.ceCeWorkerFactory = ceCeWorkerFactory; } @Override public Set<String> getWorkerUUIDs() { checkState(workerUUIDs != null, "Invalid call, broadcastWorkerUUIDs() must be called first."); return workerUUIDs; } @Override public void broadcastWorkerUUIDs() { workerUUIDs = ceCeWorkerFactory.getWorkerUUIDs(); } /** * Since StandaloneCeDistributedInformation in fact does not provide any distribution support, the lock returned by * this method provides no concurrency support at all. */ @Override public Lock acquireCleanJobLock() { return cleanJobLock; } private static class NonConcurrentLock implements Lock { @Override public void lock() { // return immediately and never block } @Override public void lockInterruptibly() throws InterruptedException { // return immediately and never block } @Override public boolean tryLock() { // always succeed return true; } @Override public boolean tryLock(long time, TimeUnit unit) throws InterruptedException { // always succeed return true; } @Override public void unlock() { // nothing to do } @Override public Condition newCondition() { throw new UnsupportedOperationException("newCondition not supported"); } } }