private void ProcessPlacementFile(ShapeTableBuilder builder, FeatureDescriptor featureDescriptor, PlacementFile placementFile) {
            var feature = new Feature { Descriptor = featureDescriptor };

            // invert the tree into a list of leaves and the stack
            var entries = DrillDownShapeLocations(placementFile.Nodes, Enumerable.Empty<PlacementMatch>());
            foreach (var entry in entries) {
                var shapeLocation = entry.Item1;
                var matches = entry.Item2;

                string shapeType;
                string differentiator;
                GetShapeType(shapeLocation, out shapeType, out differentiator);

                Func<ShapePlacementContext, bool> predicate = ctx => true;
                if (differentiator != "") {
                    predicate = ctx => (ctx.Differentiator ?? "") == differentiator;
                }

                if (matches.Any()) {
                    predicate =  matches.SelectMany(match => match.Terms).Aggregate(predicate, BuildPredicate);
                }

                var placement = new ModelPlacementInfo();

                var segments = shapeLocation.Location.Split(';').Select(s => s.Trim()).Where(s=>!String.IsNullOrWhiteSpace(s));
                foreach (var segment in segments) {
                    if (!segment.Contains('=')) {
                        placement.Location = segment;
                    }
                    else {
                        var index = segment.IndexOf('=');
                        var property = segment.Substring(0, index).ToLower();
                        var value = segment.Substring(index + 1);
                        switch (property) {
                            case "shape":
                                placement.ShapeType = value;
                                break;
                            case "alternate":
                                placement.Alternates = placement.Alternates.Concat(new[] { value });
                                break;
                            case "wrapper":
                                placement.Wrappers = placement.Wrappers.Concat(new[] { value });
                                break;
                            default:
                                // Unknown properties use alteration builders
                                _alterationBuilder.Alter(placement, property, value);
                                break;
                        }
                    }
                }

                builder.Describe(shapeType)
                    .From(feature)
                    .Placement(ctx => {
                                   var hit = predicate(ctx);
                                   // generate 'debugging' information to trace which file originated the actual location
                                    if (hit) {
                                       var virtualPath = featureDescriptor.Extension.Location + "/" + featureDescriptor.Extension.Id + "/Placement.info";
                                       ctx.Source = virtualPath;
                                   }
                                   return hit;
                               }, placement);
            }
        }
Example #2
0
        private void ProcessPlacementFile(ShapeTableBuilder builder, FeatureDescriptor featureDescriptor, PlacementFile placementFile)
        {
            var feature = new Feature {
                Descriptor = featureDescriptor
            };

            // invert the tree into a list of leaves and the stack
            var entries = DrillDownShapeLocations(placementFile.Nodes, Enumerable.Empty <PlacementMatch>());

            foreach (var entry in entries)
            {
                var shapeLocation = entry.Item1;
                var matches       = entry.Item2;

                string shapeType;
                string differentiator;
                GetShapeType(shapeLocation, out shapeType, out differentiator);

                Func <ShapePlacementContext, bool> predicate = ctx => true;
                if (differentiator != "")
                {
                    predicate = ctx => (ctx.Differentiator ?? "") == differentiator;
                }

                if (matches.Any())
                {
                    predicate = matches.SelectMany(match => match.Terms).Aggregate(predicate, BuildPredicate);
                }

                var placement = new ModelPlacementInfo();

                var segments = shapeLocation.Location.Split(';').Select(s => s.Trim()).Where(s => !String.IsNullOrWhiteSpace(s));
                foreach (var segment in segments)
                {
                    if (!segment.Contains('='))
                    {
                        placement.Location = segment;
                    }
                    else
                    {
                        var index    = segment.IndexOf('=');
                        var property = segment.Substring(0, index).ToLower();
                        var value    = segment.Substring(index + 1);
                        switch (property)
                        {
                        case "shape":
                            placement.ShapeType = value;
                            break;

                        case "alternate":
                            placement.Alternates = placement.Alternates.Concat(new[] { value });
                            break;

                        case "wrapper":
                            placement.Wrappers = placement.Wrappers.Concat(new[] { value });
                            break;

                        default:
                            // Unknown properties use alteration builders
                            _alterationBuilder.Alter(placement, property, value);
                            break;
                        }
                    }
                }

                builder.Describe(shapeType)
                .From(feature)
                .Placement(ctx => {
                    var hit = predicate(ctx);
                    // generate 'debugging' information to trace which file originated the actual location
                    if (hit)
                    {
                        var virtualPath = featureDescriptor.Extension.Location + "/" + featureDescriptor.Extension.Id + "/Placement.info";
                        ctx.Source      = virtualPath;
                    }
                    return(hit);
                }, placement);
            }
        }