use of org.apache.xerces.xs.XSModelGroup in project winery by eclipse.
the class BackendUtils method deriveWPD.
/**
* Derives Winery's Properties Definition from an existing properties definition
*
* @param ci the entity type to try to modify the WPDs
* @param errors the list to add errors to
*/
public static void deriveWPD(TEntityType ci, List<String> errors) {
BackendUtils.LOGGER.trace("deriveWPD");
PropertiesDefinition propertiesDefinition = ci.getPropertiesDefinition();
QName element = propertiesDefinition.getElement();
if (element == null) {
BackendUtils.LOGGER.debug("only works for an element definition, not for types");
} else {
BackendUtils.LOGGER.debug("Looking for the definition of {" + element.getNamespaceURI() + "}" + element.getLocalPart());
// fetch the XSD defining the element
final XsdImportManager xsdImportManager = RepositoryFactory.getRepository().getXsdImportManager();
Map<String, RepositoryFileReference> mapFromLocalNameToXSD = xsdImportManager.getMapFromLocalNameToXSD(new Namespace(element.getNamespaceURI(), false), false);
RepositoryFileReference ref = mapFromLocalNameToXSD.get(element.getLocalPart());
if (ref == null) {
String msg = "XSD not found for " + element.getNamespaceURI() + " / " + element.getLocalPart();
BackendUtils.LOGGER.debug(msg);
errors.add(msg);
return;
}
final Optional<XSModel> xsModelOptional = BackendUtils.getXSModel(ref);
if (!xsModelOptional.isPresent()) {
LOGGER.error("no XSModel found");
}
XSModel xsModel = xsModelOptional.get();
XSElementDeclaration elementDeclaration = xsModel.getElementDeclaration(element.getLocalPart(), element.getNamespaceURI());
if (elementDeclaration == null) {
String msg = "XSD model claimed to contain declaration for {" + element.getNamespaceURI() + "}" + element.getLocalPart() + ", but it did not.";
BackendUtils.LOGGER.debug(msg);
errors.add(msg);
return;
}
// go through the XSD definition and
XSTypeDefinition typeDefinition = elementDeclaration.getTypeDefinition();
if (typeDefinition instanceof XSComplexTypeDefinition) {
XSComplexTypeDefinition cTypeDefinition = (XSComplexTypeDefinition) typeDefinition;
XSParticle particle = cTypeDefinition.getParticle();
if (particle == null) {
BackendUtils.LOGGER.debug("XSD does not follow the requirements put by winery: Complex type does not contain particles");
} else {
XSTerm term = particle.getTerm();
if (term instanceof XSModelGroup) {
XSModelGroup modelGroup = (XSModelGroup) term;
if (modelGroup.getCompositor() == XSModelGroup.COMPOSITOR_SEQUENCE) {
XSObjectList particles = modelGroup.getParticles();
int len = particles.getLength();
boolean everyThingIsASimpleType = true;
PropertyDefinitionKVList list = new PropertyDefinitionKVList();
if (len != 0) {
for (int i = 0; i < len; i++) {
XSParticle innerParticle = (XSParticle) particles.item(i);
XSTerm innerTerm = innerParticle.getTerm();
if (innerTerm instanceof XSElementDeclaration) {
XSElementDeclaration innerElementDeclaration = (XSElementDeclaration) innerTerm;
String name = innerElementDeclaration.getName();
XSTypeDefinition innerTypeDefinition = innerElementDeclaration.getTypeDefinition();
if (innerTypeDefinition instanceof XSSimpleType) {
XSSimpleType xsSimpleType = (XSSimpleType) innerTypeDefinition;
String typeNS = xsSimpleType.getNamespace();
String typeName = xsSimpleType.getName();
if (typeNS.equals(XMLConstants.W3C_XML_SCHEMA_NS_URI)) {
PropertyDefinitionKV def = new PropertyDefinitionKV();
def.setKey(name);
// convention at WPD: use "xsd" as prefix for XML Schema Definition
def.setType("xsd:" + typeName);
list.add(def);
} else {
everyThingIsASimpleType = false;
break;
}
} else {
everyThingIsASimpleType = false;
break;
}
} else {
everyThingIsASimpleType = false;
break;
}
}
}
if (everyThingIsASimpleType) {
// everything went allright, we can add a WPD
WinerysPropertiesDefinition wpd = new WinerysPropertiesDefinition();
wpd.setIsDerivedFromXSD(Boolean.TRUE);
wpd.setElementName(element.getLocalPart());
wpd.setNamespace(element.getNamespaceURI());
wpd.setPropertyDefinitionKVList(list);
ModelUtilities.replaceWinerysPropertiesDefinition(ci, wpd);
BackendUtils.LOGGER.debug("Successfully generated WPD");
} else {
BackendUtils.LOGGER.debug("XSD does not follow the requirements put by winery: Not all types in the sequence are simple types");
}
} else {
BackendUtils.LOGGER.debug("XSD does not follow the requirements put by winery: Model group is not a sequence");
}
} else {
BackendUtils.LOGGER.debug("XSD does not follow the requirements put by winery: Not a model group");
}
}
} else {
BackendUtils.LOGGER.debug("XSD does not follow the requirements put by winery: No Complex Type Definition");
}
}
}
use of org.apache.xerces.xs.XSModelGroup in project winery by eclipse.
the class BackendUtils method deriveWPD.
/**
* Derives Winery's Properties Definition from an existing properties definition
*
* @param ci the entity type to try to modify the WPDs
* @param errors the list to add errors to
*/
// FIXME this is specifically for xml backends and therefore broken under the new canonical model
public static void deriveWPD(TEntityType ci, List<String> errors, IRepository repository) {
BackendUtils.LOGGER.trace("deriveWPD");
TEntityType.PropertiesDefinition propertiesDefinition = ci.getProperties();
if (propertiesDefinition == null) {
// if there's no properties definition, there's nothing to derive because we're in YAML mode
return;
}
if (!(propertiesDefinition instanceof TEntityType.XmlElementDefinition)) {
BackendUtils.LOGGER.debug("only works for an element definition, not for types");
return;
}
final QName element = ((TEntityType.XmlElementDefinition) propertiesDefinition).getElement();
BackendUtils.LOGGER.debug("Looking for the definition of {" + element.getNamespaceURI() + "}" + element.getLocalPart());
// fetch the XSD defining the element
final XsdImportManager xsdImportManager = repository.getXsdImportManager();
Map<String, RepositoryFileReference> mapFromLocalNameToXSD = xsdImportManager.getMapFromLocalNameToXSD(new Namespace(element.getNamespaceURI(), false), false);
RepositoryFileReference ref = mapFromLocalNameToXSD.get(element.getLocalPart());
if (ref == null) {
String msg = "XSD not found for " + element.getNamespaceURI() + " / " + element.getLocalPart();
BackendUtils.LOGGER.debug(msg);
errors.add(msg);
return;
}
final Optional<XSModel> xsModelOptional = BackendUtils.getXSModel(ref, repository);
if (!xsModelOptional.isPresent()) {
LOGGER.error("no XSModel found");
}
XSModel xsModel = xsModelOptional.get();
XSElementDeclaration elementDeclaration = xsModel.getElementDeclaration(element.getLocalPart(), element.getNamespaceURI());
if (elementDeclaration == null) {
String msg = "XSD model claimed to contain declaration for {" + element.getNamespaceURI() + "}" + element.getLocalPart() + ", but it did not.";
BackendUtils.LOGGER.debug(msg);
errors.add(msg);
return;
}
// go through the XSD definition and
XSTypeDefinition typeDefinition = elementDeclaration.getTypeDefinition();
if (!(typeDefinition instanceof XSComplexTypeDefinition)) {
BackendUtils.LOGGER.debug("XSD does not follow the requirements put by winery: No Complex Type Definition");
return;
}
XSComplexTypeDefinition cTypeDefinition = (XSComplexTypeDefinition) typeDefinition;
XSParticle particle = cTypeDefinition.getParticle();
if (particle == null) {
BackendUtils.LOGGER.debug("XSD does not follow the requirements put by winery: Complex type does not contain particles");
return;
}
XSTerm term = particle.getTerm();
if (!(term instanceof XSModelGroup)) {
BackendUtils.LOGGER.debug("XSD does not follow the requirements put by winery: Not a model group");
return;
}
XSModelGroup modelGroup = (XSModelGroup) term;
if (modelGroup.getCompositor() != XSModelGroup.COMPOSITOR_SEQUENCE) {
BackendUtils.LOGGER.debug("XSD does not follow the requirements put by winery: Model group is not a sequence");
return;
}
XSObjectList particles = modelGroup.getParticles();
int len = particles.getLength();
boolean everyThingIsASimpleType = true;
List<PropertyDefinitionKV> list = new ArrayList<>();
if (len != 0) {
for (int i = 0; i < len; i++) {
XSParticle innerParticle = (XSParticle) particles.item(i);
XSTerm innerTerm = innerParticle.getTerm();
if (innerTerm instanceof XSElementDeclaration) {
XSElementDeclaration innerElementDeclaration = (XSElementDeclaration) innerTerm;
String name = innerElementDeclaration.getName();
XSTypeDefinition innerTypeDefinition = innerElementDeclaration.getTypeDefinition();
if (innerTypeDefinition instanceof XSSimpleType) {
XSSimpleType xsSimpleType = (XSSimpleType) innerTypeDefinition;
String typeNS = xsSimpleType.getNamespace();
String typeName = xsSimpleType.getName();
if (typeNS.equals(XMLConstants.W3C_XML_SCHEMA_NS_URI)) {
PropertyDefinitionKV def = new PropertyDefinitionKV();
def.setKey(name);
// convention at WPD: use "xsd" as prefix for XML Schema Definition
def.setType("xsd:" + typeName);
list.add(def);
} else {
everyThingIsASimpleType = false;
break;
}
} else {
everyThingIsASimpleType = false;
break;
}
} else {
everyThingIsASimpleType = false;
break;
}
}
}
if (!everyThingIsASimpleType) {
BackendUtils.LOGGER.debug("XSD does not follow the requirements put by winery: Not all types in the sequence are simple types");
return;
}
// everything went alright, we can add a WPD
WinerysPropertiesDefinition wpd = new WinerysPropertiesDefinition();
wpd.setIsDerivedFromXSD(Boolean.TRUE);
wpd.setElementName(element.getLocalPart());
wpd.setNamespace(element.getNamespaceURI());
wpd.setPropertyDefinitions(list);
ModelUtilities.replaceWinerysPropertiesDefinition(ci, wpd);
BackendUtils.LOGGER.debug("Successfully generated WPD");
}
use of org.apache.xerces.xs.XSModelGroup in project iaf by ibissource.
the class ToXml method getBestMatchingElementPath.
/**
* @param baseElementDeclaration TODO
* @param particle
* @param failureReasons returns the reasons why no match was found
* @param path in this list the longest list of child elements, that matches the available, is maintained. Null if no matching.
* @return true when a matching path is found. if false, failureReasons will contain reasons why.
* @throws SAXException
*/
public boolean getBestMatchingElementPath(XSElementDeclaration baseElementDeclaration, N baseNode, XSParticle particle, List<XSParticle> path, List<String> failureReasons) throws SAXException {
if (particle == null) {
throw new NullPointerException("getBestMatchingElementPath particle is null");
}
XSTerm term = particle.getTerm();
if (term == null) {
throw new NullPointerException("getBestMatchingElementPath particle.term is null");
}
if (term instanceof XSModelGroup) {
XSModelGroup modelGroup = (XSModelGroup) term;
short compositor = modelGroup.getCompositor();
XSObjectList particles = modelGroup.getParticles();
if (log.isTraceEnabled())
log.trace("getBestMatchingElementPath() modelGroup particles [" + ToStringBuilder.reflectionToString(particles, ToStringStyle.MULTI_LINE_STYLE) + "]");
switch(compositor) {
case XSModelGroup.COMPOSITOR_SEQUENCE:
case XSModelGroup.COMPOSITOR_ALL:
for (int i = 0; i < particles.getLength(); i++) {
XSParticle childParticle = (XSParticle) particles.item(i);
if (!getBestMatchingElementPath(baseElementDeclaration, baseNode, childParticle, path, failureReasons)) {
return false;
}
}
return true;
case XSModelGroup.COMPOSITOR_CHOICE:
List<XSParticle> bestPath = null;
List<String> choiceFailureReasons = new LinkedList<String>();
for (int i = 0; i < particles.getLength(); i++) {
XSParticle childParticle = (XSParticle) particles.item(i);
List<XSParticle> optionPath = new LinkedList<XSParticle>(path);
if (getBestMatchingElementPath(baseElementDeclaration, baseNode, childParticle, optionPath, choiceFailureReasons)) {
if (bestPath == null || bestPath.size() < optionPath.size()) {
bestPath = optionPath;
}
}
}
if (bestPath == null) {
failureReasons.addAll(choiceFailureReasons);
return false;
}
if (log.isTraceEnabled())
log.trace("Replace path with best path of Choice Compositor, size [" + bestPath.size() + "]");
path.clear();
path.addAll(bestPath);
return true;
default:
throw new IllegalStateException("getBestMatchingElementPath modelGroup.compositor is not COMPOSITOR_SEQUENCE, COMPOSITOR_ALL or COMPOSITOR_CHOICE, but [" + compositor + "]");
}
}
if (term instanceof XSElementDeclaration) {
XSElementDeclaration elementDeclaration = (XSElementDeclaration) term;
String elementName = elementDeclaration.getName();
if (log.isTraceEnabled())
log.trace("getBestMatchingElementPath().XSElementDeclaration name [" + elementName + "]");
if (!hasChild(baseElementDeclaration, baseNode, elementName)) {
if (isDeepSearch()) {
if (log.isTraceEnabled())
log.trace("getBestMatchingElementPath().XSElementDeclaration element [" + elementName + "] not found, perform deep search");
try {
List<XSParticle> subList = getBestChildElementPath(elementDeclaration, baseNode, true);
if (subList != null && !subList.isEmpty()) {
path.add(particle);
if (log.isTraceEnabled())
log.trace("getBestMatchingElementPath().XSElementDeclaration element [" + elementName + "] not found, nested elements found in deep search");
return true;
}
if (log.isTraceEnabled())
log.trace("getBestMatchingElementPath().XSElementDeclaration element [" + elementName + "] not found, no nested elements found in deep search");
} catch (Exception e) {
if (log.isTraceEnabled())
log.trace("getBestMatchingElementPath().XSElementDeclaration element [" + elementName + "] not found, no nested elements found in deep search: " + e.getMessage());
return false;
}
}
if (particle.getMinOccurs() > 0) {
// if (log.isTraceEnabled()) log.trace("getBestMatchingElementPath().XSElementDeclaration mandatory element ["+elementName+"] not found, path fails, autoInsertMandatory ["+isAutoInsertMandatory()+"]");
// if (isAutoInsertMandatory()) {
// path.add(particle);
// if (log.isTraceEnabled()) log.trace("getBestMatchingElementPath().XSElementDeclaration element ["+elementName+"] not found, nested elements found in deep search");
// return true;
// }
failureReasons.add(MSG_EXPECTED_ELEMENT + " [" + elementName + "]");
return false;
}
if (log.isTraceEnabled())
log.trace("getBestMatchingElementPath().XSElementDeclaration optional element [" + elementName + "] not found, path continues");
return true;
}
for (XSParticle resultParticle : path) {
if (elementName.equals(resultParticle.getTerm().getName())) {
if (log.isTraceEnabled())
log.trace("getBestMatchingElementPath().XSElementDeclaration element [" + elementName + "] found but required multiple times");
failureReasons.add("element [" + elementName + "] required multiple times");
return false;
}
}
if (log.isTraceEnabled())
log.trace("getBestMatchingElementPath().XSElementDeclaration element [" + elementName + "] found");
path.add(particle);
return true;
}
if (term instanceof XSWildcard) {
XSWildcard wildcard = (XSWildcard) term;
String processContents;
switch(wildcard.getProcessContents()) {
case XSWildcard.PC_LAX:
processContents = "LAX";
break;
case XSWildcard.PC_SKIP:
processContents = "SKIP";
break;
case XSWildcard.PC_STRICT:
processContents = "STRICT";
break;
default:
throw new IllegalStateException("getBestMatchingElementPath wildcard.processContents is not PC_LAX, PC_SKIP or PC_STRICT, but [" + wildcard.getProcessContents() + "]");
}
String namespaceConstraint;
switch(wildcard.getConstraintType()) {
case XSWildcard.NSCONSTRAINT_ANY:
namespaceConstraint = "ANY";
break;
case XSWildcard.NSCONSTRAINT_LIST:
namespaceConstraint = "SKIP " + wildcard.getNsConstraintList();
break;
case XSWildcard.NSCONSTRAINT_NOT:
namespaceConstraint = "NOT " + wildcard.getNsConstraintList();
break;
default:
throw new IllegalStateException("getBestMatchingElementPath wildcard.namespaceConstraint is not ANY, LIST or NOT, but [" + wildcard.getConstraintType() + "]");
}
String msg = "term for element [" + baseElementDeclaration.getName() + "] is WILDCARD; namespaceConstraint [" + namespaceConstraint + "] processContents [" + processContents + "]. Please check if the element typed properly in the schema";
if (isFailOnWildcards()) {
throw new IllegalStateException(msg + ", or set failOnWildcards=\"false\"");
}
log.warn(msg);
return true;
}
throw new IllegalStateException("getBestMatchingElementPath unknown Term type [" + term.getClass().getName() + "]");
}
use of org.apache.xerces.xs.XSModelGroup in project iaf by ibissource.
the class XmlAligner method findMultipleOccurringChildElements.
protected Set<String> findMultipleOccurringChildElements(XSParticle particle) {
Set<String> result = new HashSet<String>();
if (particle == null) {
log.warn("typeDefinition particle is null, is this a problem?");
return result;
}
XSTerm term = particle.getTerm();
if (term == null) {
throw new IllegalStateException("findMultipleOccurringChildElements particle.term is null");
}
if (log.isTraceEnabled())
log.trace("term name [" + term.getName() + "] occurring unbounded [" + particle.getMaxOccursUnbounded() + "] max occur [" + particle.getMaxOccurs() + "] term [" + ToStringBuilder.reflectionToString(term) + "]");
if (particle.getMaxOccursUnbounded() || particle.getMaxOccurs() > 1) {
collectChildElements(particle, result);
return result;
}
if (term instanceof XSModelGroup) {
XSModelGroup modelGroup = (XSModelGroup) term;
XSObjectList particles = modelGroup.getParticles();
if (log.isTraceEnabled())
log.trace("modelGroup particles [" + ToStringBuilder.reflectionToString(particles) + "]");
for (int i = 0; i < particles.getLength(); i++) {
XSParticle childParticle = (XSParticle) particles.item(i);
result.addAll(findMultipleOccurringChildElements(childParticle));
}
}
return result;
}
use of org.apache.xerces.xs.XSModelGroup in project iaf by ibissource.
the class XmlAligner method determineIsParentOfSingleMultipleOccurringChildElement.
protected ChildOccurrence determineIsParentOfSingleMultipleOccurringChildElement(XSParticle particle) {
if (particle == null) {
log.warn("Particle is null, is this a problem? Appearantly not");
return ChildOccurrence.EMPTY;
}
XSTerm term = particle.getTerm();
if (term == null) {
throw new IllegalStateException("determineIsParentOfSingleMultipleOccurringChildElement particle.term is null");
}
if (log.isTraceEnabled())
log.trace("term name [" + term.getName() + "] occurring unbounded [" + particle.getMaxOccursUnbounded() + "] max occur [" + particle.getMaxOccurs() + "] term [" + ToStringBuilder.reflectionToString(term) + "]");
if (term instanceof XSModelGroup) {
XSModelGroup modelGroup = (XSModelGroup) term;
short compositor = modelGroup.getCompositor();
XSObjectList particles = modelGroup.getParticles();
switch(compositor) {
case XSModelGroup.COMPOSITOR_SEQUENCE:
case XSModelGroup.COMPOSITOR_ALL:
{
if (log.isTraceEnabled())
log.trace("sequence or all particles [" + ToStringBuilder.reflectionToString(particles) + "]");
ChildOccurrence result = ChildOccurrence.EMPTY;
for (int i = 0; i < particles.getLength(); i++) {
XSParticle childParticle = (XSParticle) particles.item(i);
ChildOccurrence current = determineIsParentOfSingleMultipleOccurringChildElement(childParticle);
if (log.isTraceEnabled())
log.trace("sequence or all, particle [" + i + "] current result [" + current + "]");
switch(current) {
case EMPTY:
break;
case ONE_SINGLE_OCCURRING_ELEMENT:
case ONE_MULTIPLE_OCCURRING_ELEMENT:
if (result.ordinal() > ChildOccurrence.EMPTY.ordinal()) {
if (log.isTraceEnabled())
log.trace("sequence or all, result [" + result + "] current [" + current + "]");
return ChildOccurrence.MULTIPLE_ELEMENTS_OR_NOT_MULTIPLE_OCCURRING;
}
result = current;
break;
case MULTIPLE_ELEMENTS_OR_NOT_MULTIPLE_OCCURRING:
return ChildOccurrence.MULTIPLE_ELEMENTS_OR_NOT_MULTIPLE_OCCURRING;
default:
throw new IllegalStateException("determineIsParentOfSingleMultipleOccurringChildElement child occurrence [" + current + "]");
}
}
if (log.isTraceEnabled())
log.trace("end of sequence or all, returning [" + result + "]");
return result;
}
case XSModelGroup.COMPOSITOR_CHOICE:
{
if (log.isTraceEnabled())
log.trace("choice particles [" + ToStringBuilder.reflectionToString(particles) + "]");
if (particles.getLength() == 0) {
if (log.isTraceEnabled())
log.trace("choice length 0, returning [" + ChildOccurrence.MULTIPLE_ELEMENTS_OR_NOT_MULTIPLE_OCCURRING + "]");
return ChildOccurrence.EMPTY;
}
ChildOccurrence result = determineIsParentOfSingleMultipleOccurringChildElement((XSParticle) particles.item(0));
if (result == ChildOccurrence.MULTIPLE_ELEMENTS_OR_NOT_MULTIPLE_OCCURRING) {
if (log.isTraceEnabled())
log.trace("choice single mixed, returning [" + ChildOccurrence.MULTIPLE_ELEMENTS_OR_NOT_MULTIPLE_OCCURRING + "]");
return ChildOccurrence.MULTIPLE_ELEMENTS_OR_NOT_MULTIPLE_OCCURRING;
}
for (int i = 1; i < particles.getLength(); i++) {
XSParticle childParticle = (XSParticle) particles.item(i);
ChildOccurrence current = determineIsParentOfSingleMultipleOccurringChildElement(childParticle);
if (current != result) {
if (log.isTraceEnabled())
log.trace("break out of choice, returning [" + ChildOccurrence.MULTIPLE_ELEMENTS_OR_NOT_MULTIPLE_OCCURRING + "]");
return ChildOccurrence.MULTIPLE_ELEMENTS_OR_NOT_MULTIPLE_OCCURRING;
}
}
if (log.isTraceEnabled())
log.trace("end of choice, returning [" + result + "]");
return result;
}
default:
throw new IllegalStateException("determineIsParentOfSingleMultipleOccurringChildElement() modelGroup.compositor is not COMPOSITOR_SEQUENCE, COMPOSITOR_ALL or COMPOSITOR_CHOICE, but [" + compositor + "]");
}
}
if (term instanceof XSElementDeclaration) {
XSElementDeclaration elementDeclaration = (XSElementDeclaration) term;
String elementName = elementDeclaration.getName();
if (log.isTraceEnabled())
log.trace("ElementDeclaration name [" + elementName + "] unbounded [" + particle.getMaxOccursUnbounded() + "] maxOccurs [" + particle.getMaxOccurs() + "]");
if (particle.getMaxOccursUnbounded() || particle.getMaxOccurs() > 1) {
return ChildOccurrence.ONE_MULTIPLE_OCCURRING_ELEMENT;
}
if (particle.getMaxOccurs() == 1) {
return ChildOccurrence.ONE_SINGLE_OCCURRING_ELEMENT;
}
return ChildOccurrence.EMPTY;
}
if (term instanceof XSWildcard) {
return ChildOccurrence.MULTIPLE_ELEMENTS_OR_NOT_MULTIPLE_OCCURRING;
}
throw new IllegalStateException("determineIsParentOfSingleMultipleOccurringChildElement unknown Term type [" + term.getClass().getName() + "]");
}
Aggregations