コード例 #1
0
        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;
        }