示例#1
0
 public override System.Type ResolveUri(string uri, out LibraryFailure reason)
 {
     if (cache.ContainsKey(uri)) {
         reason = cache[uri] == null ? LibraryFailure.Missing : LibraryFailure.None;
         return cache[uri];
     }
     var base_name = uri.Substring(4);
     var type_name = "Flabbergast.Library." + base_name.Replace('/', '.');
     foreach (var path in paths) {
         foreach (var extension in new[] { ".nflbgst", ".flbgst"}) {
             var src_file = Path.Combine(path, base_name + extension);
             if (!File.Exists(src_file)) {
                 continue;
             }
             var parser = Parser.Open(src_file);
             var type = parser.ParseFile(collector, unit, type_name);
             reason = type == null ? LibraryFailure.Corrupt : LibraryFailure.None;
             cache[uri] = type;
             return type;
         }
     }
     cache[uri] = null;
     reason = LibraryFailure.Missing;
     return null;
 }
示例#2
0
        public override System.Type ResolveUri(string uri, out LibraryFailure reason)
        {
            if (cache.ContainsKey(uri))
            {
                reason = cache[uri] == null ? LibraryFailure.Missing : LibraryFailure.None;
                return(cache[uri]);
            }
            var base_name = uri.Substring(4);
            var type_name = "Flabbergast.Library." + base_name.Replace('/', '.');

            foreach (var path in paths)
            {
                foreach (var extension in new[] { ".no_0", ".o_0" })
                {
                    var src_file = Path.Combine(path, base_name + extension);
                    if (!File.Exists(src_file))
                    {
                        continue;
                    }
                    var parser = Parser.Open(src_file);
                    var type   = parser.ParseFile(collector, unit, type_name);
                    reason     = type == null ? LibraryFailure.Corrupt : LibraryFailure.None;
                    cache[uri] = type;
                    return(type);
                }
            }
            cache[uri] = null;
            reason     = LibraryFailure.Missing;
            return(null);
        }
示例#3
0
        public override Type ResolveUri(string uri, out LibraryFailure reason)
        {
            var base_name = uri.Substring(4).Replace('/', '.');
            var type_name = "Flabbergast.Library." + base_name;
            var dll_name  = base_name + ".dll";

            foreach (var path in paths)
            {
                var dll_file = Path.Combine(path, dll_name);
                if (!File.Exists(dll_file))
                {
                    continue;
                }
                var assembly = Assembly.LoadFrom(dll_file);
                if (assembly == null)
                {
                    reason = LibraryFailure.Corrupt;
                    return(null);
                }
                var type = assembly.GetType(type_name, false);
                if (type == null)
                {
                    reason = LibraryFailure.Corrupt;
                    return(null);
                }
                reason = LibraryFailure.None;
                return(type);
            }
            reason = LibraryFailure.Missing;
            return(null);
        }
示例#4
0
        public Computation ResolveUri(TaskMaster master, string uri, out LibraryFailure reason)
        {
            if (!uri.StartsWith("http:") && !uri.StartsWith("https:"))
            {
                reason = LibraryFailure.Missing;
                return(null);
            }
            reason = LibraryFailure.None;
            var src_ref = new NativeSourceReference(uri);

            try {
                var response = WebRequest.Create(uri).GetResponse();
                var frame    = new FixedFrame("http" + uri.GetHashCode(), src_ref);
                var data     = new byte[response.ContentLength];
                var stream   = response.GetResponseStream();
                for (var offset = 0; offset < data.Length; offset += stream.Read(data, offset, data.Length - offset))
                {
                    ;
                }

                frame.Add("data", data);
                frame.Add("content_type", response.ContentType);
                return(new Precomputation(frame));
            } catch (Exception e) {
                return(new FailureComputation(master, src_ref, e.Message));
            }
        }
示例#5
0
        public override Type ResolveUri(string uri, out LibraryFailure reason)
        {
            var base_name = uri.Substring(4).Replace('/', '.');
            var type_name = "Flabbergast.Library." + base_name;

            foreach (var dll_file in Finder.FindAll(type_name, ".dll"))
            {
                var assembly = Assembly.LoadFrom(dll_file);
                if (assembly == null)
                {
                    reason = LibraryFailure.Corrupt;
                    return(null);
                }
                var type = assembly.GetType(type_name, false);
                if (type == null)
                {
                    reason = LibraryFailure.Corrupt;
                    return(null);
                }
                reason = LibraryFailure.None;
                return(type);
            }
            reason = LibraryFailure.Missing;
            return(null);
        }
