internal Hashtable MakePropertyObject(PropertyBE property) { if(property == null) { return null; } Hashtable result = new Hashtable(StringComparer.OrdinalIgnoreCase); // check permission & set parent reference if(property.ParentPageId != null) { if(!PermissionsBL.IsUserAllowed(DekiContext.Current.User, PageBL.GetPageById(property.ParentPageId.Value), Permissions.READ)) { return result; } // set parent result.Add("page", PropertyAt("$page", property.ParentPageId.Value)); // check if property is head revision (API doesn't support access to older revisions) if(property.IsHeadRevision()) { result.Add("api", property.Uri(Self.At("pages", property.ParentPageId.Value.ToString()))); } } else if(property.ParentUserId != null) { // check that the current user can access the properties of the specified user if((property.ParentUserId != DekiContext.Current.User.ID) && !PermissionsBL.IsUserAllowed(DekiContext.Current.User, Permissions.ADMIN)) { return result; } // set parent result.Add("user", PropertyAt("$user", property.ParentUserId.Value)); // check if property is head revision (API doesn't support access to older revisions) if(property.IsHeadRevision()) { result.Add("api", property.Uri(Self.At("users", property.ParentUserId.Value.ToString()))); } } else if(property.ParentId != null) { // parent must be a file resource, retrieve the parent and check it AttachmentBE parent = AttachmentBL.Instance.GetResource(property.ParentId.Value); // the parent must have a parent page id, o/w something isn't what we expect it to be if(parent == null) { return result; } PageBE page = PageBL.GetPageById(parent.ParentPageId); if(!PermissionsBL.IsUserAllowed(DekiContext.Current.User, page, Permissions.READ)) { return result; } // set parent uint? fileId = ResourceMapBL.GetFileIdByResourceId(property.ParentId.Value); if(fileId != null) { result.Add("file", PropertyAt("$file", fileId.Value)); // check if property is head revision (API doesn't support access to older revisions) if(property.IsHeadRevision()) { result.Add("api", property.Uri(Self.At("files", fileId.Value.ToString()))); } } else { _log.WarnFormat("Could not find parent of property {0} (expected parent to be a file)", property.ResourceId); } } else { // must be a site property if(!PermissionsBL.IsUserAllowed(DekiContext.Current.User, Permissions.ADMIN)) { return result; } } // set property information fields result.Add("editsummary", property.ChangeDescription); result.Add("language", property.Language); result.Add("mime", property.MimeType.FullType); // split name into namespace-name pair int index = property.Name.IndexOf('#'); if(index >= 0) { result.Add("namespace", property.Name.Substring(0, index)); result.Add("name", property.Name.Substring(index + 1)); } else { result.Add("namespace", string.Empty); result.Add("name", property.Name); } // get authorship information result.Add("size", property.Size); result.Add("date", property.Timestamp); result.Add("author", PropertyAt("$user", property.UserId)); result.Add("revision", property.Revision); result.Add("revisions", PropertyAt("$proprevisions", property.ResourceId)); // set content values if(property.MimeType.Match(MimeType.ANY_TEXT)) { result.Add("text", property.Content.ToText()); result.Add("xml", null); } else if(property.MimeType.IsXml) { string text = property.Content.ToText(); result.Add("text", text); result.Add("xml", DekiScriptExpression.Constant(XDocFactory.From(text, MimeType.XML))); } else { // TODO (steveb): binary types are not yet supported result.Add("text", null); result.Add("xml", null); } return result; }