private static string GetCollectionTitle(INakedObject nakedObject, HtmlHelper html) { int pageSize, maxPage, currentPage, total; int count = nakedObject.GetAsEnumerable(html.Framework().NakedObjectManager).Count(); if (!html.GetPagingValues(out pageSize, out maxPage, out currentPage, out total)) { total = count; } string queryInd = nakedObject.Spec.IsQueryable ? MvcUi.QueryResult + ": " : ""; int viewSize = count; ITypeSpec typeSpec = html.Framework().MetamodelManager.GetSpecification(nakedObject.GetTypeOfFacetFromSpec().GetValueSpec(nakedObject, html.Framework().MetamodelManager.Metamodel)); string type = total == 1 ? typeSpec.SingularName : typeSpec.PluralName; return(queryInd + string.Format(MvcUi.ViewingNofXType, viewSize, total, type)); }
public Place ObjectToElement(INakedObject nakedObject) { Log.Debug("objectToElement(" + DoLog("object", nakedObject) + ")"); IObjectSpec nos = (IObjectSpec)nakedObject.Spec; Log.Debug("objectToElement(NO): create element and nof:title"); XElement element = Schema.CreateElement(XmlDocument, nos.ShortName, nos.FullName, nos.SingularName, nos.PluralName); NofMetaModel.AppendNofTitle(element, nakedObject.TitleString()); Log.Debug("objectToElement(NO): create XS element for NOF class"); XElement xsElement = Schema.CreateXsElementForNofClass(XsdDocument, element, topLevelElementWritten); // hack: every element in the XSD schema apart from first needs minimum cardinality setting. topLevelElementWritten = true; var place = new Place(nakedObject, element); NofMetaModel.SetAttributesForClass(element, OidOrHashCode(nakedObject)); IAssociationSpec[] fields = nos.Properties; Log.Debug("objectToElement(NO): processing fields"); var seenFields = new List <string>(); foreach (IAssociationSpec field in fields) { string fieldName = field.Id; Log.Debug("objectToElement(NO): " + DoLog("field", fieldName)); // Skip field if we have seen the name already // This is a workaround for getLastActivity(). This method exists // in AbstractNakedObject, but is not (at some level) being picked up // by the dot-net reflector as a property. On the other hand it does // exist as a field in the meta model (NakedObjectSpecification). // // Now, to re-expose the lastactivity field for .Net, a deriveLastActivity() // has been added to BusinessObject. This caused another field ofthe // same name, ultimately breaking the XSD. if (seenFields.Contains(fieldName)) { Log.Debug("objectToElement(NO): " + DoLog("field", fieldName) + " SKIPPED"); continue; } seenFields.Add(fieldName); XNamespace ns = Schema.GetUri(); var xmlFieldElement = new XElement(ns + fieldName); XElement xsdFieldElement; var oneToOneAssociation = field as IOneToOneAssociationSpec; var oneToManyAssociation = field as IOneToManyAssociationSpec; if (field.ReturnSpec.IsParseable && oneToOneAssociation != null) { Log.Debug("objectToElement(NO): " + DoLog("field", fieldName) + " is value"); IObjectSpec fieldNos = field.ReturnSpec; // skip fields of type XmlValue if (fieldNos != null && fieldNos.FullName != null && fieldNos.FullName.EndsWith("XmlValue")) { continue; } XElement xmlValueElement = xmlFieldElement; // more meaningful locally scoped name try { INakedObject value = oneToOneAssociation.GetNakedObject(nakedObject); // a null value would be a programming error, but we protect // against it anyway if (value == null) { continue; } ITypeSpec valueNos = value.Spec; // XML NofMetaModel.SetAttributesForValue(xmlValueElement, valueNos.ShortName); bool notEmpty = (value.TitleString().Length > 0); if (notEmpty) { string valueStr = value.TitleString(); xmlValueElement.Add(new XText(valueStr)); } else { NofMetaModel.SetIsEmptyAttribute(xmlValueElement, true); } } catch (Exception) { Log.Warn("objectToElement(NO): " + DoLog("field", fieldName) + ": getField() threw exception - skipping XML generation"); } // XSD xsdFieldElement = Schema.CreateXsElementForNofValue(xsElement, xmlValueElement); } else if (oneToOneAssociation != null) { Log.Debug("objectToElement(NO): " + DoLog("field", fieldName) + " is IOneToOneAssociation"); XElement xmlReferenceElement = xmlFieldElement; // more meaningful locally scoped name try { INakedObject referencedNakedObject = oneToOneAssociation.GetNakedObject(nakedObject); string fullyQualifiedClassName = field.ReturnSpec.FullName; // XML NofMetaModel.SetAttributesForReference(xmlReferenceElement, Schema.Prefix, fullyQualifiedClassName); if (referencedNakedObject != null) { NofMetaModel.AppendNofTitle(xmlReferenceElement, referencedNakedObject.TitleString()); } else { NofMetaModel.SetIsEmptyAttribute(xmlReferenceElement, true); } } catch (Exception) { Log.Warn("objectToElement(NO): " + DoLog("field", fieldName) + ": getAssociation() threw exception - skipping XML generation"); } // XSD xsdFieldElement = Schema.CreateXsElementForNofReference(xsElement, xmlReferenceElement, oneToOneAssociation.ReturnSpec.FullName); } else if (oneToManyAssociation != null) { Log.Debug("objectToElement(NO): " + DoLog("field", fieldName) + " is IOneToManyAssociation"); XElement xmlCollectionElement = xmlFieldElement; // more meaningful locally scoped name try { INakedObject collection = oneToManyAssociation.GetNakedObject(nakedObject); ITypeOfFacet facet = collection.GetTypeOfFacetFromSpec(); IObjectSpecImmutable referencedTypeNos = facet.GetValueSpec(collection, metamodelManager.Metamodel); string fullyQualifiedClassName = referencedTypeNos.FullName; // XML NofMetaModel.SetNofCollection(xmlCollectionElement, Schema.Prefix, fullyQualifiedClassName, collection, nakedObjectManager); } catch (Exception) { Log.Warn("objectToElement(NO): " + DoLog("field", fieldName) + ": get(obj) threw exception - skipping XML generation"); } // XSD xsdFieldElement = Schema.CreateXsElementForNofCollection(xsElement, xmlCollectionElement, oneToManyAssociation.ReturnSpec.FullName); } else { Log.Info("objectToElement(NO): " + DoLog("field", fieldName) + " is unknown type; ignored"); continue; } if (xsdFieldElement != null) { xmlFieldElement.AddAnnotation(xsdFieldElement); } // XML Log.Debug("objectToElement(NO): invoking mergeTree for field"); MergeTree(element, xmlFieldElement); // XSD if (xsdFieldElement != null) { Log.Debug("objectToElement(NO): adding XS element for field to schema"); Schema.AddFieldXsElement(xsElement, xsdFieldElement); } } return(place); }
private static string CollectionTable(this HtmlHelper html, INakedObject collectionNakedObject, Func<INakedObject, string> linkFunc, Func<INakedObjectAssociation, bool> filter, Func<INakedObjectAssociation, int> order, bool isStandalone, bool withSelection, bool withTitle, bool defaultChecked = false) { var table = new TagBuilder("table"); table.AddCssClass(CollectionItemTypeName(collectionNakedObject)); table.InnerHtml += Environment.NewLine; string innerHtml = ""; INakedObject[] collection = collectionNakedObject.GetAsEnumerable().ToArray(); INakedObjectSpecification collectionSpec = collectionNakedObject.GetTypeOfFacetFromSpec().ValueSpec; INakedObjectAssociation[] collectionAssocs = CollectionAssociations(collection, collectionSpec, filter, order); int index = 0; foreach (INakedObject item in collection) { var row = new TagBuilder("tr"); if (withSelection) { var cbTag = new TagBuilder("td"); int i = index++; string id = "checkbox" + i; string label = GetLabelTag(true, (i + 1).ToString(CultureInfo.InvariantCulture), () => id); cbTag.InnerHtml += (label + html.CheckBox(FrameworkHelper.GetObjectId(item), defaultChecked, new {id, @class = IdHelper.CheckboxClass})); row.InnerHtml += cbTag.ToString(); } if (withTitle) { var itemTag = new TagBuilder("td"); itemTag.InnerHtml += linkFunc(item); row.InnerHtml += itemTag.ToString(); } string[] collectionValues = collectionAssocs.Select(a => html.GetViewField(new PropertyContext(item, a, false), a.Description, true, true)).ToArray(); foreach (string s in collectionValues) { row.InnerHtml += new TagBuilder("td") {InnerHtml = s}; } innerHtml += (row + Environment.NewLine); } var headers = collectionAssocs.Select(a => a.Name).ToArray(); html.AddHeader(headers, table, isStandalone, withSelection, withTitle, defaultChecked); table.InnerHtml += innerHtml; return table + html.AddFooter(collectionNakedObject); }
private static string AddFooter(this HtmlHelper html, INakedObject pagedCollectionNakedObject) { int pageSize, maxPage, currentPage, total; html.GetPagingValues(out pageSize, out maxPage, out currentPage, out total); if (maxPage > 1) { var tagPaging = new TagBuilder("div"); tagPaging.AddCssClass(IdHelper.PagingClass); var tagPageNumber = new TagBuilder("div"); tagPageNumber.AddCssClass(IdHelper.PageNumberClass); tagPageNumber.InnerHtml += string.Format(MvcUi.PageOf, currentPage, maxPage); tagPaging.InnerHtml += tagPageNumber; var tagTotalCount = new TagBuilder("div"); tagTotalCount.AddCssClass(IdHelper.TotalCountClass); INakedObjectSpecification typeSpec = pagedCollectionNakedObject.GetTypeOfFacetFromSpec().ValueSpec; tagTotalCount.InnerHtml += string.Format(MvcUi.TotalOfXType, total, total == 1 ? typeSpec.SingularName : typeSpec.PluralName); tagPaging.InnerHtml += tagTotalCount; string displayType = html.ViewData.ContainsKey(IdHelper.CollectionFormat) ? (string) html.ViewData[IdHelper.CollectionFormat] : IdHelper.ListDisplayFormat; if (currentPage > 1) { tagPaging.InnerHtml += GetSubmitButton(null, MvcUi.First, IdHelper.PageAction, new RouteValueDictionary(new {page = 1, pageSize, NofCollectionFormat = displayType})); tagPaging.InnerHtml += GetSubmitButton(null, MvcUi.Previous, IdHelper.PageAction, new RouteValueDictionary(new {page = currentPage - 1, pageSize, NofCollectionFormat = displayType})); } else { tagPaging.InnerHtml += GetDisabledButton(null, MvcUi.First); tagPaging.InnerHtml += GetDisabledButton(null, MvcUi.Previous); } if (currentPage < maxPage) { tagPaging.InnerHtml += GetSubmitButton(null, MvcUi.Next, IdHelper.PageAction, new RouteValueDictionary(new {page = currentPage + 1, pageSize, NofCollectionFormat = displayType})); tagPaging.InnerHtml += GetSubmitButton(null, MvcUi.Last, IdHelper.PageAction, new RouteValueDictionary(new {page = maxPage, pageSize, NofCollectionFormat = displayType})); } else { tagPaging.InnerHtml += GetDisabledButton(null, MvcUi.Next); tagPaging.InnerHtml += GetDisabledButton(null, MvcUi.Last); } return tagPaging.ToString(); } return ""; }
private static string CollectionItemTypeName(INakedObject collectionNakedObject) { ITypeOfFacet facet = collectionNakedObject.GetTypeOfFacetFromSpec(); return facet.ValueSpec.ShortName; }