示例#6
0
        public Computation ResolveUri(TaskMaster task_master, string uri, out LibraryFailure reason)
        {
            if (!uri.StartsWith("sql:"))
            {
                reason = LibraryFailure.Missing;
                return(null);
            }
            reason = LibraryFailure.None;
            try {
                var param = new Dictionary <string, string>();

                int first_colon = 5;
                while (first_colon < uri.Length && uri[first_colon] != ':')
                {
                    first_colon++;
                }
                if (first_colon >= uri.Length)
                {
                    return(new FailureComputation(task_master, new ClrSourceReference(), "Bad provider in URI “" + uri + "”."));
                }
                var provider      = uri.Substring(4, first_colon - 4);
                int question_mark = first_colon;
                while (question_mark < uri.Length && uri[question_mark] != '?')
                {
                    question_mark++;
                }
                var uri_fragment = uri.Substring(first_colon + 1, question_mark - first_colon - 1);
                if (question_mark < uri.Length - 1)
                {
                    foreach (var param_str in uri.Substring(question_mark + 1).Split(new [] { '&' }))
                    {
                        if (param_str.Length == 0)
                        {
                            continue;
                        }
                        var parts = param_str.Split(new [] { '=' }, 2);
                        if (parts.Length != 2)
                        {
                            return(new FailureComputation(task_master, new ClrSourceReference(), "Bad parameter “" + param_str + "”."));
                        }
                        param[parts[0]] = parts[1];
                    }
                }

                string error;
                var    connection = DbParser.Parse(provider, uri_fragment, param, out error);
                if (connection == null)
                {
                    return(new FailureComputation(task_master, new ClrSourceReference(), error ?? "Bad URI."));
                }

                connection.Open();

                var connection_proxy = ReflectedFrame.Create(task_master, connection, connection_hooks);
                connection_proxy.Set("provider", new SimpleStringish(provider));
                return(new Precomputation(connection_proxy));
            } catch (Exception e) {
                return(new FailureComputation(task_master, new ClrSourceReference(e), e.Message));
            }
        }
示例#7
0
        public Computation ResolveUri(TaskMaster master, string uri, out LibraryFailure reason)
        {
            if (!uri.StartsWith("settings:"))
            {
                reason = LibraryFailure.Missing;
                return(null);
            }
            var setting = ConfigurationManager.AppSettings[HttpUtility.UrlDecode(uri.Substring(9))];

            reason = LibraryFailure.None;
            return(new Precomputation(setting == null ? (object)Unit.NULL : (object)new SimpleStringish(setting)));
        }
示例#8
0
 public Type ResolveUri(string uri, out LibraryFailure reason)
 {
     reason = LibraryFailure.Missing;
     if (!uri.StartsWith("lib:"))
         return null;
     var type_name = "Flabbergast.Library." + uri.Substring(4).Replace('/', '.');
     var result = Type.GetType(type_name, false);
     if (result == null) {
         return null;
     } else {
         reason = LibraryFailure.None;
         return result;
     }
 }
示例#9
0
 public Computation ResolveUri(TaskMaster master, string uri, out LibraryFailure reason)
 {
     reason = LibraryFailure.Missing;
     if (!uri.StartsWith("current:"))
     {
         return(null);
     }
     if (information.ContainsKey(uri.Substring(8)))
     {
         reason = LibraryFailure.None;
         return(information[uri.Substring(8)]);
     }
     return(null);
 }
示例#10
0
 public Computation ResolveUri(TaskMaster master, string uri, out LibraryFailure reason)
 {
     if (!uri.StartsWith("ftp:") && !uri.StartsWith("ftps:"))
     {
         reason = LibraryFailure.Missing;
         return(null);
     }
     reason = LibraryFailure.None;
     try {
         return(new Precomputation(new WebClient().DownloadData(uri)));
     } catch (Exception e) {
         return(new FailureComputation(master, new NativeSourceReference(uri), e.Message));
     }
 }
示例#11
0
 public Computation ResolveUri(TaskMaster master, string uri, out LibraryFailure reason)
 {
     if (!uri.StartsWith("file:"))
     {
         reason = LibraryFailure.Missing;
         return(null);
     }
     reason = LibraryFailure.None;
     try {
         return(new Precomputation(File.ReadAllBytes(new Uri(uri).LocalPath)));
     } catch (Exception e) {
         return(new FailureComputation(master, new NativeSourceReference(uri), e.Message));
     }
 }
