private WSStatus WriteJProperty(object obj, WSParam xParam, JsonWriter writer, JsonSerializer serializer, WSSchema schema, WSSource xSource, WSParamList outFields, List <Type> printedTypes, WSRequest Request, MetaFunctions CFunc, WSDataContext DBContext) { WSStatus status = WSStatus.NONE_Copy(); try { if (Validate(obj, xParam, writer, serializer, schema, xSource, outFields, ref status, Request, CFunc)) { if (obj == null) { WritePropName(writer, ((schema != null && !string.IsNullOrEmpty(schema.Name)) ? schema.Name : xParam.NAME), true, PrintMode.ValueCell); serializer.Serialize(writer, obj); } else if (obj is WSStatus || obj is WSStatus_JSON) { #region PRINT WSStatus WSStatus_JSON json = obj is WSStatus_JSON ? (WSStatus_JSON)obj : ((WSStatus)obj).GetJson(); if (json != null) { WritePropName(writer, ((schema != null && !string.IsNullOrEmpty(schema.Name)) ? schema.Name : xParam.NAME), true, PrintMode.TableHeader); serializer.Serialize(writer, json); } #endregion } else if (obj.GetType().IsSimple()) { #region PRINT PRIMITIVE FIELD if (obj is DateTime) { obj = ((DateTime)obj).ToString(WSConstants.DATE_FORMAT); } else if (obj is TimeSpan) { obj = ((TimeSpan)obj).ToString(WSConstants.TIMESPAN_FORMAT_SIMPLE); } WritePropName(writer, (schema != null && !string.IsNullOrEmpty(schema.Name)) ? schema.Name : xParam.NAME); object _obj = null; serializer.Serialize(writer, xParam.TryReadPrimitiveWithDefault(obj, string.Empty, out _obj) ? _obj : string.Empty); #endregion } else if (obj.GetType().IsSimpleCollection()) { #region PRINT PRIMITIVE COLLECTION string key = (schema != null && !string.IsNullOrEmpty(schema.Name)) ? schema.Name : xParam.NAME; status.AddNote("ready to searialize primitive fields (" + key + ")"); WritePropName(writer, key); serializer.Serialize(writer, obj); #endregion } else if (obj is WSRecord) { #region PRINT WSRecord string pKey = (schema != null && !string.IsNullOrEmpty(schema.Name)) ? schema.Name : xParam.NAME; WritePropName(writer, pKey); ((WSRecord)obj).WriteJson(writer, serializer, printedTypes, Request, CFunc, DBContext); #endregion } else if (obj.IsCollectionOf <WSRecord>()) { #region PRINT WSRecord Collection string pKey = (schema != null && !string.IsNullOrEmpty(schema.Name)) ? schema.Name : xParam.NAME; WritePropName(writer, pKey); writer.WriteStartArray(); IList list = obj as IList; foreach (WSRecord record in list) { if (record != null) { record.WriteJson(writer, serializer, printedTypes, Request, CFunc, DBContext); } } writer.WriteEndArray(); #endregion } else { #region PRINT ENTITY bool printAllowed = (this is WSStaticEntity) || ( schema is WSEntityBaseSchema && validateType(writer, xParam, obj, printedTypes, true, Request, CFunc) ); if (printAllowed) { string pKey = (schema != null && !string.IsNullOrEmpty(schema.Name)) ? schema.Name : xParam.NAME; WritePropName(writer, pKey, false); #region PRINT WSEntity if (obj is WSEntity) { if (obj is WSDynamicEntity && !((WSDynamicEntity)obj).Match(Request, DBContext, CFunc, schema)) { serializer.Serialize(writer, "NULL"); } else { ((WSEntity)obj).WriteJson(writer, serializer, schema, outFields, printedTypes, Request, CFunc, DBContext); } } #endregion #region PRINT Collection else if (obj.IsCollectionOf <WSEntity>()) { IList list = obj as IList; Type eType = list.GetEntityType(); writer.WriteStartArray(); foreach (WSEntity entity in list) { if (entity != null) { if (entity is WSDynamicEntity) { WSDynamicEntity dEntity = (WSDynamicEntity)entity; if (dEntity.Match(Request, DBContext, CFunc, schema)) { entity.WriteJson(writer, serializer, schema, outFields, printedTypes, Request, CFunc, DBContext); } } else { entity.WriteJson(writer, serializer, schema, outFields, printedTypes, Request, CFunc, DBContext); } } } writer.WriteEndArray(); } #endregion } #endregion } status.AddNote("done", WSConstants.ACCESS_LEVEL.READ); } } catch (Exception e) { status.CODE = WSStatus.ERROR.CODE; status.AddNote("Error(line" + e.LineNumber() + "- " + e.Message + ")"); CFunc.RegError(GetType(), e, ref status); } return(status); }
private WSStatus WriteCollapsedValues(JsonWriter writer, JsonSerializer serializer, WSEntity entity, WSSource xSource, WSJson collapseOption, WSRequest Request, MetaFunctions CFunc) { WSStatus status = WSStatus.NONE_Copy(); try { /******************************************************************************* * * // TODO @ANDVO : 2016-02-15 : IMPORTANT!!! => Implement security check like this : * * WSStatus status = Validate(obj, xParam, writer, serializer, security, schema); * if (status.CODE == WSStatus.SUCCESS.CODE) * { */ if (entity != null && collapseOption != null && collapseOption.IsValid) { WSTableSource childSource = (WSTableSource)CFunc.GetSourceByType(entity.GetType()); object fieldValue = null; WSParam field = null; if (collapseOption is WSJValue) { string fieldName = ((WSJValue)collapseOption).Value; field = entity.GetParam(xSource, fieldName); fieldValue = getMemberValue(entity, field, CFunc); WSPrimitiveFieldSchema fieldSchema = new WSPrimitiveFieldSchema(CFunc, (WSTableParam)field, new WSJProperty(fieldName, new WSJArray()), /*((WSTableSource)entity.getSource())*/ childSource.BaseSchema); if (Validate(fieldValue, field, writer, serializer, childSource.BaseSchema, childSource, null, ref status, Request, CFunc)) { object _obj = null; serializer.Serialize(writer, field.TryReadPrimitiveWithDefault(fieldValue, string.Empty, out _obj) ? _obj : string.Empty); writer.Flush(); status = WSStatus.SUCCESS_Copy(); } } else if (collapseOption is WSJObject) { WSJProperty collapseSrc = ((WSJObject)collapseOption).Value.FirstOrDefault(); field = entity.GetParam(childSource, collapseSrc.Key); fieldValue = getMemberValue(entity, field, CFunc); if (Validate(fieldValue, field, writer, serializer, childSource.BaseSchema, childSource, null, ref status, Request, CFunc)) { if (fieldValue == null) { serializer.Serialize(writer, "NULL"); writer.Flush(); } else if (fieldValue is WSEntity) { WSTableSource fieldSource = (WSTableSource)CFunc.GetSourceByType(fieldValue.GetType()); status = WriteCollapsedValues(writer, serializer, (WSEntity)fieldValue, fieldSource, collapseSrc.Value, Request, CFunc); } else if (fieldValue.IsCollectionOf <WSEntity>()) { WSTableSource fieldSource = (WSTableSource)CFunc.GetSourceByType(fieldValue.GetType().GetEntityType()); if (!((IEnumerable <WSEntity>)fieldValue).Any()) { serializer.Serialize(writer, "NULL"); writer.Flush(); } else { foreach (WSEntity eItem in (IEnumerable <WSEntity>)fieldValue) { status.childs.Add(WriteCollapsedValues(writer, serializer, eItem, fieldSource, collapseSrc.Value, Request, CFunc)); } status = status.IsPositive ? WSStatus.SUCCESS_Copy() : WSStatus.ERROR_Copy(); } } } } } /*} * *******************************************************************************/ } catch (Exception e) { CFunc.RegError(GetType(), e, ref status); } return(status); }
private void WriteXmlValue(object obj, WSParam outputParam, Type type, XmlWriter writer) { WSStatus status = WSStatus.NONE.clone(); try { object _temp = null; if (obj == null) { writer.WriteValue(string.Empty); } else if (obj.GetType().IsPrimitive || obj.GetType().Equals(typeof(string))) { writer.WriteValue(outputParam.TryReadPrimitiveWithDefault(obj, string.Empty, out _temp) ? _temp : string.Empty); } else if (type.IsCollection()) { if (obj is IEnumerable) { IEnumerable enu = obj as IEnumerable; if (enu == null || !enu.GetEnumerator().MoveNext()) { writer.WriteValue(string.Empty); } else { if (obj is IList) { IList list = obj as IList; Type lt = list[0].GetType(); if (lt.IsPrimitive) { writer.WriteValue(outputParam.TryReadPrimitiveWithDefault(obj, string.Empty, out _temp) ? _temp : string.Empty); } else { foreach (object item in list) { if (item is WSRecord) { ((WSRecord)item).WriteXml(writer); } else { object _item = null; writer.WriteValue(outputParam.TryReadPrimitiveWithDefault(item, string.Empty, out _item)? _item : string.Empty); } } } } else if (obj is IDictionary) { IDictionary list = obj as IDictionary; foreach (object item in list) { DictionaryEntry entry = (DictionaryEntry)item; writer.WriteStartElement(entry.Key != null ? entry.Key.ToString() : "undefined"); if (entry.Value is WSRecord) { ((WSRecord)entry.Value).WriteXml(writer); } else { object _item = null; writer.WriteValue(outputParam.TryReadPrimitiveWithDefault(entry.Value, string.Empty, out _item)? _item : string.Empty); } writer.WriteEndElement(); } } } } } else if (obj is WSRecord) { ((WSRecord)obj).WriteXml(writer); } else { try { new XmlSerializer(obj.GetType()).Serialize(writer, obj); } catch (Exception e) { CFunc.RegError(GetType(), e, ref status); writer.WriteValue(string.Empty); } } } catch (Exception e) { CFunc.RegError(GetType(), e, ref status); } }