package org.atricore.idbus.connectors.jdoidentityvault; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.atricore.idbus.connectors.jdoidentityvault.domain.JDOAttributeType; import org.atricore.idbus.connectors.jdoidentityvault.domain.JDOGroupAttributeDefinition; import org.atricore.idbus.connectors.jdoidentityvault.domain.JDOUserAttributeDefinition; import org.atricore.idbus.connectors.jdoidentityvault.domain.dao.JDOGroupAttributeDefinitionDAO; import org.atricore.idbus.connectors.jdoidentityvault.domain.dao.JDOGroupAttributeValueDAO; import org.atricore.idbus.connectors.jdoidentityvault.domain.dao.JDOUserAttributeDefinitionDAO; import org.atricore.idbus.connectors.jdoidentityvault.domain.dao.JDOUserAttributeValueDAO; import org.atricore.idbus.kernel.main.provisioning.domain.AttributeType; import org.atricore.idbus.kernel.main.provisioning.domain.GroupAttributeDefinition; import org.atricore.idbus.kernel.main.provisioning.domain.UserAttributeDefinition; import org.atricore.idbus.kernel.main.provisioning.exception.GroupAttributeNotFoundException; import org.atricore.idbus.kernel.main.provisioning.exception.ProvisioningException; import org.atricore.idbus.kernel.main.provisioning.exception.UserAttributeNotFoundException; import org.atricore.idbus.kernel.main.provisioning.impl.AbstractSchemaManager; import org.datanucleus.exceptions.NucleusObjectNotFoundException; import org.springframework.dao.IncorrectResultSizeDataAccessException; import org.springframework.orm.jdo.JdoObjectRetrievalFailureException; import org.springframework.transaction.IllegalTransactionStateException; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.DefaultTransactionDefinition; import javax.jdo.FetchPlan; import javax.jdo.JDOObjectNotFoundException; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** * @author <a href=mailto:sgonzalez@atricore.org>Sebastian Gonzalez Oyuela</a> */ public class JDOSchemaManager extends AbstractSchemaManager { private static final Log logger = LogFactory.getLog(JDOSchemaManager.class); private JDOUserAttributeDefinitionDAO usrAttrDefDao; private JDOGroupAttributeDefinitionDAO grpAttrDefDao; private JDOUserAttributeValueDAO usrAttrValDao; private JDOGroupAttributeValueDAO grpAttrValDao; // Spring transaction management private PlatformTransactionManager transactionManager; public PlatformTransactionManager getTransactionManager() { return transactionManager; } public void setTransactionManager(PlatformTransactionManager transactionManager) { this.transactionManager = transactionManager; } // @Transactional public UserAttributeDefinition addUserAttribute(UserAttributeDefinition attrDef) throws ProvisioningException { DefaultTransactionDefinition txDef = new DefaultTransactionDefinition(); TransactionStatus status = transactionManager.getTransaction(txDef ); try { JDOUserAttributeDefinition jdoUserAttribute = toJDOUserAttribute(attrDef); jdoUserAttribute = usrAttrDefDao.save(jdoUserAttribute); jdoUserAttribute = usrAttrDefDao.detachCopy(jdoUserAttribute, FetchPlan.FETCH_SIZE_GREEDY); transactionManager.commit(status); return toUserAttribute(jdoUserAttribute); } catch (Exception e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } throw new ProvisioningException(e); } } // @Transactional public UserAttributeDefinition updateUserAttribute(UserAttributeDefinition attrDef) throws ProvisioningException { DefaultTransactionDefinition txDef = new DefaultTransactionDefinition(); TransactionStatus status = transactionManager.getTransaction(txDef ); try { JDOUserAttributeDefinition jdoUserAttribute = usrAttrDefDao.findById(Long.parseLong(attrDef.getId())); if (!jdoUserAttribute.getName().equals(attrDef.getName())) { usrAttrValDao.updateName(jdoUserAttribute.getName(), attrDef.getName()); } jdoUserAttribute = toJDOUserAttribute(jdoUserAttribute, attrDef); jdoUserAttribute = usrAttrDefDao.save(jdoUserAttribute); jdoUserAttribute = usrAttrDefDao.detachCopy(jdoUserAttribute, FetchPlan.FETCH_SIZE_GREEDY); transactionManager.commit(status); return toUserAttribute(jdoUserAttribute); } catch (JdoObjectRetrievalFailureException e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } throw new UserAttributeNotFoundException(attrDef.getId()); } catch (JDOObjectNotFoundException e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } throw new UserAttributeNotFoundException(attrDef.getId()); } catch (NucleusObjectNotFoundException e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } throw new UserAttributeNotFoundException(attrDef.getId()); } catch (Exception e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } throw new ProvisioningException(e); } } // @Transactional public void deleteUserAttribute(String oid) throws ProvisioningException { long id = Long.parseLong(oid); DefaultTransactionDefinition txDef = new DefaultTransactionDefinition(); TransactionStatus status = transactionManager.getTransaction(txDef ); try { JDOUserAttributeDefinition jdoUserAttribute = usrAttrDefDao.findById(id); if (jdoUserAttribute != null) { usrAttrValDao.deleteValues(jdoUserAttribute.getName()); usrAttrDefDao.delete(id); } transactionManager.commit(status); } catch (JdoObjectRetrievalFailureException e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } throw new UserAttributeNotFoundException(id); } catch (JDOObjectNotFoundException e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } throw new UserAttributeNotFoundException(id); } catch (NucleusObjectNotFoundException e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } throw new UserAttributeNotFoundException(id); } catch (Exception e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } throw new ProvisioningException(e); } } // @Transactional public UserAttributeDefinition findUserAttributeById(String oid) throws ProvisioningException { long id = Long.parseLong(oid); DefaultTransactionDefinition txDef = new DefaultTransactionDefinition(); TransactionStatus status = transactionManager.getTransaction(txDef ); try { JDOUserAttributeDefinition jdoUserAttribute = usrAttrDefDao.findById(id); jdoUserAttribute = usrAttrDefDao.detachCopy(jdoUserAttribute, FetchPlan.FETCH_SIZE_GREEDY); transactionManager.commit(status); return toUserAttribute(jdoUserAttribute); } catch (IncorrectResultSizeDataAccessException e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } if (e.getActualSize() == 0) throw new UserAttributeNotFoundException(id); throw new ProvisioningException(e); } catch (JdoObjectRetrievalFailureException e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } throw new UserAttributeNotFoundException(id); } catch (JDOObjectNotFoundException e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } throw new UserAttributeNotFoundException(id); } catch (NucleusObjectNotFoundException e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } throw new UserAttributeNotFoundException(id); } catch (Exception e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } throw new ProvisioningException(e); } } // @Transactional public UserAttributeDefinition findUserAttributeByName(String name) throws ProvisioningException { DefaultTransactionDefinition txDef = new DefaultTransactionDefinition(); TransactionStatus status = transactionManager.getTransaction(txDef ); try { JDOUserAttributeDefinition jdoUserAttribute = usrAttrDefDao.findByName(name); jdoUserAttribute = usrAttrDefDao.detachCopy(jdoUserAttribute, FetchPlan.FETCH_SIZE_GREEDY); transactionManager.commit(status); return toUserAttribute(jdoUserAttribute); } catch (IncorrectResultSizeDataAccessException e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } if (e.getActualSize() == 0) throw new UserAttributeNotFoundException(name); throw new ProvisioningException(e); } catch (Exception e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } throw new ProvisioningException(e); } } // @Transactional public Collection<UserAttributeDefinition> listUserAttributes() throws ProvisioningException { DefaultTransactionDefinition txDef = new DefaultTransactionDefinition(); TransactionStatus status = transactionManager.getTransaction(txDef ); try { Collection<JDOUserAttributeDefinition> jdoUserAttributes = usrAttrDefDao.findAll(); jdoUserAttributes = usrAttrDefDao.detachCopyAll(jdoUserAttributes, FetchPlan.FETCH_SIZE_GREEDY); transactionManager.commit(status); return toUserAttributes(jdoUserAttributes); } catch (Exception e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } throw new ProvisioningException(e); } } // @Transactional public GroupAttributeDefinition addGroupAttribute(GroupAttributeDefinition attrDef) throws ProvisioningException { DefaultTransactionDefinition txDef = new DefaultTransactionDefinition(); TransactionStatus status = transactionManager.getTransaction(txDef ); try { JDOGroupAttributeDefinition jdoGroupAttribute = toJDOGroupAttribute(attrDef); jdoGroupAttribute = grpAttrDefDao.save(jdoGroupAttribute); jdoGroupAttribute = grpAttrDefDao.detachCopy(jdoGroupAttribute, FetchPlan.FETCH_SIZE_GREEDY); transactionManager.commit(status); return toGroupAttribute(jdoGroupAttribute); } catch (Exception e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } throw new ProvisioningException(e); } } // @Transactional public GroupAttributeDefinition updateGroupAttribute(GroupAttributeDefinition attrDef) throws ProvisioningException { DefaultTransactionDefinition txDef = new DefaultTransactionDefinition(); TransactionStatus status = transactionManager.getTransaction(txDef ); try { JDOGroupAttributeDefinition jdoGroupAttribute = grpAttrDefDao.findById(Long.parseLong(attrDef.getId())); if (!jdoGroupAttribute.getName().equals(attrDef.getName())) { grpAttrValDao.updateName(jdoGroupAttribute.getName(), attrDef.getName()); } jdoGroupAttribute = toJDOGroupAttribute(jdoGroupAttribute, attrDef); jdoGroupAttribute = grpAttrDefDao.save(jdoGroupAttribute); jdoGroupAttribute = grpAttrDefDao.detachCopy(jdoGroupAttribute, FetchPlan.FETCH_SIZE_GREEDY); transactionManager.commit(status); return toGroupAttribute(jdoGroupAttribute); } catch (JdoObjectRetrievalFailureException e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } throw new GroupAttributeNotFoundException(attrDef.getId()); } catch (JDOObjectNotFoundException e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } throw new GroupAttributeNotFoundException(attrDef.getId()); } catch (NucleusObjectNotFoundException e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } throw new GroupAttributeNotFoundException(attrDef.getId()); } catch (Exception e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } throw new ProvisioningException(e); } } // @Transactional public void deleteGroupAttribute(String oid) throws ProvisioningException { long id = Long.parseLong(oid); DefaultTransactionDefinition txDef = new DefaultTransactionDefinition(); TransactionStatus status = transactionManager.getTransaction(txDef ); try { JDOGroupAttributeDefinition jdoGroupAttribute = grpAttrDefDao.findById(id); if (jdoGroupAttribute != null) { grpAttrValDao.deleteValues(jdoGroupAttribute.getName()); grpAttrDefDao.delete(id); } transactionManager.commit(status); } catch (JdoObjectRetrievalFailureException e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } throw new GroupAttributeNotFoundException(id); } catch (JDOObjectNotFoundException e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } throw new GroupAttributeNotFoundException(id); } catch (NucleusObjectNotFoundException e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } throw new GroupAttributeNotFoundException(id); } catch (Exception e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } throw new ProvisioningException(e); } } // @Transactional public GroupAttributeDefinition findGroupAttributeById(String oid) throws ProvisioningException { long id = Long.parseLong(oid); DefaultTransactionDefinition txDef = new DefaultTransactionDefinition(); TransactionStatus status = transactionManager.getTransaction(txDef ); try { JDOGroupAttributeDefinition jdoGroupAttribute = grpAttrDefDao.findById(id); jdoGroupAttribute = grpAttrDefDao.detachCopy(jdoGroupAttribute, FetchPlan.FETCH_SIZE_GREEDY); transactionManager.commit(status); return toGroupAttribute(jdoGroupAttribute); } catch (IncorrectResultSizeDataAccessException e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } if (e.getActualSize() == 0) throw new GroupAttributeNotFoundException(id); throw new ProvisioningException(e); } catch (JdoObjectRetrievalFailureException e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } throw new GroupAttributeNotFoundException(id); } catch (JDOObjectNotFoundException e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } throw new GroupAttributeNotFoundException(id); } catch (NucleusObjectNotFoundException e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } throw new GroupAttributeNotFoundException(id); } catch (Exception e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } throw new ProvisioningException(e); } } // @Transactional public GroupAttributeDefinition findGroupAttributeByName(String name) throws ProvisioningException { DefaultTransactionDefinition txDef = new DefaultTransactionDefinition(); TransactionStatus status = transactionManager.getTransaction(txDef ); try { JDOGroupAttributeDefinition jdoGroupAttribute = grpAttrDefDao.findByName(name); jdoGroupAttribute = grpAttrDefDao.detachCopy(jdoGroupAttribute, FetchPlan.FETCH_SIZE_GREEDY); transactionManager.commit(status); return toGroupAttribute(jdoGroupAttribute); } catch (IncorrectResultSizeDataAccessException e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } if (e.getActualSize() == 0) throw new GroupAttributeNotFoundException(name); throw new ProvisioningException(e); } catch (Exception e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } throw new ProvisioningException(e); } } // @Transactional public Collection<GroupAttributeDefinition> listGroupAttributes() throws ProvisioningException { DefaultTransactionDefinition txDef = new DefaultTransactionDefinition(); TransactionStatus status = transactionManager.getTransaction(txDef ); try { Collection<JDOGroupAttributeDefinition> jdoGroupAttributes = grpAttrDefDao.findAll(); jdoGroupAttributes = grpAttrDefDao.detachCopyAll(jdoGroupAttributes, FetchPlan.FETCH_SIZE_GREEDY); transactionManager.commit(status); return toGroupAttributes(jdoGroupAttributes); } catch (Exception e) { try { transactionManager.rollback(status); } catch (IllegalTransactionStateException te) { logger.warn (e.getMessage()); } throw new ProvisioningException(e); } } // -------------------------------------------< Utils > // User Attribute Utils protected JDOUserAttributeDefinition toJDOUserAttribute(UserAttributeDefinition userAttribute) { JDOUserAttributeDefinition jdoUserAttribute = toJDOUserAttribute(new JDOUserAttributeDefinition(), userAttribute); if (userAttribute.getId() != null) jdoUserAttribute.setId(Long.parseLong(userAttribute.getId())); return jdoUserAttribute; } protected JDOUserAttributeDefinition toJDOUserAttribute(JDOUserAttributeDefinition jdoUserAttribute, UserAttributeDefinition userAttribute) { jdoUserAttribute.setType(JDOAttributeType.fromValue(userAttribute.getType().toString())); jdoUserAttribute.setName(userAttribute.getName()); jdoUserAttribute.setDescription(userAttribute.getDescription()); jdoUserAttribute.setMultivalued(userAttribute.isMultivalued()); jdoUserAttribute.setRequired(userAttribute.isRequired()); return jdoUserAttribute; } protected UserAttributeDefinition toUserAttribute(JDOUserAttributeDefinition jdoUserAttribute) { UserAttributeDefinition userAttribute = new UserAttributeDefinition(); userAttribute.setId(jdoUserAttribute.getId() + ""); userAttribute.setType(AttributeType.fromValue(jdoUserAttribute.getType().toString())); userAttribute.setName(jdoUserAttribute.getName()); userAttribute.setDescription(jdoUserAttribute.getDescription()); userAttribute.setMultivalued(jdoUserAttribute.getMultivalued()); userAttribute.setRequired(jdoUserAttribute.getRequired()); return userAttribute; } protected Collection<UserAttributeDefinition> toUserAttributes(Collection<JDOUserAttributeDefinition> jdoUserAttributes) { List<UserAttributeDefinition> userAttributes = new ArrayList<UserAttributeDefinition>(jdoUserAttributes.size()); for (JDOUserAttributeDefinition jdoUserAttribute : jdoUserAttributes) { userAttributes.add(toUserAttribute(jdoUserAttribute)); } return userAttributes; } // Group Attribute Utils protected JDOGroupAttributeDefinition toJDOGroupAttribute(GroupAttributeDefinition groupAttribute) { JDOGroupAttributeDefinition jdoGroupAttribute = toJDOGroupAttribute(new JDOGroupAttributeDefinition(), groupAttribute); jdoGroupAttribute.setId(Long.parseLong(groupAttribute.getId())); return jdoGroupAttribute; } protected JDOGroupAttributeDefinition toJDOGroupAttribute(JDOGroupAttributeDefinition jdoGroupAttribute, GroupAttributeDefinition groupAttribute) { jdoGroupAttribute.setType(JDOAttributeType.fromValue(groupAttribute.getType().toString())); jdoGroupAttribute.setName(groupAttribute.getName()); jdoGroupAttribute.setDescription(groupAttribute.getDescription()); jdoGroupAttribute.setMultivalued(groupAttribute.isMultivalued()); jdoGroupAttribute.setRequired(groupAttribute.isRequired()); return jdoGroupAttribute; } protected GroupAttributeDefinition toGroupAttribute(JDOGroupAttributeDefinition jdoGroupAttribute) { GroupAttributeDefinition groupAttribute = new GroupAttributeDefinition(); groupAttribute.setId(jdoGroupAttribute.getId() + ""); groupAttribute.setType(AttributeType.fromValue(jdoGroupAttribute.getType().toString())); groupAttribute.setName(jdoGroupAttribute.getName()); groupAttribute.setDescription(jdoGroupAttribute.getDescription()); groupAttribute.setMultivalued(jdoGroupAttribute.getMultivalued()); groupAttribute.setRequired(jdoGroupAttribute.getRequired()); return groupAttribute; } protected Collection<GroupAttributeDefinition> toGroupAttributes(Collection<JDOGroupAttributeDefinition> jdoGroupAttributes) { List<GroupAttributeDefinition> groupAttributes = new ArrayList<GroupAttributeDefinition>(jdoGroupAttributes.size()); for (JDOGroupAttributeDefinition jdoGroupAttribute : jdoGroupAttributes) { groupAttributes.add(toGroupAttribute(jdoGroupAttribute)); } return groupAttributes; } public void setGrpAttrDefDao(JDOGroupAttributeDefinitionDAO grpAttrDefDao) { this.grpAttrDefDao = grpAttrDefDao; } public void setUsrAttrDefDao(JDOUserAttributeDefinitionDAO usrAttrDefDao) { this.usrAttrDefDao = usrAttrDefDao; } public void setUsrAttrValDao(JDOUserAttributeValueDAO usrAttrValDao) { this.usrAttrValDao = usrAttrValDao; } public void setGrpAttrValDao(JDOGroupAttributeValueDAO grpAttrValDao) { this.grpAttrValDao = grpAttrValDao; } }