protected ManagedProperty GetCurrentObject(object modelHost, ManagedPropertyDefinition definition,
            out ManagedPropertyCollection properties,
            out List<CrawledPropertyInfo> crawledProps)
        {
            if (modelHost is FarmModelHost)
            {
                var context = SPServiceContext.GetContext(SPServiceApplicationProxyGroup.Default,
                    SPSiteSubscriptionIdentifier.Default);
                var searchProxy =
                    context.GetDefaultProxy(typeof(SearchServiceApplicationProxy)) as SearchServiceApplicationProxy;

                var ssai = searchProxy.GetSearchServiceApplicationInfo();
                var application = SearchService.Service.SearchApplications.GetValue<SearchServiceApplication>(ssai.SearchServiceApplicationId);

                SearchObjectOwner searchOwner = new SearchObjectOwner(SearchObjectLevel.Ssa);

                if (cachedCrawledProps == null)
                    cachedCrawledProps = application.GetAllCrawledProperties(string.Empty, string.Empty, 0, searchOwner);

                crawledProps = cachedCrawledProps;

                var schema = new Schema(application);

                properties = schema.AllManagedProperties;
                return properties.FirstOrDefault(p => p.Name.ToUpper() == definition.Name.ToUpper());
            }

            throw new NotImplementedException();
        }
        protected ManagedProperty GetCurrentObject(object modelHost, ManagedPropertyDefinition definition)
        {
            ManagedPropertyCollection props;
            List<CrawledPropertyInfo> crawledProps;

            return GetCurrentObject(modelHost, definition, out props, out crawledProps);
        }
        private void DeployFarmManagedProperty(object modelHost, FarmModelHost farmModelHost, ManagedPropertyDefinition definition)
        {
            farmModelHost.ShouldUpdateHost = false;

            ManagedPropertyCollection properties;
            List<CrawledPropertyInfo> crawledProps;

            var existingProperty = GetCurrentObject(modelHost, definition, out properties, out crawledProps);

            var isNewMapping = existingProperty == null;

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model = null,
                EventType = ModelEventType.OnProvisioning,
                Object = existingProperty,
                ObjectType = typeof(ManagedProperty),
                ObjectDefinition = definition,
                ModelHost = modelHost
            });

            if (existingProperty == null)
            {
                existingProperty = properties.Create(definition.Name, (ManagedDataType)Enum.Parse(typeof(ManagedDataType), definition.ManagedType));
            }

            existingProperty.Description = definition.Description ?? string.Empty;

            if (definition.Searchable.HasValue)
                existingProperty.HasMultipleValues = definition.Searchable.Value;

            if (definition.Queryable.HasValue)
                existingProperty.Queryable = definition.Queryable.Value;

            if (definition.Retrievable.HasValue)
                existingProperty.Retrievable = definition.Retrievable.Value;

            if (definition.HasMultipleValues.HasValue)
                existingProperty.HasMultipleValues = definition.HasMultipleValues.Value;

            if (definition.Refinable.HasValue)
                existingProperty.Refinable = definition.Refinable.Value;

            if (definition.Sortable.HasValue)
                existingProperty.Sortable = definition.Sortable.Value;

            if (definition.SafeForAnonymous.HasValue)
                existingProperty.SafeForAnonymous = definition.SafeForAnonymous.Value;

            if (definition.TokenNormalization.HasValue)
                existingProperty.TokenNormalization = definition.TokenNormalization.Value;


            //if (isNewMapping)
            //{
            var mappings = existingProperty.GetMappings();

            foreach (var managedPropertyMappping in definition.Mappings)
            {
                var crawledProp = crawledProps
                    .FirstOrDefault(p => p.Name.ToUpper() == managedPropertyMappping.CrawledPropertyName.ToUpper());

                if (crawledProp == null)
                    continue;

                var mapping = new Mapping
                {
                    CrawledPropertyName = crawledProp.Name,
                    ManagedPid = existingProperty.PID,
                    CrawledPropset = crawledProp.Propset,
                };

                mappings.Add(mapping);
            }

            existingProperty.SetMappings(mappings);
            //}

            InvokeOnModelEvent(this, new ModelEventArgs
            {
                CurrentModelNode = null,
                Model = null,
                EventType = ModelEventType.OnProvisioned,
                Object = existingProperty,
                ObjectType = typeof(ManagedProperty),
                ObjectDefinition = definition,
                ModelHost = modelHost
            });

            // Write the changes back
            existingProperty.Update();
        }
 private void DeploySiteManagedProperty(object modelHost, SiteModelHost siteModelHost, ManagedPropertyDefinition managedProperty)
 {
     throw new NotImplementedException();
 }
 public static ModelNode AddManagedProperty(this ModelNode model, ManagedPropertyDefinition definition, Action<ModelNode> action)
 {
     return model.AddDefinitionNode(definition, action);
 }
 public static ModelNode AddManagedProperty(this ModelNode model, ManagedPropertyDefinition definition)
 {
     return AddManagedProperty(model, definition, null);
 }
 private void DeploySiteManagedProperty(object modelHost, SiteModelHost siteModelHost, ManagedPropertyDefinition managedProperty)
 {
     throw new SPMeta2NotImplementedException("Managed property deployment under site is not implemented yet");
 }