/// <summary>
        /// Get the specified request.
        /// </summary>
        /// <param name="request">Request.</param>
        public object Get(DataPackageDescriptionRequest request)
        {
            var context = TepWebContext.GetWebContext(PagePrivileges.EverybodyView);

            try {
                context.Open();
                context.LogInfo(this, string.Format("/data/package/{{DataPackageId}}/description GET DataPackageId='{0}'", request.DataPackageId));

                Terradue.Tep.DataPackage datapackage;
                if (request.Key != null)
                {
                    context.AccessLevel = EntityAccessLevel.Administrator;
                    datapackage         = DataPackage.FromIdentifier(context, request.DataPackageId);
                    if (request.Key != null && !request.Key.Equals(datapackage.AccessKey))
                    {
                        throw new UnauthorizedAccessException(CustomErrorMessages.WRONG_ACCESSKEY);
                    }
                }
                else
                {
                    datapackage = DataPackage.FromIdentifier(context, request.DataPackageId);
                }

                datapackage.SetOpenSearchEngine(MasterCatalogue.OpenSearchEngine);
                OpenSearchDescription osd = datapackage.GetLocalOpenSearchDescription();

                context.Close();

                return(new HttpResult(osd, "application/opensearchdescription+xml"));
            } catch (Exception e) {
                context.LogError(this, e.Message, e);
                context.Close();
                throw e;
            }
        }
        public object Get(DataPackageGetAvailableIdentifierRequestTep request)
        {
            var context   = TepWebContext.GetWebContext(PagePrivileges.UserView);
            var available = true;

            try {
                context.Open();
                context.LogInfo(this, string.Format("/data/package/{{DpId}}/available GET DpId='{0}'", request.DpId));
                context.AccessLevel = EntityAccessLevel.Administrator;
                try {
                    DataPackage dp = DataPackage.FromIdentifier(context, request.DpId);
                    available = false;
                }catch (EntityNotFoundException) {
                    available = true;
                }catch (Exception) {
                    available = false;
                }

                context.Close();
            } catch (Exception e) {
                context.LogError(this, e.Message, e);
                context.Close();
                throw e;
            }
            return(new WebResponseBool(available));
        }
        /// <summary>
        /// Get the specified request.
        /// </summary>
        /// <param name="request">Request.</param>
        public object Get(DataPackageGetGroupsRequestTep request)
        {
            List <WebGroup> result = new List <WebGroup>();

            var context = TepWebContext.GetWebContext(PagePrivileges.AdminOnly);

            try {
                context.Open();
                context.LogInfo(this, string.Format("/data/package/{{DpId}}/group GET DpId='{0}'", request.DpId));
                DataPackage dp = DataPackage.FromIdentifier(context, request.DpId);

                var        gids = dp.GetAuthorizedGroupIds();
                List <int> ids  = gids != null?gids.ToList() : new List <int>();

                List <Group> groups = new List <Group>();
                foreach (int id in ids)
                {
                    groups.Add(Group.FromId(context, id));
                }

                foreach (Group grp in groups)
                {
                    result.Add(new WebGroup(grp));
                }

                context.Close();
            } catch (Exception e) {
                context.LogError(this, e.Message, e);
                context.Close();
                throw e;
            }
            return(result);
        }
        /// <summary>
        /// Put the specified request.
        /// </summary>
        /// <param name="request">Request.</param>
        public object Put(DataPackageUpdateRequestTep request)
        {
            var context = TepWebContext.GetWebContext(PagePrivileges.UserView);
            WebDataPackageTep result;

            try{
                context.Open();
                context.LogInfo(this, string.Format("/data/package PUT Id='{0}'", request.Id == 0 ? request.Identifier : request.Id.ToString()));
                DataPackage tmp;
                if (request.Id != 0)
                {
                    tmp = DataPackage.FromId(context, request.Id);
                }
                else if (!string.IsNullOrEmpty(request.Identifier))
                {
                    tmp = DataPackage.FromIdentifier(context, request.Identifier);
                }
                else
                {
                    throw new Exception("Undefined data package, set at least Id or Identifier");
                }

                if (request.Access != null)
                {
                    switch (request.Access)
                    {
                    case "public":
                        tmp.GrantPermissionsToAll();
                        Activity activity = new Activity(context, tmp, EntityOperationType.Share);
                        activity.Store();
                        break;

                    case "private":
                        tmp.RevokePermissionsFromAll(true, false);
                        break;

                    default:
                        break;
                    }
                }
                else
                {
                    tmp = (DataPackage)request.ToEntity(context, tmp);
                    tmp.Store();
                }

                result = new WebDataPackageTep(tmp);
                context.Close();
            }catch (Exception e) {
                context.LogError(this, e.Message, e);
                context.Close();
                throw e;
            }

            return(result);
        }
        /// <summary>
        /// Post the specified request.
        /// </summary>
        /// <param name="request">Request.</param>
        public object Post(DataPackageCreateRequestTep request)
        {
            //Get all requests from database
            var context = TepWebContext.GetWebContext(PagePrivileges.UserView);
            WebDataPackageTep result;

            try{
                context.Open();

                var identifier = !string.IsNullOrEmpty(request.Identifier) ? TepUtility.ValidateIdentifier(request.Identifier) : TepUtility.ValidateIdentifier(request.Name);

                DataPackage tmp = new DataPackage(context);
                tmp = (DataPackage)request.ToEntity(context, tmp);

                if (request.Overwrite && tmp.OwnerId == context.UserId)
                {
                    tmp = DataPackage.FromIdentifier(context, identifier);
                    foreach (var res in tmp.Resources)
                    {
                        res.Delete();
                    }
                }
                else
                {
                    tmp            = (DataPackage)request.ToEntity(context, tmp);
                    tmp.Identifier = identifier;
                    try {
                        tmp.Store();
                    } catch (DuplicateEntityIdentifierException e) {
                        tmp = DataPackage.FromIdentifier(context, identifier);
                        if (tmp.OwnerId == context.UserId)
                        {
                            throw new DuplicateNameException(e.Message);
                        }
                        else
                        {
                            throw e;
                        }
                    }
                }

                result = new WebDataPackageTep(tmp);
                context.LogInfo(this, string.Format("/data/package POST Id='{0}'", tmp.Id));
                context.Close();
            }catch (Exception e) {
                context.LogError(this, e.Message, e);
                context.Close();
                throw e;
            }

            return(result);
        }
        /// <summary>
        /// Put the specified request.
        /// </summary>
        /// <param name="request">Request.</param>
        public object Put(DataPackageUpdateDefaultRequestTep request)
        {
            var context = TepWebContext.GetWebContext(PagePrivileges.UserView);
            WebDataPackageTep result;

            try{
                context.Open();
                context.LogInfo(this, string.Format("/data/package/default PUT"));
                DataPackage def = DataPackage.GetTemporaryForCurrentUser(context);
                //we want to do the copy of a datapackage into the default one
                if (def.Identifier != request.Identifier)
                {
                    foreach (RemoteResource res in def.Resources)
                    {
                        res.Delete();
                    }
                    def.LoadItems();
                    var tmp = DataPackage.FromIdentifier(context, request.Identifier);
                    foreach (RemoteResource res in tmp.Resources)
                    {
                        RemoteResource tmpres = new RemoteResource(context);
                        tmpres.Location = res.Location;
                        def.AddResourceItem(tmpres);
                    }
                    ActivityTep activity = new ActivityTep(context, tmp, EntityOperationType.View);
                    activity.SetParam("items", tmp.Resources.Count + "");
                    activity.Store();
                }
                else
                {
                    def = (DataPackage)request.ToEntity(context, def);
                }

                result = new WebDataPackageTep(def);
                context.Close();
            }catch (Exception e) {
                context.LogError(this, e.Message, e);
                context.Close();
                throw e;
            }

            return(result);
        }
        /// <summary>
        /// Put the specified request.
        /// </summary>
        /// <param name="request">Request.</param>
        public object Put(DataPackageExportRequestTep request)
        {
            var context = TepWebContext.GetWebContext(PagePrivileges.UserView);
            WebDataPackageTep result;

            try{
                context.Open();
                context.LogInfo(this, string.Format("/data/package/export PUT Id='{0}'", request.Id == 0 ? request.Identifier : request.Id.ToString()));
                DataPackage tmp;
                if (request.Id != 0)
                {
                    tmp = DataPackage.FromId(context, request.Id);
                }
                else if (!string.IsNullOrEmpty(request.Identifier))
                {
                    tmp = DataPackage.FromIdentifier(context, request.Identifier);
                }
                else
                {
                    throw new Exception("Undefined data package, set at least Id or Identifier");
                }

                var serie = new Collection(context);
                serie.Identifier = tmp.Identifier;
                serie.Name       = tmp.Name;
                var entityType  = EntityType.GetEntityType(typeof(DataPackage));
                var description = new UriBuilder(context.BaseUrl + "/" + entityType.Keyword + "/" + tmp.Identifier + "/description");
                description.Query             = "key=" + tmp.AccessKey;
                serie.CatalogueDescriptionUrl = description.Uri.AbsoluteUri;
                var user = UserTep.FromId(context, context.UserId);
                serie.Domain = user.Domain;
                serie.Store();
                result = new WebDataPackageTep(tmp);
                context.Close();
            }catch (Exception e) {
                context.LogError(this, e.Message, e);
                context.Close();
                throw e;
            }

            return(result);
        }
        /// <summary>
        /// Get the specified request.
        /// </summary>
        /// <param name="request">Request.</param>
        public object Get(GetDataPackageTep request)
        {
            //Get all requests from database
            var context = TepWebContext.GetWebContext(PagePrivileges.UserView);
            WebDataPackageTep result;

            try{
                context.Open();
                context.LogInfo(this, string.Format("/data/package/{{Identifier}} GET Id='{0}", request.Identifier));

                DataPackage tmp = DataPackage.FromIdentifier(context, request.Identifier);
                result = new WebDataPackageTep(tmp);
                context.Close();
            }catch (Exception e) {
                context.LogError(this, e.Message, e);
                context.Close();
                throw e;
            }

            return(result);
        }
        /// <summary>
        /// Put the specified request.
        /// </summary>
        /// <param name="request">Request.</param>
        public object Put(DataPackageUpdateGroupsRequestTep request)
        {
            var context = TepWebContext.GetWebContext(PagePrivileges.AdminOnly);

            try {
                context.Open();
                context.LogInfo(this, string.Format("/data/package/{{DpId}}/group PUT DpId='{0}', Id='{1}'", request.DpId, request.ToArray() != null ? string.Join(",", request.ToArray()) : "null"));
                DataPackage dp = DataPackage.FromIdentifier(context, request.DpId);

                string sql = String.Format("DELETE FROM resourceset_perm WHERE id_resourceset={0} AND id_grp IS NOT NULL;", dp.Id);
                context.Execute(sql);

                dp.GrantPermissionsToGroups(request.ToArray());

                context.Close();
            } catch (Exception e) {
                context.LogError(this, e.Message, e);
                context.Close();
                throw e;
            }
            return(new WebResponseBool(true));
        }
        /// <summary>
        /// Delete the specified request.
        /// </summary>
        /// <param name="request">Request.</param>
        public object Delete(DataPackageDeleteRequestTep request)
        {
            var context = TepWebContext.GetWebContext(PagePrivileges.UserView);

            try{
                context.Open();
                context.LogInfo(this, string.Format("/data/package/{{Identifier}} DELETE Identifier='{0}'", request.Identifier));
                DataPackage tmp = DataPackage.FromIdentifier(context, request.Identifier);
                if (tmp.OwnerId != context.UserId && context.AccessLevel != EntityAccessLevel.Administrator)
                {
                    throw new UnauthorizedAccessException("You are not authorized to delete this data package.");
                }
                tmp.Delete();
                context.Close();
            }catch (Exception e) {
                context.LogError(this, e.Message, e);
                context.Close();
                throw e;
            }

            return(Get(new GetAllDataPackages()));
        }
        /// <summary>
        /// Post the specified request.
        /// </summary>
        /// <param name="request">Request.</param>
        public object Delete(DataPackageDeleteGroupRequestTep request)
        {
            List <WebGroup> result = new List <WebGroup>();

            var context = TepWebContext.GetWebContext(PagePrivileges.AdminOnly);

            try {
                context.Open();
                context.LogInfo(this, string.Format("/data/package/{{DpId}}/group DELETE DpId='{0}', Id='{1}'", request.DpId, request.Id));
                DataPackage dp = DataPackage.FromIdentifier(context, request.DpId);

                //TODO: replace once http://project.terradue.com/issues/13954 is resolved
                string sql = String.Format("DELETE FROM resourceset_perm WHERE id_resourceset={0} AND id_grp={1};", dp.Id, request.Id);
                context.Execute(sql);

                context.Close();
            } catch (Exception e) {
                context.LogError(this, e.Message, e);
                context.Close();
                throw e;
            }
            return(new WebResponseBool(true));
        }
        /// <summary>
        /// Post the specified request.
        /// </summary>
        /// <param name="request">Request.</param>
        public object Post(DataPackageAddGroupRequestTep request)
        {
            var context = TepWebContext.GetWebContext(PagePrivileges.AdminOnly);

            try {
                context.Open();
                context.LogInfo(this, string.Format("/data/package/{{DpId}}/group POST DpId='{0}', Id='{1}'", request.DpId, request.Id));
                DataPackage dp = DataPackage.FromIdentifier(context, request.DpId);

                var        gids = dp.GetAuthorizedGroupIds();
                List <int> ids  = gids != null?gids.ToList() : new List <int>();

                List <Group> groups = new List <Group>();
                foreach (int id in ids)
                {
                    groups.Add(Group.FromId(context, id));
                }

                foreach (Group grp in groups)
                {
                    if (grp.Id == request.Id)
                    {
                        return(new WebResponseBool(false));
                    }
                }

                dp.GrantPermissionsToGroups(new int[] { request.Id });

                context.Close();
            } catch (Exception e) {
                context.LogError(this, e.Message, e);
                context.Close();
                throw e;
            }
            return(new WebResponseBool(true));
        }
        /// <summary>
        /// Get the specified request.
        /// </summary>
        /// <param name="request">Request.</param>
        public object Get(DataPackageSearchRequest request)
        {
            var context = TepWebContext.GetWebContext(PagePrivileges.EverybodyView);
            IOpenSearchResultCollection result = null;

            try {
                context.Open();
                context.LogInfo(this, string.Format("/data/package/{{DataPackageId}}/search GET DataPackageId='{0}'", request.DataPackageId));

                Terradue.Tep.DataPackage datapackage;

                try{
                    datapackage = DataPackage.FromIdentifier(context, request.DataPackageId);
                }catch (Exception) {
                    if (request.Key != null) //or if public
                    {
                        context.AccessLevel = EntityAccessLevel.Administrator;
                        datapackage         = DataPackage.FromIdentifier(context, request.DataPackageId);
                        if (request.Key != null && !request.Key.Equals(datapackage.AccessKey))
                        {
                            throw new UnauthorizedAccessException(CustomErrorMessages.WRONG_ACCESSKEY);
                        }
                    }
                    else
                    {
                        datapackage = DataPackage.FromIdentifier(context, request.DataPackageId);
                    }
                }

                if (Request.QueryString != null && Request.QueryString["cache"] == "false")
                {
                    datapackage.SetOpenSearchEngine(MasterCatalogue.GetNewOpenSearchEngine());
                }
                else if (Request.QueryString != null && Request.QueryString["clearcache"] == "true")
                {
                    datapackage.SetOpenSearchEngine(MasterCatalogue.ClearOpenSearchEngine());
                }
                else
                {
                    datapackage.SetOpenSearchEngine(MasterCatalogue.OpenSearchEngine);
                }

                OpenSearchEngine ose = MasterCatalogue.OpenSearchEngine;

                Type responseType = OpenSearchFactory.ResolveTypeFromRequest(HttpContext.Current.Request.QueryString, HttpContext.Current.Request.Headers, ose);

                result = ose.Query(datapackage, Request.QueryString, responseType);

                var openSearchDescription = datapackage.GetLocalOpenSearchDescription();
                var uri_s = datapackage.GetSearchBaseUrl();
                OpenSearchDescriptionUrl openSearchUrlByRel = OpenSearchFactory.GetOpenSearchUrlByRel(openSearchDescription, "self");
                Uri uri_d;
                if (openSearchUrlByRel != null)
                {
                    uri_d = new Uri(openSearchUrlByRel.Template);
                }
                else
                {
                    uri_d = openSearchDescription.Originator;
                }
                if (uri_d != null)
                {
                    result.Links.Add(new SyndicationLink(uri_d, "search", "OpenSearch Description link", "application/opensearchdescription+xml", 0));
                }
                if (uri_s != null)
                {
                    result.Links.Add(new SyndicationLink(uri_s, "self", "OpenSearch Search link", "application/atom+xml", 0));
                }

                MasterCatalogue.ReplaceSelfLinksFormat(result, Request.QueryString);

                ActivityTep activity = new ActivityTep(context, datapackage, EntityOperationType.Search);
                activity.SetParam("items", result.TotalResults + "");
                activity.Store();

                context.Close();
            } catch (Exception e) {
                context.LogError(this, e.Message, e);
                context.Close();
                throw e;
            }

            return(new HttpResult(result.SerializeToString(), result.ContentType));
        }