コード例 #1
0
 public void CreateFromRuntimeTest()
 {
     DatabaseSettings databaseSettings = DatabaseSettingsBuilder.Create(Host);
     ParameterData data = databaseSettings.ConnectionStrings["Northwind"].Parameters["server"];
     ParameterNode node = new ParameterNode(data);
     CreateHierarchyAndAddToHierarchyService(node, CreateDefaultConfiguration());
     Assert.AreEqual(data.Name, node.Name);
     Assert.AreEqual(data.Value, node.Value);
     ValidateNodeCommand cmd = new ValidateNodeCommand(Host);
     cmd.Execute(node);
     Assert.AreEqual(0, ValidationErrorsCount);
 }
コード例 #2
0
 public override void SetUp()
 {
     base.SetUp();
     DatabaseSettingsNode databaseSettingsNode = new DatabaseSettingsNode(DatabaseSettingsBuilder.Create(Host));
     IUIHierarchy hierarchy = CreateHierarchyAndAddToHierarchyService(databaseSettingsNode, CreateDefaultConfiguration());
     ConfigurationNode[] nodes = hierarchy.FindNodesByType(typeof(ParameterNode));
     foreach (ParameterNode node in nodes)
     {
         if (node.Name == "server")
         {
             parameterNode = node;
             break;
         }
     }
 }
コード例 #3
0
        public void Setup()
        {
            _person = new Person();

            _ageAccessNode = new PropertyAccessNode(typeof(Person).GetProperty("Age"));
            _brotherAccessNode = new PropertyAccessNode(typeof(Person).GetProperty("Brother")) { Children = new List<PropertyAccessTreeNode>() { _ageAccessNode } };
            _parameterAccessNode = new ParameterNode(typeof(Person), "person") { Children = new List<PropertyAccessTreeNode>() { _brotherAccessNode } };

            _brotherNode = new SubscriptionNode() { AccessNode = _brotherAccessNode };
            _parameterNode = new SubscriptionNode() { AccessNode = _parameterAccessNode, Children = new List<SubscriptionNode>() { _brotherNode } };
            _parameterNode.Subject = _person;

            List<SubscriptionNode> nodes = new List<SubscriptionNode>() { _parameterNode };

            _target = new SubscriptionTree(_person, nodes);
        }
コード例 #4
0
ファイル: TestASTVisitor.cs プロジェクト: sci4me/Neo-old
 public void VisitParameter(ParameterNode node)
 {
     VisitParameterHandler(node);
 }
