/**
* -----------------------------------------------------------------------------------
* (c) 2010-2014 OpenInfobutton Project, Biomedical Informatics, University of Utah
* Contact: {@code <andrew.iskander@utah.edu>}
* Biomedical Informatics
* 421 Wakara Way, Ste 140
* Salt Lake City, UT 84108-3514
* Day Phone: 1-801-581-4080
* -----------------------------------------------------------------------------------
*
* @author Andrew Iskander {@code <andrew.iskander@utah.edu>}
* @version Jul 15, 2014
*/
package edu.utah.openinfobutton.externalresource.implementation;
import java.util.List;
import org.openinfobutton.schemas.kb.Code;
import org.openinfobutton.schemas.kb.Id;
import org.openinfobutton.schemas.kb.TerminologyInference.CodeInference.InferenceDefinition.LocalMappings.Mapping;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import edu.utah.further.subsetdb.domain.Concept;
import edu.utah.further.subsetdb.domain.Subset;
import edu.utah.further.subsetdb.service.SubsetDbDao;
import edu.utah.openinfobutton.externalresource.api.ExternalResourceHandler;
import edu.utah.openinfobutton.externalresource.api.TerminologyHandler;
/**
* The Class LocalTerminologyHandler.
*/
@Component
public class LocalTerminologyHandler
implements TerminologyHandler
{
/** The dao. */
@Autowired
private SubsetDbDao dao;
/** The handler. */
@Autowired
ExternalResourceHandler handler;
/** The terminology mappings. */
@Autowired
TerminologyMappings terminologyMappings;
/** The valid mappings. */
List<Mapping> validMappings;
/*
* (non-Javadoc)
* @see edu.utah.openinfobutton.externalresource.api.TerminologyHandler#isSubsetMember(org.openinfobutton.schemas.kb.Code, java.util.List)
*/
@Override
public Boolean isSubsetMember( Code code, List<Id> subsetIdList )
{
Boolean match = false;
final Concept concept = dao.getConceptByCodeAndCodeSystem( code.getCode(), code.getCodeSystem() );
for ( final Id subsetId : subsetIdList )
{
final Subset subset = dao.getSubsetByName( subsetId.getId() );
if ( concept != null && subset != null )
{
match = dao.isConceptInSubset( concept.getId(), subset.getId() );
}
if ( match )
{
break;
}
}
// This is no longer necessary as all of the values sets are present in the UofU local OIB.
// If required, your own implementation can be given.
// if(!match)
// {
// match = handler.matchCodeSet(subsetIdList, code);
// }
return match;
}
/*
* (non-Javadoc)
* @see edu.utah.openinfobutton.externalresource.api.TerminologyHandler#transformCode(org.openinfobutton.schemas.kb.Code, java.lang.String)
*/
@Override
public Code transformCode( Code code, String codeSystem )
{
// TODO Auto-generated method stub
validMappings = terminologyMappings.getValidMappings();
for ( int i = 0; i < validMappings.size(); i++ )
{
final Mapping m = validMappings.get( i );
if ( ( m.getSourceValue().equals( code.getCodeSystem() ) ) && ( m.getTargetValue().equals( codeSystem ) ) )
{
final Code transformedCode = handler.transformCode( code, m.getTargetName() );
if ( transformedCode != null )
{
transformedCode.setCodeSystem( m.getTargetValue() );
return transformedCode;
}
}
}
return null;
}
/**
* Checks if is descendant.
*
* @param code1 the code1
* @param code2 the code2
* @return true, if is descendant
*/
public boolean isDescendant( Code code1, Code code2 )
{
return handler.isDescendant( code1, code2 );
}
}