use of com.sun.tools.xjc.model.CReferencePropertyInfo in project jaxb-ri by eclipse-ee4j.
the class AbstractField method annotateReference.
private void annotateReference(JAnnotatable field) {
CReferencePropertyInfo rp = (CReferencePropertyInfo) prop;
TODO.prototype();
// this is just a quick hack to get the basic test working
Collection<CElement> elements = rp.getElements();
XmlElementRefWriter refw;
if (elements.size() == 1) {
refw = field.annotate2(XmlElementRefWriter.class);
CElement e = elements.iterator().next();
refw.name(e.getElementName().getLocalPart()).namespace(e.getElementName().getNamespaceURI()).type(e.getType().toType(outline.parent(), IMPLEMENTATION));
refw.required(rp.isRequired());
} else if (elements.size() > 1) {
XmlElementRefsWriter refsw = field.annotate2(XmlElementRefsWriter.class);
for (CElement e : elements) {
refw = refsw.value();
refw.name(e.getElementName().getLocalPart()).namespace(e.getElementName().getNamespaceURI()).type(e.getType().toType(outline.parent(), IMPLEMENTATION));
refw.required(rp.isRequired());
}
}
if (rp.isMixed())
field.annotate(XmlMixed.class);
NClass dh = rp.getDOMHandler();
if (dh != null) {
XmlAnyElementWriter xaew = field.annotate2(XmlAnyElementWriter.class);
xaew.lax(rp.getWildcard().allowTypedObject);
final JClass value = dh.toType(outline.parent(), IMPLEMENTATION);
if (!value.equals(codeModel.ref(W3CDomHandler.class))) {
xaew.value(value);
}
}
}
use of com.sun.tools.xjc.model.CReferencePropertyInfo in project jaxb-ri by eclipse-ee4j.
the class AbstractField method annotate.
/**
* Annotate the field according to the recipes given as {@link CPropertyInfo}.
*/
protected void annotate(JAnnotatable field) {
assert (field != null);
// TODO: consider a visitor
if (prop instanceof CAttributePropertyInfo) {
annotateAttribute(field);
} else if (prop instanceof CElementPropertyInfo) {
annotateElement(field);
} else if (prop instanceof CValuePropertyInfo) {
field.annotate(XmlValue.class);
} else if (prop instanceof CReferencePropertyInfo) {
annotateReference(field);
}
outline.parent().generateAdapterIfNecessary(prop, field);
QName st = prop.getSchemaType();
if (st != null)
field.annotate2(XmlSchemaTypeWriter.class).name(st.getLocalPart()).namespace(st.getNamespaceURI());
if (prop.inlineBinaryData())
field.annotate(XmlInlineBinaryData.class);
}
use of com.sun.tools.xjc.model.CReferencePropertyInfo in project jaxb-ri by eclipse-ee4j.
the class AbstractMappingImpl method buildDrilldown.
/**
* Derived classes can use this method to implement {@link #calcDrilldown}.
*/
protected List<Property> buildDrilldown(CClassInfo typeBean) {
// they must not contain xsd:choice
if (containingChoice(typeBean)) {
return null;
}
List<Property> result;
CClassInfo bc = typeBean.getBaseClass();
if (bc != null) {
result = buildDrilldown(bc);
if (result == null) {
// aborted
return null;
}
} else {
result = new ArrayList<>();
}
for (CPropertyInfo p : typeBean.getProperties()) {
if (p instanceof CElementPropertyInfo) {
CElementPropertyInfo ep = (CElementPropertyInfo) p;
// wrong. A+,B,C is eligible for drill-down.
// if(ep.isCollection())
// // content model like A+,B,C is not eligible
// return null;
List<? extends CTypeRef> ref = ep.getTypes();
if (ref.size() != 1) {
// content model like (A|B),C is not eligible
return null;
}
result.add(createPropertyImpl(ep, ref.get(0).getTagName()));
} else if (p instanceof ReferencePropertyInfo) {
CReferencePropertyInfo rp = (CReferencePropertyInfo) p;
Collection<CElement> elements = rp.getElements();
if (elements.size() != 1) {
return null;
}
CElement ref = elements.iterator().next();
if (ref instanceof ClassInfo) {
result.add(createPropertyImpl(rp, ref.getElementName()));
} else {
CElementInfo eref = (CElementInfo) ref;
if (!eref.getSubstitutionMembers().isEmpty()) {
// elements with a substitution group isn't qualified for the wrapper style
return null;
}
// JAX-WS doesn't want to see JAXBElement, so we have to hide it for them.
ElementAdapter fr;
if (rp.isCollection()) {
fr = new ElementCollectionAdapter(parent.outline.getField(rp), eref);
} else {
fr = new ElementSingleAdapter(parent.outline.getField(rp), eref);
}
result.add(new PropertyImpl(this, fr, eref.getElementName()));
}
} else {
// according to the JAX-RPC spec 2.3.1.2, element refs are disallowed
return null;
}
}
return result;
}
use of com.sun.tools.xjc.model.CReferencePropertyInfo in project jaxb-ri by eclipse-ee4j.
the class Element method bind.
void bind() {
CClassInfo ci = getClassInfo();
assert ci != null || attributes.isEmpty();
for (CPropertyInfo p : attributes) ci.addProperty(p);
switch(contentModelType) {
case DTDEventListener.CONTENT_MODEL_ANY:
CReferencePropertyInfo rp = new CReferencePropertyInfo("Content", true, false, true, null, null, /*TODO*/
locator, false, false, false);
rp.setWildcard(WildcardMode.SKIP);
ci.addProperty(rp);
return;
case DTDEventListener.CONTENT_MODEL_CHILDREN:
// handling follows
break;
case DTDEventListener.CONTENT_MODEL_MIXED:
if (contentModel != Term.EMPTY)
throw new UnsupportedOperationException("mixed content model unsupported yet");
if (ci != null) {
// if this element is mapped to a class, just put one property
CValuePropertyInfo p = new CValuePropertyInfo("value", null, null, /*TODO*/
locator, getConversion(), null);
ci.addProperty(p);
}
return;
case DTDEventListener.CONTENT_MODEL_EMPTY:
// no content model
assert ci != null;
return;
}
// normalize
List<Block> n = new ArrayList<>();
contentModel.normalize(n, false);
{
// check collision among Blocks
Set<String> names = new HashSet<>();
boolean collision = false;
OUTER: for (Block b : n) for (Element e : b.elements) if (!names.add(e.name)) {
collision = true;
break OUTER;
}
if (collision) {
// collapse all blocks into one
Block all = new Block(true, true);
for (Block b : n) all.elements.addAll(b.elements);
n.clear();
n.add(all);
}
}
for (Block b : n) {
CElementPropertyInfo p;
if (b.isRepeated || b.elements.size() > 1) {
// collection
StringBuilder name = new StringBuilder();
for (Element e : b.elements) {
if (name.length() > 0)
name.append("Or");
name.append(owner.model.getNameConverter().toPropertyName(e.name));
}
p = new CElementPropertyInfo(name.toString(), REPEATED_ELEMENT, ID.NONE, null, null, null, /*TODO*/
locator, !b.isOptional);
for (Element e : b.elements) {
CClassInfo child = owner.getOrCreateElement(e.name).getClassInfo();
// we are requiring them to be classes.
assert child != null;
p.getTypes().add(new CTypeRef(child, new QName("", e.name), null, false, null));
}
} else {
// single property
String name = b.elements.iterator().next().name;
String propName = owner.model.getNameConverter().toPropertyName(name);
TypeUse refType;
Element ref = owner.getOrCreateElement(name);
if (ref.getClassInfo() != null)
refType = ref.getClassInfo();
else {
refType = ref.getConversion().getInfo();
}
p = new CElementPropertyInfo(propName, refType.isCollection() ? REPEATED_VALUE : NOT_REPEATED, ID.NONE, null, null, null, /*TODO*/
locator, !b.isOptional);
p.getTypes().add(new CTypeRef(refType.getInfo(), new QName("", name), null, false, null));
}
ci.addProperty(p);
}
}
Aggregations