コード例 #5
0
        //--- Methods ---
        public void Process(ModuleNode module)
        {
            // find all parameters with an `Import` field
            AtLocation("Parameters", () => FindAllParameterImports());

            // resolve all imported values
            _importer.BatchResolveImports();

            // replace all parameters with an `Import` field
            AtLocation("Parameters", () => ReplaceAllParameterImports());

            // check if any imports were not found
            foreach (var missing in _importer.MissingImports)
            {
                AddError($"import parameter '{missing}' not found");
            }
            return;

            // local functions
            void FindAllParameterImports(IEnumerable <ParameterNode> @params = null)
            {
                var paramIndex = 0;

                foreach (var param in @params ?? module.Parameters)
                {
                    ++paramIndex;
                    var paramName = param.Name ?? $"#{paramIndex}";
                    AtLocation(paramName, () => {
                        if (param.Import != null)
                        {
                            AtLocation("Import", () => {
                                if (!Regex.IsMatch(param.Import, IMPORT_PATTERN))
                                {
                                    AddError("import value is invalid");
                                    return;
                                }

                                // check if import requires a deployment tier prefix
                                if (!param.Import.StartsWith("/"))
                                {
                                    param.Import = $"/{Settings.Tier}/" + param.Import;
                                }
                                _importer.Add(param.Import);
                            });
                        }

                        // check if we need to import a custom resource handler topic
                        var resourceType = param?.Resource?.Type;
                        if ((resourceType != null) && !resourceType.StartsWith("AWS::"))
                        {
                            AtLocation("Resource", () => {
                                AtLocation("Type", () => {
                                    // confirm the custom resource has a `ServiceToken` specified or imports one
                                    if (resourceType.StartsWith("Custom::") || (resourceType == "AWS::CloudFormation::CustomResource"))
                                    {
                                        if (param.Resource.ImportServiceToken != null)
                                        {
                                            _importer.Add(param.Resource.ImportServiceToken);
                                        }
                                        else
                                        {
                                            AtLocation("Properties", () => {
                                                if (param.Resource.Properties?.ContainsKey("ServiceToken") != true)
                                                {
                                                    AddError("missing ServiceToken in custom resource properties");
                                                }
                                            });
                                        }
                                        return;
                                    }

                                    // parse resource name as `{MODULE}::{TYPE}` pattern to import the custom resource topic name
                                    var customResourceHandlerAndType = resourceType.Split("::");
                                    if (customResourceHandlerAndType.Length != 2)
                                    {
                                        AddError("custom resource type must have format {MODULE}::{TYPE}");
                                        return;
                                    }
                                    if (!Regex.IsMatch(customResourceHandlerAndType[0], CLOUDFORMATION_ID_PATTERN))
                                    {
                                        AddError($"custom resource prefix must be alphanumeric: {customResourceHandlerAndType[0]}");
                                        return;
                                    }
                                    if (!Regex.IsMatch(customResourceHandlerAndType[1], CLOUDFORMATION_ID_PATTERN))
                                    {
                                        AddError($"custom resource suffix must be alphanumeric: {customResourceHandlerAndType[1]}");
                                        return;
                                    }
                                    param.Resource.Type = "Custom::" + param.Resource.Type.Replace("::", "");

                                    // check if custom resource needs a service token to be retrieved
                                    if (!(param.Resource.Properties?.ContainsKey("ServiceToken") ?? false))
                                    {
                                        var importServiceToken = $"/{Settings.Tier}"
                                                                 + $"/{customResourceHandlerAndType[0]}"
                                                                 + $"/{customResourceHandlerAndType[1]}CustomResourceTopic";
                                        param.Resource.ImportServiceToken = importServiceToken;
                                        _importer.Add(importServiceToken);
                                    }
                                });
                            });
                        }

                        // check if we need to recurse into nested parameters
                        if (param.Parameters != null)
                        {
                            AtLocation("Parameters", () => {
                                FindAllParameterImports(param.Parameters);
                            });
                        }
                    });
                }
            }

            // local functions
            void ReplaceAllParameterImports(IList <ParameterNode> @params = null)
            {
                var parameterCollection = @params ?? module.Parameters;

                for (var i = 0; i < parameterCollection.Count; ++i)
                {
                    var parameter     = parameterCollection[i];
                    var parameterName = parameter.Name ?? $"#{i + 1}";
                    AtLocation(parameterName, () => {
                        var resource = parameter.Resource;
                        if (resource != null)
                        {
                            AtLocation("Resource", () => {
                                if (resource.ImportServiceToken != null)
                                {
                                    if (!_importer.TryGetValue(resource.ImportServiceToken, out string importedValue))
                                    {
                                        AddError("unable to find custom resource handler topic");
                                    }
                                    else
                                    {
                                        // add resolved `ServiceToken` to custom resource
                                        if (resource.Properties == null)
                                        {
                                            resource.Properties = new Dictionary <string, object>();
                                        }
                                        resource.Properties["ServiceToken"] = importedValue;
                                    }
                                }
                            });
                        }

                        // replace nested parameters
                        if (parameter.Parameters != null)
                        {
                            ReplaceAllParameterImports(parameter.Parameters);
                        }

                        // replace current parameter
                        if (parameter.Import != null)
                        {
                            // check if import is a parameter hierarchy
                            if (parameter.Import.EndsWith("/", StringComparison.Ordinal))
                            {
                                var imports = AtLocation("Import", () => {
                                    _importer.TryGetValue(parameter.Import, out IEnumerable <ResolvedImport> found);
                                    return(found);
                                }, null);
                                if (imports?.Any() == true)
                                {
                                    parameterCollection[i] = ConvertImportedParameter(
                                        parameter.Import.Substring(0, parameter.Import.Length - 1),
                                        new ParameterNode(parameter)
                                        );
                                }
                                else
                                {
                                    AddError($"could not find import");
                                }

                                // local functions
                                ParameterNode ConvertImportedParameter(string path, ParameterNode node)
                                {
                                    var current = imports.FirstOrDefault(import => import.Key == path);
                                    SetImportedParameterNode(path, node, current);

                                    // find nested, imported values
                                    var subImports = imports.Where(import => import.Key.StartsWith(path + "/", StringComparison.Ordinal)).ToArray();
                                    if (subImports.Any())
                                    {
                                        node.Parameters = subImports
                                                          .ToLookup(import => import.Key.Substring(path.Length + 1).Split('/', 2)[0])
                                                          .Select(child => ConvertImportedParameter(
                                                                      path + "/" + child.Key,
                                                                      new ParameterNode {
                                            Name = child.Key
                                        }
                                                                      ))
                                                          .ToArray();
                                    }
                                    return(node);
                                }
                            }
                            else
                            {
                                var import = AtLocation("Import", () => {
                                    _importer.TryGetValue(parameter.Import, out ResolvedImport found);
                                    return(found);
                                }, null);
                                if (import != null)
                                {
                                    // check the imported parameter store type
                                    parameterCollection[i] = new ParameterNode(parameter);
                                    SetImportedParameterNode(parameter.Import, parameterCollection[i], import);
                                }
                                else
                                {
                                    AddError($"import key not found '{parameter.Import}'");
                                }
                            }
                        }
                    });
                }
            }
        }
