use of ubic.gemma.model.common.description.AnnotationValueObject in project Gemma by PavlidisLab.
the class CharacteristicBrowserController method browse.
public JsonReaderResponse<AnnotationValueObject> browse(ListBatchCommand batch) {
Integer count = characteristicService.countAll();
List<AnnotationValueObject> results = new ArrayList<>();
Collection<Characteristic> records;
if (StringUtils.isNotBlank(batch.getSort())) {
String o = batch.getSort();
String orderBy;
switch(o) {
case "className":
orderBy = "category";
break;
case "termName":
orderBy = "value";
break;
case "evidenceCode":
orderBy = "evidenceCode";
break;
default:
throw new IllegalArgumentException("Unknown sort field: " + o);
}
boolean descending = batch.getDir() != null && batch.getDir().equalsIgnoreCase("DESC");
records = characteristicService.browse(batch.getStart(), batch.getLimit(), orderBy, descending);
} else {
records = characteristicService.browse(batch.getStart(), batch.getLimit());
}
Map<Characteristic, Object> charToParent = characteristicService.getParents(records);
for (Object o : records) {
Characteristic c = (Characteristic) o;
Object parent = charToParent.get(c);
AnnotationValueObject avo = new AnnotationValueObject();
avo.setId(c.getId());
avo.setClassName(c.getCategory());
avo.setTermName(c.getValue());
if (c.getEvidenceCode() != null)
avo.setEvidenceCode(c.getEvidenceCode().toString());
populateClassValues(c, avo);
if (parent != null) {
populateParentInformation(avo, parent);
}
results.add(avo);
}
return new JsonReaderResponse<>(results, count);
}
use of ubic.gemma.model.common.description.AnnotationValueObject in project Gemma by PavlidisLab.
the class CharacteristicUpdateTaskImpl method convertToFactorValuesWithCharacteristics.
/**
* This is used to handle the special case of FactorValues that are being updated to have a characteristic.
*
* @return for each given AnnotationValueObject, the corresponding FactorValue with an associated persistent
* Characteristic.
* @throws IllegalStateException if the corresponding FactorValue already has at least one Characteristic. This
* method is just intended for filling that in if it's empty.
*/
private Collection<FactorValue> convertToFactorValuesWithCharacteristics(Collection<AnnotationValueObject> avos) {
Collection<FactorValue> result = new HashSet<>();
for (AnnotationValueObject avo : avos) {
if (avo.getObjectClass() == null || !avo.getObjectClass().equals(FactorValue.class.getSimpleName()))
continue;
if (avo.getId() == null) {
log.warn("No id");
continue;
}
/*
* load the factor value, and create a characteristic
*/
FactorValue fv = factorValueService.load(avo.getId());
if (fv == null)
continue;
if (!fv.getCharacteristics().isEmpty()) {
throw new IllegalStateException("Don't use the annotator to update factor values that already have characteristics");
}
VocabCharacteristic vc = convertAvo2Characteristic(avo);
vc.setId(null);
if (vc.getEvidenceCode() == null) {
vc.setEvidenceCode(GOEvidenceCode.IC);
}
vc = (VocabCharacteristic) characteristicService.create(vc);
fv.setValue(vc.getValue());
fv.getCharacteristics().add(vc);
result.add(fv);
}
return result;
}
use of ubic.gemma.model.common.description.AnnotationValueObject in project Gemma by PavlidisLab.
the class CharacteristicUpdateTaskImpl method doUpdate.
private TaskResult doUpdate() {
Collection<AnnotationValueObject> avos = taskCommand.getAnnotationValueObjects();
if (avos.size() == 0)
return new TaskResult(taskCommand, false);
log.info("Updating " + avos.size() + " characteristics or uncharacterized factor values...");
StopWatch timer = new StopWatch();
timer.start();
Collection<Characteristic> asChars = convertToCharacteristic(avos);
Collection<FactorValue> factorValues = convertToFactorValuesWithCharacteristics(avos);
if (asChars.size() == 0 && factorValues.size() == 0) {
log.info("Nothing to update");
return new TaskResult(taskCommand, false);
}
for (FactorValue factorValue : factorValues) {
factorValueService.update(factorValue);
}
if (asChars.size() == 0)
return new TaskResult(taskCommand, true);
Map<Characteristic, Object> charToParent = characteristicService.getParents(asChars);
for (Characteristic cFromClient : asChars) {
Long characteristicId = cFromClient.getId();
if (characteristicId == null) {
continue;
}
Characteristic cFromDatabase = characteristicService.load(characteristicId);
if (cFromDatabase == null) {
log.warn("No such characteristic with id=" + characteristicId);
continue;
}
VocabCharacteristic vcFromClient = (cFromClient instanceof VocabCharacteristic) ? (VocabCharacteristic) cFromClient : null;
VocabCharacteristic vcFromDatabase = (cFromDatabase instanceof VocabCharacteristic) ? (VocabCharacteristic) cFromDatabase : null;
/*
* if one of the characteristics is a VocabCharacteristic and the other is not, we have to change the
* characteristic in the database so that it matches the one from the client; since we can't change the
* class of the object, we have to remove the old characteristic and make a new one of the appropriate
* class.
*/
Object parent = charToParent.get(cFromDatabase);
/*
* Check needed because Characteristics are not securable.
*/
if (parent != null && Securable.class.isAssignableFrom(parent.getClass()) && !securityService.isEditable((Securable) parent)) {
throw new AccessDeniedException("Access is denied");
}
if (vcFromClient != null && vcFromDatabase == null) {
VocabCharacteristic vc = VocabCharacteristic.Factory.newInstance();
vc.setValue(StringUtils.strip(cFromDatabase.getValue()));
vc.setEvidenceCode(cFromDatabase.getEvidenceCode());
vc.setDescription(cFromDatabase.getDescription());
vc.setCategory(cFromDatabase.getCategory());
vc.setName(cFromDatabase.getName());
vcFromDatabase = (VocabCharacteristic) characteristicService.create(vc);
removeFromParent(cFromDatabase, parent);
characteristicService.remove(cFromDatabase);
addToParent(vcFromDatabase, parent);
cFromDatabase = vcFromDatabase;
} else if (vcFromClient == null && vcFromDatabase != null) {
// don't copy AuditTrail or Status to avoid cascade error... vcFromDatabase.getAuditTrail()
cFromDatabase = characteristicService.create(Characteristic.Factory.newInstance(vcFromDatabase.getName(), vcFromDatabase.getDescription(), null, StringUtils.strip(vcFromDatabase.getValue()), vcFromDatabase.getCategory(), vcFromDatabase.getCategoryUri(), vcFromDatabase.getEvidenceCode()));
removeFromParent(vcFromDatabase, parent);
characteristicService.remove(vcFromDatabase);
addToParent(cFromDatabase, parent);
}
/*
* at this point, cFromDatabase points to the class-corrected characteristic in the database that must be
* updated with the information coming from the client.
*/
assert cFromDatabase != null;
cFromDatabase.setValue(cFromClient.getValue());
cFromDatabase.setCategory(cFromClient.getCategory());
if (cFromDatabase instanceof VocabCharacteristic) {
vcFromDatabase = (VocabCharacteristic) cFromDatabase;
if (vcFromClient != null) {
if (vcFromDatabase.getValueUri() == null || vcFromDatabase.getValueUri() == null || !vcFromDatabase.getValueUri().equals(vcFromClient.getValueUri())) {
log.info("Characteristic value update: " + vcFromDatabase + " " + vcFromDatabase.getValueUri() + " -> " + vcFromClient.getValueUri() + " associated with " + parent);
vcFromDatabase.setValueUri(vcFromClient.getValueUri());
}
if (vcFromDatabase.getCategory() == null || vcFromDatabase.getCategoryUri() == null || !vcFromDatabase.getCategoryUri().equals(vcFromClient.getCategoryUri())) {
log.info("Characteristic category update: " + vcFromDatabase + " " + vcFromDatabase.getCategoryUri() + " -> " + vcFromClient.getCategoryUri() + " associated with " + parent);
vcFromDatabase.setCategoryUri(vcFromClient.getCategoryUri());
}
}
}
if (cFromClient.getEvidenceCode() == null) {
// characteristic has been manually updated
cFromDatabase.setEvidenceCode(GOEvidenceCode.IC);
} else {
if (!cFromDatabase.getEvidenceCode().equals(cFromClient.getEvidenceCode())) {
log.info("Characteristic evidence code update: " + cFromDatabase + " " + cFromDatabase.getEvidenceCode() + " -> " + cFromClient.getEvidenceCode());
}
// let them change it.
cFromDatabase.setEvidenceCode(cFromClient.getEvidenceCode());
}
characteristicService.update(cFromDatabase);
}
timer.stop();
if (timer.getTime() > 1000) {
log.info("Update took: " + timer.getTime());
}
return new TaskResult(taskCommand, true);
}
use of ubic.gemma.model.common.description.AnnotationValueObject in project Gemma by PavlidisLab.
the class CharacteristicUpdateTaskImpl method convertToCharacteristic.
/**
* Convert incoming AVOs into Characteristics (if the AVO objectClass is not FactorValue)
*/
private Collection<Characteristic> convertToCharacteristic(Collection<AnnotationValueObject> avos) {
Collection<Characteristic> result = new HashSet<>();
for (AnnotationValueObject avo : avos) {
if (avo.getObjectClass() != null && avo.getObjectClass().equals(FactorValue.class.getSimpleName()))
continue;
VocabCharacteristic vc = convertAvo2Characteristic(avo);
result.add(vc);
}
return result;
}
use of ubic.gemma.model.common.description.AnnotationValueObject in project Gemma by PavlidisLab.
the class BioMaterialController method getAnnotation.
public Collection<AnnotationValueObject> getAnnotation(EntityDelegator bm) {
if (bm == null || bm.getId() == null)
return null;
BioMaterial bioM = bioMaterialService.load(bm.getId());
Collection<AnnotationValueObject> annotation = new ArrayList<>();
for (Characteristic c : bioM.getCharacteristics()) {
AnnotationValueObject annotationValue = new AnnotationValueObject();
annotationValue.setId(c.getId());
annotationValue.setClassName(c.getCategory());
annotationValue.setTermName(c.getValue());
annotationValue.setObjectClass(BioMaterial.class.getSimpleName());
if (c.getEvidenceCode() != null) {
annotationValue.setEvidenceCode(c.getEvidenceCode().toString());
}
if (c instanceof VocabCharacteristic) {
VocabCharacteristic vc = (VocabCharacteristic) c;
annotationValue.setClassUri(vc.getCategoryUri());
String className = getLabelFromUri(vc.getCategoryUri());
if (className != null)
annotationValue.setClassName(className);
annotationValue.setTermUri(vc.getValueUri());
String termName = getLabelFromUri(vc.getValueUri());
if (termName != null)
annotationValue.setTermName(termName);
}
annotation.add(annotationValue);
}
return annotation;
}
Aggregations