コード例 #1
0
        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));
        }
コード例 #2
0
        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);
        }