コード例 #6
0
 public ProtectedRowNode(ParameterNode n, ProtectedRowKind kind) : base(n.Id, n.Parameter, n.Type)
 {
     this.RowKind = kind;
 }
コード例 #7
0
 public virtual ParameterNode Visit(ParameterNode parameter)
 {
     return(parameter);
 }
コード例 #8
0
ファイル: UserFunction.cs プロジェクト: ljcleo/LEP
 public UserFunction(ParameterNode parameters, BlockNode body, Environment father)
 {
     _parameters = parameters;
     _body = body;
     _father = father;
 }
コード例 #9
0
 public ParameterMethod(ParameterNode parameter, MethodNode method)
 {
     Parameter = parameter;
     Method    = method;
 }
コード例 #10
0
 public ParameterDirectInput(ParameterNode parameter, DirectInputNode constant)
 {
     Parameter   = parameter;
     DirectInput = constant;
 }
コード例 #11
0
        public void Setup()
        {
            _source = ClinqTestFactory.CreateTwoPersonSource();

            _propertyAccessTree = new PropertyAccessTree();
            ParameterNode parameterNode = new ParameterNode(typeof(Person), "person");
            _propertyAccessTree.Children.Add(parameterNode);

            var agePropertyAccessNode = new PropertyAccessNode(typeof(Person).GetProperty("Age"));
            parameterNode.Children.Add(agePropertyAccessNode);

            _target = new NotifyCollectionChangedMonitor<Person>(_propertyAccessTree, _source);
        }
コード例 #12
0
 public override dynamic Visit(ParameterNode node)
 {
     return(null);
 }
コード例 #13
0
 internal override void Visit(ParameterNode node)
 {
 }
コード例 #14
0
 protected virtual void VisitParameterNode(ParameterNode node)
 {
 }
コード例 #15
0
 public LanguageType Visit(ParameterNode node)
 {
     return(node.Type);
 }
コード例 #16
0
        private void InitializeTargetBrothersAgeAccess()
        {
            ParameterNode parameterNode = new ParameterNode(typeof(Person), "person");
            _target.Children.Add(parameterNode);

            _brotherPropertyAccessNode = new PropertyAccessNode(_brotherProperty);
            parameterNode.Children.Add(_brotherPropertyAccessNode);

            _agePropertyAccessNode = new PropertyAccessNode(_ageProperty);
            _brotherPropertyAccessNode.Children.Add(_agePropertyAccessNode);
        }
        private void InitializeTargetJustAgeAccess()
        {
            ParameterNode parameterNode = new ParameterNode(typeof(NotifyingPerson), "person");
            _target.Children.Add(parameterNode);

            _agePropertyAccessNode = new PropertyAccessNode(_ageProperty);
            parameterNode.Children.Add(_agePropertyAccessNode);
        }
