public override ModelNode ReverseSingleHost(object reverseHost, ReverseOptions options)
        {
            var item = (reverseHost as ContentTypeFieldLinkReverseHost).HostFieldLink;

            var def = new ContentTypeFieldLinkDefinition();

            def.FieldInternalName = item.Name;
            def.FieldId = item.Id;

            def.Hidden = item.Hidden;
            def.Required = item.Required;

            return new ContentTypeFieldLinkModelNode
            {
                Options = { RequireSelfProcessing = true },
                Value = def
            };
        }
        protected SPFieldLink FindExistingFieldLink(SPContentType contentType, ContentTypeFieldLinkDefinition fieldLinkModel)
        {
            if (fieldLinkModel.FieldId.HasValue)
            {
                return contentType.FieldLinks
                      .OfType<SPFieldLink>()
                      .FirstOrDefault(l => l.Id == fieldLinkModel.FieldId);

            }
            else if (!string.IsNullOrEmpty(fieldLinkModel.FieldInternalName))
            {
                return contentType.FieldLinks
                      .OfType<SPFieldLink>()
                      .FirstOrDefault(l => l.Name.ToUpper() == fieldLinkModel.FieldInternalName.ToUpper());
            }

            throw new ArgumentException("FieldId or FieldInternalName must be defined");
        }
        private SPField FindField(SPFieldCollection fields, ContentTypeFieldLinkDefinition listFieldLinkModel)
        {
            if (listFieldLinkModel.FieldId.HasGuidValue())
            {

                return fields
                    .OfType<SPField>()
                    .FirstOrDefault(f => f.Id == listFieldLinkModel.FieldId.Value);
            }

            if (!string.IsNullOrEmpty(listFieldLinkModel.FieldInternalName))
            {
                return fields
                   .OfType<SPField>()
                   .FirstOrDefault(f => f.InternalName.ToUpper() == listFieldLinkModel.FieldInternalName.ToUpper());
            }

            throw new ArgumentException("FieldId or FieldInternalName should be defined");
        }
        public void Can_Reverse_Site_ContentType_FieldLinks()
        {
            var model = SPMeta2Model.NewSiteModel(site =>
            {
                site.AddRandomContentType(ct =>
                {
                    // the definition id verification won't match on different ID/Name
                    // both should be there
                    var randomField = new ContentTypeFieldLinkDefinition
                    {
                        FieldInternalName = "CellPhone",
                        FieldId = BuiltInFieldId.CellPhone
                    };

                    ct.AddContentTypeFieldLink(randomField);
                });

                site.AddRandomContentType();
            });

            DeployReverseAndTestModel(model);
        }
        protected FieldLink FindExistingFieldLink(ContentType contentType, ContentTypeFieldLinkDefinition contentTypeFieldLinkModel)
        {
            var context = contentType.Context;

            context.Load(contentType);
            context.Load(contentType, c => c.FieldLinks);

            context.ExecuteQuery();

            if (contentTypeFieldLinkModel.FieldId.HasGuidValue())
            {
                return contentType.FieldLinks
                                  .ToList()
                                  .FirstOrDefault(l => l.Id == contentTypeFieldLinkModel.FieldId.Value);
            }
            else if (!string.IsNullOrEmpty(contentTypeFieldLinkModel.FieldInternalName))
            {
                return contentType.FieldLinks
                                  .ToList()
                                  .FirstOrDefault(l => l.Name.ToUpper() == contentTypeFieldLinkModel.FieldInternalName.ToUpper());
            }

            throw new ArgumentException("FieldId or FieldInternalName must be defined");
        }
        private Field FindField(FieldCollection fields, ContentTypeFieldLinkDefinition listFieldLinkModel)
        {
            var context = fields.Context;

            var scope = new ExceptionHandlingScope(context);

            Field field = null;

            if (listFieldLinkModel.FieldId.HasGuidValue())
            {
                var id = listFieldLinkModel.FieldId.Value;

                using (scope.StartScope())
                {
                    using (scope.StartTry())
                    {
                        fields.GetById(id);
                    }

                    using (scope.StartCatch())
                    {

                    }
                }
            }
            else if (!string.IsNullOrEmpty(listFieldLinkModel.FieldInternalName))
            {
                var fieldInternalName = listFieldLinkModel.FieldInternalName;

                using (scope.StartScope())
                {
                    using (scope.StartTry())
                    {
                        fields.GetByInternalNameOrTitle(fieldInternalName);
                    }

                    using (scope.StartCatch())
                    {

                    }
                }
            }

            context.ExecuteQueryWithTrace();

            if (!scope.HasException)
            {
                if (listFieldLinkModel.FieldId.HasGuidValue())
                {
                    field = fields.GetById(listFieldLinkModel.FieldId.Value);
                }
                else if (!string.IsNullOrEmpty(listFieldLinkModel.FieldInternalName))
                {
                    field = fields.GetByInternalNameOrTitle(listFieldLinkModel.FieldInternalName);
                }

                context.Load(field);
                context.Load(field, f => f.SchemaXml);

                context.ExecuteQueryWithTrace();
            }

            return field;
        }
        //protected Field FindExistingListField(List list, ContentTypeFieldLinkDefinition listFieldLinkModel)
        //{
        //    return FindField(list.Fields, listFieldLinkModel);
        //}

        protected Field FindAvailableField(Web web, ContentTypeFieldLinkDefinition listFieldLinkModel)
        {
            return FindField(web.AvailableFields, listFieldLinkModel);
        }
 public static ModelNode AddContentTypeFieldLink(this ModelNode model, ContentTypeFieldLinkDefinition definition, Action<ModelNode> action)
 {
     return model.AddDefinitionNode(definition, action);
 }
 public static ModelNode AddContentTypeFieldLink(this ModelNode model, ContentTypeFieldLinkDefinition definition)
 {
     return AddContentTypeFieldLink(model, definition, null);
 }