package is.idega.idegaweb.egov.bpm.cases.exe; import java.util.logging.Level; import java.util.logging.Logger; import javax.ejb.FinderException; import org.springframework.beans.factory.annotation.Autowired; import com.idega.block.process.business.ProcessConstants; import com.idega.data.IDOLookup; import com.idega.data.MetaData; import com.idega.data.MetaDataBMPBean; import com.idega.data.MetaDataHome; import com.idega.idegaweb.IWMainApplication; import com.idega.idegaweb.egov.bpm.data.dao.CasesBPMDAO; import com.idega.jbpm.bean.VariableInstanceInfo; import com.idega.jbpm.data.VariableInstanceQuerier; import com.idega.util.CoreUtil; import com.idega.util.StringUtil; import com.idega.util.expression.ELUtil; public abstract class DefaultIdentifierGenerator { private static final Logger LOGGER = Logger.getLogger(DefaultIdentifierGenerator.class.getName()); private static final String IDENTIFIER_META_DATA = "CASE_IDENTIFIER_IS_TAKEN_META_DATA"; @Autowired private CasesBPMDAO casesBPMDAO; @Autowired private VariableInstanceQuerier variablesQuerier; /** * It is strongly recommended to implement this method as synchronized * * @return */ public abstract Object[] generateNewCaseIdentifier(); /** * It is strongly recommended to implement this method as synchronized * * @return */ protected abstract Object[] generateNewCaseIdentifier(String usedIdentifier); protected synchronized boolean canUseIdentifier(String identifier) { // 0. Checking if identifier is not empty if (StringUtil.isEmpty(identifier)) { LOGGER.warning("Identifier is empty or null!"); return false; } // 1. Will check record in meta data table for the given identifier try { if (isStoredInMetaData(identifier)) { return false; } } catch (Exception e) { LOGGER.log(Level.WARNING, "Some error occured while checking identifier ('" + identifier + "') in DB table: " + MetaDataBMPBean.TABLE_NAME, e); } // 2. Checking if already exists variable with such identifier try { if (isStoredInVariables(identifier)) { return false; } } catch (Exception e) { LOGGER.log(Level.WARNING, "Some error occured while checking identifier ('" + identifier + "') in BPM variables table", e); } // Identifier can be used, marking it as "taken" in meta data table try { storeIdentifier(identifier); } catch (Exception e) { String errorMessage = "Error saving identifier: '" + identifier + "'"; LOGGER.log(Level.SEVERE, errorMessage, e); CoreUtil.sendExceptionNotification(errorMessage, e); return false; } return true; } private boolean isStoredInMetaData(String identifier) throws Exception { MetaDataHome metaDataHome = (MetaDataHome) IDOLookup.getHome(MetaData.class); try { metaDataHome.findByMetaDataNameAndValueAndType(IDENTIFIER_META_DATA, identifier, String.class.getName()); return true; } catch (FinderException e) { return false; } } private boolean isStoredInVariables(String identifier) throws Exception { if (IWMainApplication.getDefaultIWMainApplication().getSettings().getBoolean("check_identifier_in_jbpm", Boolean.TRUE)) { try { return getVariablesQuerier().isVariableStored(ProcessConstants.CASE_IDENTIFIER, identifier); } catch (Exception e) { LOGGER.log(Level.WARNING, "Error occurred while selecting " + VariableInstanceInfo.class + " objects by variable name: " + ProcessConstants.CASE_IDENTIFIER + " and value: " + identifier, e); } return false; } return false; } private void storeIdentifier(String identifier) throws Exception { MetaDataHome metaDataHome = (MetaDataHome) IDOLookup.getHome(MetaData.class); MetaData metaData = metaDataHome.create(); metaData.setValue(identifier); metaData.setName(IDENTIFIER_META_DATA); metaData.setType(String.class.getName()); metaData.store(); } public CasesBPMDAO getCasesBPMDAO() { if (casesBPMDAO == null) { ELUtil.getInstance().autowire(this); } return casesBPMDAO; } public void setCasesBPMDAO(CasesBPMDAO casesBPMDAO) { this.casesBPMDAO = casesBPMDAO; } public VariableInstanceQuerier getVariablesQuerier() { if (variablesQuerier == null) { ELUtil.getInstance().autowire(this); } return variablesQuerier; } public void setVariablesQuerier(VariableInstanceQuerier variablesQuerier) { this.variablesQuerier = variablesQuerier; } }