コード例 #18
0
        private void ProcessParameter(ParameterNode parameter)
        {
            var files = new List <string>();

            AtLocation("Package", () => {
                // find all files that need to be part of the package
                string folder;
                string filePattern;
                SearchOption searchOption;
                var packageFiles = Path.Combine(Settings.WorkingDirectory, parameter.Package.Files);
                if ((packageFiles.EndsWith("/", StringComparison.Ordinal) || Directory.Exists(packageFiles)))
                {
                    folder       = Path.GetFullPath(packageFiles);
                    filePattern  = "*";
                    searchOption = SearchOption.AllDirectories;
                }
                else
                {
                    folder       = Path.GetDirectoryName(packageFiles);
                    filePattern  = Path.GetFileName(packageFiles);
                    searchOption = SearchOption.TopDirectoryOnly;
                }
                files.AddRange(Directory.GetFiles(folder, filePattern, searchOption));
                files.Sort();

                // compute MD5 hash for package
                string package;
                using (var md5 = MD5.Create()) {
                    var bytes = new List <byte>();
                    foreach (var file in files)
                    {
                        using (var stream = File.OpenRead(file)) {
                            var relativeFilePath = Path.GetRelativePath(folder, file);
                            bytes.AddRange(Encoding.UTF8.GetBytes(relativeFilePath));
                            var fileHash = md5.ComputeHash(stream);
                            bytes.AddRange(fileHash);
                            if (Settings.VerboseLevel >= VerboseLevel.Detailed)
                            {
                                Console.WriteLine($"... computing md5: {relativeFilePath} => {fileHash.ToHexString()}");
                            }
                        }
                    }
                    package = Path.Combine(Settings.OutputDirectory, $"{_module.Name}-{parameter.Name}-Package-{md5.ComputeHash(bytes.ToArray()).ToHexString()}.zip");
                }

                // create zip package
                Console.WriteLine($"=> Building {parameter.Name} package");
                if (Directory.Exists(Settings.OutputDirectory))
                {
                    foreach (var file in Directory.GetFiles(Settings.OutputDirectory, $"{_module.Name}-{parameter.Name}-Package-*.zip"))
                    {
                        try {
                            File.Delete(file);
                        } catch { }
                    }
                }
                using (var zipArchive = ZipFile.Open(package, ZipArchiveMode.Create)) {
                    foreach (var file in files)
                    {
                        var filename = Path.GetRelativePath(folder, file);
                        zipArchive.CreateEntryFromFile(file, filename);
                    }
                }
                parameter.Package.PackagePath = package;
            });
        }
コード例 #19
0
 public void Visit(ParameterNode node)
 {
     CurrentSymbolTable.Insert(node.Identifier, node.Type, node);
 }
コード例 #20
0
        private bool ResolvePropertyParameter(Type targetType, PathElement[] elements, int position, ParameterNode node, string source)
        {
            var pi = targetType.GetProperty(elements[position].Name, BindingFlags.Instance | BindingFlags.Public);

            if (pi == null)
            {
                return(false);
            }

            var type = pi.PropertyType;

            for (var i = 0; i < elements[position].Indexed; i++)
            {
                type = GetNestedValueType(type);
            }

            if (position < elements.Length - 1)
            {
                return(ResolvePropertyParameter(type, elements, position + 1, node, source));
            }

            var direction  = GetParameterDirection(pi);
            var isMultiple = ParameterHelper.IsMultipleParameter(type);

            if (isMultiple && (direction != ParameterDirection.Input))
            {
                throw new AccessorGeneratorException($"DB parameter argument is not valid. type=[{method.DeclaringType.FullName}], method=[{method.Name}], source=[{node.Name}]");
            }

            parameters.Add(new ParameterEntry(
                               node.Name,
                               index++,
                               source,
                               -1,
                               pi.DeclaringType,
                               pi.Name,
                               type,
                               direction,
                               node.ParameterName,
                               isMultiple));
            return(true);
        }
コード例 #21
0
		public virtual Value evaluate(Context cx, ParameterNode node)
		{
			if ((0 <= node.kind) && (node.kind < Tokens.tokenClassNames.length))
			{
				output("<ParameterNode kind=\"" + Tokens.tokenClassNames[node.kind] + "\">");
			}
			else
			{
				output("<ParameterNode kind=\"" + node.kind + "\">");
			}
			indent_Renamed_Field++;
			if (node.identifier != null)
			{
				node.identifier.evaluate(cx, this);
			}
			if (node.type != null)
			{
				node.type.evaluate(cx, this);
			}
			indent_Renamed_Field--;
			output("</ParameterNode>");
			return null;
		}
