package gov.nasa.jpl.mbee.mdk.model;
import com.nomagic.uml2.ext.jmi.helpers.StereotypesHelper;
import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Element;
import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Property;
import gov.nasa.jpl.mbee.mdk.docgen.DocGenProfile;
import gov.nasa.jpl.mbee.mdk.docgen.docbook.DBHasContent;
import gov.nasa.jpl.mbee.mdk.docgen.docbook.DBParagraph;
import gov.nasa.jpl.mbee.mdk.docgen.docbook.DBTableEntry;
import gov.nasa.jpl.mbee.mdk.docgen.docbook.DocumentElement;
import gov.nasa.jpl.mbee.mdk.docgen.docbook.stereotypes.EditableChoosable;
import java.util.*;
/**
* Common is a collection of utility functions for creating DocumentElements
* from model Elements.
*/
public class Common {
public static void addReferenceToDBHasContent(Reference ref, DBHasContent parent, Query query) {
parent.addElements(getReferenceAsDocumentElements(ref, query));
}
public static void addReferenceToDBHasContent(Reference ref, DBHasContent parent, Boolean editable) {
parent.addElements(getReferenceAsDocumentElements(ref, editable));
}
public static List<DocumentElement> getReferenceAsDocumentElements(Reference ref, Query query) {
Boolean editable = null;
Object o;
if (query != null && query.getDgElement() != null && (o = StereotypesHelper.getStereotypePropertyFirst(query.getDgElement(), DocGenProfile.editableChoosable, "editable")) instanceof Boolean) {
editable = (Boolean) o;
}
return getReferenceAsDocumentElements(ref, editable);
}
public static List<DocumentElement> getReferenceAsDocumentElements(Reference ref, Boolean editable) {
List<DocumentElement> res = new ArrayList<DocumentElement>();
if (ref.result == null) {
return res;
}
if (!ref.isResultEditable()) {
if (ref.result instanceof Collection) {
for (Object r : (Collection<?>) ref.result) {
DocumentElement documentElement = new DBParagraph(r);
initEditable(documentElement, editable);
res.add(documentElement);
}
}
else {
DocumentElement documentElement = new DBParagraph(ref.result);
initEditable(documentElement, editable);
res.add(documentElement);
}
}
else {
//if (ref.result instanceof Collection && !((Collection<?>)ref.result).isEmpty()) {
// res.add(new DBParagraph(((Collection<?>)ref.result).iterator().next(), ref.element, ref.from));
//} else {
DocumentElement documentElement = new DBParagraph(ref.result, ref.element, ref.from);
initEditable(documentElement, editable);
res.add(documentElement);
//}
}
return res;
}
/**
* This set is used to prevent infinite recursion while traversing nested
* collections of model elements.
*/
public static Set<Object> seen = Collections.synchronizedSet(new HashSet<Object>());
public static DBTableEntry getStereotypePropertyEntry(Element e, Property p, Query query) {
DBTableEntry res = new DBTableEntry();
addReferenceToDBHasContent(Reference.getPropertyReference(e, p), res, query);
return res;
}
/**
* This assumes no context for what object is or how it can be editable,
* should not be used except in old queries like GenericTable
*
* @param o
* @return
*/
public static DBTableEntry getTableEntryFromObject(Object o) {
DBTableEntry res = new DBTableEntry();
if (o instanceof Collection) {
for (Object r : (Collection<?>) o) {
res.addElement(new DBParagraph(r));
}
}
else {
res.addElement(new DBParagraph(o));
}
return res;
}
private static void initEditable(DocumentElement documentElement, Boolean editable) {
if (documentElement instanceof EditableChoosable && editable != null) {
((EditableChoosable) documentElement).setEditable(editable);
}
}
}