Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

handle the default datatype as no occurrence #5

Merged
merged 1 commit into from
Sep 27, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -269,9 +269,7 @@ public ExiGrammars toGrammarsX(SchemaInformedGrammars grammars)
// simple type grammar
Characters chev = (Characters) typeGrammar
.getProduction(0).getEvent();
long l = listOfSimpleDatatypes.indexOf(chev
.getDatatype());
qnameContext.setGlobalSimpleTypeDatatypeID(l);
qnameContext.setGlobalSimpleTypeDatatypeID(getDatatypeIndex(chev.getDatatype(), false));
} else {
// complex type grammar
long gid = gpreps.getGrammarID(qnc
Expand All @@ -290,9 +288,7 @@ public ExiGrammars toGrammarsX(SchemaInformedGrammars grammars)
// global attribute
if (qnc.getGlobalAttribute() != null) {
Attribute at = qnc.getGlobalAttribute();
long l = listOfSimpleDatatypes.indexOf(at
.getDatatype());
qnameContext.setGlobalAttributeDatatypeID(l);
qnameContext.setGlobalAttributeDatatypeID(getDatatypeIndex(at.getDatatype(), false));
}

}
Expand Down Expand Up @@ -629,7 +625,7 @@ private static void setDatatype(
}

protected void printGrammar(SchemaInformedGrammar sir,
ExiGrammars.Grammars grs) throws IOException {
ExiGrammars.Grammars grs) throws IOException, EXIException {

com.siemens.ct.exi._2017.schemaforgrammars.ExiGrammars.Grammars.Grammar g = new com.siemens.ct.exi._2017.schemaforgrammars.ExiGrammars.Grammars.Grammar();
grs.getGrammar().add(g);
Expand Down Expand Up @@ -673,8 +669,46 @@ protected void printGrammar(SchemaInformedGrammar sir,
printGrammarProduction(sir, g.getProduction());
}

/**
* Get a datatype index from a Datatype instance using the listOfSimpleDatatypes,
* or null if this is the default datatype and {@code useNullAsDefaultDatatype} is true.
* @param datatype The datatype to get the index from.
* @param useNullAsDefaultDatatype Tells is it should return null for the built-in default datatype.
* @return The index of the datatype.
* @throws EXIException if the datatype can't be found in listOfSimpleDatatypes.
*/
private Long getDatatypeIndex(Datatype datatype, boolean useNullAsDefaultDatatype) throws EXIException {
if (datatype == BuiltIn.DEFAULT_DATATYPE && useNullAsDefaultDatatype) {
return null;
}
int datatypeIndex = listOfSimpleDatatypes.indexOf(datatype);
if (datatypeIndex < 0){
throw new EXIException("Can't find datatype: " + datatype);
}
return Long.valueOf(datatypeIndex);
}

/**
* Get the datatype instance from an index in the datatypes array,
* or get the built-in default datatype if the {@code index} is null and {@code useNullAsDefaultDatatype} is true.
* @param index The index of the datatype.
* @param datatypes The array of datatypes.
* @param useNullAsDefaultDatatype Tells is it should return null for the built-in default parameter.
* @return The datatype instance.
* @throws EXIException if the index is out of bounds from the datatypes array.
*/
private static Datatype getDatatype(Long index, Datatype[] datatypes, boolean useNullAsDefaultDatatype) throws EXIException {
if (index == null && useNullAsDefaultDatatype) {
return BuiltIn.DEFAULT_DATATYPE;
}
if (index == null || index >= datatypes.length || index < 0) {
throw new EXIException("Can't find datatype of index: " + index);
}
return datatypes[index.intValue()];
}

protected void printGrammarProduction(SchemaInformedGrammar sir, List<com.siemens.ct.exi._2017.schemaforgrammars.Production> productions)
throws IOException {
throws IOException, EXIException {

for (int i = 0; i < sir.getNumberOfEvents(); i++) {
if (STATS_ON) {
Expand Down Expand Up @@ -717,7 +751,8 @@ protected void printGrammarProduction(SchemaInformedGrammar sir, List<com.siemen
QNameContext atqname = at.getQNameContext();

p.setAttribute(of.createProductionAttribute());
p.getAttribute().setAttributeDatatypeID(listOfSimpleDatatypes.indexOf(at.getDatatype()));

p.getAttribute().setAttributeDatatypeID(getDatatypeIndex(at.getDatatype(), true));
p.getAttribute().setAttributeNamespaceID(atqname.getNamespaceUriID());
p.getAttribute().setAttributeLocalNameID(atqname.getLocalNameID());
break;
Expand All @@ -729,7 +764,7 @@ protected void printGrammarProduction(SchemaInformedGrammar sir, List<com.siemen
case CHARACTERS:
Characters ch = (Characters) event;
p.setCharacters(of.createProductionCharacters());
p.getCharacters().setCharactersDatatypeID(listOfSimpleDatatypes.indexOf(ch.getDatatype()));
p.getCharacters().setCharactersDatatypeID(getDatatypeIndex(ch.getDatatype(), false));
break;
case START_ELEMENT_GENERIC:
p.setStartElementGeneric(of.createProductionStartElementGeneric());
Expand Down Expand Up @@ -996,7 +1031,7 @@ public static SchemaInformedGrammars toGrammars(ExiGrammars exiGrammars) throws
com.siemens.ct.exi._2017.schemaforgrammars.Datatype dt = exiGrammars.getSimpleDatatypes().getSimpleDatatype().get(i);

QNameContext qnc = grammarUriContexts[(int)dt.getSchemaTypeNamespaceID()].getQNameContext((int)dt.getSchemaTypeLocalNameID());

if (dt.getList() != null) {
// list MUST be first (there can be a list of enums!)
Datatype listDatatype;
Expand All @@ -1020,7 +1055,7 @@ public static SchemaInformedGrammars toGrammars(ExiGrammars exiGrammars) throws
com.siemens.ct.exi._2017.schemaforgrammars.Datatype dt = exiGrammars.getSimpleDatatypes().getSimpleDatatype().get(i);

if(dt.getBaseDatatypeID() != null) {
datatypes[i].setBaseDatatype(datatypes[dt.getBaseDatatypeID().intValue()]);
datatypes[i].setBaseDatatype(getDatatype(dt.getBaseDatatypeID(), datatypes, false));
}
}

Expand Down Expand Up @@ -1107,15 +1142,15 @@ public static SchemaInformedGrammars toGrammars(ExiGrammars exiGrammars) throws
event = new EndElement();
} else if(prod.getAttribute() != null) {
QNameContext qnc = grammarUriContexts[(int)prod.getAttribute().getAttributeNamespaceID()].getQNameContext((int)prod.getAttribute().getAttributeLocalNameID());
Datatype datatype = datatypes[(int)prod.getAttribute().getAttributeDatatypeID()];
Datatype datatype = getDatatype(prod.getAttribute().getAttributeDatatypeID(), datatypes, true);
event = new Attribute(qnc, datatype);
} else if(prod.getAttributeNS() != null) {
GrammarUriContext guc = grammarUriContexts[prod.getStartElementNS().intValue()];
event = new AttributeNS(guc.getNamespaceUriID(), guc.getNamespaceUri());
} else if(prod.getAttributeGeneric() != null) {
event = new AttributeGeneric();
} else if(prod.getCharacters() != null) {
Datatype datatype = datatypes[(int)prod.getCharacters().getCharactersDatatypeID()];
Datatype datatype = getDatatype(prod.getCharacters().getCharactersDatatypeID(), datatypes, false);
event = new Characters(datatype);
} else if(prod.getCharactersGeneric() != null) {
event = new CharactersGeneric();
Expand Down Expand Up @@ -1150,7 +1185,7 @@ public static SchemaInformedGrammars toGrammars(ExiGrammars exiGrammars) throws
// global attribute
if(qnc.getGlobalAttributeDatatypeID() != null) {
QNameContext qncAT = grammarUriContexts[i].getQNameContext(k);
Datatype dt = datatypes[qnc.getGlobalAttributeDatatypeID().intValue()];
Datatype dt = getDatatype(qnc.getGlobalAttributeDatatypeID(), datatypes, false);
Attribute at = new Attribute(qncAT, dt);
grammarUriContexts[i].getQNameContext(k).setGlobalAttribute(at);
}
Expand All @@ -1163,7 +1198,7 @@ public static SchemaInformedGrammars toGrammars(ExiGrammars exiGrammars) throws
// Note: Simple Type grammars always look the same
// SimpleType0 : CH(schema-types) SimpleType1
// SimpleType1 : EE
Datatype dt = datatypes[qnc.getGlobalSimpleTypeDatatypeID().intValue()];
Datatype dt = getDatatype(qnc.getGlobalSimpleTypeDatatypeID(), datatypes, false);
SchemaInformedFirstStartTagGrammar sistg = new SchemaInformedFirstStartTag();
SchemaInformedElement elementContent = new SchemaInformedElement();
SchemaInformedElement sie = new SchemaInformedElement();
Expand Down
3 changes: 2 additions & 1 deletion src/main/resources/SchemaForGrammars.xsd
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,8 @@
<xs:element name="attributeNamespaceID" type="xs:unsignedInt"/>
<xs:element name="attributeLocalNameID" type="xs:unsignedInt"/>
<!-- attribute datatype -->
<xs:element name="attributeDatatypeID" type="xs:unsignedInt"/>
<xs:element name="attributeDatatypeID" type="xs:unsignedInt"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is the only place is needed.
It only happens if there are tow or more attributes with the same name and different type... in elementFragmentGrammar (see https://www.w3.org/TR/exi/#informedElementFragGrammar)

minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Expand Down