Skip to content

Commit

Permalink
Merged #37: ClassCastException for SemanticString on server
Browse files Browse the repository at this point in the history
  • Loading branch information
DavidLeoni committed Mar 17, 2016
1 parent 52fc8e4 commit 1de6ae4
Show file tree
Hide file tree
Showing 2 changed files with 127 additions and 63 deletions.
Expand Up @@ -530,6 +530,10 @@ public Entity convertToEntity() {
entity.setTypeId(this.getTypeId());
entity.setDuration(this.duration);
List<Attribute> attrs = super.getAttributes();

EntityService es = new EntityService();
HashMap<String, Long> vocabularyMap = es.getVocabularies();

if (attrs != null) {
List<Attribute> attrsFixed = new ArrayList<Attribute>();

Expand All @@ -543,72 +547,58 @@ public Entity convertToEntity() {
atFixed.setInstanceId(at.getInstanceId());
atFixed.setName(at.getName());

if ((at.getConceptId() != null) && (at.getConceptId() == KnowledgeService.DESCRIPTION_CONCEPT_GLOBAL_ID)) {
List<Value> vals = at.getValues();
List<Value> fixedVals = new ArrayList<Value>();

for (Value val : vals) {
if (val.getValue() instanceof String) {
fixedVals.add(val);
logger.warn("NO VOCABULARY IS PROVIDED, SETTING IT TO '1'");
val.setVocabularyId(1L);
} else {
EntityService es = new EntityService();
HashMap<String, Long> vocabularyMap = es.getVocabularies();

SemanticText st = (SemanticText) val.getValue();
SemanticString sstring = convertSemTextToSemString(st);
Locale l = st.getLocale();
Long vocabularyID = vocabularyMap.get(TraceProvUtils.localeToLanguageTag(l));

Value fixedVal = new Value();
fixedVal.setSemanticValue(sstring);
fixedVal.setValue(sstring.getText());
fixedVal.setId(val.getId());
fixedVals.add(fixedVal);

fixedVal.setVocabularyId(vocabularyID);
}
}
atFixed.setValues(fixedVals);
} else {
List<Value> fixedVals = new ArrayList<Value>();
for (Value val : at.getValues()) {
if (val.getValue() instanceof EntityODR) {
EntityODR enodr = (EntityODR) val.getValue();
Entity en = enodr.convertToEntity();
Value fixedVal = new Value();
fixedVal.setValue(en);
fixedVal.setId(val.getId());
fixedVals.add(fixedVal);
} else if (val.getValue() instanceof StructureODR) {
StructureODR structureODR = (StructureODR) val.getValue();
Structure ebStr = structureODR.convertToSwebStructure(structureODR);
Value fixedVal = new Value();
fixedVal.setValue(ebStr);
fixedVal.setId(val.getId());
fixedVals.add(fixedVal);
} else if (val.getValue() instanceof ISemanticText){
SemanticString ss = SemanticTextFactory.semanticString((ISemanticText) val.getValue());
Value fixedVal = new Value();
fixedVal.setValue(ss);
fixedVal.setId(val.getId());
fixedVals.add(fixedVal);
} else if (val.getValue() instanceof ConceptODR){
Concept swebConcept = ((ConceptODR) val.getValue()).convertToSwebConcept();
Value fixedVal = new Value();
fixedVal.setValue(swebConcept);
fixedVal.setId(val.getId());
fixedVals.add(fixedVal);
} else {
fixedVals.add(val);
}
List<Value> fixedVals = new ArrayList<Value>();
for (Value val : at.getValues()) {

if (val.getValue() instanceof String) {
fixedVals.add(val);
logger.warn("NO VOCABULARY IS PROVIDED, SETTING IT TO '1'");
val.setVocabularyId(1L);
} else if (val.getValue() instanceof ISemanticText){

SemanticText st = (SemanticText) val.getValue();
SemanticString sstring = convertSemTextToSemString(st);

Value fixedVal = new Value();

Locale l = st.getLocale();
if (l != null){
Long vocabularyId = vocabularyMap.get(TraceProvUtils.localeToLanguageTag(l));
fixedVal.setVocabularyId(vocabularyId);
}

fixedVal.setSemanticValue(sstring);
fixedVal.setValue(sstring.getText());
fixedVal.setId(val.getId());
fixedVals.add(fixedVal);

} else if (val.getValue() instanceof EntityODR) {
EntityODR enodr = (EntityODR) val.getValue();
Entity en = enodr.convertToEntity();
Value fixedVal = new Value();
fixedVal.setValue(en);
fixedVal.setId(val.getId());
fixedVals.add(fixedVal);
} else if (val.getValue() instanceof StructureODR) {
StructureODR structureODR = (StructureODR) val.getValue();
Structure ebStr = structureODR.convertToSwebStructure(structureODR);
Value fixedVal = new Value();
fixedVal.setValue(ebStr);
fixedVal.setId(val.getId());
fixedVals.add(fixedVal);
} else if (val.getValue() instanceof ConceptODR){
Concept swebConcept = ((ConceptODR) val.getValue()).convertToSwebConcept();
Value fixedVal = new Value();
fixedVal.setValue(swebConcept);
fixedVal.setId(val.getId());
fixedVals.add(fixedVal);
} else {
fixedVals.add(val);
}

atFixed.setValues(fixedVals);

}

atFixed.setValues(fixedVals);

attrsFixed.add(atFixed);
}

Expand Down
Expand Up @@ -46,6 +46,10 @@
import it.unitn.disi.sweb.webapi.model.eb.Entity;
import it.unitn.disi.sweb.webapi.model.eb.EntityBase;
import it.unitn.disi.sweb.webapi.model.eb.Instance;
import it.unitn.disi.sweb.webapi.model.eb.Name;
import it.unitn.disi.sweb.webapi.model.eb.Value;
import it.unitn.disi.sweb.webapi.model.eb.sstring.SemanticString;
import it.unitn.disi.sweb.webapi.model.kb.concepts.Concept;
import it.unitn.disi.sweb.webapi.model.kb.types.ComplexType;
import junitparams.JUnitParamsRunner;
import junitparams.Parameters;
Expand Down Expand Up @@ -797,5 +801,75 @@ public void testSearchIncompleteMultiWordEntity() {
List<ISearchResult> res = enServ.searchEntities("borgo valsu", null, Locale.ITALIAN);
assertTrue(res.size() > 0);
}


/**
* Creates instance only using sweb InstanceClient.
*
* Shows in sweb you can't put SemanticString as an object inside a Value,
* you need to put a string and call Value.setSemanticValue(ss)
*
* Three attributes are created: name, publication date and class to fulfill an identifying set and
* adds also the attribute 'Abstract', which is a SemanticString. The latter was causing the server
* to throw a
* <pre>
* java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
* at it.unitn.disi.sweb.webapi.server.translators.impl.ValueTranslator.syncValue(ValueTranslator.java:297)
* </pre>
*
* @since 0.11.1
*/
@Ignore // only for digiuni, and fixed by #37
@Test
public void testCreateSemanticStringInDigiUni(){

InstanceClient ic = new InstanceClient(WebServiceURLs.getClientProtocol());

Entity ent = new Entity();
ent.setEntityBaseId(1L);
ent.setTypeId(208L); // thesis

Name name = new Name();
name.setTypeId(8L);
name.setEntityBaseId(1L);
addSwebValue(name, 65L, "zeName" ,"en");

addSwebValue(ent, 407L, name, null);
addSwebValue(ent, 399L, 5, null); // publication date
Concept concept = new Concept();
concept.setId(33910L); // class
addSwebValue(ent, 408L, concept, null);

// this was giving the problem:
SemanticString ss = new SemanticString("bla");
Value val = addSwebValue(ent, 400L, ss.getText(), null); // Abstract
val.setSemanticValue(ss);

long res = ic.create(ent);

logger.info("Done creating entity " + WebServiceURLs.entityIDToURL(res));
}

/**
* Creates Attribute and fills it with obj as value's value, then returns the added Value.
* @since 0.11.1
*/
private static Value addSwebValue(Instance inst, Long attrDefId, Object obj, String languageCode){

if (inst.getAttributes() == null){
inst.setAttributes(new ArrayList());
}

Attribute attr = new Attribute();
attr.setDefinitionId(attrDefId);
List<Value> values = new ArrayList();
Value val = new Value();
val.setValue(obj);
val.setLanguageCode(languageCode);

values.add(val);
attr.setValues(values);
inst.getAttributes().add(attr);
return val;
}
}

0 comments on commit 1de6ae4

Please sign in to comment.