2 * ============LICENSE_START========================================== org.onap.music
3 * =================================================================== Copyright (c) 2017 AT&T
4 * Intellectual Property ===================================================================
5 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
6 * in compliance with the License. You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software distributed under the License
11 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
12 * or implied. See the License for the specific language governing permissions and limitations under
15 * ============LICENSE_END=============================================
16 * ====================================================================
18 package org.onap.music.lockingservice;
21 import java.io.IOException;
22 import java.util.StringTokenizer;
23 import java.util.concurrent.CountDownLatch;
25 import org.apache.zookeeper.KeeperException;
26 import org.apache.zookeeper.WatchedEvent;
27 import org.apache.zookeeper.Watcher;
28 import org.apache.zookeeper.Watcher.Event.KeeperState;
29 import org.apache.zookeeper.ZooKeeper;
30 import org.onap.music.eelf.logging.EELFLoggerDelegate;
31 import org.onap.music.exceptions.MusicLockingException;
32 import org.onap.music.exceptions.MusicServiceException;
33 import org.onap.music.main.MusicUtil;
36 public class MusicLockingService implements Watcher {
39 private static final int SESSION_TIMEOUT = 180000;
40 ZkStatelessLockService zkLockHandle = null;
41 private CountDownLatch connectedSignal = new CountDownLatch(1);
42 private static EELFLoggerDelegate logger =
43 EELFLoggerDelegate.getLogger(MusicLockingService.class);
45 public MusicLockingService() throws MusicServiceException {
47 ZooKeeper zk = new ZooKeeper(MusicUtil.getMyZkHost(), SESSION_TIMEOUT, this);
48 connectedSignal.await();
49 zkLockHandle = new ZkStatelessLockService(zk);
50 } catch (IOException e) {
51 logger.error(EELFLoggerDelegate.errorLogger, e.getMessage());
52 throw new MusicServiceException("IO Error has occured" + e.getMessage());
53 } catch (InterruptedException e) {
54 logger.error(EELFLoggerDelegate.errorLogger, e.getMessage());
55 throw new MusicServiceException("Exception Occured " + e.getMessage());
59 public ZkStatelessLockService getzkLockHandle() {
63 public MusicLockingService(String lockServer) {
65 ZooKeeper zk = new ZooKeeper(lockServer, SESSION_TIMEOUT, this);
66 connectedSignal.await();
67 zkLockHandle = new ZkStatelessLockService(zk);
68 } catch (IOException | InterruptedException e) {
69 logger.error(EELFLoggerDelegate.errorLogger, e.getMessage());
73 public void createLockaIfItDoesNotExist(String lockName) {
74 if (!zkLockHandle.checkIfLockExists(lockName)) {
75 String lockHolder = null;
76 MusicLockState ml = new MusicLockState(MusicLockState.LockStatus.UNLOCKED, lockHolder);
77 byte[] data = ml.serialize();
78 zkLockHandle.createLock(lockName, data);
82 public void setLockState(String lockName, MusicLockState mls) {
83 byte[] data = mls.serialize();
84 zkLockHandle.setNodeData(lockName, data);
87 public MusicLockState getLockState(String lockName) throws MusicLockingException {
91 data = zkLockHandle.getNodeData(lockName);
92 }catch (Exception ex){
93 logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage());
96 return MusicLockState.deSerialize(data);
98 throw new MusicLockingException("Invalid lock or acquire failed");
101 public String createLockId(String lockName) {
102 String lockIdWithSlash = zkLockHandle.createLockId(lockName);
103 return lockIdWithSlash.replace('/', '$');
106 public boolean isMyTurn(String lockIdWithDollar) {
107 String lockId = lockIdWithDollar.replace('$', '/');
108 StringTokenizer st = new StringTokenizer(lockId);
109 String lockName = "/" + st.nextToken("/");
111 return zkLockHandle.lock(lockName, lockId);
112 } catch (KeeperException | InterruptedException e) {
113 logger.error(EELFLoggerDelegate.errorLogger, e.getMessage());
118 public void unlockAndDeleteId(String lockIdWithDollar) {
119 String lockId = lockIdWithDollar.replace('$', '/');
120 zkLockHandle.unlock(lockId);
123 public void deleteLock(String lockName) {
124 zkLockHandle.deleteLock(lockName);
127 public String whoseTurnIsIt(String lockName) {
128 String lockHolder = zkLockHandle.currentLockHolder(lockName);
129 return lockHolder.replace('/', '$');
133 public void process(WatchedEvent event) { // Watcher interface
134 if (event.getState() == KeeperState.SyncConnected) {
135 connectedSignal.countDown();
140 public void close() {
141 zkLockHandle.close();
144 public boolean lockIdExists(String lockIdWithDollar) {
145 String lockId = lockIdWithDollar.replace('$', '/');
146 return zkLockHandle.checkIfLockExists(lockId);