protected override JSBSchema BuildJsonSchema() { List <IJSBPart> nProps = new List <IJSBPart>(); nProps.Add(new JSBString("NodeKey", "NodeKey of the node", maxLength: 100)); nProps.Add(new JSBString("Description", "Description of the node to make it more readable and understandable")); nProps.Add(new JSBString("BehaviorKey", "Key of the behavior to use for lookup", maxLength: 100)); nProps.Add(new JSBString("BehaviorVersion", "Version of the behavior")); nProps.Add(new JSBString("BehaviorConfiguration", "Configuration of the instance of behavior")); nProps.Add(new JSBString("DataJsonSchemaModuleKey", "ModuleKey for looking up jsonschema for data", maxLength: 100)); nProps.Add(new JSBString("DataJsonSchemaKey", "Key for looking up jsonschema for data", maxLength: 100)); List <IJSBPart> eProps = new List <IJSBPart>(); eProps.Add(new JSBString("Description", "Description of the edge")); eProps.Add(new JSBString("FromNodeKey", "The nodekey of the node that the edge comes from", maxLength: 100, isRequired: true)); eProps.Add(new JSBString("ToNodeKey", "The nodekey of the node that the edge goes to", maxLength: 100, isRequired: true)); List <IJSBPart> wfProps = new List <IJSBPart>(); wfProps.Add(new JSBString("Name", "The version number of the workflow", maxLength: 100, isRequired: true)); wfProps.Add(new JSBString("Version", "The version number of the workflow", isRequired: true)); wfProps.Add(new JSBArray("Nodes", "Nodes of the workflow", items: new List <IJSBPart>() { new JSBObject("Node", "Definition of an node", nProps) }, isRequired: true)); wfProps.Add(new JSBArray("Edges", "Edges of the workflow", items: new List <IJSBPart>() { new JSBObject("Edge", "Definition of an edge", eProps) }, isRequired: true)); JSBObject objectPart = new JSBObject("WorkflowDefinition", "The easy definition of the schema of a workflow", props: wfProps); return(new JSBSchema("WorkflowDefinition", Description, topPart: objectPart)); }
/// <summary> /// Generate code from JsonSchemaBuilderSchema /// </summary> /// <param name="schema"></param> /// <returns></returns> private string GenerateCode(JSBSchema schema) { CodeBuilder codeBuilder = new CodeBuilder(); _rootSchema = schema; GenerateStartOfSchema(codeBuilder, schema); if (schema.TopPart != null) { if (schema.TopPart.PartType == JSBPartType.Object) { GenerateCodeForBuilderPart(codeBuilder, schema.TopPart.Name, schema.TopPart, schema.Definitions); } else { List <IJSBPart> properties = new List <IJSBPart>(); properties.Add(schema.TopPart); JSBObject encasingObject = new JSBObject(schema.Name, schema.Description, props: properties); GenerateCodeForBuilderPart(codeBuilder, schema.Name, encasingObject, schema.Definitions); } } else { List <IJSBPart> properties = new List <IJSBPart>(); JSBObject encasingObject = new JSBObject(schema.Name, schema.Description, props: properties); GenerateCodeForBuilderPart(codeBuilder, schema.Name, encasingObject, schema.Definitions); } GenerateEndOfSchema(codeBuilder, schema); return(codeBuilder.Build()); }
protected override JSBSchema BuildJsonSchema() { List <IJSBPart> tProps = new List <IJSBPart>(); tProps.Add(new JSBString("Key", "Lookup key for language", isRequired: true)); tProps.Add(new JSBString("Language", "Returns the language")); JSBObject objectPart = new JSBObject("LanguageDefinition", Description, props: tProps); return(new JSBSchema("LanguageDefinition", Description, topPart: objectPart)); }
public void BuildObject() { List <IJSBPart> properties = new List <IJSBPart>(); string objectName = "ObjectName"; string description = "ObjectDescription"; bool isRequired = false; bool isExpandable = false; var varObject = new JSBObject(objectName, description, properties, isRequired: isRequired, isExpandable: isExpandable); JsonSchema varSchema = varObject.AsJsonSchema(); }
protected override JSBSchema BuildJsonSchema() { List <IJSBPart> wfProps = new List <IJSBPart>(); wfProps.Add(new JSBString("Name", "Returns the Module unique name", maxLength: 100, isRequired: true)); wfProps.Add(new JSBString("Version", "Returns the version of the Module", isRequired: true)); wfProps.Add(new JSBArray("WorkflowDefinitions", "Returns the embedded workflow definitions", items: new List <IJSBPart>() { new JSBRef("WorkflowDefinition", "Definition of an workflow", iriReference: new Uri("./WorkflowDefinition.schema.json", UriKind.Relative)) }, isRequired: true)); JSBObject objectPart = new JSBObject("ModuleDefinition", "The easy definition of the schema of a module", props: wfProps); return(new JSBSchema("ModuleDefinition", Description, topPart: objectPart)); }
protected override JSBSchema BuildJsonSchema() { JSBBoolean booleanPart = new JSBBoolean("BooleanPart", "BooleanPart for testing", isRequired: true); JSBInteger integerPart = new JSBInteger("IntegerPart", "IntegerPart for testing"); List <IJSBPart> properties = new List <IJSBPart>(); properties.Add(booleanPart); properties.Add(integerPart); JSBObject objectPart = new JSBObject("MyTopPartObject", "TopPart", props: properties); return(new JSBSchema("ObjectAsATopPart", Description, topPart: objectPart)); }
protected override JSBSchema BuildJsonSchema() { JSBBoolean booleanPart = new JSBBoolean("BooleanPart", "BooleanPart for testing", isRequired: true); JSBInteger integerPart = new JSBInteger("IntegerPart", "IntegerPart for testing"); List <IJSBPart> properties = new List <IJSBPart>(); properties.Add(booleanPart); properties.Add(integerPart); JSBObject objectPart = new JSBObject("ObjectInAnArray", "ObjectInAnArray is fun", props: properties); List <IJSBPart> items = new List <IJSBPart>(); items.Add(objectPart); JSBArray arrayPart = new JSBArray("MyTopPartArray", "TopPart", items); return(new JSBSchema("ArrayOfObjectsAsATopPart", Description, topPart: arrayPart)); }
protected override JSBSchema BuildJsonSchema() { List <IJSBPart> definitions = new List <IJSBPart>(); definitions.Add(new JSBString("FtpType", "Type of FTP", enums: new List <string>() { "Auto", "FTP", "FTPS" })); List <IJSBPart> properties = new List <IJSBPart>(); properties.Add(new JSBString("SourceFileName", "File to move or copy", isRequired: true)); properties.Add(new JSBString("SourceDirectory", "Location of the file to move or copy", isRequired: true)); properties.Add(new JSBString("DestinationFileName", "File after move or copy. If filled out a rename will be done under the move or copy operation")); properties.Add(new JSBString("DestinationDirectory", "Location of the file should end after move or copy", isRequired: true)); properties.Add(new JSBString("FtpUser", "User registered on the server", isRequired: true)); properties.Add(new JSBString("FtpPassword", "Password for the user registered on the server", isRequired: true)); properties.Add(new JSBString("FtpServer", "Ftp host server", isRequired: true)); properties.Add(new JSBString("FtpFolderOnServer", "Ftp folder on server if needed")); properties.Add(new JSBRef("FtpType", "Type of FTP", iriReference: new Uri("#/definitions/ftpType", UriKind.Relative), isRequired: true)); JSBObject jsonObject = new JSBObject("FtpInformation", "Data For Copy and Move file operations on FTP", props: properties); return(new JSBSchema("FtpInformation", Description, topPart: jsonObject, defs: definitions)); }
private void DoReferenceResolution(IJSBPart jsonSchemaBuilderPart, NamespaceString module) { switch (jsonSchemaBuilderPart.PartType) { case JSBPartType.IriReference: JSBRef jsonSchemaBuilderIriReference = jsonSchemaBuilderPart as JSBRef; if (!jsonSchemaBuilderIriReference.IsFragmentOnly) { string relativeLocalFileWithExpandedDot = jsonSchemaBuilderIriReference.RelativeLocalFile; if (relativeLocalFileWithExpandedDot.StartsWith("./") || relativeLocalFileWithExpandedDot.StartsWith(".\\")) { relativeLocalFileWithExpandedDot = Path.Combine(module.ToFilePath, relativeLocalFileWithExpandedDot.Remove(0, 2)); } string localFile = Path.Combine(JsonSchemaApplicationRoot, TransformToCamelCase(relativeLocalFileWithExpandedDot)); string uriWithoutFragmentString = jsonSchemaBuilderIriReference.IriReference.OriginalString; if (!string.IsNullOrWhiteSpace(jsonSchemaBuilderIriReference.Fragment)) { uriWithoutFragmentString = uriWithoutFragmentString.Replace("#" + jsonSchemaBuilderIriReference.Fragment, ""); } if (Uri.TryCreate(uriWithoutFragmentString, UriKind.RelativeOrAbsolute, out Uri uriWithoutFragment)) { if (!File.Exists(localFile)) { if (jsonSchemaBuilderIriReference.IriReference.IsAbsoluteUri && !jsonSchemaBuilderIriReference.IriReference.IsLoopback) { try { FileInfo fileInfo = new FileInfo(localFile); string directory = fileInfo.Directory.FullName; if (!Directory.Exists(directory)) { Directory.CreateDirectory(directory); } using (WebClient myWebClient = new WebClient()) { // Download the Web resource and save it into the current filesystem folder. myWebClient.DownloadFile(uriWithoutFragment, localFile); //TODO generate builderparts from schema and register in _registeredJsonSchemas } } catch (Exception ex) { throw new CodeGenerationException($"Resource at {uriWithoutFragment} could not be downloaded", ex); } } else { throw new CodeGenerationException($"Iri reference {uriWithoutFragment} was not found locally at {localFile}"); } } } } break; case JSBPartType.Schema: JSBSchema jsonSchemaBuilderSchema = jsonSchemaBuilderPart as JSBSchema; foreach (IJSBPart definition in jsonSchemaBuilderSchema.Definitions.Values) { DoReferenceResolution(definition, module); } if (jsonSchemaBuilderSchema.TopPart != null) { DoReferenceResolution(jsonSchemaBuilderSchema.TopPart, module); } break; case JSBPartType.Array: JSBArray jsonSchemaBuilderArray = jsonSchemaBuilderPart as JSBArray; foreach (IJSBPart part in jsonSchemaBuilderArray.Items) { DoReferenceResolution(part, module); } break; case JSBPartType.Object: JSBObject jsonSchemaBuilderObject = jsonSchemaBuilderPart as JSBObject; foreach (IJSBPart property in jsonSchemaBuilderObject.Properties.Values) { DoReferenceResolution(property, module); } break; default: break; } }
private void GenerateOrdinaryObject(CodeBuilder codeBuilder, IdentifierString key, JSBObject jsonSchemaBuilderObject, Dictionary <string, IJSBPart> definitions, bool parentIsArray, bool isDefinition = false) { GenerateComments(codeBuilder, key, jsonSchemaBuilderObject); codeBuilder .L($"public partial class {TransformToTitleCase(key)}") .L("{") .IndentIncrease(); //Add definitions if (definitions != null) { foreach (KeyValuePair <string, IJSBPart> pair in definitions) { GenerateCodeForBuilderPart(codeBuilder, pair.Key, pair.Value, isDefinition: true); codeBuilder.EmptyLine(); } } //TODO Add own code //Add children foreach (KeyValuePair <IdentifierString, IJSBPart> pair in jsonSchemaBuilderObject.Properties) { GenerateCodeForBuilderPart(codeBuilder, pair.Key, pair.Value); codeBuilder.EmptyLine(); } codeBuilder .IndentDecrease() .L("}"); if (definitions == null && !parentIsArray)// Assume not top part { codeBuilder .L($"[JsonProperty(\"{TransformToCamelCase(key)}\")]") .L($"public {TransformToTitleCase(key)} {TransformToTitleCase(key)}Prop {{ get; set; }} ") .EmptyLine(); } }
private void GenerateEnumObject(CodeBuilder codeBuilder, IdentifierString key, JSBObject jsonSchemaBuilderObject, Dictionary <string, IJSBPart> definitions) { throw new NotImplementedException("Enum on objects has not been implemented"); }
private void GenerateCodeForBuilderPart(CodeBuilder codeBuilder, IdentifierString key, IJSBPart value, Dictionary <string, IJSBPart> definitions = null, bool parentIsArray = false, bool isDefinition = false) { switch (value.PartType) { case JSBPartType.Array: JSBArray jsonSchemaBuilderArray = value as JSBArray; if (jsonSchemaBuilderArray.Enums != null && jsonSchemaBuilderArray.Enums.Count > 0) { GenerateEnumArray(codeBuilder, key, jsonSchemaBuilderArray); } else { GenerateOrdinaryArray(codeBuilder, key, jsonSchemaBuilderArray); } break; case JSBPartType.Boolean: JSBBoolean jsonSchemaBuilderBoolean = value as JSBBoolean; if (jsonSchemaBuilderBoolean.Enums != null && jsonSchemaBuilderBoolean.Enums.Count > 0) { GenerateEnumBoolean(codeBuilder, key, jsonSchemaBuilderBoolean); } else { if (!parentIsArray) { GenerateOrdinaryBoolaen(codeBuilder, key, jsonSchemaBuilderBoolean); } } break; case JSBPartType.Date: JSBDate jsonSchemaBuilderDate = value as JSBDate; if (jsonSchemaBuilderDate.Enums != null && jsonSchemaBuilderDate.Enums.Count > 0) { GenerateEnumDate(codeBuilder, key, jsonSchemaBuilderDate); } else { if (!parentIsArray) { GenerateOrdinaryDate(codeBuilder, key, jsonSchemaBuilderDate); } } break; case JSBPartType.DateTime: JSBDateTime jsonSchemaBuilderDateTime = value as JSBDateTime; if (jsonSchemaBuilderDateTime.Enums != null && jsonSchemaBuilderDateTime.Enums.Count > 0) { GenerateEnumDateTime(codeBuilder, key, jsonSchemaBuilderDateTime); } else { if (!parentIsArray) { GenerateOrdinaryDateTime(codeBuilder, key, jsonSchemaBuilderDateTime); } } break; case JSBPartType.Email: JSBEmail jsonSchemaBuilderEmail = value as JSBEmail; if (jsonSchemaBuilderEmail.Enums != null && jsonSchemaBuilderEmail.Enums.Count > 0) { GenerateEnumEmail(codeBuilder, key, jsonSchemaBuilderEmail); } else { GenerateOrdinaryEmail(codeBuilder, key, jsonSchemaBuilderEmail); } break; case JSBPartType.Integer: JSBInteger jsonSchemaBuilderInteger = value as JSBInteger; if (jsonSchemaBuilderInteger.Enums != null && jsonSchemaBuilderInteger.Enums.Count > 0) { GenerateEnumInteger(codeBuilder, key, jsonSchemaBuilderInteger); } else { if (!parentIsArray) { GenerateOrdinaryInteger(codeBuilder, key, jsonSchemaBuilderInteger); } } break; case JSBPartType.Number: JSBNumber jsonSchemaBuilderNumber = value as JSBNumber; if (jsonSchemaBuilderNumber.Enums != null && jsonSchemaBuilderNumber.Enums.Count > 0) { GenerateEnumNumber(codeBuilder, key, jsonSchemaBuilderNumber); } else { if (!parentIsArray) { GenerateOrdinaryNumber(codeBuilder, key, jsonSchemaBuilderNumber); } } break; case JSBPartType.Object: JSBObject jsonSchemaBuilderObject = value as JSBObject; if (jsonSchemaBuilderObject.Enums != null && jsonSchemaBuilderObject.Enums.Count > 0) { GenerateEnumObject(codeBuilder, key, jsonSchemaBuilderObject, definitions); } else { GenerateOrdinaryObject(codeBuilder, key, jsonSchemaBuilderObject, definitions, parentIsArray); } break; case JSBPartType.String: JSBString jsonSchemaBuilderString = value as JSBString; if (jsonSchemaBuilderString.Enums != null && jsonSchemaBuilderString.Enums.Count > 0) { GenerateEnumString(codeBuilder, key, jsonSchemaBuilderString, isDefinition); } else { GenerateOrdinaryString(codeBuilder, key, jsonSchemaBuilderString); } break; case JSBPartType.Time: JSBTime jsonSchemaBuilderTime = value as JSBTime; if (jsonSchemaBuilderTime.Enums != null && jsonSchemaBuilderTime.Enums.Count > 0) { GenerateEnumTime(codeBuilder, key, jsonSchemaBuilderTime); } else { GenerateOrdinaryTime(codeBuilder, key, jsonSchemaBuilderTime); } break; case JSBPartType.IriReference: //Reference cannot be an enum if (!parentIsArray) { JSBRef jsonSchemaBuilderUriReference = value as JSBRef; GenerateOrdinaryUriReference(codeBuilder, key, jsonSchemaBuilderUriReference); } break; default: codeBuilder.L($"throw new NotImplementedException(\"PartType {value.PartType} is not implemented\");"); break; } }
public string Sync() { bool isUpdate = false; if (Request.Parameters.ContainsKey("update")) { bool.TryParse(Request.Parameters["update"], out isUpdate); } if ((Authenticated && !GeneratedSyncAuthorized.ContainsKey(AuthenticationLevel)) || (!Authenticated && string.IsNullOrEmpty(GeneratedSync))) { JSBObject jsControllers = new JSBObject(); foreach (ControllerRoute tkv in GetControllers()) { string controllerPath = tkv.Path; //System.Console.WriteLine(controllerPath); ControllerDescriptor template = tkv.Controller; JSBObject jsController = new JSBObject(); foreach (KeyValuePair <string, CallDescriptor> mkv in template.Calls.Where(x => !IgnoreSyncAttribute.HasAttribute(x.Value.Info))) { MethodInfo method = mkv.Value.Info; RequiresTokenAttribute requiresVerify = RequiresTokenAttribute.GetAttribute(method); if (requiresVerify == null || (requiresVerify != null && Authenticated && requiresVerify.LevelRequired <= AuthenticationLevel)) { string typeName = template.ControllerType.Name; string controllerName = typeName.Replace("Controller", "").Replace("`1", ""); JSBFunction func = CreateLinkFunction(APIBaseUrl, controllerPath, method, false); if (!jsController.Properties.ContainsKey(method.Name)) { jsController.AddFunction(method.Name, func); } } } if (jsController.Properties.Any()) { jsControllers.AddObject(template.ControllerType.Name.Replace("Controller", "").Replace("`1", ""), jsController); } } JSBuilder js = new JSBuilder().AssignVariable("Sync", jsControllers); if (!isUpdate) { js.DefineFunction("SyncGetJson", @" var ajax = new XMLHttpRequest(); ajax.onreadystatechange = function () { if (ajax.readyState == 4 && ajax.status == 200) /*callback(JSON.parse(ajax.responseText))*/ callback(ResolveReferences(ajax.responseText)) }; ajax.open('GET', url, true); ajax.setRequestHeader('Accept', 'application/json'); ajax.send(); ", "url", "callback") .DefineFunction("SyncPostJson", @" var ajax = new XMLHttpRequest(); ajax.onreadystatechange = function () { if (ajax.readyState == 4 && ajax.status == 200) { /*callback(JSON.parse(ajax.responseText))*/ callback(ResolveReferences(ajax.responseText)) } }; ajax.open('POST', url, true); ajax.send(data); ", "url", "data", "callback") .DefineFunction("SyncGetRaw", @" var ajax = new XMLHttpRequest(); ajax.onreadystatechange = function () { if (ajax.readyState == 4 && ajax.status == 200) /*callback(JSON.parse(ajax.responseText))*/ callback(ajax.responseText) }; ajax.open('GET', url, true); ajax.setRequestHeader('Accept', 'application/json'); ajax.send(); ", "url", "callback") .DefineFunction("SyncPostJsonRaw", @" var ajax = new XMLHttpRequest(); ajax.onreadystatechange = function () { if (ajax.readyState == 4 && ajax.status == 200) { callback(ajax.responseText) } }; ajax.open('POST', url, true); ajax.send(data); ", "url", "data", "callback") .DefineFunction("SyncPostRawRaw", @" var ajax = new XMLHttpRequest(); ajax.onreadystatechange = function () { if (ajax.readyState == 4 && ajax.status == 200) { callback(ajax.responseText) } }; ajax.open('POST', url, true); ajax.send(data); ", "url", "data", "callback") .DefineFunction("SyncPostRawJson", @" var ajax = new XMLHttpRequest(); ajax.onreadystatechange = function () { if (ajax.readyState == 4 && ajax.status == 200) { callback(ResolveReferences(ajax.responseText)) } }; ajax.open('POST', url, true); ajax.send(data); ", "url", "data", "callback") .DefineFunction("ResolveReferences", @" if (typeof json === 'string') json = JSON.parse(json); var byid = {}; var refs = []; json = (function recurse(obj, prop, parent) { if (typeof obj !== 'object' || !obj) return obj; if (Object.prototype.toString.call(obj) === '[object Array]') { for (var i = 0; i < obj.length; i++) if (typeof obj[i] !== 'object' || !obj[i]) continue; else if (""$ref "" in obj[i]) obj[i] = recurse(obj[i], i, obj); else obj[i] = recurse(obj[i], prop, obj); return obj; } if (""$ref"" in obj) { var ref = obj.$ref; if (ref in byid) return byid[ref]; refs.push([parent, prop, ref]); return; } else if (""$id"" in obj) { var id = obj.$id; delete obj.$id; if (""$values"" in obj) obj = obj.$values.map(recurse); else for (var prop in obj) obj[prop] = recurse(obj[prop], prop, obj); byid[id] = obj; } return obj; })(json); for (var i = 0; i<refs.length; i++) { var ref = refs[i]; ref[0][ref[1]] = byid[ref[2]]; } return json;", "json"); } if (Authenticated) { GeneratedSyncAuthorized.Add(AuthenticationLevel, js.BuildCode()); } else { GeneratedSync = js.BuildCode(); } } Request.Response.ContentType = "application/javascript"; string addition = ""; if (Authenticated) { addition += $"Sync.Token = '{Token.UrlEncode()}';"; } if (isUpdate) { return(((Authenticated) ? GeneratedSyncAuthorized[AuthenticationLevel] : GeneratedSync) + "\n" + addition); } else { return(((Authenticated) ? "var " + GeneratedSyncAuthorized[AuthenticationLevel] : "var " + GeneratedSync) + "\n" + addition); } }