コード例 #22
0
        public override void Visit(ParameterNode node)
        {
            if (processed.Contains(node.Name))
            {
                return;
            }

            processed.Add(node.Name);

            // [MEMO] Simple property only
            var parser   = new PathElementParser(node.Name);
            var elements = parser.Parse();

            for (var i = 0; i < method.GetParameters().Length; i++)
            {
                var pmi = method.GetParameters()[i];
                if (!ParameterHelper.IsSqlParameter(pmi))
                {
                    continue;
                }

                var type = pmi.ParameterType.IsByRef ? pmi.ParameterType.GetElementType() : pmi.ParameterType;

                if (pmi.Name == elements[0].Name)
                {
                    for (var j = 0; j < elements[0].Indexed; j++)
                    {
                        type = GetNestedValueType(type);
                    }

                    if (elements.Length == 1)
                    {
                        var direction  = GetParameterDirection(pmi);
                        var isMultiple = ParameterHelper.IsMultipleParameter(type);
                        if (isMultiple && (direction != ParameterDirection.Input))
                        {
                            throw new AccessorGeneratorException($"DB parameter argument is not valid. type=[{method.DeclaringType.FullName}], method=[{method.Name}], source=[{node.Name}]");
                        }

                        parameters.Add(new ParameterEntry(
                                           node.Name,
                                           index++,
                                           node.Name,
                                           i,
                                           null,
                                           null,
                                           type,
                                           direction,
                                           node.ParameterName,
                                           isMultiple));
                        return;
                    }

                    if (ResolvePropertyParameter(type, elements, 1, node, node.Name))
                    {
                        return;
                    }
                }

                if (ParameterHelper.IsNestedParameter(pmi) &&
                    ResolvePropertyParameter(type, elements, 0, node, $"{pmi.Name}.{node.Name}"))
                {
                    return;
                }
            }

            // Dynamic
            dynamicParameters.Add(new DynamicParameterEntry(node.Name, index++, node.IsMultiple));
        }
コード例 #23
0
ファイル: GeneratedVisitor.cs プロジェクト: DvdKhl/dgrok
 public virtual void VisitParameterNode(ParameterNode node)
 {
     Visit(node.ModifierNode);
     Visit(node.NameListNode);
     Visit(node.ColonNode);
     Visit(node.TypeNode);
     Visit(node.EqualSignNode);
     Visit(node.DefaultValueNode);
 }
コード例 #24
0
        //private void Flow(SimplePointsToGraph ptg, Instruction instruction)
        //{
        //    var ptaVisitor = new PTAVisitor(ptg, this);
        //    ptaVisitor.Visit(instruction);
        //}

        private void CreateInitialGraph(bool createNodeForParams = true, SimplePointsToGraph initialGraph = null)
        {
            this.ReturnVariable = new LocalVariable(this.method.Name + "_" + "$RV", method)
            {
                Type = this.method.Type.PlatformType.SystemObject
            };

            //IteratorPointsToAnalysis.GlobalVariable= new LocalVariable("$Global");
            //IteratorPointsToAnalysis.GlobalVariable.Type = MyLoader.PlatformTypes.SystemObject;

            var ptg = initialGraph == null ? new SimplePointsToGraph() : initialGraph.Clone();

            var variables = cfg.GetVariables();

            var body = MethodBodyProvider.Instance.GetBody(this.method);

            var parameters = body.Parameters;

            if (parameters != null)
            {
                variables.AddRange(parameters);
            }

            int           counter      = -1;
            IVariable     thisVariable = null;
            SimplePTGNode thisNode     = null;

            foreach (var variable in variables)
            {
                // TODO: replace when Egdardo fixes type inferece
                if (variable.Type == null || !variable.Type.IsClassOrStruct())
                {
                    continue;
                }
                // if (variable.Type.TypeKind == TypeKind.ValueType) continue;

                if (variable.IsParameter)
                {
                    var isThisParameter = variable.Name == "this";
                    var kind            = isThisParameter ? SimplePTGNodeKind.Object : SimplePTGNodeKind.Unknown;
                    if (createNodeForParams)
                    {
                        var ptgId = new PTGID(new MethodContex(this.method), counter--);
                        var node  = new ParameterNode(ptgId, variable.Name, variable.Type);
                        ptg.Add(node);
                        ptg.PointsTo(variable, node);
                        if (isThisParameter)
                        {
                            thisVariable = variable;
                            thisNode     = node;
                        }
                    }
                    if (isThisParameter)
                    {
                        this.ThisVariable = variable;
                    }
                    ptg.Add(variable);
                }
                else
                {
                    //ptg.Add(variable);
                    ptg.PointsTo(variable, SimplePointsToGraph.NullNode);
                }
            }

            //foreach(var specialField in specialFields)
            //{
            //    counter = -1000;
            //    var variable = specialField.Value;
            //    var fieldName =  specialField.Key;
            //    var ptgId = new PTGID(new MethodContex(this.method), counter--);
            //    var node = new SimplePTGNode(ptgId, variable.Type);
            //    ptg.Add(node);
            //    ptg.PointsTo(thisNode, new FieldReference(fieldName, variable.Type, method.ContainingType), node);
            //}
            ptg.Add(this.ReturnVariable);
            ptg.Add(SimplePointsToAnalysis.GlobalVariable);
            ptg.PointsTo(SimplePointsToAnalysis.GlobalVariable, SimplePointsToGraph.GlobalNode);
            this.initialGraph = ptg;
        }