/**
*
*/
package org.ihtsdo.otf.refset.service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import org.ihtsdo.otf.refset.domain.Member;
import org.ihtsdo.otf.refset.domain.Refset;
import org.ihtsdo.otf.refset.exception.EntityAlreadyExistException;
import org.ihtsdo.otf.refset.exception.EntityNotFoundException;
import org.ihtsdo.otf.refset.exception.RefsetServiceException;
import org.ihtsdo.otf.refset.graph.RefsetGraphAccessException;
import org.ihtsdo.otf.refset.graph.gao.MemberGAO;
import org.ihtsdo.otf.refset.graph.gao.RefsetAdminGAO;
import org.ihtsdo.otf.refset.graph.gao.RefsetGAO;
import org.ihtsdo.otf.snomed.domain.Concept;
import org.ihtsdo.otf.snomed.exception.ConceptServiceException;
import org.ihtsdo.otf.snomed.service.ConceptLookupService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
/**
* @author
*
*/
@Service
public class RefsetAuthoringServiceImpl implements RefsetAuthoringService {
private static final Logger LOGGER = LoggerFactory.getLogger(RefsetAuthoringServiceImpl.class);
@Autowired
private RefsetGAO gao;
@Autowired
private RefsetAdminGAO adminGao;
@Autowired
private MemberGAO mGao;
@Autowired
private ConceptLookupService lService;
/* (non-Javadoc)
* @see org.ihtsdo.otf.refset.service.RefsetAdminService#addRefset(org.ihtsdo.otf.refset.domain.Refset)
*/
@Override
public String addRefset(Refset r) throws RefsetServiceException, EntityAlreadyExistException {
LOGGER.debug("addrefset {}", r);
try {
adminGao.addRefset(r);
return r.getUuid();
} catch (RefsetGraphAccessException e) {
LOGGER.error("Error during service call", e);
throw new RefsetServiceException(e.getMessage());
}
}
/* (non-Javadoc)
* @see org.ihtsdo.otf.refset.service.RefsetAdminService#addMember(java.lang.String, org.ihtsdo.otf.refset.domain.Member)
*/
@Override
public void addMember(String refsetId, Member m)
throws RefsetServiceException, EntityNotFoundException, EntityAlreadyExistException {
LOGGER.debug("Adding member {} to refset {}", m, refsetId);
if (m == null || StringUtils.isEmpty(m.getReferencedComponentId())) {
throw new EntityNotFoundException("Invalid member details. Member must have reference component id");
}
try {
Refset r = gao.getRefset(refsetId);
List<Member> members = new ArrayList<Member>();
m.setUuid(UUID.randomUUID().toString());
if(StringUtils.isEmpty(m.getDescription())) {
Concept c = lService.getConcept(m.getReferencedComponentId());
m.setDescription(c.getLabel());
}
members.add(m);
r.setMembers(members);
LOGGER.debug("Adding member {} to refset {}", m, r);
adminGao.addRefset(r);
LOGGER.debug("Added member {} to refset {}", m, r);
} catch (EntityNotFoundException e) {
LOGGER.error("Error during service call", e);
throw e;
} catch (RefsetGraphAccessException e) {
// TODO Auto-generated catch block
LOGGER.error("Error during service call", e);
throw new RefsetServiceException(e.getMessage());
} catch (ConceptServiceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public String updateRefset(Refset r) throws RefsetServiceException, EntityNotFoundException {
LOGGER.debug("updateRefset member {} to refset {}", r);
try {
r = obfuscate(r);
adminGao.updateRefset(r);
} catch (RefsetGraphAccessException e) {
LOGGER.error("Error during service call", e);
throw new RefsetServiceException(e.getMessage());
}
return r.getUuid();
}
/**Does required update checks and removes fields which can not be updated
* @param r
* @return
* @throws RefsetServiceException
*/
private Refset obfuscate(Refset r) throws RefsetServiceException {
// TODO Auto-generated method stub
if (r == null) {
throw new RefsetServiceException("Invalid request, refset supplied can not be empty");
} else if (StringUtils.isEmpty(r.getDescription())) {
throw new RefsetServiceException("Invalid request, refset description is mandatory");
}
r.setCreated(null);
r.setCreatedBy(null);
return r;
}
@Override
public void remove(String refsetId, String user) throws RefsetServiceException,
EntityNotFoundException {
LOGGER.debug("remove refset {}", refsetId);
try {
adminGao.removeRefset(refsetId, user);
} catch (RefsetGraphAccessException e) {
LOGGER.error("Error during service call", e);
throw new RefsetServiceException(e.getMessage());
}
}
/* (non-Javadoc)
* @see org.ihtsdo.otf.refset.service.RefsetAuthoringService#removeMemberFromRefset(java.lang.String, java.lang.String)
*/
@Override
public void removeMemberFromRefset(String refsetId, String rcId, String user)
throws RefsetServiceException, EntityNotFoundException {
LOGGER.debug("removeMemberFromRefset member {} from refset {}", rcId, refsetId);
if (StringUtils.isEmpty(refsetId) || StringUtils.isEmpty(rcId)) {
throw new EntityNotFoundException("Invalid request check refset id and member's reference component id. Both are required");
}
try {
mGao.removeMember(refsetId, rcId, user);
} catch (EntityNotFoundException e) {
LOGGER.error("Error during service call", e);
throw e;
} catch (RefsetGraphAccessException e) {
LOGGER.error("Error during service call", e);
throw new RefsetServiceException(e.getMessage());
}
}
/* (non-Javadoc)
* @see org.ihtsdo.otf.refset.service.RefsetAuthoringService#addMembers(java.lang.String, java.util.Set, java.lang.String)
*/
@Override
public Map<String, String> removeMembers(String refsetId, Set<String> conceptIds, String user)
throws RefsetServiceException, EntityNotFoundException {
Map<String, String> tOutcome = new HashMap<String, String>();
LOGGER.debug("Removing members {} from refset {}", conceptIds, refsetId);
try {
Map<String, String> outcome = mGao.removeMembers(refsetId, conceptIds, user);
tOutcome.putAll(outcome);
} catch (EntityNotFoundException e) {
LOGGER.error("Error during service call", e);
throw e;
} catch (RefsetGraphAccessException e) {
LOGGER.error("Error during service call", e);
throw new RefsetServiceException(e.getMessage());
}
return tOutcome;
}
/* (non-Javadoc)
* @see org.ihtsdo.otf.refset.service.RefsetAuthoringService#addMembers(java.lang.String, java.util.Set)
*/
@Override
public Map<String, String> addMembers(String refsetId, Set<Member> members, String user)
throws RefsetServiceException, EntityNotFoundException {
Map<String, String> tOutcome = new HashMap<String, String>();
LOGGER.debug("Adding members {} to refset {}", members, refsetId);
try {
LOGGER.debug("Adding member {} to refset {}", members, refsetId);
Map<String, String> outcome = mGao.addMembers(refsetId, members, user);
tOutcome.putAll(outcome);
LOGGER.debug("Added member {} to refset {}");
} catch (EntityNotFoundException e) {
LOGGER.error("Error during service call", e);
throw e;
} catch (RefsetGraphAccessException e) {
LOGGER.error("Error during service call", e);
throw new RefsetServiceException(e.getMessage());
}
return tOutcome;
}
}