diff options
author | Jim Hahn <jrh3@att.com> | 2019-06-24 08:41:18 -0400 |
---|---|---|
committer | Jim Hahn <jrh3@att.com> | 2019-06-24 12:54:43 -0400 |
commit | b52c7f21f7defaeaf86ff3921fe7bc18670ce2c1 (patch) | |
tree | 2c658433bf5a26cfd05e95feb9994f197662e94b /integrity-monitor/src | |
parent | d6aa3faba917b45e01f5001fe3a768feddedc798 (diff) |
Fix more sonar issues in Integrity Audit & Monitor
Removed duplicate code in DbDao by refactoring common code
into a new updateIae() method.
Removed duplicate code in IntegrityMonitor by refactoring common code
into a new withinTransaction() method.
Removed duplicate code in StateManagementEntity, StateElement by
replacing with lombok Getter & Setter annotations.
Removed duplicate code in StateManagement by refactoring common code
into new setState() and getState() methods. Also removed
logger.isDebugEnabled() tests.
Added coverage for StateChangeNotifier.
Change-Id: I2e29b836dafc5de569a2267206a6a34105e44021
Issue-ID: POLICY-1791
Signed-off-by: Jim Hahn <jrh3@att.com>
Diffstat (limited to 'integrity-monitor/src')
5 files changed, 377 insertions, 898 deletions
diff --git a/integrity-monitor/src/main/java/org/onap/policy/common/im/IntegrityMonitor.java b/integrity-monitor/src/main/java/org/onap/policy/common/im/IntegrityMonitor.java index 68334e83..9a553dc8 100644 --- a/integrity-monitor/src/main/java/org/onap/policy/common/im/IntegrityMonitor.java +++ b/integrity-monitor/src/main/java/org/onap/policy/common/im/IntegrityMonitor.java @@ -29,7 +29,9 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Properties; +import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; +import java.util.function.Supplier; import javax.management.JMX; import javax.management.MBeanServerConnection; import javax.persistence.EntityManager; @@ -221,7 +223,7 @@ public class IntegrityMonitor { validateProperties(properties); // construct jmx url - String jmxUrl = getJmxUrl(); + String jmxUrl = getJmxUrlFromProps(); // // Create the entity manager factory @@ -433,7 +435,7 @@ public class IntegrityMonitor { logger.debug("deleteInstance() exit"); } - private static String getJmxUrl() throws IntegrityMonitorException { + private static String getJmxUrlFromProps() throws IntegrityMonitorException { // get the jmx remote port and construct the JMX URL Properties systemProps = System.getProperties(); @@ -520,53 +522,40 @@ public class IntegrityMonitor { * message is set then the evaluateSanity will return an error. * * @param dep the dependency + * @return {@code null} if success, an error message otherwise */ public String stateCheck(String dep) { logger.debug("checking state of dependent resource: {}", dep); - String errorMsg = null; - ForwardProgressEntity forwardProgressEntity = null; - StateManagementEntity stateManagementEntity = null; + AtomicReference<ForwardProgressEntity> forwardProgressEntity = new AtomicReference<>(); + AtomicReference<StateManagementEntity> stateManagementEntity = new AtomicReference<>(); - // Start a transaction - EntityTransaction et = em.getTransaction(); - et.begin(); + String errorMsg = + withinTransaction(dep + ": ForwardProgressEntity DB operation failed with exception: ", () -> { + Query query = em.createQuery( + "Select p from ForwardProgressEntity p where p.resourceName=:resource"); + query.setParameter(LC_RESOURCE_STRING, dep); - try { - Query query = em.createQuery("Select p from ForwardProgressEntity p where p.resourceName=:resource"); - query.setParameter(LC_RESOURCE_STRING, dep); + @SuppressWarnings("rawtypes") + List fpList = query.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT) + .getResultList(); - @SuppressWarnings("rawtypes") - List fpList = query.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList(); + if (!fpList.isEmpty()) { + // exists + forwardProgressEntity.set((ForwardProgressEntity) fpList.get(0)); + // refresh the object from DB in case cached data was + // returned + em.refresh(forwardProgressEntity.get()); + logger.debug("Found entry in ForwardProgressEntity table for dependent Resource={}", dep); + return null; - if (!fpList.isEmpty()) { - // exists - forwardProgressEntity = (ForwardProgressEntity) fpList.get(0); - // refresh the object from DB in case cached data was returned - em.refresh(forwardProgressEntity); - logger.debug("Found entry in ForwardProgressEntity table for dependent Resource={}", dep); - } else { - errorMsg = dep + ": resource not found in ForwardProgressEntity database table"; - logger.error("{}", errorMsg); - } - synchronized (imFlushLock) { - et.commit(); - } - } catch (Exception ex) { - // log an error - errorMsg = dep + ": ForwardProgressEntity DB operation failed with exception: "; - logger.error("{}", errorMsg, ex); - synchronized (imFlushLock) { - if (et.isActive()) { - et.rollback(); + } else { + return dep + ": resource not found in ForwardProgressEntity database table"; } - } - } + }); if (errorMsg == null) { - // Start a transaction - et = em.getTransaction(); - et.begin(); - try { + errorMsg = withinTransaction(dep + ": StateManagementEntity DB read failed with exception: ", () -> { + // query if StateManagement entry exists for dependent resource Query query = em.createQuery("Select p from StateManagementEntity p where p.resourceName=:resource"); query.setParameter(LC_RESOURCE_STRING, dep); @@ -575,39 +564,26 @@ public class IntegrityMonitor { List smList = query.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList(); if (!smList.isEmpty()) { // exist - stateManagementEntity = (StateManagementEntity) smList.get(0); + stateManagementEntity.set((StateManagementEntity) smList.get(0)); // refresh the object from DB in case cached data was // returned - em.refresh(stateManagementEntity); + em.refresh(stateManagementEntity.get()); logger.debug("Found entry in StateManagementEntity table for dependent Resource={}", dep); + return null; } else { - errorMsg = dep + ": resource not found in state management entity database table"; - logger.error("{}", errorMsg); - } - - synchronized (imFlushLock) { - et.commit(); + return dep + ": resource not found in state management entity database table"; } - } catch (Exception e) { - // log an error - errorMsg = dep + ": StateManagementEntity DB read failed with exception: "; - logger.error("{}", errorMsg, e); - synchronized (imFlushLock) { - if (et.isActive()) { - et.rollback(); - } - } - } + }); } // verify that the ForwardProgress is current (check last_updated) if (errorMsg == null) { - checkForwardProgress(dep, forwardProgressEntity, stateManagementEntity); + checkForwardProgress(dep, forwardProgressEntity.get(), stateManagementEntity.get()); } // check operation, admin and standby states of dependent resource if (errorMsg == null) { - errorMsg = checkDependentStates(dep, stateManagementEntity); + errorMsg = checkDependentStates(dep, stateManagementEntity.get()); } String returnMsg = "IntegrityMonitor.stateCheck(): returned error_msg: " + errorMsg; @@ -615,6 +591,44 @@ public class IntegrityMonitor { return errorMsg; } + /** + * Runs an action within a transaction. + * + * @param exMsg message to log and return if an exception occurs + * @param action action to apply; returns non-null if an error occurs + * @return {@code null} if success, or an error message otherwise + */ + private String withinTransaction(String exMsg, Supplier<String> action) { + String errorMsg = null; + + // Start a transaction + EntityTransaction et = em.getTransaction(); + et.begin(); + + try { + errorMsg = action.get(); + if (errorMsg != null) { + logger.error("{}", errorMsg); + } + + synchronized (imFlushLock) { + et.commit(); + } + + } catch (RuntimeException ex) { + // log an error + errorMsg = exMsg; + logger.error("{}", errorMsg, ex); + synchronized (imFlushLock) { + if (et.isActive()) { + et.rollback(); + } + } + } + + return errorMsg; + } + private void checkForwardProgress(String dep, ForwardProgressEntity forwardProgressEntity, StateManagementEntity stateManagementEntity) { if (forwardProgressEntity != null && stateManagementEntity != null) { @@ -672,58 +686,39 @@ public class IntegrityMonitor { private String fpCheck(String dep) { logger.debug("checking forward progress count of dependent resource: {}", dep); - String errorMsg = null; - - // check FPC count - a changing FPC count indicates the resource JVM is - // running - - // Start a transaction - EntityTransaction et = em.getTransaction(); - et.begin(); - try { - Query fquery = em.createQuery(QUERY_STRING); - fquery.setParameter("rn", dep); + return withinTransaction(dep + ": ForwardProgressEntity DB read failed with exception: ", () -> fpCheck2(dep)); + } - @SuppressWarnings("rawtypes") - List fpList = fquery.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList(); - ForwardProgressEntity fpx; - if (!fpList.isEmpty()) { - // ignores multiple results - fpx = (ForwardProgressEntity) fpList.get(0); - // refresh the object from DB in case cached data was returned - em.refresh(fpx); - if (logger.isDebugEnabled()) { - logger.debug("Dependent resource {} - fpc= {}, lastUpdated={}", dep, fpx.getFpcCount(), - fpx.getLastUpdated()); - } - long currTime = MonitorTime.getInstance().getMillis(); - // if dependent resource FPC has not been updated, consider it - // an error - if ((currTime - fpx.getLastUpdated().getTime()) > maxFpcUpdateIntervalMs) { - errorMsg = dep + ": FP count has not been updated in the last " + maxFpcUpdateIntervalMs + "ms"; - logger.error("{}", errorMsg); - disableEntity(dep); - } - } else { - // resource entry not found in FPC table - errorMsg = dep + ": resource not found in ForwardProgressEntity table in the DB"; - logger.error("{}", errorMsg); - } - synchronized (imFlushLock) { - et.commit(); + private String fpCheck2(String dep) { + Query fquery = em.createQuery(QUERY_STRING); + fquery.setParameter("rn", dep); + + @SuppressWarnings("rawtypes") + List fpList = fquery.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList(); + ForwardProgressEntity fpx; + if (!fpList.isEmpty()) { + // ignores multiple results + fpx = (ForwardProgressEntity) fpList.get(0); + // refresh the object from DB in case cached data was returned + em.refresh(fpx); + if (logger.isDebugEnabled()) { + logger.debug("Dependent resource {} - fpc= {}, lastUpdated={}", dep, fpx.getFpcCount(), + fpx.getLastUpdated()); } - } catch (Exception e) { - // log an error and continue - errorMsg = dep + ": ForwardProgressEntity DB read failed with exception: "; - logger.error("{}", errorMsg, e); - synchronized (imFlushLock) { - if (et.isActive()) { - et.rollback(); - } + long currTime = MonitorTime.getInstance().getMillis(); + // if dependent resource FPC has not been updated, consider it + // an error + if ((currTime - fpx.getLastUpdated().getTime()) > maxFpcUpdateIntervalMs) { + disableEntity(dep); + return dep + ": FP count has not been updated in the last " + maxFpcUpdateIntervalMs + "ms"; } - } - return errorMsg; + return null; + + } else { + // resource entry not found in FPC table + return dep + ": resource not found in ForwardProgressEntity table in the DB"; + } } /** @@ -731,113 +726,101 @@ public class IntegrityMonitor { * * @return list of all forward progress entities */ + @SuppressWarnings("unchecked") public List<ForwardProgressEntity> getAllForwardProgressEntity() { logger.debug("getAllForwardProgressEntity: entry"); + ArrayList<ForwardProgressEntity> fpList = new ArrayList<>(); - // Start a transaction - EntityTransaction et = em.getTransaction(); - et.begin(); - try { + + withinTransaction("getAllForwardProgessEntity DB read failed with exception: ", () -> { Query fquery = em.createQuery("Select e from ForwardProgressEntity e"); - @SuppressWarnings("rawtypes") - List myList = fquery.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList(); - synchronized (imFlushLock) { - et.commit(); - } - logger.debug("getAllForwardProgressEntity: myList.size(): {}", myList.size()); - for (int i = 0; i < myList.size(); i++) { - if (logger.isDebugEnabled()) { - logger.debug("getAllForwardProgressEntity: myList.get({}).getResourceName(): {}", i, - ((ForwardProgressEntity) myList.get(i)).getResourceName()); - } - fpList.add((ForwardProgressEntity) myList.get(i)); - } - synchronized (imFlushLock) { - if (et.isActive()) { - et.commit(); - } - } - } catch (Exception e) { - // log an error and continue - String msg = "getAllForwardProgessEntity DB read failed with exception: "; - logger.error("{}", msg, e); - synchronized (imFlushLock) { - if (et.isActive()) { - et.rollback(); - } - } + fquery.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList() + .forEach(obj -> fpList.add((ForwardProgressEntity) obj)); + return null; + }); + + if (!logger.isDebugEnabled()) { + return fpList; + } + + logger.debug("getAllForwardProgressEntity: fpList.size(): {}", fpList.size()); + int index = 0; + for (ForwardProgressEntity fpe : fpList) { + logger.debug("getAllForwardProgressEntity: fpList.get({}).getResourceName(): {}", index++, + fpe.getResourceName()); } + return fpList; } private String jmxCheck(String dep) { logger.debug("checking health of dependent by calling test() via JMX on resource: {}", dep); - String errorMsg = null; - // get the JMX URL from the database - String jmxUrl = null; - // Start a transaction - EntityTransaction et = em.getTransaction(); - et.begin(); - try { - // query if ResourceRegistration entry exists for resourceName - Query rquery = em.createQuery("Select r from ResourceRegistrationEntity r where r.resourceName=:rn"); - rquery.setParameter("rn", dep); + AtomicReference<String> jmxUrl = new AtomicReference<>(); - @SuppressWarnings("rawtypes") - List rrList = rquery.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList(); - ResourceRegistrationEntity rrx = null; + String errorMsg = + withinTransaction(dep + ": ResourceRegistrationEntity DB read failed with exception: ", + () -> getJmxUrlFromDb(dep, jmxUrl)); - if (!rrList.isEmpty()) { - // ignores multiple results - rrx = (ResourceRegistrationEntity) rrList.get(0); - // refresh the object from DB in case cached data was returned - em.refresh(rrx); - jmxUrl = rrx.getResourceUrl(); - if (logger.isDebugEnabled()) { - logger.debug("Dependent Resource={}, url={}, createdDate={}", dep, jmxUrl, rrx.getCreatedDate()); - } - } else { - errorMsg = dep + ": resource not found in ResourceRegistrationEntity table in the DB"; - logger.error("{}", errorMsg); - } + if (jmxUrl.get() != null) { + errorMsg = jmxCheck2(dep, jmxUrl.get(), errorMsg); + } - synchronized (imFlushLock) { - et.commit(); - } - } catch (Exception e) { - errorMsg = dep + ": ResourceRegistrationEntity DB read failed with exception: "; - logger.error("{}", errorMsg, e); - synchronized (imFlushLock) { - if (et.isActive()) { - et.rollback(); - } + return errorMsg; + } + + private String getJmxUrlFromDb(String dep, AtomicReference<String> jmxUrl) { + // query if ResourceRegistration entry exists for resourceName + Query rquery = em.createQuery( + "Select r from ResourceRegistrationEntity r where r.resourceName=:rn"); + rquery.setParameter("rn", dep); + + @SuppressWarnings("rawtypes") + List rrList = rquery.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT) + .getResultList(); + ResourceRegistrationEntity rrx = null; + + if (!rrList.isEmpty()) { + // ignores multiple results + rrx = (ResourceRegistrationEntity) rrList.get(0); + // refresh the object from DB in case cached data was + // returned + em.refresh(rrx); + jmxUrl.set(rrx.getResourceUrl()); + if (logger.isDebugEnabled()) { + logger.debug("Dependent Resource={}, url={}, createdDate={}", dep, jmxUrl.get(), + rrx.getCreatedDate()); } + + return null; + + } else { + return dep + ": resource not found in ResourceRegistrationEntity table in the DB"; } + } - if (jmxUrl != null) { - JmxAgentConnection jmxAgentConnection = null; - try { - jmxAgentConnection = new JmxAgentConnection(jmxUrl); - MBeanServerConnection mbeanServer = jmxAgentConnection.getMBeanConnection(); - ComponentAdminMBean admin = - JMX.newMXBeanProxy(mbeanServer, ComponentAdmin.getObjectName(dep), ComponentAdminMBean.class); - - // invoke the test method via the jmx proxy - admin.test(); - logger.debug("Dependent resource {} sanity test passed", dep); - } catch (Exception e) { - errorMsg = dep + ": resource sanity test failed with exception: "; - logger.error("{}", errorMsg, e); - } finally { - // close the JMX connector - if (jmxAgentConnection != null) { - jmxAgentConnection.disconnect(); - } + private String jmxCheck2(String dep, String jmxUrl, String errorMsg) { + JmxAgentConnection jmxAgentConnection = null; + try { + jmxAgentConnection = new JmxAgentConnection(jmxUrl); + MBeanServerConnection mbeanServer = jmxAgentConnection.getMBeanConnection(); + ComponentAdminMBean admin = + JMX.newMXBeanProxy(mbeanServer, ComponentAdmin.getObjectName(dep), ComponentAdminMBean.class); + + // invoke the test method via the jmx proxy + admin.test(); + logger.debug("Dependent resource {} sanity test passed", dep); + } catch (Exception e) { + String errorMsg2 = dep + ": resource sanity test failed with exception: "; + logger.error("{}", errorMsg2, e); + return errorMsg2; + } finally { + // close the JMX connector + if (jmxAgentConnection != null) { + jmxAgentConnection.disconnect(); } } - return errorMsg; } diff --git a/integrity-monitor/src/main/java/org/onap/policy/common/im/StateElement.java b/integrity-monitor/src/main/java/org/onap/policy/common/im/StateElement.java index 030a0371..73724b30 100644 --- a/integrity-monitor/src/main/java/org/onap/policy/common/im/StateElement.java +++ b/integrity-monitor/src/main/java/org/onap/policy/common/im/StateElement.java @@ -2,14 +2,14 @@ * ============LICENSE_START======================================================= * Integrity Monitor * ================================================================================ - * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -20,9 +20,13 @@ package org.onap.policy.common.im; +import lombok.Getter; +import lombok.Setter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Getter +@Setter public class StateElement { private static final Logger logger = LoggerFactory.getLogger(StateElement.class); @@ -41,86 +45,6 @@ public class StateElement { // Empty constructor } - public String getAdminState() { - return this.adminState; - } - - public void setAdminState(String adminState) { - this.adminState = adminState; - } - - public String getOpState() { - return this.opState; - } - - public void setOpState(String opState) { - this.opState = opState; - } - - public String getAvailStatus() { - return this.availStatus; - } - - public void setAvailStatus(String availStatus) { - this.availStatus = availStatus; - } - - public String getStandbyStatus() { - return this.standbyStatus; - } - - public void setStandbyStatus(String standbyStatus) { - this.standbyStatus = standbyStatus; - } - - public String getActionName() { - return this.actionName; - } - - public void setActionName(String actionName) { - this.actionName = actionName; - } - - public String getEndingAdminState() { - return this.endingAdminState; - } - - public void setEndingAdminState(String endingAdminState) { - this.endingAdminState = endingAdminState; - } - - public String getEndingOpState() { - return this.endingOpState; - } - - public void setEndingOpState(String endingOpState) { - this.endingOpState = endingOpState; - } - - public String getEndingAvailStatus() { - return this.endingAvailStatus; - } - - public void setEndingAvailStatus(String endingAvailStatus) { - this.endingAvailStatus = endingAvailStatus; - } - - public String getEndingStandbyStatus() { - return this.endingStandbyStatus; - } - - public void setEndingStandbyStatus(String endingStandbyStatus) { - this.endingStandbyStatus = endingStandbyStatus; - } - - public String getException() { - return this.exception; - } - - public void setException(String exception) { - this.exception = exception; - } - /** * Display the state element. */ diff --git a/integrity-monitor/src/main/java/org/onap/policy/common/im/StateManagement.java b/integrity-monitor/src/main/java/org/onap/policy/common/im/StateManagement.java index c5f9d7bc..575f8d01 100644 --- a/integrity-monitor/src/main/java/org/onap/policy/common/im/StateManagement.java +++ b/integrity-monitor/src/main/java/org/onap/policy/common/im/StateManagement.java @@ -22,6 +22,8 @@ package org.onap.policy.common.im; import java.util.List; import java.util.Observable; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Consumer; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.FlushModeType; @@ -103,44 +105,14 @@ public class StateManagement extends Observable { public StateManagement(final EntityManagerFactory entityManagerFactory, final String resourceName) throws StateManagementException { emf = entityManagerFactory; - if (logger.isDebugEnabled()) { - logger.debug("StateManagement: constructor, resourceName: {}", resourceName); - } - - final EntityManager em = emf.createEntityManager(); - try (EntityMgrCloser emc = new EntityMgrCloser(em); MyTransaction et = new MyTransaction(em)) { - - this.resourceName = resourceName; - if (logger.isDebugEnabled()) { - logger.debug("resourceName = {}", this.resourceName); - } - - - try { - // Create a StateManagementEntity object - if (logger.isDebugEnabled()) { - logger.debug(FIND_MESSAGE, this.resourceName); - } - final StateManagementEntity sm = findStateManagementEntity(em, this.resourceName); + logger.debug("StateManagement: constructor, resourceName: {}", resourceName); - // persist the administrative state - if (logger.isDebugEnabled()) { - logger.debug("Persist adminstrative state, resourceName = {}", this.resourceName); - } - em.persist(sm); - et.commit(); + this.resourceName = resourceName; - // Load the StateTransition hash table - st = new StateTransition(); + setState("StateManagement", this.resourceName, sm -> null); - if (logger.isDebugEnabled()) { - logger.debug("StateManagement: constructor end, resourceName: {}", this.resourceName); - } - } catch (final Exception ex) { - logger.error("StateManagement: constructor caught unexpected exception: ", ex); - throw new StateManagementException("StateManagement: Exception: " + ex.toString(), ex); - } - } + // Load the StateTransition hash table + st = new StateTransition(); } /** @@ -150,84 +122,81 @@ public class StateManagement extends Observable { * and the owning application will set the StandbyStatus. */ public void initializeState() throws StateManagementException { + setState("initializeState", this.resourceName, sm -> { + sm.setAdminState(sm.getAdminState()); // preserve the Admin state + sm.setOpState(StateManagement.ENABLED); + sm.setAvailStatus(StateManagement.NULL_VALUE); + sm.setStandbyStatus(StateManagement.NULL_VALUE); + return ADMIN_STATE; + }); + } + + /** + * Sets the management entity state. + * + * @param methodName name of the method that invoked this + * @param resourceName resource name of the desired entity + * @param updateState function to update the state; returns a string indicating which item + * was updated, {@code null} if no change was made + * @throws StateManagementException if an error occurs + */ + private void setState(String methodName, String resourceName, ExFunction<StateManagementEntity,String> updateState) + throws StateManagementException { + synchronized (SYNCLOCK) { - if (logger.isDebugEnabled()) { - logger.debug("\nStateManagement: SYNCLOCK initializeState() operation for resourceName = {}\n", - this.resourceName); - logger.debug("StateManagement: initializeState() operation started, resourceName = {}", - this.resourceName); - } + logger.debug("\nStateManagement: SYNCLOCK {}() operation for resourceName = {}\n", methodName, + resourceName); + logger.debug("StateManagement: {}() operation started, resourceName = {}", methodName, resourceName); + final EntityManager em = emf.createEntityManager(); try (EntityMgrCloser emc = new EntityMgrCloser(em); MyTransaction et = new MyTransaction(em)) { - if (logger.isDebugEnabled()) { - logger.debug(FIND_MESSAGE, this.resourceName); - } - final StateManagementEntity sm = findStateManagementEntity(em, this.resourceName); - // set state - sm.setAdminState(sm.getAdminState()); // preserve the Admin state - sm.setOpState(StateManagement.ENABLED); - sm.setAvailStatus(StateManagement.NULL_VALUE); - sm.setStandbyStatus(StateManagement.NULL_VALUE); + logger.debug(FIND_MESSAGE, resourceName); + + final StateManagementEntity sm = findStateManagementEntity(em, resourceName); + String changed = updateState.update(sm); em.persist(sm); et.commit(); - setChanged(); - notifyObservers(ADMIN_STATE); - if (logger.isDebugEnabled()) { - logger.debug("StateManagement: initializeState() operation completed, resourceName = {}", - this.resourceName); + if (changed != null) { + setChanged(); + notifyObservers(changed); } + + logger.debug("StateManagement: {}() operation completed, resourceName = {}", + methodName, resourceName); } catch (final Exception ex) { - logger.error("StateManagement.initializeState() caught unexpected exception: ", ex); - throw new StateManagementException("StateManagement.initializeState() Exception: " + ex); + logger.error("StateManagement.{}() caught unexpected exception: ", methodName, ex); + throw new StateManagementException("StateManagement." + methodName + "() Exception: " + ex); } } } + private void setStateUsingTable(String actionName, String resourceName, String changeName) + throws StateManagementException { + + setState(actionName, resourceName, sm -> { + final StateElement stateElement = st.getEndingState(sm.getAdminState(), sm.getOpState(), + sm.getAvailStatus(), sm.getStandbyStatus(), actionName); + + sm.setAdminState(stateElement.getEndingAdminState()); + sm.setOpState(stateElement.getEndingOpState()); + sm.setAvailStatus(stateElement.getEndingAvailStatus()); + sm.setStandbyStatus(stateElement.getEndingStandbyStatus()); + + return changeName; + }); + } + /** * lock() changes the administrative state to locked. * * @throws StateManagementException if an error occurs */ public void lock() throws StateManagementException { - synchronized (SYNCLOCK) { - if (logger.isDebugEnabled()) { - logger.debug("\nStateManagement: SYNCLOCK lock() operation for resourceName = {}\n", this.resourceName); - logger.debug("StateManagement: lock() operation started, resourceName = {}", this.resourceName); - } - final EntityManager em = emf.createEntityManager(); - - try (EntityMgrCloser emc = new EntityMgrCloser(em); MyTransaction et = new MyTransaction(em)) { - - if (logger.isDebugEnabled()) { - logger.debug(FIND_MESSAGE, this.resourceName); - } - final StateManagementEntity sm = findStateManagementEntity(em, this.resourceName); - - final StateElement stateElement = st.getEndingState(sm.getAdminState(), sm.getOpState(), - sm.getAvailStatus(), sm.getStandbyStatus(), LOCK); - - sm.setAdminState(stateElement.getEndingAdminState()); - sm.setOpState(stateElement.getEndingOpState()); - sm.setAvailStatus(stateElement.getEndingAvailStatus()); - sm.setStandbyStatus(stateElement.getEndingStandbyStatus()); - - em.persist(sm); - et.commit(); - setChanged(); - notifyObservers(ADMIN_STATE); - - if (logger.isDebugEnabled()) { - logger.debug("StateManagement: lock() operation completed, resourceName = {}", this.resourceName); - } - } catch (final Exception ex) { - logger.error("StateManagement.lock() caught unexpected exception: ", ex); - throw new StateManagementException("StateManagement.lock() Exception: " + ex.toString()); - } - } + setStateUsingTable(LOCK, this.resourceName, ADMIN_STATE); } /** @@ -236,41 +205,7 @@ public class StateManagement extends Observable { * @throws StateManagementException if an error occurs */ public void unlock() throws StateManagementException { - synchronized (SYNCLOCK) { - if (logger.isDebugEnabled()) { - logger.debug("\nStateManagement: SYNCLOCK unlock() operation for resourceName = {}\n", - this.resourceName); - logger.debug("StateManagement: unlock() operation started, resourceName = {}", this.resourceName); - } - final EntityManager em = emf.createEntityManager(); - - try (EntityMgrCloser emc = new EntityMgrCloser(em); MyTransaction et = new MyTransaction(em)) { - - if (logger.isDebugEnabled()) { - logger.debug(FIND_MESSAGE, this.resourceName); - } - final StateManagementEntity sm = findStateManagementEntity(em, this.resourceName); - final StateElement stateElement = st.getEndingState(sm.getAdminState(), sm.getOpState(), - sm.getAvailStatus(), sm.getStandbyStatus(), UNLOCK); - // set transition state - sm.setAdminState(stateElement.getEndingAdminState()); - sm.setOpState(stateElement.getEndingOpState()); - sm.setAvailStatus(stateElement.getEndingAvailStatus()); - sm.setStandbyStatus(stateElement.getEndingStandbyStatus()); - - em.persist(sm); - et.commit(); - setChanged(); - notifyObservers(ADMIN_STATE); - - if (logger.isDebugEnabled()) { - logger.debug("StateManagement: unlock() operation completed, resourceName = {}", this.resourceName); - } - } catch (final Exception ex) { - logger.error("StateManagement.unlock() caught unexpected exception: ", ex); - throw new StateManagementException("StateManagement.unlock() Exception: " + ex); - } - } + setStateUsingTable(UNLOCK, this.resourceName, ADMIN_STATE); } /** @@ -280,44 +215,7 @@ public class StateManagement extends Observable { * @throws StateManagementException if an error occurs */ public void enableNotFailed() throws StateManagementException { - synchronized (SYNCLOCK) { - if (logger.isDebugEnabled()) { - logger.debug("\nStateManagement: SYNCLOCK enabledNotFailed() operation for resourceName = {}\n", - this.resourceName); - logger.debug("StateManagement: enableNotFailed() operation started, resourceName = {}", - this.resourceName); - } - final EntityManager em = emf.createEntityManager(); - - try (EntityMgrCloser emc = new EntityMgrCloser(em); MyTransaction et = new MyTransaction(em)) { - - if (logger.isDebugEnabled()) { - logger.debug(FIND_MESSAGE, this.resourceName); - } - final StateManagementEntity sm = findStateManagementEntity(em, this.resourceName); - final StateElement stateElement = st.getEndingState(sm.getAdminState(), sm.getOpState(), - sm.getAvailStatus(), sm.getStandbyStatus(), ENABLE_NOT_FAILED); - // set transition state - sm.setAdminState(stateElement.getEndingAdminState()); - sm.setOpState(stateElement.getEndingOpState()); - sm.setAvailStatus(stateElement.getEndingAvailStatus()); - sm.setStandbyStatus(stateElement.getEndingStandbyStatus()); - - em.persist(sm); - et.commit(); - - setChanged(); - notifyObservers(OPERATION_STATE); - - if (logger.isDebugEnabled()) { - logger.debug("StateManagement enableNotFailed() operation completed, resourceName = {}", - this.resourceName); - } - } catch (final Exception ex) { - logger.error("StateManagement.enableNotFailed() caught unexpected exception: ", ex); - throw new StateManagementException("StateManagement.enableNotFailed() Exception: " + ex); - } - } + setStateUsingTable(ENABLE_NOT_FAILED, this.resourceName, OPERATION_STATE); } /** @@ -327,43 +225,7 @@ public class StateManagement extends Observable { * @throws StateManagementException if an error occurs */ public void disableFailed() throws StateManagementException { - synchronized (SYNCLOCK) { - if (logger.isDebugEnabled()) { - logger.debug("\nStateManagement: SYNCLOCK disabledFailed() operation for resourceName = {}\n", - this.resourceName); - logger.debug("StateManagement: disableFailed() operation started, resourceName = {}", - this.resourceName); - } - final EntityManager em = emf.createEntityManager(); - - try (EntityMgrCloser emc = new EntityMgrCloser(em); MyTransaction et = new MyTransaction(em)) { - - if (logger.isDebugEnabled()) { - logger.debug(FIND_MESSAGE, this.resourceName); - } - final StateManagementEntity sm = findStateManagementEntity(em, this.resourceName); - final StateElement stateElement = st.getEndingState(sm.getAdminState(), sm.getOpState(), - sm.getAvailStatus(), sm.getStandbyStatus(), DISABLE_FAILED); - // set transition state - sm.setAdminState(stateElement.getEndingAdminState()); - sm.setOpState(stateElement.getEndingOpState()); - sm.setAvailStatus(stateElement.getEndingAvailStatus()); - sm.setStandbyStatus(stateElement.getEndingStandbyStatus()); - - em.persist(sm); - et.commit(); - setChanged(); - notifyObservers(OPERATION_STATE); - - if (logger.isDebugEnabled()) { - logger.debug("StateManagement: disableFailed() operation completed, resourceName = {}", - this.resourceName); - } - } catch (final Exception ex) { - logger.error("StateManagement.disableFailed() caught unexpected exception: ", ex); - throw new StateManagementException("StateManagement.disableFailed() Exception: " + ex); - } - } + setStateUsingTable(DISABLE_FAILED, this.resourceName, OPERATION_STATE); } /** @@ -373,49 +235,13 @@ public class StateManagement extends Observable { * @throws StateManagementException if an error occurs */ public void disableFailed(final String otherResourceName) throws StateManagementException { - synchronized (SYNCLOCK) { - if (otherResourceName == null) { - logger.error("\nStateManagement: SYNCLOCK disableFailed(otherResourceName) operation: resourceName is " - + "NULL.\n"); - return; - } - if (logger.isDebugEnabled()) { - logger.debug("\nStateManagement: SYNCLOCK disabledFailed(otherResourceName) operation for resourceName " - + "= {}\n", otherResourceName); - logger.debug("StateManagement: disableFailed(otherResourceName) operation started, resourceName = {}", - otherResourceName); - } - final EntityManager em = emf.createEntityManager(); - - try (EntityMgrCloser emc = new EntityMgrCloser(em); MyTransaction et = new MyTransaction(em)) { - - if (logger.isDebugEnabled()) { - logger.debug(FIND_MESSAGE, otherResourceName); - } - final StateManagementEntity sm = findStateManagementEntity(em, otherResourceName); - final StateElement stateElement = st.getEndingState(sm.getAdminState(), sm.getOpState(), - sm.getAvailStatus(), sm.getStandbyStatus(), DISABLE_FAILED); - // set transition state - sm.setAdminState(stateElement.getEndingAdminState()); - sm.setOpState(stateElement.getEndingOpState()); - sm.setAvailStatus(stateElement.getEndingAvailStatus()); - sm.setStandbyStatus(stateElement.getEndingStandbyStatus()); - - em.persist(sm); - et.commit(); - setChanged(); - notifyObservers(OPERATION_STATE); - - if (logger.isDebugEnabled()) { - logger.debug( - "StateManagement: disableFailed(otherResourceName) operation completed, resourceName = {}", - otherResourceName); - } - } catch (final Exception ex) { - logger.error("StateManagement.disableFailed(otherResourceName) caught unexpected exception: ", ex); - throw new StateManagementException("StateManagement.disableFailed(otherResourceName) Exception: " + ex); - } + if (otherResourceName == null) { + logger.error( + "\nStateManagement: SYNCLOCK disableFailed(otherResourceName) operation: resourceName is NULL.\n"); + return; } + + setStateUsingTable(DISABLE_FAILED, otherResourceName, OPERATION_STATE); } /** @@ -425,43 +251,7 @@ public class StateManagement extends Observable { * @throws StateManagementException if an error occurs */ public void disableDependency() throws StateManagementException { - synchronized (SYNCLOCK) { - if (logger.isDebugEnabled()) { - logger.debug("\nStateManagement: SYNCLOCK disableDependency() operation for resourceName = {}\n", - this.resourceName); - logger.debug("StateManagement: disableDependency() operation started, resourceName = {}", - this.resourceName); - } - final EntityManager em = emf.createEntityManager(); - - try (EntityMgrCloser emc = new EntityMgrCloser(em); MyTransaction et = new MyTransaction(em)) { - - if (logger.isDebugEnabled()) { - logger.debug(FIND_MESSAGE, this.resourceName); - } - final StateManagementEntity sm = findStateManagementEntity(em, this.resourceName); - final StateElement stateElement = st.getEndingState(sm.getAdminState(), sm.getOpState(), - sm.getAvailStatus(), sm.getStandbyStatus(), DISABLE_DEPENDENCY); - // set transition state - sm.setAdminState(stateElement.getEndingAdminState()); - sm.setOpState(stateElement.getEndingOpState()); - sm.setAvailStatus(stateElement.getEndingAvailStatus()); - sm.setStandbyStatus(stateElement.getEndingStandbyStatus()); - - em.persist(sm); - et.commit(); - setChanged(); - notifyObservers(OPERATION_STATE); - - if (logger.isDebugEnabled()) { - logger.debug("StateManagement: disableDependency() operation completed, resourceName = {}", - this.resourceName); - } - } catch (final Exception ex) { - logger.error("StateManagement.disableDependency() caught unexpected exception: ", ex); - throw new StateManagementException("StateManagement.disableDependency() Exception: " + ex); - } - } + setStateUsingTable(DISABLE_DEPENDENCY, this.resourceName, OPERATION_STATE); } /** @@ -471,43 +261,7 @@ public class StateManagement extends Observable { * @throws StateManagementException if an error occurs */ public void enableNoDependency() throws StateManagementException { - synchronized (SYNCLOCK) { - if (logger.isDebugEnabled()) { - logger.debug("\nStateManagement: SYNCLOCK enableNoDependency() operation for resourceName = {}\n", - this.resourceName); - logger.debug("StateManagement: enableNoDependency() operation started, resourceName = {}", - this.resourceName); - } - final EntityManager em = emf.createEntityManager(); - - try (EntityMgrCloser emc = new EntityMgrCloser(em); MyTransaction et = new MyTransaction(em)) { - - if (logger.isDebugEnabled()) { - logger.debug(FIND_MESSAGE, this.resourceName); - } - final StateManagementEntity sm = findStateManagementEntity(em, this.resourceName); - final StateElement stateElement = st.getEndingState(sm.getAdminState(), sm.getOpState(), - sm.getAvailStatus(), sm.getStandbyStatus(), ENABLE_NO_DEPENDENCY); - // set transition state - sm.setAdminState(stateElement.getEndingAdminState()); - sm.setOpState(stateElement.getEndingOpState()); - sm.setAvailStatus(stateElement.getEndingAvailStatus()); - sm.setStandbyStatus(stateElement.getEndingStandbyStatus()); - - em.persist(sm); - et.commit(); - setChanged(); - notifyObservers(OPERATION_STATE); - - if (logger.isDebugEnabled()) { - logger.debug("StateManagement: enableNoDependency() operation completed, resourceName = {}", - this.resourceName); - } - } catch (final Exception ex) { - logger.error("StateManagement.enableNoDependency() caught unexpected exception: ", ex); - throw new StateManagementException("StateManagement.enableNoDependency() Exception: " + ex); - } - } + setStateUsingTable(ENABLE_NO_DEPENDENCY, this.resourceName, OPERATION_STATE); } /** @@ -516,48 +270,26 @@ public class StateManagement extends Observable { * @throws IntegrityMonitorException if the status fails to change */ public void promote() throws IntegrityMonitorException { - synchronized (SYNCLOCK) { - if (logger.isDebugEnabled()) { - logger.debug("\nStateManagement: SYNCLOCK promote() operation for resourceName = {}\n", - this.resourceName); - logger.debug("StateManagement: promote() operation started, resourceName = {}", this.resourceName); - } + AtomicReference<String> newStatus = new AtomicReference<>(); - StateManagementEntity sm; + setState(PROMOTE, resourceName, sm -> { + final StateElement stateElement = st.getEndingState(sm.getAdminState(), sm.getOpState(), + sm.getAvailStatus(), sm.getStandbyStatus(), PROMOTE); - final EntityManager em = emf.createEntityManager(); + sm.setAdminState(stateElement.getEndingAdminState()); + sm.setOpState(stateElement.getEndingOpState()); + sm.setAvailStatus(stateElement.getEndingAvailStatus()); + sm.setStandbyStatus(stateElement.getEndingStandbyStatus()); - try (EntityMgrCloser emc = new EntityMgrCloser(em); MyTransaction et = new MyTransaction(em)) { - - if (logger.isDebugEnabled()) { - logger.debug(FIND_MESSAGE, this.resourceName); - } - sm = findStateManagementEntity(em, this.resourceName); - final StateElement stateElement = st.getEndingState(sm.getAdminState(), sm.getOpState(), - sm.getAvailStatus(), sm.getStandbyStatus(), PROMOTE); - // set transition state - sm.setAdminState(stateElement.getEndingAdminState()); - sm.setOpState(stateElement.getEndingOpState()); - sm.setAvailStatus(stateElement.getEndingAvailStatus()); - sm.setStandbyStatus(stateElement.getEndingStandbyStatus()); + newStatus.set(sm.getStandbyStatus()); - em.persist(sm); - et.commit(); - setChanged(); - notifyObservers(STANDBY_STATUS); - } catch (final Exception ex) { - logger.error("StateManagement.promote() caught unexpected exception: ", ex); - throw new StateManagementException("StateManagement.promote() Exception: " + ex); - } + return STANDBY_STATUS; + }); - if (logger.isDebugEnabled()) { - logger.debug("StateManagement: promote() operation completed, resourceName = {}", this.resourceName); - } - if (sm.getStandbyStatus().equals(StateManagement.COLD_STANDBY)) { - final String msg = - "Failure to promote " + this.resourceName + " StandbyStatus = " + StateManagement.COLD_STANDBY; - throw new StandbyStatusException(msg); - } + if (StateManagement.COLD_STANDBY.equals(newStatus.get())) { + final String msg = + "Failure to promote " + this.resourceName + " StandbyStatus = " + StateManagement.COLD_STANDBY; + throw new StandbyStatusException(msg); } } @@ -567,42 +299,7 @@ public class StateManagement extends Observable { * @throws StateManagementException if an error occurs */ public void demote() throws StateManagementException { - synchronized (SYNCLOCK) { - if (logger.isDebugEnabled()) { - logger.debug("\nStateManagement: SYNCLOCK demote() operation for resourceName = {}\n", - this.resourceName); - logger.debug("StateManagement: demote() operation started, resourceName = {}", - this.resourceName); - } - final EntityManager em = emf.createEntityManager(); - - try (EntityMgrCloser emc = new EntityMgrCloser(em); MyTransaction et = new MyTransaction(em)) { - - if (logger.isDebugEnabled()) { - logger.debug(FIND_MESSAGE, this.resourceName); - } - final StateManagementEntity sm = findStateManagementEntity(em, this.resourceName); - final StateElement stateElement = st.getEndingState(sm.getAdminState(), sm.getOpState(), - sm.getAvailStatus(), sm.getStandbyStatus(), DEMOTE); - // set transition state - sm.setAdminState(stateElement.getEndingAdminState()); - sm.setOpState(stateElement.getEndingOpState()); - sm.setAvailStatus(stateElement.getEndingAvailStatus()); - sm.setStandbyStatus(stateElement.getEndingStandbyStatus()); - - em.persist(sm); - et.commit(); - setChanged(); - notifyObservers(STANDBY_STATUS); - - if (logger.isDebugEnabled()) { - logger.debug("StateManagement: demote() operation completed, resourceName = {}", this.resourceName); - } - } catch (final Exception ex) { - logger.error("StateManagement.demote() caught unexpected exception: ", ex); - throw new StateManagementException("StateManagement.demote() Exception: " + ex); - } - } + setStateUsingTable(DEMOTE, this.resourceName, STANDBY_STATUS); } /** @@ -615,46 +312,13 @@ public class StateManagement extends Observable { * @throws StateManagementException if an error occurs */ public void demote(final String otherResourceName) throws StateManagementException { - synchronized (SYNCLOCK) { - if (otherResourceName == null) { - logger.error( - "\nStateManagement: SYNCLOCK demote(otherResourceName) operation: resourceName is NULL.\n"); - return; - } - if (logger.isDebugEnabled()) { - logger.debug("\nStateManagement: SYNCLOCK demote(otherResourceName) operation for resourceName = {}\n", - otherResourceName); - } - final EntityManager em = emf.createEntityManager(); - - try (EntityMgrCloser emc = new EntityMgrCloser(em); MyTransaction et = new MyTransaction(em)) { - - if (logger.isDebugEnabled()) { - logger.debug("StateManagement: SYNCLOCK demote(otherResourceName) findStateManagementEntity for {}", - otherResourceName); - } - final StateManagementEntity sm = findStateManagementEntity(em, otherResourceName); - final StateElement stateElement = st.getEndingState(sm.getAdminState(), sm.getOpState(), - sm.getAvailStatus(), sm.getStandbyStatus(), DEMOTE); - // set transition state - sm.setAdminState(stateElement.getEndingAdminState()); - sm.setOpState(stateElement.getEndingOpState()); - sm.setAvailStatus(stateElement.getEndingAvailStatus()); - sm.setStandbyStatus(stateElement.getEndingStandbyStatus()); - - em.persist(sm); - et.commit(); - // We don't notify observers because this is assumed to be a remote resource - - if (logger.isDebugEnabled()) { - logger.debug("StateManagement: demote(otherResourceName) operation completed, resourceName = {}", - otherResourceName); - } - } catch (final Exception ex) { - logger.error("StateManagement.demote(otherResourceName) caught unexpected exception: ", ex); - throw new StateManagementException("StateManagement.demote(otherResourceName) Exception: " + ex); - } + if (otherResourceName == null) { + logger.error( + "\nStateManagement: SYNCLOCK demote(otherResourceName) operation: resourceName is NULL.\n"); + return; } + + setStateUsingTable(DEMOTE, otherResourceName, null); } /** @@ -663,9 +327,16 @@ public class StateManagement extends Observable { * @return the administration state */ public String getAdminState() { - if (logger.isDebugEnabled()) { - logger.debug("StateManagement(6/1/16): getAdminState for resourceName {}", this.resourceName); - } + getEntityState("getAdminState", this.resourceName, + sm -> this.adminState = sm.getAdminState(), + () -> this.adminState = null); + return this.adminState; + } + + private void getEntityState(String methodName, String resourceName, Consumer<StateManagementEntity> function, + Runnable notFound) { + + logger.debug("StateManagement(6/1/16): {} for resourceName {}", methodName, resourceName); final EntityManager em = emf.createEntityManager(); try (final EntityMgrCloser emc = new EntityMgrCloser(em)) { @@ -682,15 +353,14 @@ public class StateManagement extends Observable { final StateManagementEntity stateManagementEntity = resourceList.get(0); // refresh the object from DB in case cached data was returned em.refresh(stateManagementEntity); - this.adminState = stateManagementEntity.getAdminState(); + function.accept(stateManagementEntity); } else { - this.adminState = null; + notFound.run(); } } catch (final Exception ex) { - logger.error("StateManagement: getAdminState exception: {}", ex.toString(), ex); + logger.error("StateManagement: {} exception: {}", methodName, ex.toString(), ex); } - return this.adminState; } /** @@ -699,33 +369,9 @@ public class StateManagement extends Observable { * @return the operational state */ public String getOpState() { - if (logger.isDebugEnabled()) { - logger.debug("StateManagement(6/1/16): getOpState for resourceName {}", this.resourceName); - } - - final EntityManager em = emf.createEntityManager(); - try (EntityMgrCloser emc = new EntityMgrCloser(em)) { - final TypedQuery<StateManagementEntity> query = - em.createQuery(GET_STATE_MANAGEMENT_ENTITY_QUERY, StateManagementEntity.class); - - query.setParameter(RESOURCE_NAME, this.resourceName); - - // Just test that we are retrieving the right object - final List<StateManagementEntity> resourceList = - query.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList(); - if (!resourceList.isEmpty()) { - // exist - final StateManagementEntity stateManagementEntity = resourceList.get(0); - // refresh the object from DB in case cached data was returned - em.refresh(stateManagementEntity); - this.opState = stateManagementEntity.getOpState(); - } else { - this.opState = null; - } - } catch (final Exception ex) { - logger.error("StateManagement: getOpState exception: {}", ex.toString(), ex); - } - + getEntityState("getOpState", this.resourceName, + sm -> this.opState = sm.getOpState(), + () -> this.opState = null); return this.opState; } @@ -735,33 +381,9 @@ public class StateManagement extends Observable { * @return the availability status */ public String getAvailStatus() { - if (logger.isDebugEnabled()) { - logger.debug("StateManagement(6/1/16): getAvailStatus for resourceName {}", this.resourceName); - } - - final EntityManager em = emf.createEntityManager(); - try (EntityMgrCloser emc = new EntityMgrCloser(em)) { - final TypedQuery<StateManagementEntity> query = - em.createQuery(GET_STATE_MANAGEMENT_ENTITY_QUERY, StateManagementEntity.class); - - query.setParameter(RESOURCE_NAME, this.resourceName); - - // Just test that we are retrieving the right object - final List<StateManagementEntity> resourceList = - query.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList(); - if (!resourceList.isEmpty()) { - // exist - final StateManagementEntity stateManagementEntity = resourceList.get(0); - // refresh the object from DB in case cached data was returned - em.refresh(stateManagementEntity); - this.availStatus = stateManagementEntity.getAvailStatus(); - } else { - this.availStatus = null; - } - } catch (final Exception ex) { - logger.error("StateManagement: getAvailStatus exception: {}", ex.toString(), ex); - } - + getEntityState("getAvailStatus", this.resourceName, + sm -> this.availStatus = sm.getAvailStatus(), + () -> this.availStatus = null); return this.availStatus; } @@ -771,33 +393,9 @@ public class StateManagement extends Observable { * @return the standby status */ public String getStandbyStatus() { - if (logger.isDebugEnabled()) { - logger.debug("StateManagement(6/1/16): getStandbyStatus for resourceName {}", this.resourceName); - } - - final EntityManager em = emf.createEntityManager(); - try (EntityMgrCloser emc = new EntityMgrCloser(em)) { - final TypedQuery<StateManagementEntity> query = - em.createQuery(GET_STATE_MANAGEMENT_ENTITY_QUERY, StateManagementEntity.class); - - query.setParameter(RESOURCE_NAME, this.resourceName); - - // Just test that we are retrieving the right object - final List<StateManagementEntity> resourceList = - query.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList(); - if (!resourceList.isEmpty()) { - // exist - final StateManagementEntity stateManagementEntity = resourceList.get(0); - // refresh the object from DB in case cached data was returned - em.refresh(stateManagementEntity); - this.standbyStatus = stateManagementEntity.getStandbyStatus(); - } else { - this.standbyStatus = null; - } - } catch (final Exception ex) { - logger.error("StateManagement: getStandbyStatus exception: {}", ex.toString(), ex); - } - + getEntityState("getStandbyStatus", this.resourceName, + sm -> this.standbyStatus = sm.getStandbyStatus(), + () -> this.standbyStatus = null); return this.standbyStatus; } @@ -808,48 +406,16 @@ public class StateManagement extends Observable { * @return the standby status */ public String getStandbyStatus(final String otherResourceName) { + AtomicReference<String> tempStandbyStatus = new AtomicReference<>(); - if (logger.isDebugEnabled()) { - logger.debug("StateManagement: getStandbyStatus: Entering, resourceName='{}'", otherResourceName); - } + getEntityState("getStandbyStatus", otherResourceName, + sm -> tempStandbyStatus.set(sm.getStandbyStatus()), + () -> logger.error("getStandbyStatus: resourceName ={} not found in statemanagemententity table", + otherResourceName)); - String tempStandbyStatus = null; + logger.debug("getStandbyStatus: Returning standbyStatus={}", tempStandbyStatus.get()); - // The transaction is required for the LockModeType - final EntityManager em = emf.createEntityManager(); - - try (EntityMgrCloser emc = new EntityMgrCloser(em); MyTransaction et = new MyTransaction(em)) { - - final TypedQuery<StateManagementEntity> stateManagementListQuery = - em.createQuery(GET_STATE_MANAGEMENT_ENTITY_QUERY, StateManagementEntity.class); - stateManagementListQuery.setParameter(RESOURCE_NAME, otherResourceName); - final List<StateManagementEntity> stateManagementList = stateManagementListQuery - .setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList(); - if (!stateManagementList.isEmpty()) { - final StateManagementEntity stateManagementEntity = stateManagementList.get(0); - // refresh the object from DB in case cached data was returned - em.refresh(stateManagementEntity); - tempStandbyStatus = stateManagementEntity.getStandbyStatus(); - if (logger.isDebugEnabled()) { - logger.debug("getStandbyStatus: resourceName ={} has standbyStatus={}", otherResourceName, - tempStandbyStatus); - } - } else { - logger.error("getStandbyStatus: resourceName ={} not found in statemanagemententity table", - otherResourceName); - } - - et.commit(); - } catch (final Exception e) { - logger.error( - "getStandbyStatus: Caught Exception attempting to get statemanagemententity record, message='{}'", - e.getMessage(), e); - } - if (logger.isDebugEnabled()) { - logger.debug("getStandbyStatus: Returning standbyStatus={}", tempStandbyStatus); - } - - return tempStandbyStatus; + return tempStandbyStatus.get(); } /** @@ -861,9 +427,7 @@ public class StateManagement extends Observable { */ private static StateManagementEntity findStateManagementEntity(final EntityManager em, final String otherResourceName) { - if (logger.isDebugEnabled()) { - logger.debug("StateManagementEntity: findStateManagementEntity: Entry"); - } + logger.debug("StateManagementEntity: findStateManagementEntity: Entry"); try { final TypedQuery<StateManagementEntity> query = em.createQuery(GET_STATE_MANAGEMENT_ENTITY_QUERY, StateManagementEntity.class); @@ -902,9 +466,7 @@ public class StateManagement extends Observable { */ public void deleteAllStateManagementEntities() { - if (logger.isDebugEnabled()) { - logger.debug("StateManagement: deleteAllStateManagementEntities: Entering"); - } + logger.debug("StateManagement: deleteAllStateManagementEntities: Entering"); /* * Start transaction @@ -916,17 +478,12 @@ public class StateManagement extends Observable { em.createQuery("SELECT p FROM StateManagementEntity p", StateManagementEntity.class); final List<StateManagementEntity> stateManagementEntityList = stateManagementEntityListQuery .setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList(); - if (logger.isDebugEnabled()) { - logger.debug("deleteAllStateManagementEntities: Deleting {} StateManagementEntity records", - stateManagementEntityList.size()); - } + logger.debug("deleteAllStateManagementEntities: Deleting {} StateManagementEntity records", + stateManagementEntityList.size()); for (final StateManagementEntity stateManagementEntity : stateManagementEntityList) { - if (logger.isDebugEnabled()) { - logger.debug( - "deleteAllStateManagementEntities: Deleting statemanagemententity with resourceName={} and" - + " standbyStatus={}", - stateManagementEntity.getResourceName(), stateManagementEntity.getStandbyStatus()); - } + logger.debug("deleteAllStateManagementEntities: Deleting statemanagemententity with resourceName={} and" + + " standbyStatus={}", stateManagementEntity.getResourceName(), + stateManagementEntity.getStandbyStatus()); em.remove(stateManagementEntity); } @@ -934,9 +491,12 @@ public class StateManagement extends Observable { } catch (final Exception ex) { logger.error("StateManagement.deleteAllStateManagementEntities() caught Exception: ", ex); } - if (logger.isDebugEnabled()) { - logger.debug("deleteAllStateManagementEntities: Exiting"); - } + logger.debug("deleteAllStateManagementEntities: Exiting"); + } + + @FunctionalInterface + private static interface ExFunction<T,R> { + public R update(T object) throws IntegrityMonitorException; } private static class MyTransaction extends EntityTransCloser { diff --git a/integrity-monitor/src/main/java/org/onap/policy/common/im/jpa/StateManagementEntity.java b/integrity-monitor/src/main/java/org/onap/policy/common/im/jpa/StateManagementEntity.java index 79f843e4..494931d2 100644 --- a/integrity-monitor/src/main/java/org/onap/policy/common/im/jpa/StateManagementEntity.java +++ b/integrity-monitor/src/main/java/org/onap/policy/common/im/jpa/StateManagementEntity.java @@ -34,6 +34,9 @@ import javax.persistence.PreUpdate; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.Setter; import org.onap.policy.common.im.MonitorTime; @Entity @@ -41,6 +44,9 @@ import org.onap.policy.common.im.MonitorTime; @NamedQuery(name = "StateManagementEntity.findAll", query = "SELECT e FROM StateManagementEntity e") // @SequenceGenerator(name="seqSM", initialValue=1, allocationSize=1) +@Getter +@Setter + public class StateManagementEntity implements Serializable { private static final long serialVersionUID = 1L; @@ -48,6 +54,8 @@ public class StateManagementEntity implements Serializable { // @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="seqSM") @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) private long id; @Column(name = "resourceName", nullable = false, length = 100, unique = true) @@ -67,6 +75,7 @@ public class StateManagementEntity implements Serializable { @Temporal(TemporalType.TIMESTAMP) @Column(name = "created_Date", updatable = false) + @Setter(AccessLevel.NONE) private Date createdDate; @Temporal(TemporalType.TIMESTAMP) @@ -88,51 +97,6 @@ public class StateManagementEntity implements Serializable { this.modifiedDate = MonitorTime.getInstance().getDate(); } - public String getResourceName() { - return this.resourceName; - } - - public void setResourceName(String resourceName) { - this.resourceName = resourceName; - } - - public String getAdminState() { - return this.adminState; - } - - public void setAdminState(String adminState) { - this.adminState = adminState; - } - - public String getOpState() { - return this.opState; - } - - public void setOpState(String opState) { - this.opState = opState; - - } - - public String getAvailStatus() { - return this.availStatus; - } - - public void setAvailStatus(String availStatus) { - this.availStatus = availStatus; - } - - public String getStandbyStatus() { - return this.standbyStatus; - } - - public void setStandbyStatus(String standbyStatus) { - this.standbyStatus = standbyStatus; - } - - public void setModifiedDate(Date modifiedDate) { - this.modifiedDate = modifiedDate; - } - /** * Clone a StateManagementEntity. * diff --git a/integrity-monitor/src/test/java/org/onap/policy/common/im/StateChangeNotifierTest.java b/integrity-monitor/src/test/java/org/onap/policy/common/im/StateChangeNotifierTest.java new file mode 100644 index 00000000..46207804 --- /dev/null +++ b/integrity-monitor/src/test/java/org/onap/policy/common/im/StateChangeNotifierTest.java @@ -0,0 +1,48 @@ +/* + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.common.im; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertSame; +import static org.mockito.Mockito.mock; + +import org.junit.Test; + +public class StateChangeNotifierTest { + private static final String MESSAGE = "my message"; + + private StateChangeNotifier scn; + private StateManagement sm; + + @Test + public void test() { + sm = mock(StateManagement.class); + scn = new StateChangeNotifier(); + + scn.update(sm, MESSAGE); + + scn.handleStateChange(); + + assertSame(sm, scn.getStateManagement()); + assertEquals(MESSAGE, scn.getMessage()); + } + +} |