示例#12
0
        public Computation ResolveUri(TaskMaster task_master, string uri, out LibraryFailure reason)
        {
            var type = loader.ResolveUri(uri, out reason);

            if (reason != LibraryFailure.None || type == null)
            {
                return(null);
            }
            if (!typeof(Computation).IsAssignableFrom(type))
            {
                throw new InvalidCastException(String.Format(
                                                   "Class {0} for URI {1} from {2} is not a computation.", type, uri, UriName));
            }
            return((Computation)Activator.CreateInstance(type, task_master));
        }
示例#13
0
 public override void ReportExternalError(string uri, LibraryFailure reason)
 {
     Dirty = true;
     switch (reason) {
     case LibraryFailure.BadName:
         Console.Error.WriteLine("The URI “{0}” is not a valid name.", uri);
         break;
     case LibraryFailure.Corrupt:
         Console.Error.WriteLine("The URI “{0}” could not be loaded due to corruption.", uri);
         break;
     case LibraryFailure.Missing:
         Console.Error.WriteLine("The URI “{0}” could not be found.", uri);
         break;
     default:
         Console.Error.WriteLine("The URI “{0}” could not be resolved.", uri);
         break;
     }
 }
示例#14
0
        public Computation ResolveUri(TaskMaster task_master, string uri, out LibraryFailure reason)
        {
            if (!uri.StartsWith("env:"))
            {
                reason = LibraryFailure.Missing;
                return(null);
            }
            var name = uri.Substring(4);

            if (!Regex.IsMatch(name, "[A-Z_][A-Z0-9_]*"))
            {
                reason = LibraryFailure.BadName;
                return(null);
            }
            reason = LibraryFailure.None;
            var content = Environment.GetEnvironmentVariable(name);

            return(new Precomputation(content == null ? (object)Unit.NULL : new SimpleStringish(content)));
        }
示例#15
0
        public Type ResolveUri(string uri, out LibraryFailure reason)
        {
            reason = LibraryFailure.Missing;
            if (!uri.StartsWith("lib:"))
            {
                return(null);
            }
            var type_name = "Flabbergast.Library." + uri.Substring(4).Replace('/', '.');
            var result    = Type.GetType(type_name, false);

            if (result == null)
            {
                return(null);
            }
            else
            {
                reason = LibraryFailure.None;
                return(result);
            }
        }
示例#16
0
        public override void ReportExternalError(string uri, LibraryFailure reason)
        {
            Dirty = true;
            switch (reason)
            {
            case LibraryFailure.BadName:
                Console.Error.WriteLine("The URI “{0}” is not a valid name.", uri);
                break;

            case LibraryFailure.Corrupt:
                Console.Error.WriteLine("The URI “{0}” could not be loaded due to corruption.", uri);
                break;

            case LibraryFailure.Missing:
                Console.Error.WriteLine("The URI “{0}” could not be found.", uri);
                break;

            default:
                Console.Error.WriteLine("The URI “{0}” could not be resolved.", uri);
                break;
            }
        }
示例#17
0
        public Computation ResolveUri(TaskMaster master, string uri, out LibraryFailure reason)
        {
            if (!uri.StartsWith("res:"))
            {
                reason = LibraryFailure.Missing;
                return(null);
            }
            var tail = HttpUtility.UrlDecode(uri.Substring(4)).Replace('/', Path.DirectorySeparatorChar);

            try {
                foreach (var filename in Finder.FindAll(tail, ""))
                {
                    reason = LibraryFailure.None;
                    return(new Precomputation(File.ReadAllBytes(filename)));
                }
                reason = LibraryFailure.Missing;
                return(null);
            } catch (Exception e) {
                reason = LibraryFailure.None;
                return(new FailureComputation(master, new NativeSourceReference(uri), e.Message));
            }
        }
示例#18
0
        public override void ReportExternalError(string uri, LibraryFailure reason)
        {
            MakeDirty();
            switch (reason)
            {
            case LibraryFailure.BadName:
                buffer.Write("<tr><td></td><td>The URI “{0}” is not a valid name.</td></tr>", uri);
                break;

            case LibraryFailure.Corrupt:
                buffer.Write("<tr><td></td><td>The URI “{0}” could not be loaded due to corruption.</td></tr>", uri);
                break;

            case LibraryFailure.Missing:
                buffer.Write("<tr><td></td><td>The URI “{0}” could not be found.</td></tr>", uri);
                break;

            default:
                buffer.Write("<tr><td></td><td>The URI “{0}” could not be resolved.</td></tr>", uri);
                break;
            }
        }
