public RisiCollection <ReportDefinition> GetReportDefinitions() { this.Authenticate(this.username, this.password); var url = $"{this.ReportUri}{JasperResourcesPath}?type=reportUnit"; if (!string.IsNullOrEmpty(FolderPath) && !string.IsNullOrWhiteSpace(FolderPath)) { this.tracer.TraceEvent(TraceEventType.Verbose, 0, $"Mapping folder path: {this.FolderPath}"); url += $"&folderUri={FolderPath}"; } var response = client.GetAsync(url).Result; tracer.TraceEvent(TraceEventType.Information, 0, $"Jasper report server response: {response.Content}"); Resources resources; using (var stream = response.Content.ReadAsStreamAsync().Result) { var serializer = new XmlSerializer(typeof(Resources)); resources = (Resources)serializer.Deserialize(stream); } var reportDefinitionPersistenceService = ApplicationContext.Current.GetService <IDataPersistenceService <ReportDefinition> >(); if (reportDefinitionPersistenceService == null) { throw new InvalidOperationException($"Unable to locate persistence service: {nameof(IDataPersistenceService<ReportDefinition>)}"); } // HACK: remove existing reports to ensure we have the latest reports // otherwise we'd need logic to reconcile which reports have been removed, updated etc. //var existingReports = reportDefinitionPersistenceService.Query(r => true, AuthenticationContext.Current.Principal); //foreach (var reportDefinition in existingReports) //{ // reportDefinitionPersistenceService.Obsolete(reportDefinition, AuthenticationContext.Current.Principal, TransactionMode.Commit); //} var reports = new List <ReportDefinition>(); foreach (var resourceLookup in resources.ResourceLookups) { switch (resourceLookup.ResourceType) { case "reportUnit": var reportDefinition = new ReportDefinition(resourceLookup.Label) { CorrelationId = resourceLookup.Uri, Description = resourceLookup.Description, // jasper reports supports the following formats Formats = new List <ReportFormat> { new ReportFormat(ReportFormatKeys.Csv), new ReportFormat(ReportFormatKeys.Docx), new ReportFormat(ReportFormatKeys.Html), new ReportFormat(ReportFormatKeys.JPrint), new ReportFormat(ReportFormatKeys.Ods), new ReportFormat(ReportFormatKeys.Odt), new ReportFormat(ReportFormatKeys.Pdf), new ReportFormat(ReportFormatKeys.Rtf), new ReportFormat(ReportFormatKeys.Xls), new ReportFormat(ReportFormatKeys.Xlsx), new ReportFormat(ReportFormatKeys.Xml) } }; var reportUnit = this.LookupResource <ReportUnit>(resourceLookup.Uri); var count = 0; foreach (var reportUnitInputControlReference in reportUnit.InputControlReferences) { var inputControl = this.LookupResource <InputControl>(reportUnitInputControlReference.Uri); var reportParameter = new ReportParameter(inputControl.Label, count++, null) { CorrelationId = inputControl.Uri, Description = inputControl.Description, ReportDefinition = reportDefinition, IsNullable = inputControl.Mandatory }; reportDefinition.Parameters.Add(reportParameter); } reports.Add(reportDefinition); break; } } foreach (var report in reports) { int totalResults; var existingReport = reportDefinitionPersistenceService.Query(r => r.CorrelationId == report.CorrelationId, 0, 1, AuthenticationContext.Current.Principal, out totalResults).FirstOrDefault(); // does the report already exist? if (existingReport == null) { reportDefinitionPersistenceService.Insert(report, AuthenticationContext.Current.Principal, TransactionMode.Commit); } else { // make sure the keys for the report formats map back to the report definition itself report.Formats.ForEach(r => r.ReportDefinitionKey = existingReport.Key.Value); // make sure the keys for the report parameters map back to the report definition itself report.Parameters.ForEach(r => r.ReportDefinitionKey = existingReport.Key.Value); // update the existing report information existingReport.Formats = report.Formats; existingReport.Parameters = report.Parameters; existingReport.Description = report.Description; existingReport.Name = report.Name; // update the report definition reportDefinitionPersistenceService.Update(existingReport, AuthenticationContext.Current.Principal, TransactionMode.Commit); } } // load the reports from the database. var dbReports = reportDefinitionPersistenceService.Query(r => r.Key != null, AuthenticationContext.Current.Principal); return(new RisiCollection <ReportDefinition>(dbReports)); }
public ReportDefinition GetReportDefinition(Guid id) { var persistenceService = ApplicationContext.Current.GetService <IDataPersistenceService <ReportDefinition> >(); if (persistenceService == null) { throw new InvalidOperationException($"Unable to locate persistence service: {nameof(IDataPersistenceService<ReportDefinition>)}"); } var reportDefinition = persistenceService.Get(new Identifier <Guid>(id), AuthenticationContext.Current.Principal, true); if (reportDefinition == null) { return(null); } this.Authenticate(this.username, this.password); var userId = OpenIZ.Core.ExtensionMethods.GetUserId(AuthenticationContext.Current.Principal.Identity); var reportUnit = this.LookupResource <ReportUnit>(reportDefinition.CorrelationId, new List <KeyValuePair <string, string> > { new KeyValuePair <string, string>(UserIdKey, Guid.Parse(userId).ToString()) }); var count = 0; foreach (var reportUnitInputControlReference in reportUnit.InputControlReferences) { var inputControl = this.LookupResource <InputControl>(reportUnitInputControlReference.Uri); var reportParameter = new ReportParameter(inputControl.Label, count++, null) { CorrelationId = inputControl.Uri, Description = inputControl.Description, ReportDefinition = reportDefinition, Name = inputControl.Label, IsHidden = !inputControl.Visible, IsNullable = inputControl.Mandatory, ReportDefinitionKey = reportDefinition.Key.Value, }; // if the parameter is the user id, set the user id value as the current user id if (reportParameter.Name == UserIdKey) { reportParameter.Value = Guid.Parse(OpenIZ.Core.ExtensionMethods.GetUserId(AuthenticationContext.Current.Principal.Identity)).ToByteArray(); } if (inputControl.DataType != null) { var dataType = this.LookupResource <DataType>(inputControl.DataType.Uri); switch (dataType.Type.ToLower()) { case "text": reportParameter.ParameterType = new ParameterType(ParameterTypeKeys.String) { SystemTypeXml = typeof(string).AssemblyQualifiedName }; break; case "date": case "datetime": reportParameter.ParameterType = new ParameterType(ParameterTypeKeys.DateTime) { SystemTypeXml = typeof(DateTime).AssemblyQualifiedName }; break; case "number": reportParameter.ParameterType = new ParameterType(ParameterTypeKeys.Integer) { SystemTypeXml = typeof(int).AssemblyQualifiedName }; break; } } if (inputControl.Query != null) { var query = this.LookupResource <Query>(inputControl.Query.Uri); this.tracer.TraceEvent(TraceEventType.Verbose, 0, $"Jasper Query: {query.Value}"); var warehouseService = ApplicationContext.Current.GetService <IAdHocDatawarehouseService>(); if (warehouseService == null) { throw new InvalidOperationException($"Unable to locate service: {nameof(IAdHocDatawarehouseService)}"); } IEnumerable <ExpandoObject> queryResult = null; try { // set the user id if (query.Value.Contains("${Userid}") || query.Value.Contains("$P{Userid}")) { var securityUserId = Guid.Parse(OpenIZ.Core.ExtensionMethods.GetUserId(AuthenticationContext.Current.Principal.Identity)); var totalCount = 0; var userEntityId = ApplicationContext.Current.GetService <IDataPersistenceService <UserEntity> >().Query(c => c.SecurityUserKey == securityUserId, 0, 1, AuthenticationContext.Current.Principal, out totalCount)?.FirstOrDefault()?.Key; query.Value = query.Value.Replace("${Userid}", $"'{userEntityId}'::uuid"); query.Value = query.Value.Replace("$P{Userid}", $"'{userEntityId}'::uuid"); } queryResult = warehouseService.AdhocQuery(query.Value) as IEnumerable <ExpandoObject>; } catch (Exception e) { tracer.TraceEvent(TraceEventType.Warning, 0, $"Unable to execute query: {e}"); } var sourceDefinition = new ListAutoCompleteSourceDefinition(); if (queryResult != null) { try { sourceDefinition.Items.AddRange(queryResult.Where(o => o.HasProperty(inputControl.ValueColumn)).Select(p => MapIdentifiedData(p, inputControl.ValueColumn, inputControl.VisibleColumns.FirstOrDefault()))); reportParameter.ParameterType = new ParameterType(Guid.Parse("516D80B2-FDE3-4731-9FE8-30719C5EB9AC")) { AutoCompleteSourceDefinition = sourceDefinition, SystemTypeXml = typeof(Entity).AssemblyQualifiedName }; } catch (Exception e) { tracer.TraceEvent(TraceEventType.Error, 0, $"Error: {e}"); } } } int totalResults; reportParameter.Key = ApplicationContext.Current.GetService <IDataPersistenceService <ReportParameter> >()?.Query(r => r.CorrelationId == inputControl.Uri, 0, null, AuthenticationContext.Current.Principal, out totalResults).FirstOrDefault(r => r.CorrelationId == inputControl.Uri && r.ReportDefinitionKey == id)?.Key; reportDefinition.Parameters.Add(reportParameter); } return(reportDefinition); }