package jp.aegif.nemaki.businesslogic.impl; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import jp.aegif.nemaki.businesslogic.TypeService; import jp.aegif.nemaki.dao.ContentDaoService; import jp.aegif.nemaki.model.NemakiPropertyDefinition; import jp.aegif.nemaki.model.NemakiPropertyDefinitionCore; import jp.aegif.nemaki.model.NemakiPropertyDefinitionDetail; import jp.aegif.nemaki.model.NemakiTypeDefinition; import org.apache.chemistry.opencmis.commons.PropertyIds; import org.apache.commons.collections.CollectionUtils; public class TypeServiceImpl implements TypeService{ private ContentDaoService contentDaoService; public TypeServiceImpl() { } public TypeServiceImpl(ContentDaoService contentDaoService) { setContentDaoService(contentDaoService); } @Override public NemakiTypeDefinition getTypeDefinition(String repositoryId, String typeId) { return contentDaoService.getTypeDefinition(repositoryId, typeId); } @Override public List<NemakiTypeDefinition> getTypeDefinitions(String repositoryId) { return contentDaoService.getTypeDefinitions(repositoryId); } @Override public NemakiPropertyDefinition getPropertyDefinition(String repositoryId, String detailNodeId) { NemakiPropertyDefinitionDetail detail = getPropertyDefinitionDetail(repositoryId, detailNodeId); NemakiPropertyDefinitionCore core = getPropertyDefinitionCore(repositoryId, detail .getCoreNodeId()); NemakiPropertyDefinition npd = new NemakiPropertyDefinition(core, detail); return npd; } @Override public NemakiPropertyDefinitionCore getPropertyDefinitionCore(String repositoryId, String coreId) { return contentDaoService.getPropertyDefinitionCore(repositoryId, coreId); } @Override public NemakiPropertyDefinitionCore getPropertyDefinitionCoreByPropertyId( String repositoryId, String propertyId) { return contentDaoService.getPropertyDefinitionCoreByPropertyId(repositoryId, propertyId); } @Override public List<NemakiPropertyDefinitionCore> getPropertyDefinitionCores(String repositoryId) { return contentDaoService.getPropertyDefinitionCores(repositoryId); } @Override public NemakiPropertyDefinitionDetail getPropertyDefinitionDetail( String repositoryId, String detailId) { return contentDaoService.getPropertyDefinitionDetail(repositoryId, detailId); } @Override public List<NemakiPropertyDefinitionDetail> getPropertyDefinitionDetailByCoreNodeId( String repositoryId, String coreNodeId){ return contentDaoService.getPropertyDefinitionDetailByCoreNodeId(repositoryId, coreNodeId); } @Override public NemakiTypeDefinition createTypeDefinition( String repositoryId, NemakiTypeDefinition typeDefinition) { return contentDaoService.createTypeDefinition(repositoryId, typeDefinition); } @Override public NemakiTypeDefinition updateTypeDefinition( String repositoryId, NemakiTypeDefinition typeDefinition) { return contentDaoService.updateTypeDefinition(repositoryId, typeDefinition); } @Override public void deleteTypeDefinition(String repositoryId, String typeId) { NemakiTypeDefinition ntd = getTypeDefinition(repositoryId, typeId); //Delete unnecessary property definitions List<String> detailIds = ntd.getProperties(); for(String detailId : detailIds){ NemakiPropertyDefinitionDetail detail = getPropertyDefinitionDetail(repositoryId, detailId); NemakiPropertyDefinitionCore core = getPropertyDefinitionCore(repositoryId, detail.getCoreNodeId()); //Delete a detail contentDaoService.delete(repositoryId, detail.getId()); //Delete a core only if no details exist List<NemakiPropertyDefinitionDetail> l = contentDaoService.getPropertyDefinitionDetailByCoreNodeId(repositoryId, core.getId()); if(CollectionUtils.isEmpty(l)){ contentDaoService.delete(repositoryId, core.getId()); } } //Delete the type definition contentDaoService.deleteTypeDefinition(repositoryId, ntd.getId()); } @Override public NemakiPropertyDefinitionDetail createPropertyDefinition( String repositoryId, NemakiPropertyDefinition propertyDefinition) { NemakiPropertyDefinitionCore _core = new NemakiPropertyDefinitionCore( propertyDefinition); // Skip creating a core when it exists List<NemakiPropertyDefinitionCore> cores = getPropertyDefinitionCores(repositoryId); Map<String, NemakiPropertyDefinitionCore> corePropertyIds = new HashMap<String, NemakiPropertyDefinitionCore>(); for (NemakiPropertyDefinitionCore npdc : cores) { corePropertyIds.put(npdc.getPropertyId(), npdc); } String coreNodeId = ""; if (!corePropertyIds.containsKey(_core.getPropertyId())) { //propertyId uniqueness _core.setPropertyId(buildUniquePropertyId(repositoryId, _core.getPropertyId())); // Create a property core NemakiPropertyDefinitionCore core = contentDaoService .createPropertyDefinitionCore(repositoryId, _core); coreNodeId = core.getId(); } else { NemakiPropertyDefinitionCore existing = corePropertyIds.get(_core .getPropertyId()); coreNodeId = existing.getId(); } // Create a detail NemakiPropertyDefinitionDetail _detail = new NemakiPropertyDefinitionDetail( propertyDefinition, coreNodeId); NemakiPropertyDefinitionDetail detail = contentDaoService .createPropertyDefinitionDetail(repositoryId, _detail); return detail; } @Override public NemakiPropertyDefinitionDetail updatePropertyDefinitionDetail( String repositoryId, NemakiPropertyDefinitionDetail propertyDefinitionDetail) { return contentDaoService.updatePropertyDefinitionDetail(repositoryId, propertyDefinitionDetail); } private String buildUniquePropertyId(String repositoryId, String propertyId){ if(isUniquePropertyIdInRepository(repositoryId, propertyId)){ return propertyId; }else{ return propertyId + "_" + String.valueOf(System.currentTimeMillis()); } } private boolean isUniquePropertyIdInRepository(String repositoryId, String propertyId){ //propertyId uniqueness List<String> list = getSystemPropertyIds(); List<NemakiPropertyDefinitionCore>cores = getPropertyDefinitionCores(repositoryId); if(CollectionUtils.isNotEmpty(cores)){ for(NemakiPropertyDefinitionCore core: cores){ list.add(core.getPropertyId()); } } return !list.contains(propertyId); } /** * List up specification-default property ids * * @return */ private List<String> getSystemPropertyIds() { List<String> ids = new ArrayList<String>(); Field[] fields = PropertyIds.class.getDeclaredFields(); for (Field field : fields) { try { String cmisId = (String) (field.get(null)); ids.add(cmisId); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } return ids; } public void setContentDaoService(ContentDaoService contentDaoService) { this.contentDaoService = contentDaoService; } }