示例#19
0
        public override System.Type ResolveUri(string uri, out LibraryFailure reason)
        {
            if (cache.ContainsKey(uri))
            {
                reason = cache[uri] == null ? LibraryFailure.Missing : LibraryFailure.None;
                return(cache[uri]);
            }
            var base_name = uri.Substring(4);
            var type_name = "Flabbergast.Library." + base_name.Replace('/', '.');

            foreach (var src_file in Finder.FindAll(base_name, ".no_0", ".o_0"))
            {
                var parser = Parser.Open(src_file);
                var type   = parser.ParseFile(collector, unit, type_name);
                reason     = type == null ? LibraryFailure.Corrupt : LibraryFailure.None;
                cache[uri] = type;
                return(type);
            }
            cache[uri] = null;
            reason     = LibraryFailure.Missing;
            return(null);
        }
示例#20
0
 public abstract Type ResolveUri(string uri, out LibraryFailure reason);
示例#21
0
        public Computation ResolveUri(TaskMaster task_master, string uri, out LibraryFailure reason)
        {
            if (!uri.StartsWith("sql:")) {
                reason = LibraryFailure.Missing;
                return null;
            }
            reason = LibraryFailure.None;
            try {
                var param = new Dictionary<string, string>();

                int first_colon = 5;
                while (first_colon < uri.Length && uri[first_colon] != ':') first_colon++;
                if (first_colon >= uri.Length) {
                    return new FailureComputation(task_master, new ClrSourceReference(), "Bad provider in URI “" + uri + "”.");
                }
                var provider = uri.Substring(4, first_colon - 4);
                int question_mark = first_colon;
                while (question_mark < uri.Length && uri[question_mark] != '?') question_mark++;
                var uri_fragment = uri.Substring(first_colon + 1, question_mark - first_colon - 1);
                if (question_mark < uri.Length - 1) {
                    foreach (var param_str in uri.Substring(question_mark + 1).Split(new []{'&'})) {
                        if (param_str.Length == 0)
                            continue;
                        var parts = param_str.Split(new []{'='}, 2);
                        if (parts.Length != 2) {
                            return new FailureComputation(task_master, new ClrSourceReference(), "Bad parameter “" + param_str + "”.");
                        }
                        param[parts[0]] = parts[1];
                    }
                }

                string error;
                var connection = DbParser.Parse(provider, uri_fragment, param, out error);
                if (connection == null) {
                    return new FailureComputation(task_master, new ClrSourceReference(), error ?? "Bad URI.");
                }

                connection.Open();

                var connection_proxy = ReflectedFrame.Create(task_master, connection, connection_hooks);
                connection_proxy.Set("provider", new SimpleStringish(provider));
                return new Precomputation(connection_proxy);
            } catch (Exception e) {
                return new FailureComputation(task_master, new ClrSourceReference(e), e.Message);
            }
        }
示例#22
0
 public abstract void ReportExternalError(string uri, LibraryFailure reason);
示例#23
0
 public abstract Type ResolveUri(string uri, out LibraryFailure reason);
示例#24
0
 public override Type ResolveUri(string uri, out LibraryFailure reason)
 {
     var base_name = uri.Substring(4).Replace('/', '.');
     var type_name = "Flabbergast.Library." + base_name;
     var dll_name = base_name + ".dll";
     foreach (var path in paths) {
         var dll_file = Path.Combine(path, dll_name);
         if (!File.Exists(dll_file)) {
             continue;
         }
         var assembly = Assembly.LoadFrom(dll_file);
         if (assembly == null) {
             reason = LibraryFailure.Corrupt;
             return null;
         }
         var type = assembly.GetType(type_name, false);
         if (type == null) {
             reason = LibraryFailure.Corrupt;
             return null;
         }
         reason = LibraryFailure.None;
         return type;
     }
     reason = LibraryFailure.Missing;
     return null;
 }
示例#25
0
 public override void ReportExternalError(string uri, LibraryFailure reason)
 {
 }
示例#26
0
 public override void ReportExternalError(string uri, LibraryFailure reason)
 {
 }