package is.idega.idegaweb.egov.bpm.cases.exe; import java.util.Date; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; import com.idega.idegaweb.egov.bpm.data.CaseProcInstBind; import com.idega.idegaweb.egov.bpm.data.dao.CasesBPMDAO; import com.idega.util.CoreConstants; import com.idega.util.IWTimestamp; import com.idega.util.StringUtil; /** * @author <a href="mailto:civilis@idega.com">Vytautas Čivilis</a> * @version $Revision: 1.2 $ * * Last modified: $Date: 2009/06/30 13:17:35 $ by $Author: valdas $ */ @Scope(BeanDefinition.SCOPE_SINGLETON) @Service @Qualifier(CaseIdentifier.QUALIFIER) public class CaseIdentifier extends DefaultIdentifierGenerator { public static final String QUALIFIER = "defaultCaseIdentifier"; public static final String IDENTIFIER_PREFIX = "P"; private CaseIdentifierBean lastCaseIdentifierNumber; @Autowired private CasesBPMDAO casesBPMDAO; @Override public synchronized Object[] generateNewCaseIdentifier() { return generateNewCaseIdentifier(null); } @Override protected synchronized Object[] generateNewCaseIdentifier(String usedIdentifier) { IWTimestamp currentTime = new IWTimestamp(); currentTime.setAsDate(); CaseIdentifierBean scopedCI; if (lastCaseIdentifierNumber == null || !currentTime.equals(lastCaseIdentifierNumber.time)) { lastCaseIdentifierNumber = new CaseIdentifierBean(); CaseProcInstBind b = getCasesBPMDAO().getCaseProcInstBindLatestByDateQN(new Date()); if (b != null && b.getDateCreated() != null && b.getCaseIdentierID() != null) { lastCaseIdentifierNumber.time = new IWTimestamp(b.getDateCreated()); lastCaseIdentifierNumber.time.setAsDate(); lastCaseIdentifierNumber.number = b.getCaseIdentierID(); } else { lastCaseIdentifierNumber.time = currentTime; lastCaseIdentifierNumber.time.setAsDate(); lastCaseIdentifierNumber.number = 0; } } scopedCI = lastCaseIdentifierNumber; // Will try to use used identifier's number (increased by 1) if (!StringUtil.isEmpty(usedIdentifier)) { String[] parts = usedIdentifier.split(CoreConstants.MINUS); String numberValue = parts[parts.length - 1]; Integer number = Integer.valueOf(numberValue); if (number > scopedCI.number) { scopedCI.number = number; } } String generated = scopedCI.generate(); while (!canUseIdentifier(generated)) { generated = scopedCI.generate(); } return new Object[] { scopedCI.number, generated }; } protected class CaseIdentifierBean { private IWTimestamp time; private Integer number; String generate() { String nr = String.valueOf(++number); while(nr.length() < 4) nr = "0"+nr; return new StringBuffer(IDENTIFIER_PREFIX) .append(CoreConstants.MINUS) .append(time.getYear()) .append(CoreConstants.MINUS) .append(time.getMonth() < 10 ? "0"+time.getMonth() : time.getMonth()) .append(CoreConstants.MINUS) .append(time.getDay() < 10 ? "0"+time.getDay() : time.getDay()) .append(CoreConstants.MINUS) .append(nr) .toString(); } public IWTimestamp getTime() { return time; } public Integer getNumber() { return number; } } protected CaseIdentifierBean getCaseIdentifierBean() { return lastCaseIdentifierNumber; } @Override public CasesBPMDAO getCasesBPMDAO() { return casesBPMDAO; } @Override public void setCasesBPMDAO(CasesBPMDAO casesBPMDAO) { this.casesBPMDAO = casesBPMDAO; } }