Exemplo n.º 1
0
/*====================================================*/
//Peter Larsen 11/12/2003
        private void AddDataObjects(DataTable aDT)
        {
            cDataObject aDataObject;
            XmlNode     aClassNode;

            aClassNode = ObjDefNode.SelectSingleNode("Class");
            foreach (DataRow aDR in aDT.Rows)
            {
                aDataObject = DataObjectFactory.CreateDataObject(aDR, this, aClassNode);
                Add(aDataObject);
            }
        }
Exemplo n.º 2
0
/*====================================================*/

        public cDataObject AddNewDataObject()
        {
            DataRow     aDataRow;
            cDataObject aDataObject;

            aDataRow = this.ObjDataSet.Tables[this.DefinitionKey].NewRow();
            this.ObjDataSet.Tables[this.DefinitionKey].Rows.Add(aDataRow);

            //aDataObject = new cDataObject(aDataRow, this, true);
            aDataObject = DataObjectFactory.CreateDataObject(aDataRow, this, ObjDefNode.SelectSingleNode("Class"));
            aDataObject.IsNewDataObject = true;

            this.Add(aDataObject);
            return(aDataObject);
        }
        private void ProcessGetById(ApiRequest request)
        {
            // Notify extensions
            Extensions.OnRequestAction(new ApiExtensionResponseData {
                action = "BYID", context = "BEFORE_BYID", data = null
            });

            var pks        = request.QueryParts.Skip(2).Select(pk => HttpUtilities.UrlDecode(pk));
            var dataObject = DataObjectFactory.CreateDataObject(pks);
            var result     = DataProvider.Get(dataObject, null, request.IncludeList);

            if (result == null)
            {
                techLogger.Error("Can't get Entity by Id. DataObject:{0} pk:{1}: url:{2}", DataObjectFactory.GetType().Name, pks.SingleOrDefault(), request.HttpContext.Request.Url);
                throw new ResourceNotFoundException();
            }

            if (result.ObjectsDataSet == null)
            {
                result.ObjectsDataSet = ApplicationSettings.Resolve <IObjectsDataSet>();
                result.ObjectsDataSet.AddObject(result);
            }

            result.ObjectsDataSet.SerializeTechnicalProperties = false;

            if (!request.IsDatasetApi)
            {
                result.ObjectsDataSet.InitializeRelationsToInclude(typeof(TENTITY), request.Includes);
            }

            object dataToSerialize = request.IsDatasetApi ? DataObjectFactory.CreateDataSetContainer(result) : result;

            var json = JsonConvert.SerializeObject(dataToSerialize, GetJsonSerializerSettings(request));

            // Notify extensions
            Extensions.OnRequestAction(new ApiExtensionResponseData {
                action = "BYID", context = "JSON", data = json
            });

            WriteResponse(request.HttpContext, json);
        }
        private void ProcessDelete(ApiRequest request)
        {
            // Notify extensions
            Extensions.OnRequestAction(new ApiExtensionResponseData {
                action = "DELETE", context = "BEFORE_DATA_DELETE", data = null
            });

            HttpContext context = request.HttpContext;

            TENTITY objectToDelete = null;

            // Does the request contain the entity PK(s)?
            if (request.QueryParts != null && request.QueryParts.Length > 1)
            {
                var pks = request.QueryParts.Skip(1).Select(pk => HttpUtilities.UrlDecode(pk));
                if (pks != null && pks.Any())
                {
                    objectToDelete = DataObjectFactory.CreateDataObject(pks);
                }
            }

            // Does the request contain json encoded body? (e.g. when called via SDK)
            if (objectToDelete == null)
            {
                JsonSerializerSettings settings = GetJsonSerializerSettings(request);
                string jsonIncomingEntity       = request.JsonEntityData;

                if (jsonIncomingEntity == null)
                {
                    throw new GOServerException("objectToDeleteNotFound");
                }

                if (request.IsDatasetApi)
                {
                    objectToDelete = DataObjectFactory.DeserializeFromContainer(jsonIncomingEntity, settings);
                }
                else
                {
                    objectToDelete = JsonConvert.DeserializeObject <TENTITY>(jsonIncomingEntity, settings);

                    if (objectToDelete != null)
                    {
                        var dataset = ApplicationSettings.Container.Resolve <IObjectsDataSet>();
                        dataset.AddObject(objectToDelete);
                    }
                }

                if (objectToDelete != null)
                {
                    objectToDelete.ObjectsDataSet.EnsureInitialized();
                    objectToDelete.ObjectsDataSet.ReconstructIndexes();
                }
            }

            context.Response.StatusCode = (int)HttpStatusCode.NoContent;

            if (objectToDelete != null)
            {
                // We fetch the instance from storage and then fetch the corresponding entity data provider for the type
                // This is so that for entity hierarchies we call Delete on the actual instance type
                var     instance = DataProvider.Get(objectToDelete, skipSecurity: true);
                dynamic provider = ApplicationSettings.Container.Resolve <IEntityDataProvider>().GetDataProviderForEntity(instance);

                // If this is a 'dry' delete request (means we process the delete logic without actually deleting anything), then the response is the delete stack info
                if (DoDryDelete(request, instance, provider))
                {
                    context.Response.StatusCode = (int)HttpStatusCode.OK;
                }
                else
                {
                    provider.Delete(instance);
                }
            }
        }
        private void ProcessGetFile(ApiRequest request)
        {
            // Notify extensions
            Extensions.OnRequestAction(new ApiExtensionResponseData {
                action = "GETFILE", context = "BEFORE_GETFILE", data = null
            });

            //Get the file owning entity, pk starts at position 2, ends one before end (next item being the document field name
            var result = DataProvider.Get(
                DataObjectFactory.CreateDataObject(
                    request.QueryParts.Skip(2)
                    .Take(request.QueryParts.Length - 3)
                    .Select(pk => HttpUtilities.UrlDecode(pk))
                    ),
                parameters: new Parameters {
                { "GetFileContext", true }
            }
                );

            if (result == null)
            {
                throw new ResourceNotFoundException();
            }

            //Get document internal and client name
            var documentInternalNameField    = request.QueryParts.Last() + "InternalName";
            var documentClientNameField      = request.QueryParts.Last();
            var documentInternalNameProperty = result.GetType().GetProperty(documentInternalNameField);

            if (documentInternalNameProperty == null)
            {
                throw new GOServerException("Unknown property " + documentInternalNameField);
            }

            var documentInternalNameAsObject = documentInternalNameProperty.GetValue(result, null);

            if (!(documentInternalNameAsObject is String))
            {
                throw new GOServerException(String.Format("Unproper datatype for property {0}", documentInternalNameField));
            }

            var documentClientNameFieldProperty = result.GetType().GetProperty(documentClientNameField);

            if (documentClientNameFieldProperty == null)
            {
                throw new GOServerException("Unknown property " + documentClientNameField);
            }

            var documentClientNameAsObject = documentClientNameFieldProperty.GetValue(result, null);

            if (!(documentClientNameAsObject is String))
            {
                throw new GOServerException(String.Format("Unproper datatype for property {0}", documentClientNameField));
            }

            string documentInternalName = (string)documentInternalNameAsObject;
            string documentClientName   = (string)documentClientNameAsObject;

            string storageContainer = String.IsNullOrEmpty(ConfigurationManager.AppSettings["StorageContainer"]) ? "files" : ConfigurationManager.AppSettings["StorageContainer"];
            string fileUrl          = request.HttpContext.Request.Url.Scheme + "://" + request.HttpContext.Request.Url.Authority.TrimEnd('/') + request.HttpContext.Request.ApplicationPath + "/" + storageContainer + "/" + documentInternalName;

            // read the file and stream it to caller
            using (var fileStream = ApplicationSettings.Container.Resolve <IStorageProvider>().GetFileStream(fileUrl, System.IO.FileMode.Open))
            {
                request.HttpContext.Response.ContentType = System.Web.MimeMapping.GetMimeMapping(documentInternalName);
                request.HttpContext.Response.AddHeader("Content-Disposition", $"inline; filename=\"{documentClientName}\"");
                fileStream.CopyTo(request.HttpContext.Response.OutputStream);
            }
        }