Merge "Sonar Fixes - CadiAuthFilter.java"
[music.git] / src / main / java / org / onap / music / lockingservice / zookeeper / MusicLockingService.java
1 /*
2  * ============LICENSE_START==========================================
3  * org.onap.music
4  * ===================================================================
5  *  Copyright (c) 2017 AT&T Intellectual Property
6  * ===================================================================
7  *  Licensed under the Apache License, Version 2.0 (the "License");
8  *  you may not use this file except in compliance with the License.
9  *  You may obtain a copy of the License at
10  * 
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  *  Unless required by applicable law or agreed to in writing, software
14  *  distributed under the License is distributed on an "AS IS" BASIS,
15  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  *  See the License for the specific language governing permissions and
17  *  limitations under the License.
18  * 
19  * ============LICENSE_END=============================================
20  * ====================================================================
21  */
22
23 package org.onap.music.lockingservice.zookeeper;
24
25
26 import java.io.IOException;
27 import java.util.StringTokenizer;
28 import java.util.concurrent.CountDownLatch;
29
30 import org.apache.zookeeper.KeeperException;
31 import org.apache.zookeeper.WatchedEvent;
32 import org.apache.zookeeper.Watcher;
33 import org.apache.zookeeper.Watcher.Event.KeeperState;
34 import org.apache.zookeeper.ZooKeeper;
35 import org.onap.music.authentication.CachingUtil;
36 import org.onap.music.eelf.logging.EELFLoggerDelegate;
37 import org.onap.music.eelf.logging.format.AppMessages;
38 import org.onap.music.eelf.logging.format.ErrorSeverity;
39 import org.onap.music.eelf.logging.format.ErrorTypes;
40 import org.onap.music.exceptions.MusicLockingException;
41 import org.onap.music.exceptions.MusicServiceException;
42 import org.onap.music.lockingservice.cassandra.MusicLockState;
43 import org.onap.music.main.MusicUtil;
44
45
46 public class MusicLockingService implements Watcher {
47
48     
49     private static final int SESSION_TIMEOUT = 180000;
50     ZkStatelessLockService zkLockHandle = null;
51     private CountDownLatch connectedSignal = new CountDownLatch(1);
52     private static EELFLoggerDelegate logger =
53                     EELFLoggerDelegate.getLogger(MusicLockingService.class);
54
55     public MusicLockingService() throws MusicServiceException {
56         try {
57             ZooKeeper zk = new ZooKeeper(MusicUtil.getMyZkHost(), SESSION_TIMEOUT, this);
58             connectedSignal.await();
59             zkLockHandle = new ZkStatelessLockService(zk);
60         } catch (IOException e) {
61             logger.error("Error", e);
62             logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.IOERROR, ErrorSeverity.ERROR, ErrorTypes.CONNECTIONERROR);
63             throw new MusicServiceException("IO Error has occured" + e.getMessage());
64         } catch (InterruptedException e) {
65             logger.error("Error", e);
66             logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.EXECUTIONINTERRUPTED, ErrorSeverity.ERROR, ErrorTypes.LOCKINGERROR);
67             throw new MusicServiceException("Exception Occured " + e.getMessage());
68         }
69     }
70
71     public MusicLockingService(String lockServer) {
72         try {
73             ZooKeeper zk = new ZooKeeper(lockServer, SESSION_TIMEOUT, this);
74             connectedSignal.await();
75             zkLockHandle = new ZkStatelessLockService(zk);
76         } catch (IOException e) {
77             logger.error("Error", e);
78             logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.IOERROR, ErrorSeverity.ERROR, ErrorTypes.CONNECTIONERROR);
79         }catch( InterruptedException e) {
80             logger.error("Error", e);
81             logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.EXECUTIONINTERRUPTED, ErrorSeverity.ERROR, ErrorTypes.LOCKINGERROR);
82         }catch(Exception e) {
83             logger.error("Error", e);
84             logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.UNKNOWNERROR, ErrorSeverity.ERROR, ErrorTypes.LOCKINGERROR);
85         }
86     }
87
88     public ZkStatelessLockService getzkLockHandle() {
89         return zkLockHandle;
90     }
91
92     public void createLockaIfItDoesNotExist(String lockName) {
93         if (!zkLockHandle.checkIfLockExists(lockName)) {
94             String lockHolder = null;
95             MusicLockState ml = new MusicLockState(MusicLockState.LockStatus.UNLOCKED, lockHolder);
96             byte[] data = ml.serialize();
97             zkLockHandle.createLock(lockName, data);
98         }
99     }
100
101     public void setLockState(String lockName, MusicLockState mls) {
102         byte[] data = mls.serialize();
103         zkLockHandle.setNodeData(lockName, data);
104     }
105
106     public MusicLockState getLockState(String lockName) throws MusicLockingException {
107
108         byte[] data = null;
109         try{
110             data = zkLockHandle.getNodeData(lockName);
111         }catch (Exception ex){
112             logger.error(EELFLoggerDelegate.errorLogger, ex,AppMessages.UNKNOWNERROR, ErrorSeverity.ERROR, ErrorTypes.LOCKINGERROR);
113         }
114         if(data !=null)
115         return MusicLockState.deSerialize(data);
116         else {
117             logger.error(EELFLoggerDelegate.errorLogger,"Invalid lock or acquire failed",AppMessages.INVALIDLOCK, ErrorSeverity.ERROR, ErrorTypes.LOCKINGERROR);
118             throw new  MusicLockingException("Invalid lock or acquire failed");
119         }
120     }
121
122     public String createLockId(String lockName) {
123         String lockIdWithSlash = zkLockHandle.createLockId(lockName);
124         return lockIdWithSlash.replace('/', '$');
125     }
126
127     public boolean isMyTurn(String lockIdWithDollar) {
128         String lockId = lockIdWithDollar.replace('$', '/');
129         StringTokenizer st = new StringTokenizer(lockId);
130         String lockName = "/" + st.nextToken("/");
131         try {
132             return zkLockHandle.lock(lockName, lockId);
133         } catch (KeeperException e) {
134             logger.error("Error", e);
135             logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.LOCKINGERROR, ErrorSeverity.ERROR, ErrorTypes.LOCKINGERROR);
136         }catch( InterruptedException e) {
137             logger.error("Error", e);
138             logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.EXECUTIONINTERRUPTED, ErrorSeverity.ERROR, ErrorTypes.LOCKINGERROR);
139         }catch(Exception e) {
140             logger.error("Error", e);
141             logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.UNKNOWNERROR, ErrorSeverity.ERROR, ErrorTypes.LOCKINGERROR);
142         }
143         return false;
144     }
145
146     public void unlockAndDeleteId(String lockIdWithDollar) throws KeeperException.NoNodeException {
147         String lockId = lockIdWithDollar.replace('$', '/');
148         zkLockHandle.unlock(lockId);
149         CachingUtil.deleteKeysFromDB("'"+lockId+"'");
150     }
151
152     public void deleteLock(String lockName) throws MusicLockingException {
153         if(lockIdExists(lockName))
154             zkLockHandle.deleteLock(lockName);
155         else{
156             throw new MusicLockingException("Lock does not exist.Please check the lock: " + lockName + " and try again");
157         }
158     }
159
160     public String whoseTurnIsIt(String lockName) {
161         String lockHolder = zkLockHandle.currentLockHolder(lockName);
162         return lockHolder.replace('/', '$');
163
164     }
165
166     public void process(WatchedEvent event) { // Watcher interface
167         if (event.getState() == KeeperState.SyncConnected) {
168             connectedSignal.countDown();
169         }
170     }
171
172
173     public void close() {
174         zkLockHandle.close();
175     }
176
177     public boolean lockIdExists(String lockIdWithDollar) {
178         String lockId = lockIdWithDollar.replace('$', '/');
179         return zkLockHandle.checkIfLockExists(lockId);
180     }
181
182 }