aboutsummaryrefslogtreecommitdiffstats
path: root/feature-active-standby-management/src/main/java/org/onap/policy/drools/activestandby/JpaDroolsPdpsConnector.java
diff options
context:
space:
mode:
Diffstat (limited to 'feature-active-standby-management/src/main/java/org/onap/policy/drools/activestandby/JpaDroolsPdpsConnector.java')
-rw-r--r--feature-active-standby-management/src/main/java/org/onap/policy/drools/activestandby/JpaDroolsPdpsConnector.java1190
1 files changed, 595 insertions, 595 deletions
diff --git a/feature-active-standby-management/src/main/java/org/onap/policy/drools/activestandby/JpaDroolsPdpsConnector.java b/feature-active-standby-management/src/main/java/org/onap/policy/drools/activestandby/JpaDroolsPdpsConnector.java
index dc907b27..04448052 100644
--- a/feature-active-standby-management/src/main/java/org/onap/policy/drools/activestandby/JpaDroolsPdpsConnector.java
+++ b/feature-active-standby-management/src/main/java/org/onap/policy/drools/activestandby/JpaDroolsPdpsConnector.java
@@ -36,599 +36,599 @@ import org.slf4j.LoggerFactory;
public class JpaDroolsPdpsConnector implements DroolsPdpsConnector {
- // get an instance of logger
- private static final Logger logger = LoggerFactory.getLogger(JpaDroolsPdpsConnector.class);
- private EntityManagerFactory emf;
-
-
- //not sure if we want to use the same entity manager factory for drools session and pass it in here, or create a new one
- public JpaDroolsPdpsConnector(EntityManagerFactory emf){
- this.emf = emf;
- }
- @Override
- public Collection<DroolsPdp> getDroolsPdps() {
- //return a list of all the DroolsPdps in the database
- EntityManager em = emf.createEntityManager();
- try {
- em.getTransaction().begin();
- Query droolsPdpsListQuery = em.createQuery("SELECT p FROM DroolsPdpEntity p");
- List<?> droolsPdpsList = droolsPdpsListQuery.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
- LinkedList<DroolsPdp> droolsPdpsReturnList = new LinkedList<>();
- for(Object o : droolsPdpsList){
- if(o instanceof DroolsPdp){
- //Make sure it is not a cached version
- em.refresh((DroolsPdpEntity)o);
- droolsPdpsReturnList.add((DroolsPdp)o);
- if (logger.isDebugEnabled()) {
- DroolsPdp droolsPdp = (DroolsPdp)o;
- logger.debug("getDroolsPdps: PDP= {}"
- + ", isDesignated= {}"
- + ", updatedDate= {}"
- + ", priority= {}", droolsPdp.getPdpId(), droolsPdp.isDesignated(),
- droolsPdp.getUpdatedDate(), droolsPdp.getPriority());
- }
- }
- }
- try{
- em.getTransaction().commit();
- }catch(Exception e){
- logger.error
- ("Cannot commit getDroolsPdps() transaction", e);
- }
- return droolsPdpsReturnList;
- } finally {
- cleanup(em, "getDroolsPdps");
- }
- }
-
- private boolean nullSafeEquals(Object one, Object two){
- if(one == null && two == null){
- return true;
- }
- if(one != null && two != null){
- return one.equals(two);
- }
- return false;
- }
-
- @Override
- public void update(DroolsPdp pdp) {
-
- if (logger.isDebugEnabled()) {
- logger.debug("update: Entering, pdpId={}", pdp.getPdpId());
- }
-
- //this is to update our own pdp in the database
- EntityManager em = emf.createEntityManager();
- try {
- em.getTransaction().begin();
- Query droolsPdpsListQuery = em.createQuery("SELECT p FROM DroolsPdpEntity p WHERE p.pdpId=:pdpId");
- droolsPdpsListQuery.setParameter("pdpId", pdp.getPdpId());
- List<?> droolsPdpsList = droolsPdpsListQuery.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
- DroolsPdpEntity droolsPdpEntity;
- if(droolsPdpsList.size() == 1 && (droolsPdpsList.get(0) instanceof DroolsPdpEntity)){
- droolsPdpEntity = (DroolsPdpEntity)droolsPdpsList.get(0);
- em.refresh(droolsPdpEntity); //Make sure we have current values
- Date currentDate = new Date();
- long difference = currentDate.getTime()-droolsPdpEntity.getUpdatedDate().getTime();
- //just set some kind of default here
- long pdpTimeout = 15000;
- try{
- pdpTimeout = Long.parseLong(ActiveStandbyProperties.getProperty(ActiveStandbyProperties.PDP_TIMEOUT));
- }catch(Exception e){
- logger.error
- ("Could not get PDP timeout property, using default.", e);
- }
- boolean isCurrent = difference<pdpTimeout;
- if (logger.isDebugEnabled()) {
- logger.debug("update: PDP= {}, isCurrent={}"
- + " difference= {}"
- + ", pdpTimeout= {}, designated= {}",
- pdp.getPdpId(), isCurrent, difference, pdpTimeout, droolsPdpEntity.isDesignated());
- }
- } else {
- if (logger.isDebugEnabled()) {
- logger.debug("update: For PDP={}"
- + ", instantiating new DroolsPdpEntity", pdp.getPdpId());
- }
- droolsPdpEntity = new DroolsPdpEntity();
- em.persist(droolsPdpEntity);
- droolsPdpEntity.setPdpId(pdp.getPdpId());
- }
- if(droolsPdpEntity.getPriority() != pdp.getPriority()){
- droolsPdpEntity.setPriority(pdp.getPriority());
- }
- if(!droolsPdpEntity.getUpdatedDate().equals(pdp.getUpdatedDate())){
- droolsPdpEntity.setUpdatedDate(pdp.getUpdatedDate());
- }
- /*if(!droolsPdpEntity.getDesignatedDate().equals(pdp.getDesignatedDate())){
- droolsPdpEntity.setDesignatedDate(pdp.getDesignatedDate());
- } The designated date is only set below when this first becomes designated*/
- if(!nullSafeEquals(droolsPdpEntity.getSiteName(),pdp.getSiteName())){
- droolsPdpEntity.setSiteName(pdp.getSiteName());
- }
-
- if(droolsPdpEntity.isDesignated() != pdp.isDesignated()){
- if (logger.isDebugEnabled()) {
- logger.debug("update: pdpId={}"
- + ", pdp.isDesignated={}"
- + ", droolsPdpEntity.pdpId= {}"
- + ", droolsPdpEntity.isDesignated={}",
- pdp.getPdpId(), pdp.isDesignated(),droolsPdpEntity.getPdpId(), droolsPdpEntity.isDesignated());
- }
- droolsPdpEntity.setDesignated(pdp.isDesignated());
- //The isDesignated value is not the same and the new one == true
- if(pdp.isDesignated()){
- droolsPdpEntity.setDesignatedDate(new Date());
- }
- }
- em.getTransaction().commit();
- } finally {
- cleanup(em, "update");
- }
-
- if (logger.isDebugEnabled()) {
- logger.debug("update: Exiting");
- }
-
- }
-
- /*
- * Note: A side effect of this boolean method is that if the PDP is designated but not current, the
- * droolspdpentity.DESIGNATED column will be set to false (the PDP will be un-designated, i.e. marked as
- * being in standby mode)
- */
- @Override
- public boolean isPdpCurrent(DroolsPdp pdp) {
-
- boolean isCurrent = isCurrent(pdp);
-
- EntityManager em = emf.createEntityManager();
- try{
- if(!isCurrent && pdp.isDesignated()){
- em.getTransaction().begin();
- Query droolsPdpsListQuery = em.createQuery("SELECT p FROM DroolsPdpEntity p WHERE p.pdpId=:pdpId");
- droolsPdpsListQuery.setParameter("pdpId", pdp.getPdpId());
- List<?> droolsPdpsList = droolsPdpsListQuery.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
- if(droolsPdpsList.size() == 1 && droolsPdpsList.get(0) instanceof DroolsPdpEntity){
- if (logger.isDebugEnabled()) {
- logger.debug("isPdpCurrent: PDP={} designated but not current; setting designated to false", pdp.getPdpId());
- }
- DroolsPdpEntity droolsPdpEntity = (DroolsPdpEntity)droolsPdpsList.get(0);
- droolsPdpEntity.setDesignated(false);
- em.getTransaction().commit();
- } else {
- logger.warn("isPdpCurrent: PDP={} is designated but not current; "
- + "however it does not have a DB entry, so cannot set DESIGNATED to false!", pdp.getPdpId());
- }
- } else {
- if (logger.isDebugEnabled()) {
- logger.debug("isPdpCurrent: For PDP= {}, "
- + "designated={}, isCurrent={}", pdp.getPdpId(), pdp.isDesignated(), isCurrent);
- }
- }
- }catch(Exception e){
- logger.error
- ("Could not update expired record marked as designated in the database", e);
- } finally {
- cleanup(em, "isPdpCurrent");
- }
- return isCurrent;
-
- }
-
- @Override
- public void setDesignated(DroolsPdp pdp, boolean designated) {
-
- if (logger.isDebugEnabled()) {
- logger.debug("setDesignated: Entering, pdpId={}"
- + ", designated={}", pdp.getPdpId(), designated);
- }
-
- EntityManager em = null;
- try {
- em = emf.createEntityManager();
- em.getTransaction().begin();
- Query droolsPdpsListQuery = em
- .createQuery("SELECT p FROM DroolsPdpEntity p WHERE p.pdpId=:pdpId");
- droolsPdpsListQuery.setParameter("pdpId", pdp.getPdpId());
- List<?> droolsPdpsList = droolsPdpsListQuery.setLockMode(
- LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
- if (droolsPdpsList.size() == 1
- && droolsPdpsList.get(0) instanceof DroolsPdpEntity) {
- DroolsPdpEntity droolsPdpEntity = (DroolsPdpEntity) droolsPdpsList
- .get(0);
-
- if (logger.isDebugEnabled()) {
- logger.debug("setDesignated: PDP={}"
- + " found, designated= {}"
- + ", setting to {}", pdp.getPdpId(), droolsPdpEntity.isDesignated(),
- designated);
- }
- droolsPdpEntity.setDesignated(designated);
- if(designated){
- em.refresh(droolsPdpEntity); //make sure we get the DB value
- if(!droolsPdpEntity.isDesignated()){
- droolsPdpEntity.setDesignatedDate(new Date());
- }
-
- }
- em.getTransaction().commit();
- } else {
- logger.error("setDesignated: PDP={}"
- + " not in DB; cannot update designation", pdp.getPdpId());
- }
- } catch (Exception e) {
- logger.error("setDesignated: Caught Exception", e);
- } finally {
- cleanup(em, "setDesignated");
- }
-
- if (logger.isDebugEnabled()) {
- logger.debug("setDesignated: Exiting");
- }
-
- }
-
-
- @Override
- public void standDownPdp(String pdpId) {
- if(logger.isDebugEnabled()){
- logger.debug("standDownPdp: Entering, pdpId={}", pdpId);
- }
-
- EntityManager em = null;
- try {
- /*
- * Start transaction.
- */
- em = emf.createEntityManager();
- em.getTransaction().begin();
-
- /*
- * Get droolspdpentity record for this PDP and mark DESIGNATED as
- * false.
- */
- Query droolsPdpsListQuery = em
- .createQuery("SELECT p FROM DroolsPdpEntity p WHERE p.pdpId=:pdpId");
- droolsPdpsListQuery.setParameter("pdpId", pdpId);
- List<?> droolsPdpsList = droolsPdpsListQuery.setLockMode(
- LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
- DroolsPdpEntity droolsPdpEntity;
- if (droolsPdpsList.size() == 1
- && (droolsPdpsList.get(0) instanceof DroolsPdpEntity)) {
- droolsPdpEntity = (DroolsPdpEntity) droolsPdpsList.get(0);
- droolsPdpEntity.setDesignated(false);
- em.persist(droolsPdpEntity);
- if(logger.isDebugEnabled()){
- logger.debug("standDownPdp: PDP={} persisted as non-designated.", pdpId );
- }
- } else {
- logger.error("standDownPdp: Missing record in droolspdpentity for pdpId={}"
- + "; cannot stand down PDP", pdpId);
- }
-
- /*
- * End transaction.
- */
- em.getTransaction().commit();
- cleanup(em, "standDownPdp");
- em = null;
-
- // Keep the election handler in sync with the DB
- DroolsPdpsElectionHandler.setMyPdpDesignated(false);
-
- } catch (Exception e) {
- logger.error("standDownPdp: Unexpected Exception attempting to mark "
- + "DESIGNATED as false for droolspdpentity, pdpId={}"
- + ". Cannot stand down PDP; message={}", pdpId, e.getMessage(), e);
- } finally {
- cleanup(em, "standDownPdp");
- }
- if(logger.isDebugEnabled()){
- logger.debug("standDownPdp: Exiting");
- }
-
- }
-
- /*
- * Determines whether or not a designated PDP has failed.
- *
- * Note: The update method, which is run periodically by the
- * TimerUpdateClass, will un-designate a PDP that is stale.
- */
- @Override
- public boolean hasDesignatedPdpFailed(Collection<DroolsPdp> pdps) {
-
- if (logger.isDebugEnabled()) {
- logger.debug("hasDesignatedPdpFailed: Entering, pdps.size()={}", pdps.size());
- }
-
- boolean failed = true;
- boolean foundDesignatedPdp = false;
-
- for (DroolsPdp pdp : pdps) {
-
- /*
- * Normally, the update method will un-designate any stale PDP, but
- * we check here to see if the PDP has gone stale since the update
- * method was run.
- *
- * Even if we determine that the designated PDP is current, we keep
- * going (we don't break), so we can get visibility into the other
- * PDPs, when in DEBUG mode.
- */
- if (pdp.isDesignated() && isCurrent(pdp)) {
- if (logger.isDebugEnabled()) {
- logger.debug("hasDesignatedPdpFailed: Designated PDP={} is current", pdp.getPdpId());
- }
- failed = false;
- foundDesignatedPdp = true;
- } else if (pdp.isDesignated() && !isCurrent(pdp)) {
- logger.error("hasDesignatedPdpFailed: Designated PDP={} has failed", pdp.getPdpId());
- foundDesignatedPdp = true;
- } else {
- if (logger.isDebugEnabled()) {
- logger.debug("hasDesignatedPdpFailed: PDP={} is not designated", pdp.getPdpId());
- }
- }
- }
-
- if (logger.isDebugEnabled()) {
- logger.debug("hasDesignatedPdpFailed: Exiting and returning, foundDesignatedPdp={}",
- foundDesignatedPdp);
- }
- return failed;
- }
-
-
- private boolean isCurrent(DroolsPdp pdp) {
-
- if (logger.isDebugEnabled()) {
- logger.debug("isCurrent: Entering, pdpId={}", pdp.getPdpId());
- }
-
- boolean current = false;
-
- // Return if the current PDP is considered "current" based on whatever
- // time box that may be.
- // If the the PDP is not current, we should mark it as not primary in
- // the database
- Date currentDate = new Date();
- long difference = currentDate.getTime()
- - pdp.getUpdatedDate().getTime();
- // just set some kind of default here
- long pdpTimeout = 15000;
- try {
- pdpTimeout = Long.parseLong(ActiveStandbyProperties
- .getProperty(ActiveStandbyProperties.PDP_TIMEOUT));
- if (logger.isDebugEnabled()) {
- logger.debug("isCurrent: pdp.timeout={}", pdpTimeout);
- }
- } catch (Exception e) {
- logger.error
- ("isCurrent: Could not get PDP timeout property, using default.", e);
- }
- current = difference < pdpTimeout;
-
- if (logger.isDebugEnabled()) {
- logger.debug("isCurrent: Exiting, difference={}, pdpTimeout={}"
- + "; returning current={}", difference, pdpTimeout, current);
- }
-
- return current;
- }
-
-
- /*
- * Currently this method is only used in a JUnit test environment. Gets a
- * PDP record from droolspdpentity table.
- */
- @Override
- public DroolsPdpEntity getPdp(String pdpId) {
-
- if (logger.isDebugEnabled()) {
- logger.debug("getPdp: Entering and getting PDP with pdpId={}", pdpId);
- }
-
- DroolsPdpEntity droolsPdpEntity = null;
-
- EntityManager em = null;
- try {
- em = emf.createEntityManager();
- em.getTransaction().begin();
- Query droolsPdpsListQuery = em
- .createQuery("SELECT p FROM DroolsPdpEntity p WHERE p.pdpId=:pdpId");
- droolsPdpsListQuery.setParameter("pdpId", pdpId);
- List<?> droolsPdpsList = droolsPdpsListQuery.setLockMode(
- LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
- if (droolsPdpsList.size() == 1
- && droolsPdpsList.get(0) instanceof DroolsPdpEntity) {
- droolsPdpEntity = (DroolsPdpEntity) droolsPdpsList.get(0);
- if (logger.isDebugEnabled()) {
- logger.debug("getPdp: PDP={}"
- + " found, isDesignated={},"
- + " updatedDate={}, "
- + "priority={}", pdpId,
- droolsPdpEntity.isDesignated(), droolsPdpEntity.getUpdatedDate(),
- droolsPdpEntity.getPriority());
- }
-
- // Make sure the droolsPdpEntity is not a cached version
- em.refresh(droolsPdpEntity);
-
- em.getTransaction().commit();
- } else {
- logger.error("getPdp: PDP={} not found!?", pdpId);
- }
- } catch (Exception e) {
- logger.error
- ("getPdp: Caught Exception attempting to get PDP", e);
- } finally {
- cleanup(em, "getPdp");
- }
-
- if (logger.isDebugEnabled()) {
- logger.debug("getPdp: Returning droolsPdpEntity={}", droolsPdpEntity);
- }
- return droolsPdpEntity;
-
- }
-
- /*
- * Normally this method should only be used in a JUnit test environment.
- * Manually inserts a PDP record in droolspdpentity table.
- */
- @Override
- public void insertPdp(DroolsPdp pdp) {
- if(logger.isDebugEnabled()){
- logger.debug("insertPdp: Entering and manually inserting PDP");
- }
-
- /*
- * Start transaction
- */
- EntityManager em = emf.createEntityManager();
- try {
- em.getTransaction().begin();
-
- /*
- * Insert record.
- */
- DroolsPdpEntity droolsPdpEntity = new DroolsPdpEntity();
- em.persist(droolsPdpEntity);
- droolsPdpEntity.setPdpId(pdp.getPdpId());
- droolsPdpEntity.setDesignated(pdp.isDesignated());
- droolsPdpEntity.setPriority(pdp.getPriority());
- droolsPdpEntity.setUpdatedDate(pdp.getUpdatedDate());
- droolsPdpEntity.setSiteName(pdp.getSiteName());
-
- /*
- * End transaction.
- */
- em.getTransaction().commit();
- } finally {
- cleanup(em, "insertPdp");
- }
- if(logger.isDebugEnabled()){
- logger.debug("insertPdp: Exiting");
- }
-
- }
-
- /*
- * Normally this method should only be used in a JUnit test environment.
- * Manually deletes all PDP records in droolspdpentity table.
- */
- @Override
- public void deleteAllPdps() {
-
- if(logger.isDebugEnabled()){
- logger.debug("deleteAllPdps: Entering");
- }
-
- /*
- * Start transaction
- */
- EntityManager em = emf.createEntityManager();
- try {
- em.getTransaction().begin();
-
- Query droolsPdpsListQuery = em
- .createQuery("SELECT p FROM DroolsPdpEntity p");
- @SuppressWarnings("unchecked")
- List<DroolsPdp> droolsPdpsList = droolsPdpsListQuery.setLockMode(
- LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
- if(logger.isDebugEnabled()){
- logger.debug("deleteAllPdps: Deleting {} PDPs", droolsPdpsList.size());
- }
- for (DroolsPdp droolsPdp : droolsPdpsList) {
- String pdpId = droolsPdp.getPdpId();
- deletePdp(pdpId);
- }
-
- /*
- * End transaction.
- */
- em.getTransaction().commit();
- } finally {
- cleanup(em, "deleteAllPdps");
- }
- if(logger.isDebugEnabled()){
- logger.debug("deleteAllPdps: Exiting");
- }
-
- }
-
- /*
- * Normally this method should only be used in a JUnit test environment.
- * Manually deletes a PDP record in droolspdpentity table.
- */
- @Override
- public void deletePdp(String pdpId) {
- if(logger.isDebugEnabled()){
- logger.debug("deletePdp: Entering and manually deleting pdpId={}", pdpId);
- }
-
- /*
- * Start transaction
- */
- EntityManager em = emf.createEntityManager();
- try {
- em.getTransaction().begin();
-
- /*
- * Delete record.
- */
- DroolsPdpEntity droolsPdpEntity = em.find(DroolsPdpEntity.class, pdpId);
- if (droolsPdpEntity != null) {
- if(logger.isDebugEnabled()){
- logger.debug("deletePdp: Removing PDP");
- }
- em.remove(droolsPdpEntity);
- } else {
- if(logger.isDebugEnabled()){
- logger.debug("deletePdp: PDP with ID={} not currently in DB", pdpId);
- }
- }
-
- /*
- * End transaction.
- */
- em.getTransaction().commit();
- } finally {
- cleanup(em, "deletePdp");
- }
- if(logger.isDebugEnabled()){
- logger.debug("deletePdp: Exiting");
- }
-
- }
-
- /*
- * Close the specified EntityManager, rolling back any pending transaction
- *
- * @param em the EntityManager to close ('null' is OK)
- * @param method the invoking Java method (used for log messages)
- */
- private static void cleanup(EntityManager em, String method)
- {
- if (em != null && em.isOpen()) {
- if (em.getTransaction().isActive()) {
- // there is an active EntityTransaction -- roll it back
- try {
- em.getTransaction().rollback();
- } catch (Exception e) {
- logger.error(method + ": Caught Exception attempting to rollback EntityTransaction,", e);
- }
- }
-
- // now, close the EntityManager
- try {
- em.close();
- } catch (Exception e) {
- logger.error(method + ": Caught Exception attempting to close EntityManager, ", e);
- }
- }
- }
+ // get an instance of logger
+ private static final Logger logger = LoggerFactory.getLogger(JpaDroolsPdpsConnector.class);
+ private EntityManagerFactory emf;
+
+
+ //not sure if we want to use the same entity manager factory
+ //for drools session and pass it in here, or create a new one
+ public JpaDroolsPdpsConnector(EntityManagerFactory emf) {
+ this.emf = emf;
+ }
+
+ @Override
+ public Collection<DroolsPdp> getDroolsPdps() {
+ //return a list of all the DroolsPdps in the database
+ EntityManager em = emf.createEntityManager();
+ try {
+ em.getTransaction().begin();
+ Query droolsPdpsListQuery = em.createQuery("SELECT p FROM DroolsPdpEntity p");
+ List<?> droolsPdpsList = droolsPdpsListQuery.setLockMode(LockModeType.NONE)
+ .setFlushMode(FlushModeType.COMMIT).getResultList();
+ LinkedList<DroolsPdp> droolsPdpsReturnList = new LinkedList<>();
+ for (Object o : droolsPdpsList) {
+ if (o instanceof DroolsPdp) {
+ //Make sure it is not a cached version
+ em.refresh((DroolsPdpEntity)o);
+ droolsPdpsReturnList.add((DroolsPdp)o);
+ if (logger.isDebugEnabled()) {
+ DroolsPdp droolsPdp = (DroolsPdp)o;
+ logger.debug("getDroolsPdps: PDP= {}"
+ + ", isDesignated= {}"
+ + ", updatedDate= {}"
+ + ", priority= {}", droolsPdp.getPdpId(), droolsPdp.isDesignated(),
+ droolsPdp.getUpdatedDate(), droolsPdp.getPriority());
+ }
+ }
+ }
+ try {
+ em.getTransaction().commit();
+ } catch (Exception e) {
+ logger.error("Cannot commit getDroolsPdps() transaction", e);
+ }
+ return droolsPdpsReturnList;
+ } finally {
+ cleanup(em, "getDroolsPdps");
+ }
+ }
+
+ private boolean nullSafeEquals(Object one, Object two) {
+ if (one == null && two == null) {
+ return true;
+ }
+ if (one != null && two != null) {
+ return one.equals(two);
+ }
+ return false;
+ }
+
+ @Override
+ public void update(DroolsPdp pdp) {
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("update: Entering, pdpId={}", pdp.getPdpId());
+ }
+
+ //this is to update our own pdp in the database
+ EntityManager em = emf.createEntityManager();
+ try {
+ em.getTransaction().begin();
+ Query droolsPdpsListQuery = em.createQuery("SELECT p FROM DroolsPdpEntity p WHERE p.pdpId=:pdpId");
+ droolsPdpsListQuery.setParameter("pdpId", pdp.getPdpId());
+ List<?> droolsPdpsList = droolsPdpsListQuery.setLockMode(LockModeType.NONE)
+ .setFlushMode(FlushModeType.COMMIT).getResultList();
+ DroolsPdpEntity droolsPdpEntity;
+ if (droolsPdpsList.size() == 1 && (droolsPdpsList.get(0) instanceof DroolsPdpEntity)) {
+ droolsPdpEntity = (DroolsPdpEntity)droolsPdpsList.get(0);
+ em.refresh(droolsPdpEntity); //Make sure we have current values
+ Date currentDate = new Date();
+ long difference = currentDate.getTime() - droolsPdpEntity.getUpdatedDate().getTime();
+ //just set some kind of default here
+ long pdpTimeout = 15000;
+ try {
+ pdpTimeout = Long.parseLong(
+ ActiveStandbyProperties.getProperty(ActiveStandbyProperties.PDP_TIMEOUT));
+ } catch (Exception e) {
+ logger.error("Could not get PDP timeout property, using default.", e);
+ }
+ boolean isCurrent = difference < pdpTimeout;
+ if (logger.isDebugEnabled()) {
+ logger.debug("update: PDP= {}, isCurrent={}"
+ + " difference= {}"
+ + ", pdpTimeout= {}, designated= {}",
+ pdp.getPdpId(), isCurrent, difference, pdpTimeout, droolsPdpEntity.isDesignated());
+ }
+ } else {
+ if (logger.isDebugEnabled()) {
+ logger.debug("update: For PDP={}"
+ + ", instantiating new DroolsPdpEntity", pdp.getPdpId());
+ }
+ droolsPdpEntity = new DroolsPdpEntity();
+ em.persist(droolsPdpEntity);
+ droolsPdpEntity.setPdpId(pdp.getPdpId());
+ }
+ if (droolsPdpEntity.getPriority() != pdp.getPriority()) {
+ droolsPdpEntity.setPriority(pdp.getPriority());
+ }
+ if (!droolsPdpEntity.getUpdatedDate().equals(pdp.getUpdatedDate())) {
+ droolsPdpEntity.setUpdatedDate(pdp.getUpdatedDate());
+ }
+ if (!nullSafeEquals(droolsPdpEntity.getSiteName(),pdp.getSiteName())) {
+ droolsPdpEntity.setSiteName(pdp.getSiteName());
+ }
+
+ if (droolsPdpEntity.isDesignated() != pdp.isDesignated()) {
+ if (logger.isDebugEnabled()) {
+ logger.debug("update: pdpId={}"
+ + ", pdp.isDesignated={}"
+ + ", droolsPdpEntity.pdpId= {}"
+ + ", droolsPdpEntity.isDesignated={}",
+ pdp.getPdpId(), pdp.isDesignated(),
+ droolsPdpEntity.getPdpId(), droolsPdpEntity.isDesignated());
+ }
+ droolsPdpEntity.setDesignated(pdp.isDesignated());
+ //The isDesignated value is not the same and the new one == true
+ if (pdp.isDesignated()) {
+ droolsPdpEntity.setDesignatedDate(new Date());
+ }
+ }
+ em.getTransaction().commit();
+ } finally {
+ cleanup(em, "update");
+ }
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("update: Exiting");
+ }
+
+ }
+
+ /*
+ * Note: A side effect of this boolean method is that if the PDP is designated but not current, the
+ * droolspdpentity.DESIGNATED column will be set to false (the PDP will be un-designated, i.e. marked as
+ * being in standby mode)
+ */
+ @Override
+ public boolean isPdpCurrent(DroolsPdp pdp) {
+
+ boolean isCurrent = isCurrent(pdp);
+
+ EntityManager em = emf.createEntityManager();
+ try {
+ if (!isCurrent && pdp.isDesignated()) {
+ em.getTransaction().begin();
+ Query droolsPdpsListQuery = em.createQuery("SELECT p FROM DroolsPdpEntity p WHERE p.pdpId=:pdpId");
+ droolsPdpsListQuery.setParameter("pdpId", pdp.getPdpId());
+ List<?> droolsPdpsList = droolsPdpsListQuery.setLockMode(LockModeType.NONE)
+ .setFlushMode(FlushModeType.COMMIT).getResultList();
+ if (droolsPdpsList.size() == 1 && droolsPdpsList.get(0) instanceof DroolsPdpEntity) {
+ if (logger.isDebugEnabled()) {
+ logger.debug("isPdpCurrent: PDP={} designated but not current; setting designated to false",
+ pdp.getPdpId());
+ }
+ DroolsPdpEntity droolsPdpEntity = (DroolsPdpEntity)droolsPdpsList.get(0);
+ droolsPdpEntity.setDesignated(false);
+ em.getTransaction().commit();
+ } else {
+ logger.warn("isPdpCurrent: PDP={} is designated but not current; "
+ + "however it does not have a DB entry, so cannot set DESIGNATED to false!",
+ pdp.getPdpId());
+ }
+ } else {
+ if (logger.isDebugEnabled()) {
+ logger.debug("isPdpCurrent: For PDP= {}, "
+ + "designated={}, isCurrent={}", pdp.getPdpId(), pdp.isDesignated(), isCurrent);
+ }
+ }
+ } catch (Exception e) {
+ logger.error("Could not update expired record marked as designated in the database", e);
+ } finally {
+ cleanup(em, "isPdpCurrent");
+ }
+ return isCurrent;
+
+ }
+
+ @Override
+ public void setDesignated(DroolsPdp pdp, boolean designated) {
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("setDesignated: Entering, pdpId={}"
+ + ", designated={}", pdp.getPdpId(), designated);
+ }
+
+ EntityManager em = null;
+ try {
+ em = emf.createEntityManager();
+ em.getTransaction().begin();
+ Query droolsPdpsListQuery = em
+ .createQuery("SELECT p FROM DroolsPdpEntity p WHERE p.pdpId=:pdpId");
+ droolsPdpsListQuery.setParameter("pdpId", pdp.getPdpId());
+ List<?> droolsPdpsList = droolsPdpsListQuery.setLockMode(
+ LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
+ if (droolsPdpsList.size() == 1
+ && droolsPdpsList.get(0) instanceof DroolsPdpEntity) {
+ DroolsPdpEntity droolsPdpEntity = (DroolsPdpEntity) droolsPdpsList
+ .get(0);
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("setDesignated: PDP={}"
+ + " found, designated= {}"
+ + ", setting to {}", pdp.getPdpId(), droolsPdpEntity.isDesignated(),
+ designated);
+ }
+ droolsPdpEntity.setDesignated(designated);
+ if (designated) {
+ em.refresh(droolsPdpEntity); //make sure we get the DB value
+ if (!droolsPdpEntity.isDesignated()) {
+ droolsPdpEntity.setDesignatedDate(new Date());
+ }
+
+ }
+ em.getTransaction().commit();
+ } else {
+ logger.error("setDesignated: PDP={}"
+ + " not in DB; cannot update designation", pdp.getPdpId());
+ }
+ } catch (Exception e) {
+ logger.error("setDesignated: Caught Exception", e);
+ } finally {
+ cleanup(em, "setDesignated");
+ }
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("setDesignated: Exiting");
+ }
+
+ }
+
+
+ @Override
+ public void standDownPdp(String pdpId) {
+ if (logger.isDebugEnabled()) {
+ logger.debug("standDownPdp: Entering, pdpId={}", pdpId);
+ }
+
+ EntityManager em = null;
+ try {
+ /*
+ * Start transaction.
+ */
+ em = emf.createEntityManager();
+ em.getTransaction().begin();
+
+ /*
+ * Get droolspdpentity record for this PDP and mark DESIGNATED as
+ * false.
+ */
+ Query droolsPdpsListQuery = em
+ .createQuery("SELECT p FROM DroolsPdpEntity p WHERE p.pdpId=:pdpId");
+ droolsPdpsListQuery.setParameter("pdpId", pdpId);
+ List<?> droolsPdpsList = droolsPdpsListQuery.setLockMode(
+ LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
+ DroolsPdpEntity droolsPdpEntity;
+ if (droolsPdpsList.size() == 1
+ && (droolsPdpsList.get(0) instanceof DroolsPdpEntity)) {
+ droolsPdpEntity = (DroolsPdpEntity) droolsPdpsList.get(0);
+ droolsPdpEntity.setDesignated(false);
+ em.persist(droolsPdpEntity);
+ if (logger.isDebugEnabled()) {
+ logger.debug("standDownPdp: PDP={} persisted as non-designated.", pdpId );
+ }
+ } else {
+ logger.error("standDownPdp: Missing record in droolspdpentity for pdpId={}"
+ + "; cannot stand down PDP", pdpId);
+ }
+
+ /*
+ * End transaction.
+ */
+ em.getTransaction().commit();
+ cleanup(em, "standDownPdp");
+ em = null;
+
+ // Keep the election handler in sync with the DB
+ DroolsPdpsElectionHandler.setMyPdpDesignated(false);
+
+ } catch (Exception e) {
+ logger.error("standDownPdp: Unexpected Exception attempting to mark "
+ + "DESIGNATED as false for droolspdpentity, pdpId={}"
+ + ". Cannot stand down PDP; message={}", pdpId, e.getMessage(), e);
+ } finally {
+ cleanup(em, "standDownPdp");
+ }
+ if (logger.isDebugEnabled()) {
+ logger.debug("standDownPdp: Exiting");
+ }
+
+ }
+
+ /*
+ * Determines whether or not a designated PDP has failed.
+ *
+ * Note: The update method, which is run periodically by the
+ * TimerUpdateClass, will un-designate a PDP that is stale.
+ */
+ @Override
+ public boolean hasDesignatedPdpFailed(Collection<DroolsPdp> pdps) {
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("hasDesignatedPdpFailed: Entering, pdps.size()={}", pdps.size());
+ }
+
+ boolean failed = true;
+ boolean foundDesignatedPdp = false;
+
+ for (DroolsPdp pdp : pdps) {
+
+ /*
+ * Normally, the update method will un-designate any stale PDP, but
+ * we check here to see if the PDP has gone stale since the update
+ * method was run.
+ *
+ * Even if we determine that the designated PDP is current, we keep
+ * going (we don't break), so we can get visibility into the other
+ * PDPs, when in DEBUG mode.
+ */
+ if (pdp.isDesignated() && isCurrent(pdp)) {
+ if (logger.isDebugEnabled()) {
+ logger.debug("hasDesignatedPdpFailed: Designated PDP={} is current", pdp.getPdpId());
+ }
+ failed = false;
+ foundDesignatedPdp = true;
+ } else if (pdp.isDesignated() && !isCurrent(pdp)) {
+ logger.error("hasDesignatedPdpFailed: Designated PDP={} has failed", pdp.getPdpId());
+ foundDesignatedPdp = true;
+ } else {
+ if (logger.isDebugEnabled()) {
+ logger.debug("hasDesignatedPdpFailed: PDP={} is not designated", pdp.getPdpId());
+ }
+ }
+ }
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("hasDesignatedPdpFailed: Exiting and returning, foundDesignatedPdp={}",
+ foundDesignatedPdp);
+ }
+ return failed;
+ }
+
+
+ private boolean isCurrent(DroolsPdp pdp) {
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("isCurrent: Entering, pdpId={}", pdp.getPdpId());
+ }
+
+ boolean current = false;
+
+ // Return if the current PDP is considered "current" based on whatever
+ // time box that may be.
+ // If the the PDP is not current, we should mark it as not primary in
+ // the database
+ Date currentDate = new Date();
+ long difference = currentDate.getTime()
+ - pdp.getUpdatedDate().getTime();
+ // just set some kind of default here
+ long pdpTimeout = 15000;
+ try {
+ pdpTimeout = Long.parseLong(ActiveStandbyProperties
+ .getProperty(ActiveStandbyProperties.PDP_TIMEOUT));
+ if (logger.isDebugEnabled()) {
+ logger.debug("isCurrent: pdp.timeout={}", pdpTimeout);
+ }
+ } catch (Exception e) {
+ logger.error("isCurrent: Could not get PDP timeout property, using default.", e);
+ }
+ current = difference < pdpTimeout;
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("isCurrent: Exiting, difference={}, pdpTimeout={}"
+ + "; returning current={}", difference, pdpTimeout, current);
+ }
+
+ return current;
+ }
+
+
+ /*
+ * Currently this method is only used in a JUnit test environment. Gets a
+ * PDP record from droolspdpentity table.
+ */
+ @Override
+ public DroolsPdpEntity getPdp(String pdpId) {
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("getPdp: Entering and getting PDP with pdpId={}", pdpId);
+ }
+
+ DroolsPdpEntity droolsPdpEntity = null;
+
+ EntityManager em = null;
+ try {
+ em = emf.createEntityManager();
+ em.getTransaction().begin();
+ Query droolsPdpsListQuery = em
+ .createQuery("SELECT p FROM DroolsPdpEntity p WHERE p.pdpId=:pdpId");
+ droolsPdpsListQuery.setParameter("pdpId", pdpId);
+ List<?> droolsPdpsList = droolsPdpsListQuery.setLockMode(
+ LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
+ if (droolsPdpsList.size() == 1
+ && droolsPdpsList.get(0) instanceof DroolsPdpEntity) {
+ droolsPdpEntity = (DroolsPdpEntity) droolsPdpsList.get(0);
+ if (logger.isDebugEnabled()) {
+ logger.debug("getPdp: PDP={}"
+ + " found, isDesignated={},"
+ + " updatedDate={}, "
+ + "priority={}", pdpId,
+ droolsPdpEntity.isDesignated(), droolsPdpEntity.getUpdatedDate(),
+ droolsPdpEntity.getPriority());
+ }
+
+ // Make sure the droolsPdpEntity is not a cached version
+ em.refresh(droolsPdpEntity);
+
+ em.getTransaction().commit();
+ } else {
+ logger.error("getPdp: PDP={} not found!?", pdpId);
+ }
+ } catch (Exception e) {
+ logger.error("getPdp: Caught Exception attempting to get PDP", e);
+ } finally {
+ cleanup(em, "getPdp");
+ }
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("getPdp: Returning droolsPdpEntity={}", droolsPdpEntity);
+ }
+ return droolsPdpEntity;
+
+ }
+
+ /*
+ * Normally this method should only be used in a JUnit test environment.
+ * Manually inserts a PDP record in droolspdpentity table.
+ */
+ @Override
+ public void insertPdp(DroolsPdp pdp) {
+ if (logger.isDebugEnabled()) {
+ logger.debug("insertPdp: Entering and manually inserting PDP");
+ }
+
+ /*
+ * Start transaction
+ */
+ EntityManager em = emf.createEntityManager();
+ try {
+ em.getTransaction().begin();
+
+ /*
+ * Insert record.
+ */
+ DroolsPdpEntity droolsPdpEntity = new DroolsPdpEntity();
+ em.persist(droolsPdpEntity);
+ droolsPdpEntity.setPdpId(pdp.getPdpId());
+ droolsPdpEntity.setDesignated(pdp.isDesignated());
+ droolsPdpEntity.setPriority(pdp.getPriority());
+ droolsPdpEntity.setUpdatedDate(pdp.getUpdatedDate());
+ droolsPdpEntity.setSiteName(pdp.getSiteName());
+
+ /*
+ * End transaction.
+ */
+ em.getTransaction().commit();
+ } finally {
+ cleanup(em, "insertPdp");
+ }
+ if (logger.isDebugEnabled()) {
+ logger.debug("insertPdp: Exiting");
+ }
+
+ }
+
+ /*
+ * Normally this method should only be used in a JUnit test environment.
+ * Manually deletes all PDP records in droolspdpentity table.
+ */
+ @Override
+ public void deleteAllPdps() {
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("deleteAllPdps: Entering");
+ }
+
+ /*
+ * Start transaction
+ */
+ EntityManager em = emf.createEntityManager();
+ try {
+ em.getTransaction().begin();
+
+ Query droolsPdpsListQuery = em
+ .createQuery("SELECT p FROM DroolsPdpEntity p");
+ @SuppressWarnings("unchecked")
+ List<DroolsPdp> droolsPdpsList = droolsPdpsListQuery.setLockMode(
+ LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
+ if (logger.isDebugEnabled()) {
+ logger.debug("deleteAllPdps: Deleting {} PDPs", droolsPdpsList.size());
+ }
+ for (DroolsPdp droolsPdp : droolsPdpsList) {
+ String pdpId = droolsPdp.getPdpId();
+ deletePdp(pdpId);
+ }
+
+ /*
+ * End transaction.
+ */
+ em.getTransaction().commit();
+ } finally {
+ cleanup(em, "deleteAllPdps");
+ }
+ if (logger.isDebugEnabled()) {
+ logger.debug("deleteAllPdps: Exiting");
+ }
+
+ }
+
+ /*
+ * Normally this method should only be used in a JUnit test environment.
+ * Manually deletes a PDP record in droolspdpentity table.
+ */
+ @Override
+ public void deletePdp(String pdpId) {
+ if (logger.isDebugEnabled()) {
+ logger.debug("deletePdp: Entering and manually deleting pdpId={}", pdpId);
+ }
+
+ /*
+ * Start transaction
+ */
+ EntityManager em = emf.createEntityManager();
+ try {
+ em.getTransaction().begin();
+
+ /*
+ * Delete record.
+ */
+ DroolsPdpEntity droolsPdpEntity = em.find(DroolsPdpEntity.class, pdpId);
+ if (droolsPdpEntity != null) {
+ if (logger.isDebugEnabled()) {
+ logger.debug("deletePdp: Removing PDP");
+ }
+ em.remove(droolsPdpEntity);
+ } else {
+ if (logger.isDebugEnabled()) {
+ logger.debug("deletePdp: PDP with ID={} not currently in DB", pdpId);
+ }
+ }
+
+ /*
+ * End transaction.
+ */
+ em.getTransaction().commit();
+ } finally {
+ cleanup(em, "deletePdp");
+ }
+ if (logger.isDebugEnabled()) {
+ logger.debug("deletePdp: Exiting");
+ }
+
+ }
+
+ /*
+ * Close the specified EntityManager, rolling back any pending transaction
+ *
+ * @param em the EntityManager to close ('null' is OK)
+ * @param method the invoking Java method (used for log messages)
+ */
+ private static void cleanup(EntityManager em, String method) {
+ if (em != null && em.isOpen()) {
+ if (em.getTransaction().isActive()) {
+ // there is an active EntityTransaction -- roll it back
+ try {
+ em.getTransaction().rollback();
+ } catch (Exception e) {
+ logger.error(method + ": Caught Exception attempting to rollback EntityTransaction,", e);
+ }
+ }
+
+ // now, close the EntityManager
+ try {
+ em.close();
+ } catch (Exception e) {
+ logger.error(method + ": Caught Exception attempting to close EntityManager, ", e);
+ }
+ }
+ }
}