<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://fmrwiki.sdmxcloud.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mnelson</id>
	<title>FMR Knowledge Base - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://fmrwiki.sdmxcloud.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mnelson"/>
	<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/Special:Contributions/Mnelson"/>
	<updated>2026-05-27T02:32:04Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.32.0</generator>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7095</id>
		<title>DRAFT SDMX-CORE</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7095"/>
		<updated>2023-07-24T16:40:33Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Using Spring/SDMX.IO */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architecture =&lt;br /&gt;
== Modules ==&lt;br /&gt;
The sdmx-io modules are as follows&lt;br /&gt;
===Interface Modules===&lt;br /&gt;
These modules contains Java Interfaces only, no Java classes.  The sdmx-io framework uses Interfaces over implementation classes in order to achieve loose coupling.&lt;br /&gt;
&lt;br /&gt;
 '''fusion-api'''  - contains generic Interfaces that are unrelated to SDMX. Each package in this project is broken down by function, i.e audit, cache, date, email, exception&lt;br /&gt;
 '''fusion-api-dao''' - contains Interface definitions for database persistence, not coupled to database platform, but all based on storage and retrieval of Java Objects&lt;br /&gt;
 '''fusion-api-sdmx''' - contains Interfaces for SDMX Information model (SdmxBeans and related), high level Interfaces for SDMX related functions which cross multiple modules&lt;br /&gt;
 '''fusion-api-service''' - contains Interfaces definitions for web services to use - allowing projects the implement web service entry points to not require web service dependencies&lt;br /&gt;
&lt;br /&gt;
===Implementation Modules===&lt;br /&gt;
These modules contain Java classes which are core to SDMX, they implement Interfaces in the higher api modules&lt;br /&gt;
 '''fusion-sdmx-im''' - contains the implementation code for the SDMX Information Model (SdmxBeans and related structures such as Codelists, Concepts, etc)&lt;br /&gt;
 '''fusion-core-data''' - contains code to read/write data and generic data related features such as determining series/obs, validation, temporary data stores&lt;br /&gt;
 '''fusion-core-sdmx''' - contains core code for structural metadata, including temporary store, cross reference resolution, contains some data and reference metadata features &lt;br /&gt;
 '''fusion-core-structure''' - contains core code for processing structural metadata &lt;br /&gt;
 '''fusion-core-xlsx''' - contains code to read and write structures and data in Excel &lt;br /&gt;
&lt;br /&gt;
===Format Modules===&lt;br /&gt;
These modules contains Java classes for reading and writing SDMX Structural Metadata, Reference Metadata, and Data&lt;br /&gt;
&lt;br /&gt;
 '''fusion-sdmx-csv''' - reading and writing SDMX-CSV format&lt;br /&gt;
 '''fusion-sdmx-edi''' - reading and writing SDMX-EDI format&lt;br /&gt;
 '''fusion-sdmx-json''' - reading and writing SDMX-JSON format&lt;br /&gt;
 '''fusion-sdmx-ml''' reading and writing SDMX-XML&lt;br /&gt;
&lt;br /&gt;
===Feature Modules===&lt;br /&gt;
These modules provide feature specific code&lt;br /&gt;
 '''fusion-core-dao''' - contains generic DAO implementations for storing and querying for objects, not coupled to a specific object store, but we use hibernate, mongodb is also an option&lt;br /&gt;
 '''fusion-audit''' - audit events and centralised error handling&lt;br /&gt;
 '''fusion-sdmx-kafka''' - connecting to and sending/receiving messages to Apache Kafka&lt;br /&gt;
 '''fusion-sdmx-publication''' - SDMX Publication Tables: SdmxBean implementations, and business logic to materilise table based on definition&lt;br /&gt;
 '''fusion-sdmx-reporttemplate''' - Reporting Templates: SdmxBean implementations, and business logic to genearte excel workbook from template definition, reading data from workbooks&lt;br /&gt;
 '''fusion-sdmx-rest''' - SDMX web services, and additional web service implementations from APIs defined in fusion-api-service&lt;br /&gt;
 '''fusion-sdmx-search''' - Lucene search engine for structures&lt;br /&gt;
 '''fusion-sdmx-security''' - authentication against LDAP/AD/Fusion Security - contains user definition (SecurityDetailsImpl)&lt;br /&gt;
 '''fusion-xl''' - exposes web services required by the FusionXL Excel Plugin&lt;br /&gt;
&lt;br /&gt;
===Utility Modules===&lt;br /&gt;
Utility classes, typically public static classes, the utils projects may organise code by function rather then using the generic packaging structure (api, engine, manager, model, ...)&lt;br /&gt;
 '''fusion-utils''' - generic utility classes, not specific to SDMX&lt;br /&gt;
 '''fusion-utils-hibernate''' - implementation code to use Hibernate as a means to connect to the DAO&lt;br /&gt;
 '''fusion-utils-http''' - calling HTTP web services&lt;br /&gt;
 '''fusion-utils-json''' - JSON related utility classes&lt;br /&gt;
 '''fusion-utils-mail''' - email utility classes&lt;br /&gt;
 '''fusion-utils-mongodb'''  - implementation code to use MongoDB a means to store Objects&lt;br /&gt;
 '''fusion-utils-sdmx''' - SDMX Specific utility classes&lt;br /&gt;
 '''fusion-utils-spring''' - spring related utility classes&lt;br /&gt;
 '''fusion-utils-xlsx''' - reading/writing Excel workbooks related utility classes&lt;br /&gt;
&lt;br /&gt;
== Java Packages ==&lt;br /&gt;
Each module is partitioned into Java packages, with the exception of the utility modules, which typically separate code by its function. &lt;br /&gt;
&lt;br /&gt;
The generic packages are as follows.&lt;br /&gt;
&lt;br /&gt;
 '''api''' - contains interfaces relevant to the module &lt;br /&gt;
 '''application''' - contains code specific to the building of an application - this will contain any '''IFusionModule''' specific to this module (described later)&lt;br /&gt;
 '''constant''' - contains Java enums and java classes that contain public static constants&lt;br /&gt;
 '''engine''' - classes that 'do the work', many are stateless singletons, there are also stateful for example DataReader/WriterEngine &lt;br /&gt;
 '''factory''' - singleton classes that are responsible for generating an engine, typically called by a manager class, factories enable new features to be plugged into the framework&lt;br /&gt;
 '''filter'''  - REST web service filters (defined in web.xml) - filters are called before the web service&lt;br /&gt;
 '''manager''' - the main entry point for all high level functions, the manager's job is to verify the request (i.e. a security check) and manage the process of fulfilling the request by delegating the work to an engine or a DAO, a manager should be a fairly thin layer&lt;br /&gt;
 '''model''' - data transfer objects &lt;br /&gt;
 '''service''' (or rest) - web service entry points&lt;br /&gt;
 '''util''' - utility classes, typically containing public static methods&lt;br /&gt;
&lt;br /&gt;
The general logical flow of a system is the following&lt;br /&gt;
&lt;br /&gt;
 service --&amp;gt; manager --&amp;gt; engine&lt;br /&gt;
                     --&amp;gt; dao&lt;br /&gt;
&lt;br /&gt;
The service (web service entry point) is a thin layer which collects the request arguments, with minimal manipulation, and passes them to the respective Service Interface. The implementation of this Service Interface will create an appropriate model object (or objects) which contain a consolidated collection of arguments, some validation of arguments can be performed at this point, and then pass these to the manager Interface.  The manager will ensure the arguments are valid and the user has permission to perform the action.  The manager then provides the workflow required to fulfil the task, by making calls to engines and/or daos.&lt;br /&gt;
&lt;br /&gt;
= High Level Design =&lt;br /&gt;
&lt;br /&gt;
==[https://en.wikipedia.org/wiki/Inversion_of_control Inversion of Control] (IoC)==&lt;br /&gt;
&lt;br /&gt;
IoC is achieved by assigning all implementation classes to Interfaces and ensuring classes are stateless so that they can be singletons.  Managers are typically singletons.  This enables the system to be plugged together either by using the spring framework, or by using the sdmx.io framework.&lt;br /&gt;
&lt;br /&gt;
===Spring Framework===&lt;br /&gt;
Spring is used in the Java web application, web.xml references a number of spring bean files, which are located under src/main/resources/spring subfolder of the web application library.  The spring beans define the classes and which dependencies they are using. This works well for very large systems such as Fusion Metadata Registry which contains a large number of services and class definitions.&lt;br /&gt;
&lt;br /&gt;
===SDMX.IO IoC framework===&lt;br /&gt;
In order to remove the dependency on spring, and to simplify simpler projects, Sdmx.io provides a framework which allows instances of singleton classes to be registered to and obtained via the '''SingletonStore''' class.  When the class is not a singleton, instances can be registered with the '''FusionBeanStore''' class.  &lt;br /&gt;
&lt;br /&gt;
A running application would request a singleton instance in the following way.&lt;br /&gt;
&lt;br /&gt;
 private IActiveDirectorySecuritySettingsManager activeDirectorySecuritySettingsManager = SingletonStore.getSingleton(IActiveDirectorySecuritySettingsManager.class);&lt;br /&gt;
&lt;br /&gt;
This is typically done at the web service layer, as a web service is constructed outside of the spring framework, after the application has launched.&lt;br /&gt;
&lt;br /&gt;
There are some use cases where the singleton is not available at the time it is requested, typcially because it is during application startup and the bean has not yet been built and registered.  In this scenario the Singleton store can be asked to provide an instance when it is registered.&lt;br /&gt;
 &lt;br /&gt;
 SingletonStore.registerInterest(FusionProductInformationRetrievalManager.class, (bean) -&amp;gt; {&lt;br /&gt;
   infoRetreival = bean;&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
If the application wants multiple instances of an interface, then the FusionBeanStore is used&lt;br /&gt;
&lt;br /&gt;
 Collection&amp;lt;StructureWriterFactory&amp;gt; allBeans = FusionBeanStore.getBeans(StructureWriterFactory.class);&lt;br /&gt;
&lt;br /&gt;
===Using Spring/SDMX.IO===&lt;br /&gt;
In order to quickly register modules with the SDMX.IO framework, there are a number of classes that implement '''IFusionModule''', these classes have a register method, which on calling will automatically create and register instances of classes relevant to that module. &lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 CoreSDMXModule.register(); - register schema factories, cross reference resolution, reference metadata reader and writer manager&lt;br /&gt;
 SdmxMLModule.register();  - register SDMX-XML data and structure format readers and writers&lt;br /&gt;
 SdmxJsonModule.register(); - register SDMX-JSON data and structure format readers and writers&lt;br /&gt;
 FusionXLModule.register(); - register FusionXL classes for the excel plugin&lt;br /&gt;
 SdmxEDIModule.register(); - register SDMX-EDI data and structure format readers and writers&lt;br /&gt;
 FusionJsonModule.register();  - register Fusion-JSON data and structure format readers and writers&lt;br /&gt;
 SdmxCsvModule.register();  - register SDMX-CSV data format readers and writers&lt;br /&gt;
 FusionCoreDataModule.register();  - register SDMX-EDI data and structure format readers and writers&lt;br /&gt;
 XLSXModule.register();  - register reader and writer for Excel&lt;br /&gt;
 PublicationTableModule.register(); - classes to support Publication ables&lt;br /&gt;
  &lt;br /&gt;
The spring framework can be used in conjunction with the SDMX.IO IoC framework, as the class '''SpringBeansContainer''' which is a wrapper around the spring beans container, can be used by both the SingletonStore and FusionBeansStore.  This allows SingletonStore and FusionBeansStore to search both the spring beans container, and any locally registered classes.&lt;br /&gt;
&lt;br /&gt;
= Example Code =&lt;br /&gt;
The following example code blocks are all in one Java main method - which in a real system would not be the case, most of the code in these examples is setting up the system (registering modules and singletons), which is a one time system set up operation.  &lt;br /&gt;
&lt;br /&gt;
== Reading Structures ==&lt;br /&gt;
* Register the SDMX-ML module as the response from the URL is in SDMX-ML format&lt;br /&gt;
* Creates an instance of the StructureReaderManager  (typically in an application this would be a singleton). &lt;br /&gt;
* Creates a wrapper around a URL giving repeated access to the input stream of information, the URL resolves to an SDMX structure file containing multiple Dataflows&lt;br /&gt;
* Convert the stream into SDMX structures&lt;br /&gt;
* Loop the Dataflows and print the ID to the console&lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
  SdmxMLModule.register();&lt;br /&gt;
  StructureReaderManager srm = new StructureReaderManagerImpl();&lt;br /&gt;
  ReadableDataLocation rdl = new ReadableDataLocationTmp(new URL(&amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2/structure/dataflow&amp;quot;));&lt;br /&gt;
  SdmxBeans beans = srm.parseStructures(rdl);&lt;br /&gt;
  beans.getDataflows().forEach((flow) -&amp;gt; System.out.println(flow.getId()));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Writing / Transforming Structures ==&lt;br /&gt;
The same code as  Reading Structures, but with the addition lines in BOLD&lt;br /&gt;
&lt;br /&gt;
* Register the SDMX-JSON module as we are writing out in this format&lt;br /&gt;
* Creates an instance of the StructureWriterManager (typically in an application this would be a singleton). &lt;br /&gt;
* Writes the structures in FusionJson format to the system output&lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
  SdmxMLModule.register();&lt;br /&gt;
  '''SdmxJsonModule.register();'''&lt;br /&gt;
  StructureReaderManager srm = new StructureReaderManagerImpl();&lt;br /&gt;
  ReadableDataLocation rdl = new ReadableDataLocationTmp(new URL(&amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2/structure/dataflow&amp;quot;));&lt;br /&gt;
  SdmxBeans beans = srm.parseStructures(rdl);&lt;br /&gt;
  '''StructureWriterManager swm = new StructureWriterManagerImpl();'''&lt;br /&gt;
  '''swm.writeStructures(beans, FusionJsonStructureFormat.getInstance(), System.out);'''&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Data Read ==&lt;br /&gt;
Reading data requires access to both the dataset, and the structural metadata (DSD) which describes the data in terms of its Dimensions and Concepts.  &lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
    //SDMX WEB SERVICE&lt;br /&gt;
    String sdmxv2API = &amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2&amp;quot;;&lt;br /&gt;
    String dataflow = &amp;quot;dataflow/ECB/BSI/1.0&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    //Register modules for formats&lt;br /&gt;
    SdmxMLModule.register();&lt;br /&gt;
    	&lt;br /&gt;
    //Set up data reader and writer managers&lt;br /&gt;
    DataFormatManager dfm = new DataFormatManagerImpl(SdmxJsonDataFormat.INSTANCE, InformationFormatManager.getInstance());&lt;br /&gt;
    DataReaderManager drm = new DataReaderManagerImpl(dfm);&lt;br /&gt;
    	&lt;br /&gt;
    //Get Structures from URL into an in-memory store&lt;br /&gt;
    String structureURL = sdmxv2API + &amp;quot;/structure/&amp;quot;+dataflow+&amp;quot;?references=children&amp;quot;;&lt;br /&gt;
    SdmxBeanRetrievalManager beanRetrieval = new InMemoryRetrievalManagerFast(new ReadableDataLocationTmp(structureURL), new StructureReaderManagerImpl());&lt;br /&gt;
 &lt;br /&gt;
    //Get Data&lt;br /&gt;
    String dataQueryUrl = sdmxv2API+&amp;quot;/data/&amp;quot;+dataflow+&amp;quot;?c%5BFREQ%5D=A&amp;amp;c%5BREF_AREA%5D=DE,ES&amp;quot;;&lt;br /&gt;
    ReadableDataLocation sourceData = new ReadableDataLocationTmp(dataQueryUrl);&lt;br /&gt;
    DataReaderEngine dre = drm.getDataReaderEngine(sourceData, beanRetrieval, null);&lt;br /&gt;
    	&lt;br /&gt;
    while(dre.moveNextDataset()) {&lt;br /&gt;
      while(dre.moveNextKeyable()) {&lt;br /&gt;
        System.out.println(dre.getCurrentKey().getShortCode());&lt;br /&gt;
        while(dre.moveNextObservation()) {&lt;br /&gt;
          Observation obs = dre.getCurrentObservation();&lt;br /&gt;
          System.out.println(obs.getDimensionValue() + &amp;quot;=&amp;quot; + obs.getPrimaryMeasure());&lt;br /&gt;
        }&lt;br /&gt;
      }	&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Data Transformation ==&lt;br /&gt;
This example is a bit more involved, as the structures are no longer obtained as a file, but on demand from a web service.  This requires the registration of the REST classes.  In addition, as the output data format is SDMX JSON, the writer requires not only access to the DSD, but also all the metadata related to the DSD (Codelists, Concepts).  This requires the SdmxSuperBeanRetrievalManager, which is used to get a fully resolved tree of structural information.&lt;br /&gt;
&lt;br /&gt;
  public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
    //SDMX WEB SERVICE&lt;br /&gt;
    String sdmxv2API = &amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    //Register modules for formats&lt;br /&gt;
    SdmxMLModule.register();&lt;br /&gt;
    SdmxJsonModule.register();&lt;br /&gt;
    	&lt;br /&gt;
    //Manually register required instances		&lt;br /&gt;
    SingletonStore.registerInstance(new RESTQueryBrokerEngineImpl());&lt;br /&gt;
    SingletonStore.registerInstance(new StructureQueryBuilderRest());&lt;br /&gt;
    SingletonStore.registerInstance(new StructureReaderManagerImpl());&lt;br /&gt;
    	&lt;br /&gt;
    //Set up data reader and writer managers&lt;br /&gt;
    DataFormatManager dfm = new DataFormatManagerImpl(SdmxJsonDataFormat.INSTANCE, InformationFormatManager.getInstance());&lt;br /&gt;
    DataReaderManager drm = new DataReaderManagerImpl(dfm);&lt;br /&gt;
    DataWriterManager dwm = new DataWriterManagerImpl(dfm);&lt;br /&gt;
    	&lt;br /&gt;
    //JSON output format requires access to the metadata so labels can be resolved&lt;br /&gt;
    //Wrap the SDMX API ISdmxBeanRestRetrievalManager in a SdmxBeanRetrievalManager so the system can pull back the required structures on demand&lt;br /&gt;
    ISdmxBeanRestRetrievalManager restBeanRetrievalManager = new RESTSdmxBeanRetrievalManager(sdmxv2API, REST_API_VERSION.v2_0_0);&lt;br /&gt;
    SdmxBeanRetrievalManager beanRetrieval = new SdmxRestToBeanRetrievalManager(restBeanRetrievalManager);&lt;br /&gt;
 &lt;br /&gt;
    //Additionally wrap the SdmxBeanRetrievalManager to create a SdmxSuperBeanRetrievalManager, required when the full 'tree' of structral metadata is &lt;br /&gt;
    //required (i.e not just the SDMX Data Structure but resolved Concepts and Codelists in one fully resolved Object&lt;br /&gt;
    SdmxSuperBeanRetrievalManager sbRm = new SdmxSuperBeanRetrievalManagerImpl(beanRetrieval);&lt;br /&gt;
    	 &lt;br /&gt;
    //Register an instance of a SdmxBeanRetreivalContainer with the system, this is used as the default container to get a handle on implementations of the &lt;br /&gt;
    //structure retrieval interfaces - used by classes including the JSON writers&lt;br /&gt;
    SingletonStore.registerInstance(new SdmxBeanRetreivalContainer(beanRetrieval, null, sbRm, null, null, restBeanRetrievalManager));&lt;br /&gt;
    	&lt;br /&gt;
    //Get Data&lt;br /&gt;
    String dataQueryUrl = sdmxv2API+&amp;quot;/data/dataflow/ECB/BSI/1.0/?c%5BFREQ%5D=A&amp;amp;c%5BREF_AREA%5D=DE,ES&amp;quot;;&lt;br /&gt;
    ReadableDataLocation sourceData = new ReadableDataLocationTmp(dataQueryUrl);&lt;br /&gt;
    DataReaderEngine dre = drm.getDataReaderEngine(sourceData, beanRetrieval, null);&lt;br /&gt;
    	&lt;br /&gt;
    //Create Writer&lt;br /&gt;
    ISeriesObsDataWriterEngine dwe = dwm.getDataWriterEngine(SdmxJsonDataFormat.INSTANCE, System.out);&lt;br /&gt;
    	&lt;br /&gt;
    //Transform Data&lt;br /&gt;
    DataTransformOptions transformOptions = DataTransformOptions.getInstance().setCloseWriter(true); &lt;br /&gt;
    DataTransformationUtil.copyData(dre, dwe, transformOptions);&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7094</id>
		<title>DRAFT SDMX-CORE</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7094"/>
		<updated>2023-07-24T16:39:15Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* SDMX.IO IoC framework */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architecture =&lt;br /&gt;
== Modules ==&lt;br /&gt;
The sdmx-io modules are as follows&lt;br /&gt;
===Interface Modules===&lt;br /&gt;
These modules contains Java Interfaces only, no Java classes.  The sdmx-io framework uses Interfaces over implementation classes in order to achieve loose coupling.&lt;br /&gt;
&lt;br /&gt;
 '''fusion-api'''  - contains generic Interfaces that are unrelated to SDMX. Each package in this project is broken down by function, i.e audit, cache, date, email, exception&lt;br /&gt;
 '''fusion-api-dao''' - contains Interface definitions for database persistence, not coupled to database platform, but all based on storage and retrieval of Java Objects&lt;br /&gt;
 '''fusion-api-sdmx''' - contains Interfaces for SDMX Information model (SdmxBeans and related), high level Interfaces for SDMX related functions which cross multiple modules&lt;br /&gt;
 '''fusion-api-service''' - contains Interfaces definitions for web services to use - allowing projects the implement web service entry points to not require web service dependencies&lt;br /&gt;
&lt;br /&gt;
===Implementation Modules===&lt;br /&gt;
These modules contain Java classes which are core to SDMX, they implement Interfaces in the higher api modules&lt;br /&gt;
 '''fusion-sdmx-im''' - contains the implementation code for the SDMX Information Model (SdmxBeans and related structures such as Codelists, Concepts, etc)&lt;br /&gt;
 '''fusion-core-data''' - contains code to read/write data and generic data related features such as determining series/obs, validation, temporary data stores&lt;br /&gt;
 '''fusion-core-sdmx''' - contains core code for structural metadata, including temporary store, cross reference resolution, contains some data and reference metadata features &lt;br /&gt;
 '''fusion-core-structure''' - contains core code for processing structural metadata &lt;br /&gt;
 '''fusion-core-xlsx''' - contains code to read and write structures and data in Excel &lt;br /&gt;
&lt;br /&gt;
===Format Modules===&lt;br /&gt;
These modules contains Java classes for reading and writing SDMX Structural Metadata, Reference Metadata, and Data&lt;br /&gt;
&lt;br /&gt;
 '''fusion-sdmx-csv''' - reading and writing SDMX-CSV format&lt;br /&gt;
 '''fusion-sdmx-edi''' - reading and writing SDMX-EDI format&lt;br /&gt;
 '''fusion-sdmx-json''' - reading and writing SDMX-JSON format&lt;br /&gt;
 '''fusion-sdmx-ml''' reading and writing SDMX-XML&lt;br /&gt;
&lt;br /&gt;
===Feature Modules===&lt;br /&gt;
These modules provide feature specific code&lt;br /&gt;
 '''fusion-core-dao''' - contains generic DAO implementations for storing and querying for objects, not coupled to a specific object store, but we use hibernate, mongodb is also an option&lt;br /&gt;
 '''fusion-audit''' - audit events and centralised error handling&lt;br /&gt;
 '''fusion-sdmx-kafka''' - connecting to and sending/receiving messages to Apache Kafka&lt;br /&gt;
 '''fusion-sdmx-publication''' - SDMX Publication Tables: SdmxBean implementations, and business logic to materilise table based on definition&lt;br /&gt;
 '''fusion-sdmx-reporttemplate''' - Reporting Templates: SdmxBean implementations, and business logic to genearte excel workbook from template definition, reading data from workbooks&lt;br /&gt;
 '''fusion-sdmx-rest''' - SDMX web services, and additional web service implementations from APIs defined in fusion-api-service&lt;br /&gt;
 '''fusion-sdmx-search''' - Lucene search engine for structures&lt;br /&gt;
 '''fusion-sdmx-security''' - authentication against LDAP/AD/Fusion Security - contains user definition (SecurityDetailsImpl)&lt;br /&gt;
 '''fusion-xl''' - exposes web services required by the FusionXL Excel Plugin&lt;br /&gt;
&lt;br /&gt;
===Utility Modules===&lt;br /&gt;
Utility classes, typically public static classes, the utils projects may organise code by function rather then using the generic packaging structure (api, engine, manager, model, ...)&lt;br /&gt;
 '''fusion-utils''' - generic utility classes, not specific to SDMX&lt;br /&gt;
 '''fusion-utils-hibernate''' - implementation code to use Hibernate as a means to connect to the DAO&lt;br /&gt;
 '''fusion-utils-http''' - calling HTTP web services&lt;br /&gt;
 '''fusion-utils-json''' - JSON related utility classes&lt;br /&gt;
 '''fusion-utils-mail''' - email utility classes&lt;br /&gt;
 '''fusion-utils-mongodb'''  - implementation code to use MongoDB a means to store Objects&lt;br /&gt;
 '''fusion-utils-sdmx''' - SDMX Specific utility classes&lt;br /&gt;
 '''fusion-utils-spring''' - spring related utility classes&lt;br /&gt;
 '''fusion-utils-xlsx''' - reading/writing Excel workbooks related utility classes&lt;br /&gt;
&lt;br /&gt;
== Java Packages ==&lt;br /&gt;
Each module is partitioned into Java packages, with the exception of the utility modules, which typically separate code by its function. &lt;br /&gt;
&lt;br /&gt;
The generic packages are as follows.&lt;br /&gt;
&lt;br /&gt;
 '''api''' - contains interfaces relevant to the module &lt;br /&gt;
 '''application''' - contains code specific to the building of an application - this will contain any '''IFusionModule''' specific to this module (described later)&lt;br /&gt;
 '''constant''' - contains Java enums and java classes that contain public static constants&lt;br /&gt;
 '''engine''' - classes that 'do the work', many are stateless singletons, there are also stateful for example DataReader/WriterEngine &lt;br /&gt;
 '''factory''' - singleton classes that are responsible for generating an engine, typically called by a manager class, factories enable new features to be plugged into the framework&lt;br /&gt;
 '''filter'''  - REST web service filters (defined in web.xml) - filters are called before the web service&lt;br /&gt;
 '''manager''' - the main entry point for all high level functions, the manager's job is to verify the request (i.e. a security check) and manage the process of fulfilling the request by delegating the work to an engine or a DAO, a manager should be a fairly thin layer&lt;br /&gt;
 '''model''' - data transfer objects &lt;br /&gt;
 '''service''' (or rest) - web service entry points&lt;br /&gt;
 '''util''' - utility classes, typically containing public static methods&lt;br /&gt;
&lt;br /&gt;
The general logical flow of a system is the following&lt;br /&gt;
&lt;br /&gt;
 service --&amp;gt; manager --&amp;gt; engine&lt;br /&gt;
                     --&amp;gt; dao&lt;br /&gt;
&lt;br /&gt;
The service (web service entry point) is a thin layer which collects the request arguments, with minimal manipulation, and passes them to the respective Service Interface. The implementation of this Service Interface will create an appropriate model object (or objects) which contain a consolidated collection of arguments, some validation of arguments can be performed at this point, and then pass these to the manager Interface.  The manager will ensure the arguments are valid and the user has permission to perform the action.  The manager then provides the workflow required to fulfil the task, by making calls to engines and/or daos.&lt;br /&gt;
&lt;br /&gt;
= High Level Design =&lt;br /&gt;
&lt;br /&gt;
==[https://en.wikipedia.org/wiki/Inversion_of_control Inversion of Control] (IoC)==&lt;br /&gt;
&lt;br /&gt;
IoC is achieved by assigning all implementation classes to Interfaces and ensuring classes are stateless so that they can be singletons.  Managers are typically singletons.  This enables the system to be plugged together either by using the spring framework, or by using the sdmx.io framework.&lt;br /&gt;
&lt;br /&gt;
===Spring Framework===&lt;br /&gt;
Spring is used in the Java web application, web.xml references a number of spring bean files, which are located under src/main/resources/spring subfolder of the web application library.  The spring beans define the classes and which dependencies they are using. This works well for very large systems such as Fusion Metadata Registry which contains a large number of services and class definitions.&lt;br /&gt;
&lt;br /&gt;
===SDMX.IO IoC framework===&lt;br /&gt;
In order to remove the dependency on spring, and to simplify simpler projects, Sdmx.io provides a framework which allows instances of singleton classes to be registered to and obtained via the '''SingletonStore''' class.  When the class is not a singleton, instances can be registered with the '''FusionBeanStore''' class.  &lt;br /&gt;
&lt;br /&gt;
A running application would request a singleton instance in the following way.&lt;br /&gt;
&lt;br /&gt;
 private IActiveDirectorySecuritySettingsManager activeDirectorySecuritySettingsManager = SingletonStore.getSingleton(IActiveDirectorySecuritySettingsManager.class);&lt;br /&gt;
&lt;br /&gt;
This is typically done at the web service layer, as a web service is constructed outside of the spring framework, after the application has launched.&lt;br /&gt;
&lt;br /&gt;
There are some use cases where the singleton is not available at the time it is requested, typcially because it is during application startup and the bean has not yet been built and registered.  In this scenario the Singleton store can be asked to provide an instance when it is registered.&lt;br /&gt;
 &lt;br /&gt;
 SingletonStore.registerInterest(FusionProductInformationRetrievalManager.class, (bean) -&amp;gt; {&lt;br /&gt;
   infoRetreival = bean;&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
If the application wants multiple instances of an interface, then the FusionBeanStore is used&lt;br /&gt;
&lt;br /&gt;
 Collection&amp;lt;StructureWriterFactory&amp;gt; allBeans = FusionBeanStore.getBeans(StructureWriterFactory.class);&lt;br /&gt;
&lt;br /&gt;
===Using Spring/SDMX.IO===&lt;br /&gt;
In order to quickly register modules with the SDMX.IO framework, there are a number of classes that implement '''IFusionModule''', these classes have a register method, which on calling will automatically create and register instances of classes relevant to that module. &lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 CoreSDMXModule.register(); - register schema factories, cross reference resolution, reference metadata reader and writer manager&lt;br /&gt;
 SdmxMLModule.register();  - register SDMX-XML data and structure format readers and writers&lt;br /&gt;
 SdmxJsonModule.register(); - register SDMX-JSON data and structure format readers and writers&lt;br /&gt;
 FusionXLModule.register(); - register FusionXL classes for the excel plugin&lt;br /&gt;
 SdmxEDIModule.register(); - register SDMX-EDI data and structure format readers and writers&lt;br /&gt;
 FusionJsonModule.register();  - register Fusion-JSON data and structure format readers and writers&lt;br /&gt;
 SdmxCsvModule.register();  - register SDMX-CSV data format readers and writers&lt;br /&gt;
 FusionCoreDataModule.register();  - register SDMX-EDI data and structure format readers and writers&lt;br /&gt;
 XLSXModule.register();  - register reader and writer for Excel&lt;br /&gt;
 PublicationTableModule.register(); - classes to support Publication ables&lt;br /&gt;
  &lt;br /&gt;
The spring framework can be used in conjunction with the SDMX.IO IoC framework, as the class '''SpringBeansContainer''' which is a wrapper around the spring beans contained, can be used by both the SingletonStore and FusionBeansStore.  This allows SingletonStore and FusionBeansStore to search both the spring beans container, and any locally registered classes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Example Code =&lt;br /&gt;
The following example code blocks are all in one Java main method - which in a real system would not be the case, most of the code in these examples is setting up the system (registering modules and singletons), which is a one time system set up operation.  &lt;br /&gt;
&lt;br /&gt;
== Reading Structures ==&lt;br /&gt;
* Register the SDMX-ML module as the response from the URL is in SDMX-ML format&lt;br /&gt;
* Creates an instance of the StructureReaderManager  (typically in an application this would be a singleton). &lt;br /&gt;
* Creates a wrapper around a URL giving repeated access to the input stream of information, the URL resolves to an SDMX structure file containing multiple Dataflows&lt;br /&gt;
* Convert the stream into SDMX structures&lt;br /&gt;
* Loop the Dataflows and print the ID to the console&lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
  SdmxMLModule.register();&lt;br /&gt;
  StructureReaderManager srm = new StructureReaderManagerImpl();&lt;br /&gt;
  ReadableDataLocation rdl = new ReadableDataLocationTmp(new URL(&amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2/structure/dataflow&amp;quot;));&lt;br /&gt;
  SdmxBeans beans = srm.parseStructures(rdl);&lt;br /&gt;
  beans.getDataflows().forEach((flow) -&amp;gt; System.out.println(flow.getId()));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Writing / Transforming Structures ==&lt;br /&gt;
The same code as  Reading Structures, but with the addition lines in BOLD&lt;br /&gt;
&lt;br /&gt;
* Register the SDMX-JSON module as we are writing out in this format&lt;br /&gt;
* Creates an instance of the StructureWriterManager (typically in an application this would be a singleton). &lt;br /&gt;
* Writes the structures in FusionJson format to the system output&lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
  SdmxMLModule.register();&lt;br /&gt;
  '''SdmxJsonModule.register();'''&lt;br /&gt;
  StructureReaderManager srm = new StructureReaderManagerImpl();&lt;br /&gt;
  ReadableDataLocation rdl = new ReadableDataLocationTmp(new URL(&amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2/structure/dataflow&amp;quot;));&lt;br /&gt;
  SdmxBeans beans = srm.parseStructures(rdl);&lt;br /&gt;
  '''StructureWriterManager swm = new StructureWriterManagerImpl();'''&lt;br /&gt;
  '''swm.writeStructures(beans, FusionJsonStructureFormat.getInstance(), System.out);'''&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Data Read ==&lt;br /&gt;
Reading data requires access to both the dataset, and the structural metadata (DSD) which describes the data in terms of its Dimensions and Concepts.  &lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
    //SDMX WEB SERVICE&lt;br /&gt;
    String sdmxv2API = &amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2&amp;quot;;&lt;br /&gt;
    String dataflow = &amp;quot;dataflow/ECB/BSI/1.0&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    //Register modules for formats&lt;br /&gt;
    SdmxMLModule.register();&lt;br /&gt;
    	&lt;br /&gt;
    //Set up data reader and writer managers&lt;br /&gt;
    DataFormatManager dfm = new DataFormatManagerImpl(SdmxJsonDataFormat.INSTANCE, InformationFormatManager.getInstance());&lt;br /&gt;
    DataReaderManager drm = new DataReaderManagerImpl(dfm);&lt;br /&gt;
    	&lt;br /&gt;
    //Get Structures from URL into an in-memory store&lt;br /&gt;
    String structureURL = sdmxv2API + &amp;quot;/structure/&amp;quot;+dataflow+&amp;quot;?references=children&amp;quot;;&lt;br /&gt;
    SdmxBeanRetrievalManager beanRetrieval = new InMemoryRetrievalManagerFast(new ReadableDataLocationTmp(structureURL), new StructureReaderManagerImpl());&lt;br /&gt;
 &lt;br /&gt;
    //Get Data&lt;br /&gt;
    String dataQueryUrl = sdmxv2API+&amp;quot;/data/&amp;quot;+dataflow+&amp;quot;?c%5BFREQ%5D=A&amp;amp;c%5BREF_AREA%5D=DE,ES&amp;quot;;&lt;br /&gt;
    ReadableDataLocation sourceData = new ReadableDataLocationTmp(dataQueryUrl);&lt;br /&gt;
    DataReaderEngine dre = drm.getDataReaderEngine(sourceData, beanRetrieval, null);&lt;br /&gt;
    	&lt;br /&gt;
    while(dre.moveNextDataset()) {&lt;br /&gt;
      while(dre.moveNextKeyable()) {&lt;br /&gt;
        System.out.println(dre.getCurrentKey().getShortCode());&lt;br /&gt;
        while(dre.moveNextObservation()) {&lt;br /&gt;
          Observation obs = dre.getCurrentObservation();&lt;br /&gt;
          System.out.println(obs.getDimensionValue() + &amp;quot;=&amp;quot; + obs.getPrimaryMeasure());&lt;br /&gt;
        }&lt;br /&gt;
      }	&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Data Transformation ==&lt;br /&gt;
This example is a bit more involved, as the structures are no longer obtained as a file, but on demand from a web service.  This requires the registration of the REST classes.  In addition, as the output data format is SDMX JSON, the writer requires not only access to the DSD, but also all the metadata related to the DSD (Codelists, Concepts).  This requires the SdmxSuperBeanRetrievalManager, which is used to get a fully resolved tree of structural information.&lt;br /&gt;
&lt;br /&gt;
  public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
    //SDMX WEB SERVICE&lt;br /&gt;
    String sdmxv2API = &amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    //Register modules for formats&lt;br /&gt;
    SdmxMLModule.register();&lt;br /&gt;
    SdmxJsonModule.register();&lt;br /&gt;
    	&lt;br /&gt;
    //Manually register required instances		&lt;br /&gt;
    SingletonStore.registerInstance(new RESTQueryBrokerEngineImpl());&lt;br /&gt;
    SingletonStore.registerInstance(new StructureQueryBuilderRest());&lt;br /&gt;
    SingletonStore.registerInstance(new StructureReaderManagerImpl());&lt;br /&gt;
    	&lt;br /&gt;
    //Set up data reader and writer managers&lt;br /&gt;
    DataFormatManager dfm = new DataFormatManagerImpl(SdmxJsonDataFormat.INSTANCE, InformationFormatManager.getInstance());&lt;br /&gt;
    DataReaderManager drm = new DataReaderManagerImpl(dfm);&lt;br /&gt;
    DataWriterManager dwm = new DataWriterManagerImpl(dfm);&lt;br /&gt;
    	&lt;br /&gt;
    //JSON output format requires access to the metadata so labels can be resolved&lt;br /&gt;
    //Wrap the SDMX API ISdmxBeanRestRetrievalManager in a SdmxBeanRetrievalManager so the system can pull back the required structures on demand&lt;br /&gt;
    ISdmxBeanRestRetrievalManager restBeanRetrievalManager = new RESTSdmxBeanRetrievalManager(sdmxv2API, REST_API_VERSION.v2_0_0);&lt;br /&gt;
    SdmxBeanRetrievalManager beanRetrieval = new SdmxRestToBeanRetrievalManager(restBeanRetrievalManager);&lt;br /&gt;
 &lt;br /&gt;
    //Additionally wrap the SdmxBeanRetrievalManager to create a SdmxSuperBeanRetrievalManager, required when the full 'tree' of structral metadata is &lt;br /&gt;
    //required (i.e not just the SDMX Data Structure but resolved Concepts and Codelists in one fully resolved Object&lt;br /&gt;
    SdmxSuperBeanRetrievalManager sbRm = new SdmxSuperBeanRetrievalManagerImpl(beanRetrieval);&lt;br /&gt;
    	 &lt;br /&gt;
    //Register an instance of a SdmxBeanRetreivalContainer with the system, this is used as the default container to get a handle on implementations of the &lt;br /&gt;
    //structure retrieval interfaces - used by classes including the JSON writers&lt;br /&gt;
    SingletonStore.registerInstance(new SdmxBeanRetreivalContainer(beanRetrieval, null, sbRm, null, null, restBeanRetrievalManager));&lt;br /&gt;
    	&lt;br /&gt;
    //Get Data&lt;br /&gt;
    String dataQueryUrl = sdmxv2API+&amp;quot;/data/dataflow/ECB/BSI/1.0/?c%5BFREQ%5D=A&amp;amp;c%5BREF_AREA%5D=DE,ES&amp;quot;;&lt;br /&gt;
    ReadableDataLocation sourceData = new ReadableDataLocationTmp(dataQueryUrl);&lt;br /&gt;
    DataReaderEngine dre = drm.getDataReaderEngine(sourceData, beanRetrieval, null);&lt;br /&gt;
    	&lt;br /&gt;
    //Create Writer&lt;br /&gt;
    ISeriesObsDataWriterEngine dwe = dwm.getDataWriterEngine(SdmxJsonDataFormat.INSTANCE, System.out);&lt;br /&gt;
    	&lt;br /&gt;
    //Transform Data&lt;br /&gt;
    DataTransformOptions transformOptions = DataTransformOptions.getInstance().setCloseWriter(true); &lt;br /&gt;
    DataTransformationUtil.copyData(dre, dwe, transformOptions);&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7093</id>
		<title>DRAFT SDMX-CORE</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7093"/>
		<updated>2023-07-24T16:38:24Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Java Packages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architecture =&lt;br /&gt;
== Modules ==&lt;br /&gt;
The sdmx-io modules are as follows&lt;br /&gt;
===Interface Modules===&lt;br /&gt;
These modules contains Java Interfaces only, no Java classes.  The sdmx-io framework uses Interfaces over implementation classes in order to achieve loose coupling.&lt;br /&gt;
&lt;br /&gt;
 '''fusion-api'''  - contains generic Interfaces that are unrelated to SDMX. Each package in this project is broken down by function, i.e audit, cache, date, email, exception&lt;br /&gt;
 '''fusion-api-dao''' - contains Interface definitions for database persistence, not coupled to database platform, but all based on storage and retrieval of Java Objects&lt;br /&gt;
 '''fusion-api-sdmx''' - contains Interfaces for SDMX Information model (SdmxBeans and related), high level Interfaces for SDMX related functions which cross multiple modules&lt;br /&gt;
 '''fusion-api-service''' - contains Interfaces definitions for web services to use - allowing projects the implement web service entry points to not require web service dependencies&lt;br /&gt;
&lt;br /&gt;
===Implementation Modules===&lt;br /&gt;
These modules contain Java classes which are core to SDMX, they implement Interfaces in the higher api modules&lt;br /&gt;
 '''fusion-sdmx-im''' - contains the implementation code for the SDMX Information Model (SdmxBeans and related structures such as Codelists, Concepts, etc)&lt;br /&gt;
 '''fusion-core-data''' - contains code to read/write data and generic data related features such as determining series/obs, validation, temporary data stores&lt;br /&gt;
 '''fusion-core-sdmx''' - contains core code for structural metadata, including temporary store, cross reference resolution, contains some data and reference metadata features &lt;br /&gt;
 '''fusion-core-structure''' - contains core code for processing structural metadata &lt;br /&gt;
 '''fusion-core-xlsx''' - contains code to read and write structures and data in Excel &lt;br /&gt;
&lt;br /&gt;
===Format Modules===&lt;br /&gt;
These modules contains Java classes for reading and writing SDMX Structural Metadata, Reference Metadata, and Data&lt;br /&gt;
&lt;br /&gt;
 '''fusion-sdmx-csv''' - reading and writing SDMX-CSV format&lt;br /&gt;
 '''fusion-sdmx-edi''' - reading and writing SDMX-EDI format&lt;br /&gt;
 '''fusion-sdmx-json''' - reading and writing SDMX-JSON format&lt;br /&gt;
 '''fusion-sdmx-ml''' reading and writing SDMX-XML&lt;br /&gt;
&lt;br /&gt;
===Feature Modules===&lt;br /&gt;
These modules provide feature specific code&lt;br /&gt;
 '''fusion-core-dao''' - contains generic DAO implementations for storing and querying for objects, not coupled to a specific object store, but we use hibernate, mongodb is also an option&lt;br /&gt;
 '''fusion-audit''' - audit events and centralised error handling&lt;br /&gt;
 '''fusion-sdmx-kafka''' - connecting to and sending/receiving messages to Apache Kafka&lt;br /&gt;
 '''fusion-sdmx-publication''' - SDMX Publication Tables: SdmxBean implementations, and business logic to materilise table based on definition&lt;br /&gt;
 '''fusion-sdmx-reporttemplate''' - Reporting Templates: SdmxBean implementations, and business logic to genearte excel workbook from template definition, reading data from workbooks&lt;br /&gt;
 '''fusion-sdmx-rest''' - SDMX web services, and additional web service implementations from APIs defined in fusion-api-service&lt;br /&gt;
 '''fusion-sdmx-search''' - Lucene search engine for structures&lt;br /&gt;
 '''fusion-sdmx-security''' - authentication against LDAP/AD/Fusion Security - contains user definition (SecurityDetailsImpl)&lt;br /&gt;
 '''fusion-xl''' - exposes web services required by the FusionXL Excel Plugin&lt;br /&gt;
&lt;br /&gt;
===Utility Modules===&lt;br /&gt;
Utility classes, typically public static classes, the utils projects may organise code by function rather then using the generic packaging structure (api, engine, manager, model, ...)&lt;br /&gt;
 '''fusion-utils''' - generic utility classes, not specific to SDMX&lt;br /&gt;
 '''fusion-utils-hibernate''' - implementation code to use Hibernate as a means to connect to the DAO&lt;br /&gt;
 '''fusion-utils-http''' - calling HTTP web services&lt;br /&gt;
 '''fusion-utils-json''' - JSON related utility classes&lt;br /&gt;
 '''fusion-utils-mail''' - email utility classes&lt;br /&gt;
 '''fusion-utils-mongodb'''  - implementation code to use MongoDB a means to store Objects&lt;br /&gt;
 '''fusion-utils-sdmx''' - SDMX Specific utility classes&lt;br /&gt;
 '''fusion-utils-spring''' - spring related utility classes&lt;br /&gt;
 '''fusion-utils-xlsx''' - reading/writing Excel workbooks related utility classes&lt;br /&gt;
&lt;br /&gt;
== Java Packages ==&lt;br /&gt;
Each module is partitioned into Java packages, with the exception of the utility modules, which typically separate code by its function. &lt;br /&gt;
&lt;br /&gt;
The generic packages are as follows.&lt;br /&gt;
&lt;br /&gt;
 '''api''' - contains interfaces relevant to the module &lt;br /&gt;
 '''application''' - contains code specific to the building of an application - this will contain any '''IFusionModule''' specific to this module (described later)&lt;br /&gt;
 '''constant''' - contains Java enums and java classes that contain public static constants&lt;br /&gt;
 '''engine''' - classes that 'do the work', many are stateless singletons, there are also stateful for example DataReader/WriterEngine &lt;br /&gt;
 '''factory''' - singleton classes that are responsible for generating an engine, typically called by a manager class, factories enable new features to be plugged into the framework&lt;br /&gt;
 '''filter'''  - REST web service filters (defined in web.xml) - filters are called before the web service&lt;br /&gt;
 '''manager''' - the main entry point for all high level functions, the manager's job is to verify the request (i.e. a security check) and manage the process of fulfilling the request by delegating the work to an engine or a DAO, a manager should be a fairly thin layer&lt;br /&gt;
 '''model''' - data transfer objects &lt;br /&gt;
 '''service''' (or rest) - web service entry points&lt;br /&gt;
 '''util''' - utility classes, typically containing public static methods&lt;br /&gt;
&lt;br /&gt;
The general logical flow of a system is the following&lt;br /&gt;
&lt;br /&gt;
 service --&amp;gt; manager --&amp;gt; engine&lt;br /&gt;
                     --&amp;gt; dao&lt;br /&gt;
&lt;br /&gt;
The service (web service entry point) is a thin layer which collects the request arguments, with minimal manipulation, and passes them to the respective Service Interface. The implementation of this Service Interface will create an appropriate model object (or objects) which contain a consolidated collection of arguments, some validation of arguments can be performed at this point, and then pass these to the manager Interface.  The manager will ensure the arguments are valid and the user has permission to perform the action.  The manager then provides the workflow required to fulfil the task, by making calls to engines and/or daos.&lt;br /&gt;
&lt;br /&gt;
= High Level Design =&lt;br /&gt;
&lt;br /&gt;
==[https://en.wikipedia.org/wiki/Inversion_of_control Inversion of Control] (IoC)==&lt;br /&gt;
&lt;br /&gt;
IoC is achieved by assigning all implementation classes to Interfaces and ensuring classes are stateless so that they can be singletons.  Managers are typically singletons.  This enables the system to be plugged together either by using the spring framework, or by using the sdmx.io framework.&lt;br /&gt;
&lt;br /&gt;
===Spring Framework===&lt;br /&gt;
Spring is used in the Java web application, web.xml references a number of spring bean files, which are located under src/main/resources/spring subfolder of the web application library.  The spring beans define the classes and which dependencies they are using. This works well for very large systems such as Fusion Metadata Registry which contains a large number of services and class definitions.&lt;br /&gt;
&lt;br /&gt;
===SDMX.IO IoC framework===&lt;br /&gt;
In order to remove the dependency on spring, and to simplify simpler projects, Sdmx.io provides a framework which allows instances of singleton classes to be registered to and obtained via the '''SingletonStore''' class.  When the class is not a singleton instances can be registered with the '''FusionBeanStore''' class.  &lt;br /&gt;
&lt;br /&gt;
A running application would request a singleton instance in the following way.&lt;br /&gt;
&lt;br /&gt;
 private IActiveDirectorySecuritySettingsManager activeDirectorySecuritySettingsManager = SingletonStore.getSingleton(IActiveDirectorySecuritySettingsManager.class);&lt;br /&gt;
&lt;br /&gt;
This is typically done at the web service layer, as a web service is constructed outside of the spring framework, after the application has launched.&lt;br /&gt;
&lt;br /&gt;
There are some use cases where the singleton is not available at the time it is requested, typcially because it is during application startup and the bean has not yet been built and registered.  In this scenario the Singleton store can be asked to provide an instance when it is registered.&lt;br /&gt;
 &lt;br /&gt;
 SingletonStore.registerInterest(FusionProductInformationRetrievalManager.class, (bean) -&amp;gt; {&lt;br /&gt;
   infoRetreival = bean;&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
If the application wants multiple instances of an interface, then the FusionBeanStore is used&lt;br /&gt;
&lt;br /&gt;
 Collection&amp;lt;StructureWriterFactory&amp;gt; allBeans = FusionBeanStore.getBeans(StructureWriterFactory.class);&lt;br /&gt;
&lt;br /&gt;
===Using Spring/SDMX.IO===&lt;br /&gt;
In order to quickly register modules with the SDMX.IO framework, there are a number of classes that implement '''IFusionModule''', these classes have a register method, which on calling will automatically create and register instances of classes relevant to that module. &lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 CoreSDMXModule.register(); - register schema factories, cross reference resolution, reference metadata reader and writer manager&lt;br /&gt;
 SdmxMLModule.register();  - register SDMX-XML data and structure format readers and writers&lt;br /&gt;
 SdmxJsonModule.register(); - register SDMX-JSON data and structure format readers and writers&lt;br /&gt;
 FusionXLModule.register(); - register FusionXL classes for the excel plugin&lt;br /&gt;
 SdmxEDIModule.register(); - register SDMX-EDI data and structure format readers and writers&lt;br /&gt;
 FusionJsonModule.register();  - register Fusion-JSON data and structure format readers and writers&lt;br /&gt;
 SdmxCsvModule.register();  - register SDMX-CSV data format readers and writers&lt;br /&gt;
 FusionCoreDataModule.register();  - register SDMX-EDI data and structure format readers and writers&lt;br /&gt;
 XLSXModule.register();  - register reader and writer for Excel&lt;br /&gt;
 PublicationTableModule.register(); - classes to support Publication ables&lt;br /&gt;
  &lt;br /&gt;
The spring framework can be used in conjunction with the SDMX.IO IoC framework, as the class '''SpringBeansContainer''' which is a wrapper around the spring beans contained, can be used by both the SingletonStore and FusionBeansStore.  This allows SingletonStore and FusionBeansStore to search both the spring beans container, and any locally registered classes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Example Code =&lt;br /&gt;
The following example code blocks are all in one Java main method - which in a real system would not be the case, most of the code in these examples is setting up the system (registering modules and singletons), which is a one time system set up operation.  &lt;br /&gt;
&lt;br /&gt;
== Reading Structures ==&lt;br /&gt;
* Register the SDMX-ML module as the response from the URL is in SDMX-ML format&lt;br /&gt;
* Creates an instance of the StructureReaderManager  (typically in an application this would be a singleton). &lt;br /&gt;
* Creates a wrapper around a URL giving repeated access to the input stream of information, the URL resolves to an SDMX structure file containing multiple Dataflows&lt;br /&gt;
* Convert the stream into SDMX structures&lt;br /&gt;
* Loop the Dataflows and print the ID to the console&lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
  SdmxMLModule.register();&lt;br /&gt;
  StructureReaderManager srm = new StructureReaderManagerImpl();&lt;br /&gt;
  ReadableDataLocation rdl = new ReadableDataLocationTmp(new URL(&amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2/structure/dataflow&amp;quot;));&lt;br /&gt;
  SdmxBeans beans = srm.parseStructures(rdl);&lt;br /&gt;
  beans.getDataflows().forEach((flow) -&amp;gt; System.out.println(flow.getId()));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Writing / Transforming Structures ==&lt;br /&gt;
The same code as  Reading Structures, but with the addition lines in BOLD&lt;br /&gt;
&lt;br /&gt;
* Register the SDMX-JSON module as we are writing out in this format&lt;br /&gt;
* Creates an instance of the StructureWriterManager (typically in an application this would be a singleton). &lt;br /&gt;
* Writes the structures in FusionJson format to the system output&lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
  SdmxMLModule.register();&lt;br /&gt;
  '''SdmxJsonModule.register();'''&lt;br /&gt;
  StructureReaderManager srm = new StructureReaderManagerImpl();&lt;br /&gt;
  ReadableDataLocation rdl = new ReadableDataLocationTmp(new URL(&amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2/structure/dataflow&amp;quot;));&lt;br /&gt;
  SdmxBeans beans = srm.parseStructures(rdl);&lt;br /&gt;
  '''StructureWriterManager swm = new StructureWriterManagerImpl();'''&lt;br /&gt;
  '''swm.writeStructures(beans, FusionJsonStructureFormat.getInstance(), System.out);'''&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Data Read ==&lt;br /&gt;
Reading data requires access to both the dataset, and the structural metadata (DSD) which describes the data in terms of its Dimensions and Concepts.  &lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
    //SDMX WEB SERVICE&lt;br /&gt;
    String sdmxv2API = &amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2&amp;quot;;&lt;br /&gt;
    String dataflow = &amp;quot;dataflow/ECB/BSI/1.0&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    //Register modules for formats&lt;br /&gt;
    SdmxMLModule.register();&lt;br /&gt;
    	&lt;br /&gt;
    //Set up data reader and writer managers&lt;br /&gt;
    DataFormatManager dfm = new DataFormatManagerImpl(SdmxJsonDataFormat.INSTANCE, InformationFormatManager.getInstance());&lt;br /&gt;
    DataReaderManager drm = new DataReaderManagerImpl(dfm);&lt;br /&gt;
    	&lt;br /&gt;
    //Get Structures from URL into an in-memory store&lt;br /&gt;
    String structureURL = sdmxv2API + &amp;quot;/structure/&amp;quot;+dataflow+&amp;quot;?references=children&amp;quot;;&lt;br /&gt;
    SdmxBeanRetrievalManager beanRetrieval = new InMemoryRetrievalManagerFast(new ReadableDataLocationTmp(structureURL), new StructureReaderManagerImpl());&lt;br /&gt;
 &lt;br /&gt;
    //Get Data&lt;br /&gt;
    String dataQueryUrl = sdmxv2API+&amp;quot;/data/&amp;quot;+dataflow+&amp;quot;?c%5BFREQ%5D=A&amp;amp;c%5BREF_AREA%5D=DE,ES&amp;quot;;&lt;br /&gt;
    ReadableDataLocation sourceData = new ReadableDataLocationTmp(dataQueryUrl);&lt;br /&gt;
    DataReaderEngine dre = drm.getDataReaderEngine(sourceData, beanRetrieval, null);&lt;br /&gt;
    	&lt;br /&gt;
    while(dre.moveNextDataset()) {&lt;br /&gt;
      while(dre.moveNextKeyable()) {&lt;br /&gt;
        System.out.println(dre.getCurrentKey().getShortCode());&lt;br /&gt;
        while(dre.moveNextObservation()) {&lt;br /&gt;
          Observation obs = dre.getCurrentObservation();&lt;br /&gt;
          System.out.println(obs.getDimensionValue() + &amp;quot;=&amp;quot; + obs.getPrimaryMeasure());&lt;br /&gt;
        }&lt;br /&gt;
      }	&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Data Transformation ==&lt;br /&gt;
This example is a bit more involved, as the structures are no longer obtained as a file, but on demand from a web service.  This requires the registration of the REST classes.  In addition, as the output data format is SDMX JSON, the writer requires not only access to the DSD, but also all the metadata related to the DSD (Codelists, Concepts).  This requires the SdmxSuperBeanRetrievalManager, which is used to get a fully resolved tree of structural information.&lt;br /&gt;
&lt;br /&gt;
  public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
    //SDMX WEB SERVICE&lt;br /&gt;
    String sdmxv2API = &amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    //Register modules for formats&lt;br /&gt;
    SdmxMLModule.register();&lt;br /&gt;
    SdmxJsonModule.register();&lt;br /&gt;
    	&lt;br /&gt;
    //Manually register required instances		&lt;br /&gt;
    SingletonStore.registerInstance(new RESTQueryBrokerEngineImpl());&lt;br /&gt;
    SingletonStore.registerInstance(new StructureQueryBuilderRest());&lt;br /&gt;
    SingletonStore.registerInstance(new StructureReaderManagerImpl());&lt;br /&gt;
    	&lt;br /&gt;
    //Set up data reader and writer managers&lt;br /&gt;
    DataFormatManager dfm = new DataFormatManagerImpl(SdmxJsonDataFormat.INSTANCE, InformationFormatManager.getInstance());&lt;br /&gt;
    DataReaderManager drm = new DataReaderManagerImpl(dfm);&lt;br /&gt;
    DataWriterManager dwm = new DataWriterManagerImpl(dfm);&lt;br /&gt;
    	&lt;br /&gt;
    //JSON output format requires access to the metadata so labels can be resolved&lt;br /&gt;
    //Wrap the SDMX API ISdmxBeanRestRetrievalManager in a SdmxBeanRetrievalManager so the system can pull back the required structures on demand&lt;br /&gt;
    ISdmxBeanRestRetrievalManager restBeanRetrievalManager = new RESTSdmxBeanRetrievalManager(sdmxv2API, REST_API_VERSION.v2_0_0);&lt;br /&gt;
    SdmxBeanRetrievalManager beanRetrieval = new SdmxRestToBeanRetrievalManager(restBeanRetrievalManager);&lt;br /&gt;
 &lt;br /&gt;
    //Additionally wrap the SdmxBeanRetrievalManager to create a SdmxSuperBeanRetrievalManager, required when the full 'tree' of structral metadata is &lt;br /&gt;
    //required (i.e not just the SDMX Data Structure but resolved Concepts and Codelists in one fully resolved Object&lt;br /&gt;
    SdmxSuperBeanRetrievalManager sbRm = new SdmxSuperBeanRetrievalManagerImpl(beanRetrieval);&lt;br /&gt;
    	 &lt;br /&gt;
    //Register an instance of a SdmxBeanRetreivalContainer with the system, this is used as the default container to get a handle on implementations of the &lt;br /&gt;
    //structure retrieval interfaces - used by classes including the JSON writers&lt;br /&gt;
    SingletonStore.registerInstance(new SdmxBeanRetreivalContainer(beanRetrieval, null, sbRm, null, null, restBeanRetrievalManager));&lt;br /&gt;
    	&lt;br /&gt;
    //Get Data&lt;br /&gt;
    String dataQueryUrl = sdmxv2API+&amp;quot;/data/dataflow/ECB/BSI/1.0/?c%5BFREQ%5D=A&amp;amp;c%5BREF_AREA%5D=DE,ES&amp;quot;;&lt;br /&gt;
    ReadableDataLocation sourceData = new ReadableDataLocationTmp(dataQueryUrl);&lt;br /&gt;
    DataReaderEngine dre = drm.getDataReaderEngine(sourceData, beanRetrieval, null);&lt;br /&gt;
    	&lt;br /&gt;
    //Create Writer&lt;br /&gt;
    ISeriesObsDataWriterEngine dwe = dwm.getDataWriterEngine(SdmxJsonDataFormat.INSTANCE, System.out);&lt;br /&gt;
    	&lt;br /&gt;
    //Transform Data&lt;br /&gt;
    DataTransformOptions transformOptions = DataTransformOptions.getInstance().setCloseWriter(true); &lt;br /&gt;
    DataTransformationUtil.copyData(dre, dwe, transformOptions);&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7092</id>
		<title>DRAFT SDMX-CORE</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7092"/>
		<updated>2023-07-24T16:37:36Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Java Packages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architecture =&lt;br /&gt;
== Modules ==&lt;br /&gt;
The sdmx-io modules are as follows&lt;br /&gt;
===Interface Modules===&lt;br /&gt;
These modules contains Java Interfaces only, no Java classes.  The sdmx-io framework uses Interfaces over implementation classes in order to achieve loose coupling.&lt;br /&gt;
&lt;br /&gt;
 '''fusion-api'''  - contains generic Interfaces that are unrelated to SDMX. Each package in this project is broken down by function, i.e audit, cache, date, email, exception&lt;br /&gt;
 '''fusion-api-dao''' - contains Interface definitions for database persistence, not coupled to database platform, but all based on storage and retrieval of Java Objects&lt;br /&gt;
 '''fusion-api-sdmx''' - contains Interfaces for SDMX Information model (SdmxBeans and related), high level Interfaces for SDMX related functions which cross multiple modules&lt;br /&gt;
 '''fusion-api-service''' - contains Interfaces definitions for web services to use - allowing projects the implement web service entry points to not require web service dependencies&lt;br /&gt;
&lt;br /&gt;
===Implementation Modules===&lt;br /&gt;
These modules contain Java classes which are core to SDMX, they implement Interfaces in the higher api modules&lt;br /&gt;
 '''fusion-sdmx-im''' - contains the implementation code for the SDMX Information Model (SdmxBeans and related structures such as Codelists, Concepts, etc)&lt;br /&gt;
 '''fusion-core-data''' - contains code to read/write data and generic data related features such as determining series/obs, validation, temporary data stores&lt;br /&gt;
 '''fusion-core-sdmx''' - contains core code for structural metadata, including temporary store, cross reference resolution, contains some data and reference metadata features &lt;br /&gt;
 '''fusion-core-structure''' - contains core code for processing structural metadata &lt;br /&gt;
 '''fusion-core-xlsx''' - contains code to read and write structures and data in Excel &lt;br /&gt;
&lt;br /&gt;
===Format Modules===&lt;br /&gt;
These modules contains Java classes for reading and writing SDMX Structural Metadata, Reference Metadata, and Data&lt;br /&gt;
&lt;br /&gt;
 '''fusion-sdmx-csv''' - reading and writing SDMX-CSV format&lt;br /&gt;
 '''fusion-sdmx-edi''' - reading and writing SDMX-EDI format&lt;br /&gt;
 '''fusion-sdmx-json''' - reading and writing SDMX-JSON format&lt;br /&gt;
 '''fusion-sdmx-ml''' reading and writing SDMX-XML&lt;br /&gt;
&lt;br /&gt;
===Feature Modules===&lt;br /&gt;
These modules provide feature specific code&lt;br /&gt;
 '''fusion-core-dao''' - contains generic DAO implementations for storing and querying for objects, not coupled to a specific object store, but we use hibernate, mongodb is also an option&lt;br /&gt;
 '''fusion-audit''' - audit events and centralised error handling&lt;br /&gt;
 '''fusion-sdmx-kafka''' - connecting to and sending/receiving messages to Apache Kafka&lt;br /&gt;
 '''fusion-sdmx-publication''' - SDMX Publication Tables: SdmxBean implementations, and business logic to materilise table based on definition&lt;br /&gt;
 '''fusion-sdmx-reporttemplate''' - Reporting Templates: SdmxBean implementations, and business logic to genearte excel workbook from template definition, reading data from workbooks&lt;br /&gt;
 '''fusion-sdmx-rest''' - SDMX web services, and additional web service implementations from APIs defined in fusion-api-service&lt;br /&gt;
 '''fusion-sdmx-search''' - Lucene search engine for structures&lt;br /&gt;
 '''fusion-sdmx-security''' - authentication against LDAP/AD/Fusion Security - contains user definition (SecurityDetailsImpl)&lt;br /&gt;
 '''fusion-xl''' - exposes web services required by the FusionXL Excel Plugin&lt;br /&gt;
&lt;br /&gt;
===Utility Modules===&lt;br /&gt;
Utility classes, typically public static classes, the utils projects may organise code by function rather then using the generic packaging structure (api, engine, manager, model, ...)&lt;br /&gt;
 '''fusion-utils''' - generic utility classes, not specific to SDMX&lt;br /&gt;
 '''fusion-utils-hibernate''' - implementation code to use Hibernate as a means to connect to the DAO&lt;br /&gt;
 '''fusion-utils-http''' - calling HTTP web services&lt;br /&gt;
 '''fusion-utils-json''' - JSON related utility classes&lt;br /&gt;
 '''fusion-utils-mail''' - email utility classes&lt;br /&gt;
 '''fusion-utils-mongodb'''  - implementation code to use MongoDB a means to store Objects&lt;br /&gt;
 '''fusion-utils-sdmx''' - SDMX Specific utility classes&lt;br /&gt;
 '''fusion-utils-spring''' - spring related utility classes&lt;br /&gt;
 '''fusion-utils-xlsx''' - reading/writing Excel workbooks related utility classes&lt;br /&gt;
&lt;br /&gt;
== Java Packages ==&lt;br /&gt;
Each module is partitioned into Java packages, with the exception of the utility modules, which typically separate code by its function. &lt;br /&gt;
&lt;br /&gt;
The generic packages are as follows.&lt;br /&gt;
&lt;br /&gt;
 '''api''' - contains interfaces relevant to the module &lt;br /&gt;
 '''application''' - contains code specific to the building of an application - this will contain any '''IFusionModule''' specific to this module (described later)&lt;br /&gt;
 '''constant''' - contains Java enums and java classes that contain public static constants&lt;br /&gt;
 '''engine''' - classes that 'do the work', many are stateless singletons, there are also stateful for example DataReader/WriterEngine &lt;br /&gt;
 '''factory''' - singleton classes that are responsible for generating an engine, typically called by a manager class, factories enable new features to be plugged into the framework&lt;br /&gt;
 '''filter'''  - REST web service filters (defined in web.xml) - filters are called before the web service&lt;br /&gt;
 '''manager''' - the main entry point for all high level functions, the manager's job is to verify the request (i.e. a security check) and manage the process of fulfilling the request by delegating the work to an engine or a DAO, a manager should be a fairly thin layer&lt;br /&gt;
 '''model''' - data transfer objects &lt;br /&gt;
 '''service''' (or rest) - web service entry points&lt;br /&gt;
 '''util''' - utility classes, typically containing public static methods&lt;br /&gt;
&lt;br /&gt;
The general logical flow of a system is the following&lt;br /&gt;
&lt;br /&gt;
 service --&amp;gt; manager --&amp;gt; engine&lt;br /&gt;
                     --&amp;gt; dao&lt;br /&gt;
&lt;br /&gt;
The service (web service entry point) is a thin layer which collects the request arguments, with minimal manipulation, and passes them to the respective Service Interface. The implementation of this Service Interface will create an appropriate model object (or objects) which contain a consolidated collection of arguments, some validation of arguments can be performed at this point, and then pass these to the manager Interface.  The manager will ensure the arguments are valid and the user has permission to perform the action.  The manager then provides the workflow required to fulfil the task, by making calls to engines, daos.&lt;br /&gt;
&lt;br /&gt;
= High Level Design =&lt;br /&gt;
&lt;br /&gt;
==[https://en.wikipedia.org/wiki/Inversion_of_control Inversion of Control] (IoC)==&lt;br /&gt;
&lt;br /&gt;
IoC is achieved by assigning all implementation classes to Interfaces and ensuring classes are stateless so that they can be singletons.  Managers are typically singletons.  This enables the system to be plugged together either by using the spring framework, or by using the sdmx.io framework.&lt;br /&gt;
&lt;br /&gt;
===Spring Framework===&lt;br /&gt;
Spring is used in the Java web application, web.xml references a number of spring bean files, which are located under src/main/resources/spring subfolder of the web application library.  The spring beans define the classes and which dependencies they are using. This works well for very large systems such as Fusion Metadata Registry which contains a large number of services and class definitions.&lt;br /&gt;
&lt;br /&gt;
===SDMX.IO IoC framework===&lt;br /&gt;
In order to remove the dependency on spring, and to simplify simpler projects, Sdmx.io provides a framework which allows instances of singleton classes to be registered to and obtained via the '''SingletonStore''' class.  When the class is not a singleton instances can be registered with the '''FusionBeanStore''' class.  &lt;br /&gt;
&lt;br /&gt;
A running application would request a singleton instance in the following way.&lt;br /&gt;
&lt;br /&gt;
 private IActiveDirectorySecuritySettingsManager activeDirectorySecuritySettingsManager = SingletonStore.getSingleton(IActiveDirectorySecuritySettingsManager.class);&lt;br /&gt;
&lt;br /&gt;
This is typically done at the web service layer, as a web service is constructed outside of the spring framework, after the application has launched.&lt;br /&gt;
&lt;br /&gt;
There are some use cases where the singleton is not available at the time it is requested, typcially because it is during application startup and the bean has not yet been built and registered.  In this scenario the Singleton store can be asked to provide an instance when it is registered.&lt;br /&gt;
 &lt;br /&gt;
 SingletonStore.registerInterest(FusionProductInformationRetrievalManager.class, (bean) -&amp;gt; {&lt;br /&gt;
   infoRetreival = bean;&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
If the application wants multiple instances of an interface, then the FusionBeanStore is used&lt;br /&gt;
&lt;br /&gt;
 Collection&amp;lt;StructureWriterFactory&amp;gt; allBeans = FusionBeanStore.getBeans(StructureWriterFactory.class);&lt;br /&gt;
&lt;br /&gt;
===Using Spring/SDMX.IO===&lt;br /&gt;
In order to quickly register modules with the SDMX.IO framework, there are a number of classes that implement '''IFusionModule''', these classes have a register method, which on calling will automatically create and register instances of classes relevant to that module. &lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 CoreSDMXModule.register(); - register schema factories, cross reference resolution, reference metadata reader and writer manager&lt;br /&gt;
 SdmxMLModule.register();  - register SDMX-XML data and structure format readers and writers&lt;br /&gt;
 SdmxJsonModule.register(); - register SDMX-JSON data and structure format readers and writers&lt;br /&gt;
 FusionXLModule.register(); - register FusionXL classes for the excel plugin&lt;br /&gt;
 SdmxEDIModule.register(); - register SDMX-EDI data and structure format readers and writers&lt;br /&gt;
 FusionJsonModule.register();  - register Fusion-JSON data and structure format readers and writers&lt;br /&gt;
 SdmxCsvModule.register();  - register SDMX-CSV data format readers and writers&lt;br /&gt;
 FusionCoreDataModule.register();  - register SDMX-EDI data and structure format readers and writers&lt;br /&gt;
 XLSXModule.register();  - register reader and writer for Excel&lt;br /&gt;
 PublicationTableModule.register(); - classes to support Publication ables&lt;br /&gt;
  &lt;br /&gt;
The spring framework can be used in conjunction with the SDMX.IO IoC framework, as the class '''SpringBeansContainer''' which is a wrapper around the spring beans contained, can be used by both the SingletonStore and FusionBeansStore.  This allows SingletonStore and FusionBeansStore to search both the spring beans container, and any locally registered classes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Example Code =&lt;br /&gt;
The following example code blocks are all in one Java main method - which in a real system would not be the case, most of the code in these examples is setting up the system (registering modules and singletons), which is a one time system set up operation.  &lt;br /&gt;
&lt;br /&gt;
== Reading Structures ==&lt;br /&gt;
* Register the SDMX-ML module as the response from the URL is in SDMX-ML format&lt;br /&gt;
* Creates an instance of the StructureReaderManager  (typically in an application this would be a singleton). &lt;br /&gt;
* Creates a wrapper around a URL giving repeated access to the input stream of information, the URL resolves to an SDMX structure file containing multiple Dataflows&lt;br /&gt;
* Convert the stream into SDMX structures&lt;br /&gt;
* Loop the Dataflows and print the ID to the console&lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
  SdmxMLModule.register();&lt;br /&gt;
  StructureReaderManager srm = new StructureReaderManagerImpl();&lt;br /&gt;
  ReadableDataLocation rdl = new ReadableDataLocationTmp(new URL(&amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2/structure/dataflow&amp;quot;));&lt;br /&gt;
  SdmxBeans beans = srm.parseStructures(rdl);&lt;br /&gt;
  beans.getDataflows().forEach((flow) -&amp;gt; System.out.println(flow.getId()));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Writing / Transforming Structures ==&lt;br /&gt;
The same code as  Reading Structures, but with the addition lines in BOLD&lt;br /&gt;
&lt;br /&gt;
* Register the SDMX-JSON module as we are writing out in this format&lt;br /&gt;
* Creates an instance of the StructureWriterManager (typically in an application this would be a singleton). &lt;br /&gt;
* Writes the structures in FusionJson format to the system output&lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
  SdmxMLModule.register();&lt;br /&gt;
  '''SdmxJsonModule.register();'''&lt;br /&gt;
  StructureReaderManager srm = new StructureReaderManagerImpl();&lt;br /&gt;
  ReadableDataLocation rdl = new ReadableDataLocationTmp(new URL(&amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2/structure/dataflow&amp;quot;));&lt;br /&gt;
  SdmxBeans beans = srm.parseStructures(rdl);&lt;br /&gt;
  '''StructureWriterManager swm = new StructureWriterManagerImpl();'''&lt;br /&gt;
  '''swm.writeStructures(beans, FusionJsonStructureFormat.getInstance(), System.out);'''&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Data Read ==&lt;br /&gt;
Reading data requires access to both the dataset, and the structural metadata (DSD) which describes the data in terms of its Dimensions and Concepts.  &lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
    //SDMX WEB SERVICE&lt;br /&gt;
    String sdmxv2API = &amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2&amp;quot;;&lt;br /&gt;
    String dataflow = &amp;quot;dataflow/ECB/BSI/1.0&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    //Register modules for formats&lt;br /&gt;
    SdmxMLModule.register();&lt;br /&gt;
    	&lt;br /&gt;
    //Set up data reader and writer managers&lt;br /&gt;
    DataFormatManager dfm = new DataFormatManagerImpl(SdmxJsonDataFormat.INSTANCE, InformationFormatManager.getInstance());&lt;br /&gt;
    DataReaderManager drm = new DataReaderManagerImpl(dfm);&lt;br /&gt;
    	&lt;br /&gt;
    //Get Structures from URL into an in-memory store&lt;br /&gt;
    String structureURL = sdmxv2API + &amp;quot;/structure/&amp;quot;+dataflow+&amp;quot;?references=children&amp;quot;;&lt;br /&gt;
    SdmxBeanRetrievalManager beanRetrieval = new InMemoryRetrievalManagerFast(new ReadableDataLocationTmp(structureURL), new StructureReaderManagerImpl());&lt;br /&gt;
 &lt;br /&gt;
    //Get Data&lt;br /&gt;
    String dataQueryUrl = sdmxv2API+&amp;quot;/data/&amp;quot;+dataflow+&amp;quot;?c%5BFREQ%5D=A&amp;amp;c%5BREF_AREA%5D=DE,ES&amp;quot;;&lt;br /&gt;
    ReadableDataLocation sourceData = new ReadableDataLocationTmp(dataQueryUrl);&lt;br /&gt;
    DataReaderEngine dre = drm.getDataReaderEngine(sourceData, beanRetrieval, null);&lt;br /&gt;
    	&lt;br /&gt;
    while(dre.moveNextDataset()) {&lt;br /&gt;
      while(dre.moveNextKeyable()) {&lt;br /&gt;
        System.out.println(dre.getCurrentKey().getShortCode());&lt;br /&gt;
        while(dre.moveNextObservation()) {&lt;br /&gt;
          Observation obs = dre.getCurrentObservation();&lt;br /&gt;
          System.out.println(obs.getDimensionValue() + &amp;quot;=&amp;quot; + obs.getPrimaryMeasure());&lt;br /&gt;
        }&lt;br /&gt;
      }	&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Data Transformation ==&lt;br /&gt;
This example is a bit more involved, as the structures are no longer obtained as a file, but on demand from a web service.  This requires the registration of the REST classes.  In addition, as the output data format is SDMX JSON, the writer requires not only access to the DSD, but also all the metadata related to the DSD (Codelists, Concepts).  This requires the SdmxSuperBeanRetrievalManager, which is used to get a fully resolved tree of structural information.&lt;br /&gt;
&lt;br /&gt;
  public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
    //SDMX WEB SERVICE&lt;br /&gt;
    String sdmxv2API = &amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    //Register modules for formats&lt;br /&gt;
    SdmxMLModule.register();&lt;br /&gt;
    SdmxJsonModule.register();&lt;br /&gt;
    	&lt;br /&gt;
    //Manually register required instances		&lt;br /&gt;
    SingletonStore.registerInstance(new RESTQueryBrokerEngineImpl());&lt;br /&gt;
    SingletonStore.registerInstance(new StructureQueryBuilderRest());&lt;br /&gt;
    SingletonStore.registerInstance(new StructureReaderManagerImpl());&lt;br /&gt;
    	&lt;br /&gt;
    //Set up data reader and writer managers&lt;br /&gt;
    DataFormatManager dfm = new DataFormatManagerImpl(SdmxJsonDataFormat.INSTANCE, InformationFormatManager.getInstance());&lt;br /&gt;
    DataReaderManager drm = new DataReaderManagerImpl(dfm);&lt;br /&gt;
    DataWriterManager dwm = new DataWriterManagerImpl(dfm);&lt;br /&gt;
    	&lt;br /&gt;
    //JSON output format requires access to the metadata so labels can be resolved&lt;br /&gt;
    //Wrap the SDMX API ISdmxBeanRestRetrievalManager in a SdmxBeanRetrievalManager so the system can pull back the required structures on demand&lt;br /&gt;
    ISdmxBeanRestRetrievalManager restBeanRetrievalManager = new RESTSdmxBeanRetrievalManager(sdmxv2API, REST_API_VERSION.v2_0_0);&lt;br /&gt;
    SdmxBeanRetrievalManager beanRetrieval = new SdmxRestToBeanRetrievalManager(restBeanRetrievalManager);&lt;br /&gt;
 &lt;br /&gt;
    //Additionally wrap the SdmxBeanRetrievalManager to create a SdmxSuperBeanRetrievalManager, required when the full 'tree' of structral metadata is &lt;br /&gt;
    //required (i.e not just the SDMX Data Structure but resolved Concepts and Codelists in one fully resolved Object&lt;br /&gt;
    SdmxSuperBeanRetrievalManager sbRm = new SdmxSuperBeanRetrievalManagerImpl(beanRetrieval);&lt;br /&gt;
    	 &lt;br /&gt;
    //Register an instance of a SdmxBeanRetreivalContainer with the system, this is used as the default container to get a handle on implementations of the &lt;br /&gt;
    //structure retrieval interfaces - used by classes including the JSON writers&lt;br /&gt;
    SingletonStore.registerInstance(new SdmxBeanRetreivalContainer(beanRetrieval, null, sbRm, null, null, restBeanRetrievalManager));&lt;br /&gt;
    	&lt;br /&gt;
    //Get Data&lt;br /&gt;
    String dataQueryUrl = sdmxv2API+&amp;quot;/data/dataflow/ECB/BSI/1.0/?c%5BFREQ%5D=A&amp;amp;c%5BREF_AREA%5D=DE,ES&amp;quot;;&lt;br /&gt;
    ReadableDataLocation sourceData = new ReadableDataLocationTmp(dataQueryUrl);&lt;br /&gt;
    DataReaderEngine dre = drm.getDataReaderEngine(sourceData, beanRetrieval, null);&lt;br /&gt;
    	&lt;br /&gt;
    //Create Writer&lt;br /&gt;
    ISeriesObsDataWriterEngine dwe = dwm.getDataWriterEngine(SdmxJsonDataFormat.INSTANCE, System.out);&lt;br /&gt;
    	&lt;br /&gt;
    //Transform Data&lt;br /&gt;
    DataTransformOptions transformOptions = DataTransformOptions.getInstance().setCloseWriter(true); &lt;br /&gt;
    DataTransformationUtil.copyData(dre, dwe, transformOptions);&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7091</id>
		<title>DRAFT SDMX-CORE</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7091"/>
		<updated>2023-07-24T16:33:55Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architecture =&lt;br /&gt;
== Modules ==&lt;br /&gt;
The sdmx-io modules are as follows&lt;br /&gt;
===Interface Modules===&lt;br /&gt;
These modules contains Java Interfaces only, no Java classes.  The sdmx-io framework uses Interfaces over implementation classes in order to achieve loose coupling.&lt;br /&gt;
&lt;br /&gt;
 '''fusion-api'''  - contains generic Interfaces that are unrelated to SDMX. Each package in this project is broken down by function, i.e audit, cache, date, email, exception&lt;br /&gt;
 '''fusion-api-dao''' - contains Interface definitions for database persistence, not coupled to database platform, but all based on storage and retrieval of Java Objects&lt;br /&gt;
 '''fusion-api-sdmx''' - contains Interfaces for SDMX Information model (SdmxBeans and related), high level Interfaces for SDMX related functions which cross multiple modules&lt;br /&gt;
 '''fusion-api-service''' - contains Interfaces definitions for web services to use - allowing projects the implement web service entry points to not require web service dependencies&lt;br /&gt;
&lt;br /&gt;
===Implementation Modules===&lt;br /&gt;
These modules contain Java classes which are core to SDMX, they implement Interfaces in the higher api modules&lt;br /&gt;
 '''fusion-sdmx-im''' - contains the implementation code for the SDMX Information Model (SdmxBeans and related structures such as Codelists, Concepts, etc)&lt;br /&gt;
 '''fusion-core-data''' - contains code to read/write data and generic data related features such as determining series/obs, validation, temporary data stores&lt;br /&gt;
 '''fusion-core-sdmx''' - contains core code for structural metadata, including temporary store, cross reference resolution, contains some data and reference metadata features &lt;br /&gt;
 '''fusion-core-structure''' - contains core code for processing structural metadata &lt;br /&gt;
 '''fusion-core-xlsx''' - contains code to read and write structures and data in Excel &lt;br /&gt;
&lt;br /&gt;
===Format Modules===&lt;br /&gt;
These modules contains Java classes for reading and writing SDMX Structural Metadata, Reference Metadata, and Data&lt;br /&gt;
&lt;br /&gt;
 '''fusion-sdmx-csv''' - reading and writing SDMX-CSV format&lt;br /&gt;
 '''fusion-sdmx-edi''' - reading and writing SDMX-EDI format&lt;br /&gt;
 '''fusion-sdmx-json''' - reading and writing SDMX-JSON format&lt;br /&gt;
 '''fusion-sdmx-ml''' reading and writing SDMX-XML&lt;br /&gt;
&lt;br /&gt;
===Feature Modules===&lt;br /&gt;
These modules provide feature specific code&lt;br /&gt;
 '''fusion-core-dao''' - contains generic DAO implementations for storing and querying for objects, not coupled to a specific object store, but we use hibernate, mongodb is also an option&lt;br /&gt;
 '''fusion-audit''' - audit events and centralised error handling&lt;br /&gt;
 '''fusion-sdmx-kafka''' - connecting to and sending/receiving messages to Apache Kafka&lt;br /&gt;
 '''fusion-sdmx-publication''' - SDMX Publication Tables: SdmxBean implementations, and business logic to materilise table based on definition&lt;br /&gt;
 '''fusion-sdmx-reporttemplate''' - Reporting Templates: SdmxBean implementations, and business logic to genearte excel workbook from template definition, reading data from workbooks&lt;br /&gt;
 '''fusion-sdmx-rest''' - SDMX web services, and additional web service implementations from APIs defined in fusion-api-service&lt;br /&gt;
 '''fusion-sdmx-search''' - Lucene search engine for structures&lt;br /&gt;
 '''fusion-sdmx-security''' - authentication against LDAP/AD/Fusion Security - contains user definition (SecurityDetailsImpl)&lt;br /&gt;
 '''fusion-xl''' - exposes web services required by the FusionXL Excel Plugin&lt;br /&gt;
&lt;br /&gt;
===Utility Modules===&lt;br /&gt;
Utility classes, typically public static classes, the utils projects may organise code by function rather then using the generic packaging structure (api, engine, manager, model, ...)&lt;br /&gt;
 '''fusion-utils''' - generic utility classes, not specific to SDMX&lt;br /&gt;
 '''fusion-utils-hibernate''' - implementation code to use Hibernate as a means to connect to the DAO&lt;br /&gt;
 '''fusion-utils-http''' - calling HTTP web services&lt;br /&gt;
 '''fusion-utils-json''' - JSON related utility classes&lt;br /&gt;
 '''fusion-utils-mail''' - email utility classes&lt;br /&gt;
 '''fusion-utils-mongodb'''  - implementation code to use MongoDB a means to store Objects&lt;br /&gt;
 '''fusion-utils-sdmx''' - SDMX Specific utility classes&lt;br /&gt;
 '''fusion-utils-spring''' - spring related utility classes&lt;br /&gt;
 '''fusion-utils-xlsx''' - reading/writing Excel workbooks related utility classes&lt;br /&gt;
&lt;br /&gt;
== Java Packages ==&lt;br /&gt;
Each module is partitioned into Java packages, with the exception of the utility modules, which typically separate code by its function. &lt;br /&gt;
&lt;br /&gt;
The generic packages are as follows.&lt;br /&gt;
&lt;br /&gt;
 '''api''' - contains interfaces relevant to the module &lt;br /&gt;
 '''constant''' - contains Java enums and java classes that contain public static constants&lt;br /&gt;
 '''engine''' - classes that 'do the work', many are stateless singletons, there are also stateful for example DataReader/WriterEngine &lt;br /&gt;
 '''factory''' - singleton classes that are responsible for generating an engine, typically called by a manager class, factories enable new features to be plugged into the framework&lt;br /&gt;
 '''filter'''  - REST web service filters (defined in web.xml) - filters are called before the web service&lt;br /&gt;
 '''manager''' - the main entry point for all high level functions, the manager's job is to verify the request (i.e. a security check) and manage the process of fulfilling the request by delegating the work to an engine or a DAO, a manager should be a fairly thin layer&lt;br /&gt;
 '''model''' - data transfer objects &lt;br /&gt;
 '''service''' (or rest) - web service entry points&lt;br /&gt;
 '''util''' - utility classes, typically containing public static methods&lt;br /&gt;
&lt;br /&gt;
The general logical flow of a system is the following&lt;br /&gt;
&lt;br /&gt;
 service --&amp;gt; manager --&amp;gt; engine&lt;br /&gt;
                     --&amp;gt; dao&lt;br /&gt;
&lt;br /&gt;
The service (web service entry point) is a thin layer which collects the request arguments, with minimal manipulation, and passes them to the respective Service Interface. The implementation of this Service Interface will create an appropriate model object (or objects) which contain a consolidated collection of arguments, some validation of arguments can be performed at this point, and then pass these to the manager Interface.  The manager will ensure the arguments are valid and the user has permission to perform the action.  The manager then provides the workflow required to fulfil the task, by making calls to engines, daos.&lt;br /&gt;
&lt;br /&gt;
= High Level Design =&lt;br /&gt;
&lt;br /&gt;
==[https://en.wikipedia.org/wiki/Inversion_of_control Inversion of Control] (IoC)==&lt;br /&gt;
&lt;br /&gt;
IoC is achieved by assigning all implementation classes to Interfaces and ensuring classes are stateless so that they can be singletons.  Managers are typically singletons.  This enables the system to be plugged together either by using the spring framework, or by using the sdmx.io framework.&lt;br /&gt;
&lt;br /&gt;
===Spring Framework===&lt;br /&gt;
Spring is used in the Java web application, web.xml references a number of spring bean files, which are located under src/main/resources/spring subfolder of the web application library.  The spring beans define the classes and which dependencies they are using. This works well for very large systems such as Fusion Metadata Registry which contains a large number of services and class definitions.&lt;br /&gt;
&lt;br /&gt;
===SDMX.IO IoC framework===&lt;br /&gt;
In order to remove the dependency on spring, and to simplify simpler projects, Sdmx.io provides a framework which allows instances of singleton classes to be registered to and obtained via the '''SingletonStore''' class.  When the class is not a singleton instances can be registered with the '''FusionBeanStore''' class.  &lt;br /&gt;
&lt;br /&gt;
A running application would request a singleton instance in the following way.&lt;br /&gt;
&lt;br /&gt;
 private IActiveDirectorySecuritySettingsManager activeDirectorySecuritySettingsManager = SingletonStore.getSingleton(IActiveDirectorySecuritySettingsManager.class);&lt;br /&gt;
&lt;br /&gt;
This is typically done at the web service layer, as a web service is constructed outside of the spring framework, after the application has launched.&lt;br /&gt;
&lt;br /&gt;
There are some use cases where the singleton is not available at the time it is requested, typcially because it is during application startup and the bean has not yet been built and registered.  In this scenario the Singleton store can be asked to provide an instance when it is registered.&lt;br /&gt;
 &lt;br /&gt;
 SingletonStore.registerInterest(FusionProductInformationRetrievalManager.class, (bean) -&amp;gt; {&lt;br /&gt;
   infoRetreival = bean;&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
If the application wants multiple instances of an interface, then the FusionBeanStore is used&lt;br /&gt;
&lt;br /&gt;
 Collection&amp;lt;StructureWriterFactory&amp;gt; allBeans = FusionBeanStore.getBeans(StructureWriterFactory.class);&lt;br /&gt;
&lt;br /&gt;
===Using Spring/SDMX.IO===&lt;br /&gt;
In order to quickly register modules with the SDMX.IO framework, there are a number of classes that implement '''IFusionModule''', these classes have a register method, which on calling will automatically create and register instances of classes relevant to that module. &lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 CoreSDMXModule.register(); - register schema factories, cross reference resolution, reference metadata reader and writer manager&lt;br /&gt;
 SdmxMLModule.register();  - register SDMX-XML data and structure format readers and writers&lt;br /&gt;
 SdmxJsonModule.register(); - register SDMX-JSON data and structure format readers and writers&lt;br /&gt;
 FusionXLModule.register(); - register FusionXL classes for the excel plugin&lt;br /&gt;
 SdmxEDIModule.register(); - register SDMX-EDI data and structure format readers and writers&lt;br /&gt;
 FusionJsonModule.register();  - register Fusion-JSON data and structure format readers and writers&lt;br /&gt;
 SdmxCsvModule.register();  - register SDMX-CSV data format readers and writers&lt;br /&gt;
 FusionCoreDataModule.register();  - register SDMX-EDI data and structure format readers and writers&lt;br /&gt;
 XLSXModule.register();  - register reader and writer for Excel&lt;br /&gt;
 PublicationTableModule.register(); - classes to support Publication ables&lt;br /&gt;
  &lt;br /&gt;
The spring framework can be used in conjunction with the SDMX.IO IoC framework, as the class '''SpringBeansContainer''' which is a wrapper around the spring beans contained, can be used by both the SingletonStore and FusionBeansStore.  This allows SingletonStore and FusionBeansStore to search both the spring beans container, and any locally registered classes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Example Code =&lt;br /&gt;
The following example code blocks are all in one Java main method - which in a real system would not be the case, most of the code in these examples is setting up the system (registering modules and singletons), which is a one time system set up operation.  &lt;br /&gt;
&lt;br /&gt;
== Reading Structures ==&lt;br /&gt;
* Register the SDMX-ML module as the response from the URL is in SDMX-ML format&lt;br /&gt;
* Creates an instance of the StructureReaderManager  (typically in an application this would be a singleton). &lt;br /&gt;
* Creates a wrapper around a URL giving repeated access to the input stream of information, the URL resolves to an SDMX structure file containing multiple Dataflows&lt;br /&gt;
* Convert the stream into SDMX structures&lt;br /&gt;
* Loop the Dataflows and print the ID to the console&lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
  SdmxMLModule.register();&lt;br /&gt;
  StructureReaderManager srm = new StructureReaderManagerImpl();&lt;br /&gt;
  ReadableDataLocation rdl = new ReadableDataLocationTmp(new URL(&amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2/structure/dataflow&amp;quot;));&lt;br /&gt;
  SdmxBeans beans = srm.parseStructures(rdl);&lt;br /&gt;
  beans.getDataflows().forEach((flow) -&amp;gt; System.out.println(flow.getId()));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Writing / Transforming Structures ==&lt;br /&gt;
The same code as  Reading Structures, but with the addition lines in BOLD&lt;br /&gt;
&lt;br /&gt;
* Register the SDMX-JSON module as we are writing out in this format&lt;br /&gt;
* Creates an instance of the StructureWriterManager (typically in an application this would be a singleton). &lt;br /&gt;
* Writes the structures in FusionJson format to the system output&lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
  SdmxMLModule.register();&lt;br /&gt;
  '''SdmxJsonModule.register();'''&lt;br /&gt;
  StructureReaderManager srm = new StructureReaderManagerImpl();&lt;br /&gt;
  ReadableDataLocation rdl = new ReadableDataLocationTmp(new URL(&amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2/structure/dataflow&amp;quot;));&lt;br /&gt;
  SdmxBeans beans = srm.parseStructures(rdl);&lt;br /&gt;
  '''StructureWriterManager swm = new StructureWriterManagerImpl();'''&lt;br /&gt;
  '''swm.writeStructures(beans, FusionJsonStructureFormat.getInstance(), System.out);'''&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Data Read ==&lt;br /&gt;
Reading data requires access to both the dataset, and the structural metadata (DSD) which describes the data in terms of its Dimensions and Concepts.  &lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
    //SDMX WEB SERVICE&lt;br /&gt;
    String sdmxv2API = &amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2&amp;quot;;&lt;br /&gt;
    String dataflow = &amp;quot;dataflow/ECB/BSI/1.0&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    //Register modules for formats&lt;br /&gt;
    SdmxMLModule.register();&lt;br /&gt;
    	&lt;br /&gt;
    //Set up data reader and writer managers&lt;br /&gt;
    DataFormatManager dfm = new DataFormatManagerImpl(SdmxJsonDataFormat.INSTANCE, InformationFormatManager.getInstance());&lt;br /&gt;
    DataReaderManager drm = new DataReaderManagerImpl(dfm);&lt;br /&gt;
    	&lt;br /&gt;
    //Get Structures from URL into an in-memory store&lt;br /&gt;
    String structureURL = sdmxv2API + &amp;quot;/structure/&amp;quot;+dataflow+&amp;quot;?references=children&amp;quot;;&lt;br /&gt;
    SdmxBeanRetrievalManager beanRetrieval = new InMemoryRetrievalManagerFast(new ReadableDataLocationTmp(structureURL), new StructureReaderManagerImpl());&lt;br /&gt;
 &lt;br /&gt;
    //Get Data&lt;br /&gt;
    String dataQueryUrl = sdmxv2API+&amp;quot;/data/&amp;quot;+dataflow+&amp;quot;?c%5BFREQ%5D=A&amp;amp;c%5BREF_AREA%5D=DE,ES&amp;quot;;&lt;br /&gt;
    ReadableDataLocation sourceData = new ReadableDataLocationTmp(dataQueryUrl);&lt;br /&gt;
    DataReaderEngine dre = drm.getDataReaderEngine(sourceData, beanRetrieval, null);&lt;br /&gt;
    	&lt;br /&gt;
    while(dre.moveNextDataset()) {&lt;br /&gt;
      while(dre.moveNextKeyable()) {&lt;br /&gt;
        System.out.println(dre.getCurrentKey().getShortCode());&lt;br /&gt;
        while(dre.moveNextObservation()) {&lt;br /&gt;
          Observation obs = dre.getCurrentObservation();&lt;br /&gt;
          System.out.println(obs.getDimensionValue() + &amp;quot;=&amp;quot; + obs.getPrimaryMeasure());&lt;br /&gt;
        }&lt;br /&gt;
      }	&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Data Transformation ==&lt;br /&gt;
This example is a bit more involved, as the structures are no longer obtained as a file, but on demand from a web service.  This requires the registration of the REST classes.  In addition, as the output data format is SDMX JSON, the writer requires not only access to the DSD, but also all the metadata related to the DSD (Codelists, Concepts).  This requires the SdmxSuperBeanRetrievalManager, which is used to get a fully resolved tree of structural information.&lt;br /&gt;
&lt;br /&gt;
  public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
    //SDMX WEB SERVICE&lt;br /&gt;
    String sdmxv2API = &amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    //Register modules for formats&lt;br /&gt;
    SdmxMLModule.register();&lt;br /&gt;
    SdmxJsonModule.register();&lt;br /&gt;
    	&lt;br /&gt;
    //Manually register required instances		&lt;br /&gt;
    SingletonStore.registerInstance(new RESTQueryBrokerEngineImpl());&lt;br /&gt;
    SingletonStore.registerInstance(new StructureQueryBuilderRest());&lt;br /&gt;
    SingletonStore.registerInstance(new StructureReaderManagerImpl());&lt;br /&gt;
    	&lt;br /&gt;
    //Set up data reader and writer managers&lt;br /&gt;
    DataFormatManager dfm = new DataFormatManagerImpl(SdmxJsonDataFormat.INSTANCE, InformationFormatManager.getInstance());&lt;br /&gt;
    DataReaderManager drm = new DataReaderManagerImpl(dfm);&lt;br /&gt;
    DataWriterManager dwm = new DataWriterManagerImpl(dfm);&lt;br /&gt;
    	&lt;br /&gt;
    //JSON output format requires access to the metadata so labels can be resolved&lt;br /&gt;
    //Wrap the SDMX API ISdmxBeanRestRetrievalManager in a SdmxBeanRetrievalManager so the system can pull back the required structures on demand&lt;br /&gt;
    ISdmxBeanRestRetrievalManager restBeanRetrievalManager = new RESTSdmxBeanRetrievalManager(sdmxv2API, REST_API_VERSION.v2_0_0);&lt;br /&gt;
    SdmxBeanRetrievalManager beanRetrieval = new SdmxRestToBeanRetrievalManager(restBeanRetrievalManager);&lt;br /&gt;
 &lt;br /&gt;
    //Additionally wrap the SdmxBeanRetrievalManager to create a SdmxSuperBeanRetrievalManager, required when the full 'tree' of structral metadata is &lt;br /&gt;
    //required (i.e not just the SDMX Data Structure but resolved Concepts and Codelists in one fully resolved Object&lt;br /&gt;
    SdmxSuperBeanRetrievalManager sbRm = new SdmxSuperBeanRetrievalManagerImpl(beanRetrieval);&lt;br /&gt;
    	 &lt;br /&gt;
    //Register an instance of a SdmxBeanRetreivalContainer with the system, this is used as the default container to get a handle on implementations of the &lt;br /&gt;
    //structure retrieval interfaces - used by classes including the JSON writers&lt;br /&gt;
    SingletonStore.registerInstance(new SdmxBeanRetreivalContainer(beanRetrieval, null, sbRm, null, null, restBeanRetrievalManager));&lt;br /&gt;
    	&lt;br /&gt;
    //Get Data&lt;br /&gt;
    String dataQueryUrl = sdmxv2API+&amp;quot;/data/dataflow/ECB/BSI/1.0/?c%5BFREQ%5D=A&amp;amp;c%5BREF_AREA%5D=DE,ES&amp;quot;;&lt;br /&gt;
    ReadableDataLocation sourceData = new ReadableDataLocationTmp(dataQueryUrl);&lt;br /&gt;
    DataReaderEngine dre = drm.getDataReaderEngine(sourceData, beanRetrieval, null);&lt;br /&gt;
    	&lt;br /&gt;
    //Create Writer&lt;br /&gt;
    ISeriesObsDataWriterEngine dwe = dwm.getDataWriterEngine(SdmxJsonDataFormat.INSTANCE, System.out);&lt;br /&gt;
    	&lt;br /&gt;
    //Transform Data&lt;br /&gt;
    DataTransformOptions transformOptions = DataTransformOptions.getInstance().setCloseWriter(true); &lt;br /&gt;
    DataTransformationUtil.copyData(dre, dwe, transformOptions);&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7090</id>
		<title>DRAFT SDMX-CORE</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7090"/>
		<updated>2023-07-24T16:29:22Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architecture =&lt;br /&gt;
== Modules ==&lt;br /&gt;
The sdmx-io modules are as follows&lt;br /&gt;
===Interface Modules===&lt;br /&gt;
These modules contains Java Interfaces only, no Java classes.  The sdmx-io framework uses Interfaces over implementation classes in order to achieve loose coupling.&lt;br /&gt;
&lt;br /&gt;
 '''fusion-api'''  - contains generic Interfaces that are unrelated to SDMX. Each package in this project is broken down by function, i.e audit, cache, date, email, exception&lt;br /&gt;
 '''fusion-api-dao''' - contains Interface definitions for database persistence, not coupled to database platform, but all based on storeage and retrieval of Java Objects&lt;br /&gt;
 '''fusion-api-sdmx''' - contains Interfaces for SDMX Information model (SdmxBeans and related), high level Interfaces for SDMX related functions which cross mulitple modules&lt;br /&gt;
 '''fusion-api-service''' - contains Interfaces definitions for web services to use - allowing projects the implement web service entry points to not require web service depdenancies&lt;br /&gt;
&lt;br /&gt;
===Implementation Modules===&lt;br /&gt;
These modules contain Java classes which are core to SDMX, they implement Interfaces in the higher api modules&lt;br /&gt;
 '''fusion-sdmx-im''' - contains the implementation code for the SDMX Information Model (SdmxBeans and related structures such as Codelists, Concepts, etc)&lt;br /&gt;
 '''fusion-core-data''' - contains code to read/write data and generic data related features such as determining series/obs, validation, temporary data stores&lt;br /&gt;
 '''fusion-core-sdmx''' - contains core code for structural metadata, including temporary store, cross reference resolution, contains some data and reference metadata features &lt;br /&gt;
 '''fusion-core-structure''' - contains core code for processing structural metadata &lt;br /&gt;
 '''fusion-core-xlsx''' - contains code to read and write structures and data in Excel &lt;br /&gt;
&lt;br /&gt;
===Format Modules===&lt;br /&gt;
These modules contains Java classes for reading and writing SDMX Structureal Metadata, Reference Metadata, and Data&lt;br /&gt;
&lt;br /&gt;
 '''fusion-sdmx-csv''' - reading and writing SDMX-CSV format&lt;br /&gt;
 '''fusion-sdmx-edi''' - reading and writing SDMX-EDI format&lt;br /&gt;
 '''fusion-sdmx-json''' - reading and writing SDMX-JSON format&lt;br /&gt;
 '''fusion-sdmx-ml''' reading and writing SDMX-XML&lt;br /&gt;
&lt;br /&gt;
===Feature Modules===&lt;br /&gt;
These modules provide feature specific code&lt;br /&gt;
 '''fusion-core-dao''' - contains generic DAO implementations for storing and querying for objects, not coupled to a specific object store, but we use hibernate, mongodb is also an option&lt;br /&gt;
 '''fusion-audit''' - audit events and centralised error handling&lt;br /&gt;
 '''fusion-sdmx-kafka''' - connecting to and sending/recieving messages to Apache Kafka&lt;br /&gt;
 '''fusion-sdmx-publication''' - SDMX Publication Tables: SdmxBean implementations, and buisness logic to materilise table based on definition&lt;br /&gt;
 '''fusion-sdmx-reporttemplate''' - Reporting Templates: SdmxBean implementations, and buisness logic to genearte excel workbook from template definition, reading data from workbooks&lt;br /&gt;
 '''fusion-sdmx-rest''' - SDMX web services, and additional web service implementations from APIs defined in fusion-api-service&lt;br /&gt;
 '''fusion-sdmx-search''' - Lucene search engine for structures&lt;br /&gt;
 '''fusion-sdmx-security''' - authentication against LDAP/AD/Fusion Security - contains user definition (SecurityDetailsImpl)&lt;br /&gt;
 '''fusion-xl''' - exposes web services required by the FusionXL Excel Pluin&lt;br /&gt;
&lt;br /&gt;
===Utility Modules===&lt;br /&gt;
Utility classes, typically public static classes, the utils projects may organise code by function rather then using the generic packaging structure (api, engine, manager, model, ...)&lt;br /&gt;
 '''fusion-utils''' - generic utility classes, not specific to SDMX&lt;br /&gt;
 '''fusion-utils-hibernate''' - implementation code to use Hibernate as a means to connect to the DAO&lt;br /&gt;
 '''fusion-utils-http''' - calling HTTP web services&lt;br /&gt;
 '''fusion-utils-json''' - JSON related utility classes&lt;br /&gt;
 '''fusion-utils-mail''' - email utiliity classes&lt;br /&gt;
 '''fusion-utils-mongodb'''  - implementation code to use MongoDB a means to store Objects&lt;br /&gt;
 '''fusion-utils-sdmx''' - SDMX Specific utilty classes&lt;br /&gt;
 '''fusion-utils-spring''' - spring related utility classes&lt;br /&gt;
 '''fusion-utils-xlsx''' - reading/writing Excel workbooks related utility classes&lt;br /&gt;
&lt;br /&gt;
== Java Packages ==&lt;br /&gt;
Each module is partitioned into Java packages, with the exception of the utility modules, which typically seperate code by its function. &lt;br /&gt;
&lt;br /&gt;
The generic packages are as follows.&lt;br /&gt;
&lt;br /&gt;
 '''api''' - contains interfaces relevent to the module &lt;br /&gt;
 '''constant''' - contains Java enums and java classes that contain public static constants&lt;br /&gt;
 '''engine''' - classes that 'do the work', many are stateless singletons, there are also stateful for example DataReader/WriterEngine &lt;br /&gt;
 '''factory''' - singleton classes that are responisble for generating an engine, typically called by a manager class, factories enable new features to be plugged into the framework&lt;br /&gt;
 '''filter'''  - REST web service filters (defined in web.xml) - filters are called before the web service&lt;br /&gt;
 '''manager''' - the main entry point for all high level functions, the manager's job is to veryify the request (i.e. a security check) and manage the process of fulfiliing the request by delegating the work to an engine or a DAO, a manager should be a fairly thin layer&lt;br /&gt;
 '''model''' - data transfer objects &lt;br /&gt;
 '''service''' (or rest) - web service entry points&lt;br /&gt;
 '''util''' - utility classes, typically containing public static methods&lt;br /&gt;
&lt;br /&gt;
The general logical flow of a system is the following&lt;br /&gt;
&lt;br /&gt;
 service --&amp;gt; manager --&amp;gt; engine&lt;br /&gt;
                     --&amp;gt; dao&lt;br /&gt;
&lt;br /&gt;
The service (web service entry point) is a thin layer which collects the request arguments, with miniumal manipulation, and passes them to the respective Service Interface. The implementation of this Service Interface will create an apporpriate model object (or objects) which contain a consolidated collection of arguements, some validation of arguments can be performed at this point, and then pass these to the manager Interface.  The manager will ensure the arguments are valid and the user has permission to perform the action.  The manager then provides the workflow required to fulfil the task, by makking calls to engines, daos.&lt;br /&gt;
&lt;br /&gt;
= High Level Design =&lt;br /&gt;
&lt;br /&gt;
==[https://en.wikipedia.org/wiki/Inversion_of_control Inversion of Control] (IoC)==&lt;br /&gt;
&lt;br /&gt;
IoC is achieved by assigning all implementation classes to Interfaces and ensuring classes are stateless so that they can be singletons.  Managers are typically singletons.  This enables the system to be plugged togeather either by using the spring framework, or by using the sdmx.io framework.&lt;br /&gt;
&lt;br /&gt;
===Spring Framework===&lt;br /&gt;
Spring is used in the Java web application, web.xml references a number of spring bean files, which are located under src/main/resources/spring subfolder of the web application library.  The spring beans define the classes and which dependancies they are using. This works well for very large systems such as Fusion Metadata Registry which contains a large number of services and class definitions.&lt;br /&gt;
&lt;br /&gt;
===SDMX.IO IoC framework===&lt;br /&gt;
In order to remove the dependency on spring, and to simplify simpler projects, Sdmx.io provides a framework which allows instances of singleton classes to be registered to and obtained via the '''SingletonStore''' class.  When the class is not a singleton instances can be registered with the '''FusionBeanStore''' class.  &lt;br /&gt;
&lt;br /&gt;
A running application would request a singleton instance in the following way.&lt;br /&gt;
&lt;br /&gt;
 private IActiveDirectorySecuritySettingsManager activeDirectorySecuritySettingsManager = SingletonStore.getSingleton(IActiveDirectorySecuritySettingsManager.class);&lt;br /&gt;
&lt;br /&gt;
This is typically done at the web service layer, as a web service is constructed outside of the spring framework, after the application has launched.&lt;br /&gt;
&lt;br /&gt;
There are some use cases where the singleton is not available at the time it is requested, typcially because it is during application startup and the bean has not yet been built and registered.  In this scenario the Singleton store can be asked to provide an instance when it is registered.&lt;br /&gt;
 &lt;br /&gt;
 SingletonStore.registerInterest(FusionProductInformationRetrievalManager.class, (bean) -&amp;gt; {&lt;br /&gt;
   infoRetreival = bean;&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
If the application wants multiple instances of an interface, then the FusionBeanStore is used&lt;br /&gt;
&lt;br /&gt;
 Collection&amp;lt;StructureWriterFactory&amp;gt; allBeans = FusionBeanStore.getBeans(StructureWriterFactory.class);&lt;br /&gt;
&lt;br /&gt;
===Using Spring/SDMX.IO===&lt;br /&gt;
In order to quickly register modules with the SDMX.IO framework, there are a number of classes that implement '''IFusionModule''', these classes have a register method, which on calling will automatically create and register instances of classes relevent to that module. &lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 CoreSDMXModule.register(); - register schema factories, cross reference resolution, reference metadata reader and writer manager&lt;br /&gt;
 SdmxMLModule.register();  - register SDMX-XML data and structure format readers and writers&lt;br /&gt;
 SdmxJsonModule.register(); - register SDMX-JSON data and structure format readers and writers&lt;br /&gt;
 FusionXLModule.register(); - register FusionXL classes for the excel plugin&lt;br /&gt;
 SdmxEDIModule.register(); - register SDMX-EDI data and structure format readers and writers&lt;br /&gt;
 FusionJsonModule.register();  - register Fusion-JSON data and structure format readers and writers&lt;br /&gt;
 SdmxCsvModule.register();  - register SDMX-CSV data format readers and writers&lt;br /&gt;
 FusionCoreDataModule.register();  - register SDMX-EDI data and structure format readers and writers&lt;br /&gt;
 XLSXModule.register();  - register reader and writer for Excel&lt;br /&gt;
 PublicationTableModule.register(); - classes to support Publication ables&lt;br /&gt;
  &lt;br /&gt;
The spring framework can be used in conjunction with the SDMX.IO IoC framework, as the class '''SpringBeansContainer''' which is a wrapper around the spring beans contained, can be used by both the SingletonStore and FusionBeansStore.  This allows SingletonStore and FusionBeansStore to search both the spring beans container, and any locally registered classes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Example Code =&lt;br /&gt;
The following example code blocks are all in one Java main method - which in a real system would not be the case, most of the code in these examples is setting up the system (registering modules and singletons), which is a one time system set up operation.  &lt;br /&gt;
&lt;br /&gt;
== Reading Structures ==&lt;br /&gt;
* Register the SDMX-ML module as the response from the URL is in SDMX-ML format&lt;br /&gt;
* Creates an instance of the StructureReaderManager  (typically in an application this would be a singleton). &lt;br /&gt;
* Creates a wrapper around a URL giving repeated access to the input stream of information, the URL resolves to an SDMX structure file containing mulitple Dataflows&lt;br /&gt;
* Convert the stream into SDMX structures&lt;br /&gt;
* Loop the Dataflows and print the ID to the console&lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
  SdmxMLModule.register();&lt;br /&gt;
  StructureReaderManager srm = new StructureReaderManagerImpl();&lt;br /&gt;
  ReadableDataLocation rdl = new ReadableDataLocationTmp(new URL(&amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2/structure/dataflow&amp;quot;));&lt;br /&gt;
  SdmxBeans beans = srm.parseStructures(rdl);&lt;br /&gt;
  beans.getDataflows().forEach((flow) -&amp;gt; System.out.println(flow.getId()));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Writing / Transforming Structures ==&lt;br /&gt;
The same code as  Reading Structures, but with the addition lines in BOLD&lt;br /&gt;
&lt;br /&gt;
* Register the SDMX-JSON module as we are wriring out in this format&lt;br /&gt;
* Creates an instance of the StructureWriterManager (typically in an application this would be a singleton). &lt;br /&gt;
* Writes the structures in FusionJson format to the system output&lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
  SdmxMLModule.register();&lt;br /&gt;
  '''SdmxJsonModule.register();'''&lt;br /&gt;
  StructureReaderManager srm = new StructureReaderManagerImpl();&lt;br /&gt;
  ReadableDataLocation rdl = new ReadableDataLocationTmp(new URL(&amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2/structure/dataflow&amp;quot;));&lt;br /&gt;
  SdmxBeans beans = srm.parseStructures(rdl);&lt;br /&gt;
  '''StructureWriterManager swm = new StructureWriterManagerImpl();'''&lt;br /&gt;
  '''swm.writeStructures(beans, FusionJsonStructureFormat.getInstance(), System.out);'''&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Data Read ==&lt;br /&gt;
Reading data requires access to both the dataset, and the structural metadata (DSD) which describes the data in terms of its Dimensions and Concepts.  &lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
    //SDMX WEB SERVICE&lt;br /&gt;
    String sdmxv2API = &amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2&amp;quot;;&lt;br /&gt;
    String dataflow = &amp;quot;dataflow/ECB/BSI/1.0&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    //Register modules for formats&lt;br /&gt;
    SdmxMLModule.register();&lt;br /&gt;
    	&lt;br /&gt;
    //Set up data reader and writer managers&lt;br /&gt;
    DataFormatManager dfm = new DataFormatManagerImpl(SdmxJsonDataFormat.INSTANCE, InformationFormatManager.getInstance());&lt;br /&gt;
    DataReaderManager drm = new DataReaderManagerImpl(dfm);&lt;br /&gt;
    	&lt;br /&gt;
    //Get Structures from URL into an in-memory store&lt;br /&gt;
    String structureURL = sdmxv2API + &amp;quot;/structure/&amp;quot;+dataflow+&amp;quot;?references=children&amp;quot;;&lt;br /&gt;
    SdmxBeanRetrievalManager beanRetrieval = new InMemoryRetrievalManagerFast(new ReadableDataLocationTmp(structureURL), new StructureReaderManagerImpl());&lt;br /&gt;
 &lt;br /&gt;
    //Get Data&lt;br /&gt;
    String dataQueryUrl = sdmxv2API+&amp;quot;/data/&amp;quot;+dataflow+&amp;quot;?c%5BFREQ%5D=A&amp;amp;c%5BREF_AREA%5D=DE,ES&amp;quot;;&lt;br /&gt;
    ReadableDataLocation sourceData = new ReadableDataLocationTmp(dataQueryUrl);&lt;br /&gt;
    DataReaderEngine dre = drm.getDataReaderEngine(sourceData, beanRetrieval, null);&lt;br /&gt;
    	&lt;br /&gt;
    while(dre.moveNextDataset()) {&lt;br /&gt;
      while(dre.moveNextKeyable()) {&lt;br /&gt;
        System.out.println(dre.getCurrentKey().getShortCode());&lt;br /&gt;
        while(dre.moveNextObservation()) {&lt;br /&gt;
          Observation obs = dre.getCurrentObservation();&lt;br /&gt;
          System.out.println(obs.getDimensionValue() + &amp;quot;=&amp;quot; + obs.getPrimaryMeasure());&lt;br /&gt;
        }&lt;br /&gt;
      }	&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Data Transformation ==&lt;br /&gt;
This example is a bit more involved, as the structures are no longer obtained as a file, but on demand from a web service.  This requires the registration of the REST&lt;br /&gt;
classes.  In addition, as the output data format is SDMX JSON, the writer requires not only access to the DSD, but also all the metadata related to the DSD (Codelists, Concepts).  This requires &lt;br /&gt;
the SdmxSuperBeanRetrievalManager, which is used to get a fully resolved tree of structural information.&lt;br /&gt;
&lt;br /&gt;
  public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
    //SDMX WEB SERVICE&lt;br /&gt;
    String sdmxv2API = &amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    //Register modules for formats&lt;br /&gt;
    SdmxMLModule.register();&lt;br /&gt;
    SdmxJsonModule.register();&lt;br /&gt;
    	&lt;br /&gt;
    //Manually register required instances		&lt;br /&gt;
    SingletonStore.registerInstance(new RESTQueryBrokerEngineImpl());&lt;br /&gt;
    SingletonStore.registerInstance(new StructureQueryBuilderRest());&lt;br /&gt;
    SingletonStore.registerInstance(new StructureReaderManagerImpl());&lt;br /&gt;
    	&lt;br /&gt;
    //Set up data reader and writer managers&lt;br /&gt;
    DataFormatManager dfm = new DataFormatManagerImpl(SdmxJsonDataFormat.INSTANCE, InformationFormatManager.getInstance());&lt;br /&gt;
    DataReaderManager drm = new DataReaderManagerImpl(dfm);&lt;br /&gt;
    DataWriterManager dwm = new DataWriterManagerImpl(dfm);&lt;br /&gt;
    	&lt;br /&gt;
    //JSON output format requires access to the metadata so labels can be resolved&lt;br /&gt;
    //Wrap the SDMX API ISdmxBeanRestRetrievalManager in a SdmxBeanRetrievalManager so the system can pull back the required structures on demand&lt;br /&gt;
    ISdmxBeanRestRetrievalManager restBeanRetrievalManager = new RESTSdmxBeanRetrievalManager(sdmxv2API, REST_API_VERSION.v2_0_0);&lt;br /&gt;
    SdmxBeanRetrievalManager beanRetrieval = new SdmxRestToBeanRetrievalManager(restBeanRetrievalManager);&lt;br /&gt;
 &lt;br /&gt;
    //Additionally wrap the SdmxBeanRetrievalManager to create a SdmxSuperBeanRetrievalManager, required when the full 'tree' of structral metadata is &lt;br /&gt;
    //required (i.e not just the SDMX Data Structure but resolved Concepts and Codelists in one fully resolved Object&lt;br /&gt;
    SdmxSuperBeanRetrievalManager sbRm = new SdmxSuperBeanRetrievalManagerImpl(beanRetrieval);&lt;br /&gt;
    	 &lt;br /&gt;
    //Register an instance of a SdmxBeanRetreivalContainer with the system, this is used as the default container to get a handle on implementations of the &lt;br /&gt;
    //structure retrieval interfaces - used by classes including the JSON writers&lt;br /&gt;
    SingletonStore.registerInstance(new SdmxBeanRetreivalContainer(beanRetrieval, null, sbRm, null, null, restBeanRetrievalManager));&lt;br /&gt;
    	&lt;br /&gt;
    //Get Data&lt;br /&gt;
    String dataQueryUrl = sdmxv2API+&amp;quot;/data/dataflow/ECB/BSI/1.0/?c%5BFREQ%5D=A&amp;amp;c%5BREF_AREA%5D=DE,ES&amp;quot;;&lt;br /&gt;
    ReadableDataLocation sourceData = new ReadableDataLocationTmp(dataQueryUrl);&lt;br /&gt;
    DataReaderEngine dre = drm.getDataReaderEngine(sourceData, beanRetrieval, null);&lt;br /&gt;
    	&lt;br /&gt;
    //Create Writer&lt;br /&gt;
    ISeriesObsDataWriterEngine dwe = dwm.getDataWriterEngine(SdmxJsonDataFormat.INSTANCE, System.out);&lt;br /&gt;
    	&lt;br /&gt;
    //Transform Data&lt;br /&gt;
    DataTransformOptions transformOptions = DataTransformOptions.getInstance().setCloseWriter(true); &lt;br /&gt;
    DataTransformationUtil.copyData(dre, dwe, transformOptions);&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7089</id>
		<title>DRAFT SDMX-CORE</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7089"/>
		<updated>2023-07-24T16:27:58Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Example Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectire =&lt;br /&gt;
== Modules ==&lt;br /&gt;
The sdmx-io modules are as follows&lt;br /&gt;
===Interface Modules===&lt;br /&gt;
These modules contains Java Interfaces only, no Java classes.  The sdmx-io framework uses Interfaces over implementation classes in order to achieve loose coupling.&lt;br /&gt;
&lt;br /&gt;
 '''fusion-api'''  - contains generic Interfaces that are unrelated to SDMX. Each package in this project is broken down by function, i.e audit, cache, date, email, exception&lt;br /&gt;
 '''fusion-api-dao''' - contains Interface definitions for database persistence, not coupled to database platform, but all based on storeage and retrieval of Java Objects&lt;br /&gt;
 '''fusion-api-sdmx''' - contains Interfaces for SDMX Information model (SdmxBeans and related), high level Interfaces for SDMX related functions which cross mulitple modules&lt;br /&gt;
 '''fusion-api-service''' - contains Interfaces definitions for web services to use - allowing projects the implement web service entry points to not require web service depdenancies&lt;br /&gt;
&lt;br /&gt;
===Implementation Modules===&lt;br /&gt;
These modules contain Java classes which are core to SDMX, they implement Interfaces in the higher api modules&lt;br /&gt;
 '''fusion-sdmx-im''' - contains the implementation code for the SDMX Information Model (SdmxBeans and related structures such as Codelists, Concepts, etc)&lt;br /&gt;
 '''fusion-core-data''' - contains code to read/write data and generic data related features such as determining series/obs, validation, temporary data stores&lt;br /&gt;
 '''fusion-core-sdmx''' - contains core code for structural metadata, including temporary store, cross reference resolution, contains some data and reference metadata features &lt;br /&gt;
 '''fusion-core-structure''' - contains core code for processing structural metadata &lt;br /&gt;
 '''fusion-core-xlsx''' - contains code to read and write structures and data in Excel &lt;br /&gt;
&lt;br /&gt;
===Format Modules===&lt;br /&gt;
These modules contains Java classes for reading and writing SDMX Structureal Metadata, Reference Metadata, and Data&lt;br /&gt;
&lt;br /&gt;
 '''fusion-sdmx-csv''' - reading and writing SDMX-CSV format&lt;br /&gt;
 '''fusion-sdmx-edi''' - reading and writing SDMX-EDI format&lt;br /&gt;
 '''fusion-sdmx-json''' - reading and writing SDMX-JSON format&lt;br /&gt;
 '''fusion-sdmx-ml''' reading and writing SDMX-XML&lt;br /&gt;
&lt;br /&gt;
===Feature Modules===&lt;br /&gt;
These modules provide feature specific code&lt;br /&gt;
 '''fusion-core-dao''' - contains generic DAO implementations for storing and querying for objects, not coupled to a specific object store, but we use hibernate, mongodb is also an option&lt;br /&gt;
 '''fusion-audit''' - audit events and centralised error handling&lt;br /&gt;
 '''fusion-sdmx-kafka''' - connecting to and sending/recieving messages to Apache Kafka&lt;br /&gt;
 '''fusion-sdmx-publication''' - SDMX Publication Tables: SdmxBean implementations, and buisness logic to materilise table based on definition&lt;br /&gt;
 '''fusion-sdmx-reporttemplate''' - Reporting Templates: SdmxBean implementations, and buisness logic to genearte excel workbook from template definition, reading data from workbooks&lt;br /&gt;
 '''fusion-sdmx-rest''' - SDMX web services, and additional web service implementations from APIs defined in fusion-api-service&lt;br /&gt;
 '''fusion-sdmx-search''' - Lucene search engine for structures&lt;br /&gt;
 '''fusion-sdmx-security''' - authentication against LDAP/AD/Fusion Security - contains user definition (SecurityDetailsImpl)&lt;br /&gt;
 '''fusion-xl''' - exposes web services required by the FusionXL Excel Pluin&lt;br /&gt;
&lt;br /&gt;
===Utility Modules===&lt;br /&gt;
Utility classes, typically public static classes, the utils projects may organise code by function rather then using the generic packaging structure (api, engine, manager, model, ...)&lt;br /&gt;
 '''fusion-utils''' - generic utility classes, not specific to SDMX&lt;br /&gt;
 '''fusion-utils-hibernate''' - implementation code to use Hibernate as a means to connect to the DAO&lt;br /&gt;
 '''fusion-utils-http''' - calling HTTP web services&lt;br /&gt;
 '''fusion-utils-json''' - JSON related utility classes&lt;br /&gt;
 '''fusion-utils-mail''' - email utiliity classes&lt;br /&gt;
 '''fusion-utils-mongodb'''  - implementation code to use MongoDB a means to store Objects&lt;br /&gt;
 '''fusion-utils-sdmx''' - SDMX Specific utilty classes&lt;br /&gt;
 '''fusion-utils-spring''' - spring related utility classes&lt;br /&gt;
 '''fusion-utils-xlsx''' - reading/writing Excel workbooks related utility classes&lt;br /&gt;
&lt;br /&gt;
== Java Packages ==&lt;br /&gt;
Each module is partitioned into Java packages, with the exception of the utility modules, which typically seperate code by its function. &lt;br /&gt;
&lt;br /&gt;
The generic packages are as follows.&lt;br /&gt;
&lt;br /&gt;
 '''api''' - contains interfaces relevent to the module &lt;br /&gt;
 '''constant''' - contains Java enums and java classes that contain public static constants&lt;br /&gt;
 '''engine''' - classes that 'do the work', many are stateless singletons, there are also stateful for example DataReader/WriterEngine &lt;br /&gt;
 '''factory''' - singleton classes that are responisble for generating an engine, typically called by a manager class, factories enable new features to be plugged into the framework&lt;br /&gt;
 '''filter'''  - REST web service filters (defined in web.xml) - filters are called before the web service&lt;br /&gt;
 '''manager''' - the main entry point for all high level functions, the manager's job is to veryify the request (i.e. a security check) and manage the process of fulfiliing the request by delegating the work to an engine or a DAO, a manager should be a fairly thin layer&lt;br /&gt;
 '''model''' - data transfer objects &lt;br /&gt;
 '''service''' (or rest) - web service entry points&lt;br /&gt;
 '''util''' - utility classes, typically containing public static methods&lt;br /&gt;
&lt;br /&gt;
The general logical flow of a system is the following&lt;br /&gt;
&lt;br /&gt;
 service --&amp;gt; manager --&amp;gt; engine&lt;br /&gt;
                     --&amp;gt; dao&lt;br /&gt;
&lt;br /&gt;
The service (web service entry point) is a thin layer which collects the request arguments, with miniumal manipulation, and passes them to the respective Service Interface. The implementation of this Service Interface will create an apporpriate model object (or objects) which contain a consolidated collection of arguements, some validation of arguments can be performed at this point, and then pass these to the manager Interface.  The manager will ensure the arguments are valid and the user has permission to perform the action.  The manager then provides the workflow required to fulfil the task, by makking calls to engines, daos.&lt;br /&gt;
&lt;br /&gt;
= High Level Design =&lt;br /&gt;
&lt;br /&gt;
==[https://en.wikipedia.org/wiki/Inversion_of_control Inversion of Control] (IoC)==&lt;br /&gt;
&lt;br /&gt;
IoC is achieved by assigning all implementation classes to Interfaces and ensuring classes are stateless so that they can be singletons.  Managers are typically singletons.  This enables the system to be plugged togeather either by using the spring framework, or by using the sdmx.io framework.&lt;br /&gt;
&lt;br /&gt;
===Spring Framework===&lt;br /&gt;
Spring is used in the Java web application, web.xml references a number of spring bean files, which are located under src/main/resources/spring subfolder of the web application library.  The spring beans define the classes and which dependancies they are using. This works well for very large systems such as Fusion Metadata Registry which contains a large number of services and class definitions.&lt;br /&gt;
&lt;br /&gt;
===SDMX.IO IoC framework===&lt;br /&gt;
In order to remove the dependency on spring, and to simplify simpler projects, Sdmx.io provides a framework which allows instances of singleton classes to be registered to and obtained via the '''SingletonStore''' class.  When the class is not a singleton instances can be registered with the '''FusionBeanStore''' class.  &lt;br /&gt;
&lt;br /&gt;
A running application would request a singleton instance in the following way.&lt;br /&gt;
&lt;br /&gt;
 private IActiveDirectorySecuritySettingsManager activeDirectorySecuritySettingsManager = SingletonStore.getSingleton(IActiveDirectorySecuritySettingsManager.class);&lt;br /&gt;
&lt;br /&gt;
This is typically done at the web service layer, as a web service is constructed outside of the spring framework, after the application has launched.&lt;br /&gt;
&lt;br /&gt;
There are some use cases where the singleton is not available at the time it is requested, typcially because it is during application startup and the bean has not yet been built and registered.  In this scenario the Singleton store can be asked to provide an instance when it is registered.&lt;br /&gt;
 &lt;br /&gt;
 SingletonStore.registerInterest(FusionProductInformationRetrievalManager.class, (bean) -&amp;gt; {&lt;br /&gt;
   infoRetreival = bean;&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
If the application wants multiple instances of an interface, then the FusionBeanStore is used&lt;br /&gt;
&lt;br /&gt;
 Collection&amp;lt;StructureWriterFactory&amp;gt; allBeans = FusionBeanStore.getBeans(StructureWriterFactory.class);&lt;br /&gt;
&lt;br /&gt;
===Using Spring/SDMX.IO===&lt;br /&gt;
In order to quickly register modules with the SDMX.IO framework, there are a number of classes that implement '''IFusionModule''', these classes have a register method, which on calling will automatically create and register instances of classes relevent to that module. &lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 CoreSDMXModule.register(); - register schema factories, cross reference resolution, reference metadata reader and writer manager&lt;br /&gt;
 SdmxMLModule.register();  - register SDMX-XML data and structure format readers and writers&lt;br /&gt;
 SdmxJsonModule.register(); - register SDMX-JSON data and structure format readers and writers&lt;br /&gt;
 FusionXLModule.register(); - register FusionXL classes for the excel plugin&lt;br /&gt;
 SdmxEDIModule.register(); - register SDMX-EDI data and structure format readers and writers&lt;br /&gt;
 FusionJsonModule.register();  - register Fusion-JSON data and structure format readers and writers&lt;br /&gt;
 SdmxCsvModule.register();  - register SDMX-CSV data format readers and writers&lt;br /&gt;
 FusionCoreDataModule.register();  - register SDMX-EDI data and structure format readers and writers&lt;br /&gt;
 XLSXModule.register();  - register reader and writer for Excel&lt;br /&gt;
 PublicationTableModule.register(); - classes to support Publication ables&lt;br /&gt;
  &lt;br /&gt;
The spring framework can be used in conjunction with the SDMX.IO IoC framework, as the class '''SpringBeansContainer''' which is a wrapper around the spring beans contained, can be used by both the SingletonStore and FusionBeansStore.  This allows SingletonStore and FusionBeansStore to search both the spring beans container, and any locally registered classes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Example Code =&lt;br /&gt;
The following example code blocks are all in one Java main method - which in a real system would not be the case, most of the code in these examples is setting up the system (registering modules and singletons), which is a one time system set up operation.  &lt;br /&gt;
&lt;br /&gt;
== Reading Structures ==&lt;br /&gt;
* Register the SDMX-ML module as the response from the URL is in SDMX-ML format&lt;br /&gt;
* Creates an instance of the StructureReaderManager  (typically in an application this would be a singleton). &lt;br /&gt;
* Creates a wrapper around a URL giving repeated access to the input stream of information, the URL resolves to an SDMX structure file containing mulitple Dataflows&lt;br /&gt;
* Convert the stream into SDMX structures&lt;br /&gt;
* Loop the Dataflows and print the ID to the console&lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
  SdmxMLModule.register();&lt;br /&gt;
  StructureReaderManager srm = new StructureReaderManagerImpl();&lt;br /&gt;
  ReadableDataLocation rdl = new ReadableDataLocationTmp(new URL(&amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2/structure/dataflow&amp;quot;));&lt;br /&gt;
  SdmxBeans beans = srm.parseStructures(rdl);&lt;br /&gt;
  beans.getDataflows().forEach((flow) -&amp;gt; System.out.println(flow.getId()));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Writing / Transforming Structures ==&lt;br /&gt;
The same code as  Reading Structures, but with the addition lines in BOLD&lt;br /&gt;
&lt;br /&gt;
* Register the SDMX-JSON module as we are wriring out in this format&lt;br /&gt;
* Creates an instance of the StructureWriterManager (typically in an application this would be a singleton). &lt;br /&gt;
* Writes the structures in FusionJson format to the system output&lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
  SdmxMLModule.register();&lt;br /&gt;
  '''SdmxJsonModule.register();'''&lt;br /&gt;
  StructureReaderManager srm = new StructureReaderManagerImpl();&lt;br /&gt;
  ReadableDataLocation rdl = new ReadableDataLocationTmp(new URL(&amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2/structure/dataflow&amp;quot;));&lt;br /&gt;
  SdmxBeans beans = srm.parseStructures(rdl);&lt;br /&gt;
  '''StructureWriterManager swm = new StructureWriterManagerImpl();'''&lt;br /&gt;
  '''swm.writeStructures(beans, FusionJsonStructureFormat.getInstance(), System.out);'''&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Data Read ==&lt;br /&gt;
Reading data requires access to both the dataset, and the structural metadata (DSD) which describes the data in terms of its Dimensions and Concepts.  &lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
    //SDMX WEB SERVICE&lt;br /&gt;
    String sdmxv2API = &amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2&amp;quot;;&lt;br /&gt;
    String dataflow = &amp;quot;dataflow/ECB/BSI/1.0&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    //Register modules for formats&lt;br /&gt;
    SdmxMLModule.register();&lt;br /&gt;
    	&lt;br /&gt;
    //Set up data reader and writer managers&lt;br /&gt;
    DataFormatManager dfm = new DataFormatManagerImpl(SdmxJsonDataFormat.INSTANCE, InformationFormatManager.getInstance());&lt;br /&gt;
    DataReaderManager drm = new DataReaderManagerImpl(dfm);&lt;br /&gt;
    	&lt;br /&gt;
    //Get Structures from URL into an in-memory store&lt;br /&gt;
    String structureURL = sdmxv2API + &amp;quot;/structure/&amp;quot;+dataflow+&amp;quot;?references=children&amp;quot;;&lt;br /&gt;
    SdmxBeanRetrievalManager beanRetrieval = new InMemoryRetrievalManagerFast(new ReadableDataLocationTmp(structureURL), new StructureReaderManagerImpl());&lt;br /&gt;
 &lt;br /&gt;
    //Get Data&lt;br /&gt;
    String dataQueryUrl = sdmxv2API+&amp;quot;/data/&amp;quot;+dataflow+&amp;quot;?c%5BFREQ%5D=A&amp;amp;c%5BREF_AREA%5D=DE,ES&amp;quot;;&lt;br /&gt;
    ReadableDataLocation sourceData = new ReadableDataLocationTmp(dataQueryUrl);&lt;br /&gt;
    DataReaderEngine dre = drm.getDataReaderEngine(sourceData, beanRetrieval, null);&lt;br /&gt;
    	&lt;br /&gt;
    while(dre.moveNextDataset()) {&lt;br /&gt;
      while(dre.moveNextKeyable()) {&lt;br /&gt;
        System.out.println(dre.getCurrentKey().getShortCode());&lt;br /&gt;
        while(dre.moveNextObservation()) {&lt;br /&gt;
          Observation obs = dre.getCurrentObservation();&lt;br /&gt;
          System.out.println(obs.getDimensionValue() + &amp;quot;=&amp;quot; + obs.getPrimaryMeasure());&lt;br /&gt;
        }&lt;br /&gt;
      }	&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Data Transformation ==&lt;br /&gt;
This example is a bit more involved, as the structures are no longer obtained as a file, but on demand from a web service.  This requires the registration of the REST&lt;br /&gt;
classes.  In addition, as the output data format is SDMX JSON, the writer requires not only access to the DSD, but also all the metadata related to the DSD (Codelists, Concepts).  This requires &lt;br /&gt;
the SdmxSuperBeanRetrievalManager, which is used to get a fully resolved tree of structural information.&lt;br /&gt;
&lt;br /&gt;
  public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
    //SDMX WEB SERVICE&lt;br /&gt;
    String sdmxv2API = &amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    //Register modules for formats&lt;br /&gt;
    SdmxMLModule.register();&lt;br /&gt;
    SdmxJsonModule.register();&lt;br /&gt;
    	&lt;br /&gt;
    //Manually register required instances		&lt;br /&gt;
    SingletonStore.registerInstance(new RESTQueryBrokerEngineImpl());&lt;br /&gt;
    SingletonStore.registerInstance(new StructureQueryBuilderRest());&lt;br /&gt;
    SingletonStore.registerInstance(new StructureReaderManagerImpl());&lt;br /&gt;
    	&lt;br /&gt;
    //Set up data reader and writer managers&lt;br /&gt;
    DataFormatManager dfm = new DataFormatManagerImpl(SdmxJsonDataFormat.INSTANCE, InformationFormatManager.getInstance());&lt;br /&gt;
    DataReaderManager drm = new DataReaderManagerImpl(dfm);&lt;br /&gt;
    DataWriterManager dwm = new DataWriterManagerImpl(dfm);&lt;br /&gt;
    	&lt;br /&gt;
    //JSON output format requires access to the metadata so labels can be resolved&lt;br /&gt;
    //Wrap the SDMX API ISdmxBeanRestRetrievalManager in a SdmxBeanRetrievalManager so the system can pull back the required structures on demand&lt;br /&gt;
    ISdmxBeanRestRetrievalManager restBeanRetrievalManager = new RESTSdmxBeanRetrievalManager(sdmxv2API, REST_API_VERSION.v2_0_0);&lt;br /&gt;
    SdmxBeanRetrievalManager beanRetrieval = new SdmxRestToBeanRetrievalManager(restBeanRetrievalManager);&lt;br /&gt;
 &lt;br /&gt;
    //Additionally wrap the SdmxBeanRetrievalManager to create a SdmxSuperBeanRetrievalManager, required when the full 'tree' of structral metadata is &lt;br /&gt;
    //required (i.e not just the SDMX Data Structure but resolved Concepts and Codelists in one fully resolved Object&lt;br /&gt;
    SdmxSuperBeanRetrievalManager sbRm = new SdmxSuperBeanRetrievalManagerImpl(beanRetrieval);&lt;br /&gt;
    	 &lt;br /&gt;
    //Register an instance of a SdmxBeanRetreivalContainer with the system, this is used as the default container to get a handle on implementations of the &lt;br /&gt;
    //structure retrieval interfaces - used by classes including the JSON writers&lt;br /&gt;
    SingletonStore.registerInstance(new SdmxBeanRetreivalContainer(beanRetrieval, null, sbRm, null, null, restBeanRetrievalManager));&lt;br /&gt;
    	&lt;br /&gt;
    //Get Data&lt;br /&gt;
    String dataQueryUrl = sdmxv2API+&amp;quot;/data/dataflow/ECB/BSI/1.0/?c%5BFREQ%5D=A&amp;amp;c%5BREF_AREA%5D=DE,ES&amp;quot;;&lt;br /&gt;
    ReadableDataLocation sourceData = new ReadableDataLocationTmp(dataQueryUrl);&lt;br /&gt;
    DataReaderEngine dre = drm.getDataReaderEngine(sourceData, beanRetrieval, null);&lt;br /&gt;
    	&lt;br /&gt;
    //Create Writer&lt;br /&gt;
    ISeriesObsDataWriterEngine dwe = dwm.getDataWriterEngine(SdmxJsonDataFormat.INSTANCE, System.out);&lt;br /&gt;
    	&lt;br /&gt;
    //Transform Data&lt;br /&gt;
    DataTransformOptions transformOptions = DataTransformOptions.getInstance().setCloseWriter(true); &lt;br /&gt;
    DataTransformationUtil.copyData(dre, dwe, transformOptions);&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7088</id>
		<title>DRAFT SDMX-CORE</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7088"/>
		<updated>2023-07-24T16:24:59Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Data Transformation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectire =&lt;br /&gt;
== Modules ==&lt;br /&gt;
The sdmx-io modules are as follows&lt;br /&gt;
===Interface Modules===&lt;br /&gt;
These modules contains Java Interfaces only, no Java classes.  The sdmx-io framework uses Interfaces over implementation classes in order to achieve loose coupling.&lt;br /&gt;
&lt;br /&gt;
 '''fusion-api'''  - contains generic Interfaces that are unrelated to SDMX. Each package in this project is broken down by function, i.e audit, cache, date, email, exception&lt;br /&gt;
 '''fusion-api-dao''' - contains Interface definitions for database persistence, not coupled to database platform, but all based on storeage and retrieval of Java Objects&lt;br /&gt;
 '''fusion-api-sdmx''' - contains Interfaces for SDMX Information model (SdmxBeans and related), high level Interfaces for SDMX related functions which cross mulitple modules&lt;br /&gt;
 '''fusion-api-service''' - contains Interfaces definitions for web services to use - allowing projects the implement web service entry points to not require web service depdenancies&lt;br /&gt;
&lt;br /&gt;
===Implementation Modules===&lt;br /&gt;
These modules contain Java classes which are core to SDMX, they implement Interfaces in the higher api modules&lt;br /&gt;
 '''fusion-sdmx-im''' - contains the implementation code for the SDMX Information Model (SdmxBeans and related structures such as Codelists, Concepts, etc)&lt;br /&gt;
 '''fusion-core-data''' - contains code to read/write data and generic data related features such as determining series/obs, validation, temporary data stores&lt;br /&gt;
 '''fusion-core-sdmx''' - contains core code for structural metadata, including temporary store, cross reference resolution, contains some data and reference metadata features &lt;br /&gt;
 '''fusion-core-structure''' - contains core code for processing structural metadata &lt;br /&gt;
 '''fusion-core-xlsx''' - contains code to read and write structures and data in Excel &lt;br /&gt;
&lt;br /&gt;
===Format Modules===&lt;br /&gt;
These modules contains Java classes for reading and writing SDMX Structureal Metadata, Reference Metadata, and Data&lt;br /&gt;
&lt;br /&gt;
 '''fusion-sdmx-csv''' - reading and writing SDMX-CSV format&lt;br /&gt;
 '''fusion-sdmx-edi''' - reading and writing SDMX-EDI format&lt;br /&gt;
 '''fusion-sdmx-json''' - reading and writing SDMX-JSON format&lt;br /&gt;
 '''fusion-sdmx-ml''' reading and writing SDMX-XML&lt;br /&gt;
&lt;br /&gt;
===Feature Modules===&lt;br /&gt;
These modules provide feature specific code&lt;br /&gt;
 '''fusion-core-dao''' - contains generic DAO implementations for storing and querying for objects, not coupled to a specific object store, but we use hibernate, mongodb is also an option&lt;br /&gt;
 '''fusion-audit''' - audit events and centralised error handling&lt;br /&gt;
 '''fusion-sdmx-kafka''' - connecting to and sending/recieving messages to Apache Kafka&lt;br /&gt;
 '''fusion-sdmx-publication''' - SDMX Publication Tables: SdmxBean implementations, and buisness logic to materilise table based on definition&lt;br /&gt;
 '''fusion-sdmx-reporttemplate''' - Reporting Templates: SdmxBean implementations, and buisness logic to genearte excel workbook from template definition, reading data from workbooks&lt;br /&gt;
 '''fusion-sdmx-rest''' - SDMX web services, and additional web service implementations from APIs defined in fusion-api-service&lt;br /&gt;
 '''fusion-sdmx-search''' - Lucene search engine for structures&lt;br /&gt;
 '''fusion-sdmx-security''' - authentication against LDAP/AD/Fusion Security - contains user definition (SecurityDetailsImpl)&lt;br /&gt;
 '''fusion-xl''' - exposes web services required by the FusionXL Excel Pluin&lt;br /&gt;
&lt;br /&gt;
===Utility Modules===&lt;br /&gt;
Utility classes, typically public static classes, the utils projects may organise code by function rather then using the generic packaging structure (api, engine, manager, model, ...)&lt;br /&gt;
 '''fusion-utils''' - generic utility classes, not specific to SDMX&lt;br /&gt;
 '''fusion-utils-hibernate''' - implementation code to use Hibernate as a means to connect to the DAO&lt;br /&gt;
 '''fusion-utils-http''' - calling HTTP web services&lt;br /&gt;
 '''fusion-utils-json''' - JSON related utility classes&lt;br /&gt;
 '''fusion-utils-mail''' - email utiliity classes&lt;br /&gt;
 '''fusion-utils-mongodb'''  - implementation code to use MongoDB a means to store Objects&lt;br /&gt;
 '''fusion-utils-sdmx''' - SDMX Specific utilty classes&lt;br /&gt;
 '''fusion-utils-spring''' - spring related utility classes&lt;br /&gt;
 '''fusion-utils-xlsx''' - reading/writing Excel workbooks related utility classes&lt;br /&gt;
&lt;br /&gt;
== Java Packages ==&lt;br /&gt;
Each module is partitioned into Java packages, with the exception of the utility modules, which typically seperate code by its function. &lt;br /&gt;
&lt;br /&gt;
The generic packages are as follows.&lt;br /&gt;
&lt;br /&gt;
 '''api''' - contains interfaces relevent to the module &lt;br /&gt;
 '''constant''' - contains Java enums and java classes that contain public static constants&lt;br /&gt;
 '''engine''' - classes that 'do the work', many are stateless singletons, there are also stateful for example DataReader/WriterEngine &lt;br /&gt;
 '''factory''' - singleton classes that are responisble for generating an engine, typically called by a manager class, factories enable new features to be plugged into the framework&lt;br /&gt;
 '''filter'''  - REST web service filters (defined in web.xml) - filters are called before the web service&lt;br /&gt;
 '''manager''' - the main entry point for all high level functions, the manager's job is to veryify the request (i.e. a security check) and manage the process of fulfiliing the request by delegating the work to an engine or a DAO, a manager should be a fairly thin layer&lt;br /&gt;
 '''model''' - data transfer objects &lt;br /&gt;
 '''service''' (or rest) - web service entry points&lt;br /&gt;
 '''util''' - utility classes, typically containing public static methods&lt;br /&gt;
&lt;br /&gt;
The general logical flow of a system is the following&lt;br /&gt;
&lt;br /&gt;
 service --&amp;gt; manager --&amp;gt; engine&lt;br /&gt;
                     --&amp;gt; dao&lt;br /&gt;
&lt;br /&gt;
The service (web service entry point) is a thin layer which collects the request arguments, with miniumal manipulation, and passes them to the respective Service Interface. The implementation of this Service Interface will create an apporpriate model object (or objects) which contain a consolidated collection of arguements, some validation of arguments can be performed at this point, and then pass these to the manager Interface.  The manager will ensure the arguments are valid and the user has permission to perform the action.  The manager then provides the workflow required to fulfil the task, by makking calls to engines, daos.&lt;br /&gt;
&lt;br /&gt;
= High Level Design =&lt;br /&gt;
&lt;br /&gt;
==[https://en.wikipedia.org/wiki/Inversion_of_control Inversion of Control] (IoC)==&lt;br /&gt;
&lt;br /&gt;
IoC is achieved by assigning all implementation classes to Interfaces and ensuring classes are stateless so that they can be singletons.  Managers are typically singletons.  This enables the system to be plugged togeather either by using the spring framework, or by using the sdmx.io framework.&lt;br /&gt;
&lt;br /&gt;
===Spring Framework===&lt;br /&gt;
Spring is used in the Java web application, web.xml references a number of spring bean files, which are located under src/main/resources/spring subfolder of the web application library.  The spring beans define the classes and which dependancies they are using. This works well for very large systems such as Fusion Metadata Registry which contains a large number of services and class definitions.&lt;br /&gt;
&lt;br /&gt;
===SDMX.IO IoC framework===&lt;br /&gt;
In order to remove the dependency on spring, and to simplify simpler projects, Sdmx.io provides a framework which allows instances of singleton classes to be registered to and obtained via the '''SingletonStore''' class.  When the class is not a singleton instances can be registered with the '''FusionBeanStore''' class.  &lt;br /&gt;
&lt;br /&gt;
A running application would request a singleton instance in the following way.&lt;br /&gt;
&lt;br /&gt;
 private IActiveDirectorySecuritySettingsManager activeDirectorySecuritySettingsManager = SingletonStore.getSingleton(IActiveDirectorySecuritySettingsManager.class);&lt;br /&gt;
&lt;br /&gt;
This is typically done at the web service layer, as a web service is constructed outside of the spring framework, after the application has launched.&lt;br /&gt;
&lt;br /&gt;
There are some use cases where the singleton is not available at the time it is requested, typcially because it is during application startup and the bean has not yet been built and registered.  In this scenario the Singleton store can be asked to provide an instance when it is registered.&lt;br /&gt;
 &lt;br /&gt;
 SingletonStore.registerInterest(FusionProductInformationRetrievalManager.class, (bean) -&amp;gt; {&lt;br /&gt;
   infoRetreival = bean;&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
If the application wants multiple instances of an interface, then the FusionBeanStore is used&lt;br /&gt;
&lt;br /&gt;
 Collection&amp;lt;StructureWriterFactory&amp;gt; allBeans = FusionBeanStore.getBeans(StructureWriterFactory.class);&lt;br /&gt;
&lt;br /&gt;
===Using Spring/SDMX.IO===&lt;br /&gt;
In order to quickly register modules with the SDMX.IO framework, there are a number of classes that implement '''IFusionModule''', these classes have a register method, which on calling will automatically create and register instances of classes relevent to that module. &lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 CoreSDMXModule.register(); - register schema factories, cross reference resolution, reference metadata reader and writer manager&lt;br /&gt;
 SdmxMLModule.register();  - register SDMX-XML data and structure format readers and writers&lt;br /&gt;
 SdmxJsonModule.register(); - register SDMX-JSON data and structure format readers and writers&lt;br /&gt;
 FusionXLModule.register(); - register FusionXL classes for the excel plugin&lt;br /&gt;
 SdmxEDIModule.register(); - register SDMX-EDI data and structure format readers and writers&lt;br /&gt;
 FusionJsonModule.register();  - register Fusion-JSON data and structure format readers and writers&lt;br /&gt;
 SdmxCsvModule.register();  - register SDMX-CSV data format readers and writers&lt;br /&gt;
 FusionCoreDataModule.register();  - register SDMX-EDI data and structure format readers and writers&lt;br /&gt;
 XLSXModule.register();  - register reader and writer for Excel&lt;br /&gt;
 PublicationTableModule.register(); - classes to support Publication ables&lt;br /&gt;
  &lt;br /&gt;
The spring framework can be used in conjunction with the SDMX.IO IoC framework, as the class '''SpringBeansContainer''' which is a wrapper around the spring beans contained, can be used by both the SingletonStore and FusionBeansStore.  This allows SingletonStore and FusionBeansStore to search both the spring beans container, and any locally registered classes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Example Code =&lt;br /&gt;
== Reading Structures ==&lt;br /&gt;
* Register the SDMX-ML module as the response from the URL is in SDMX-ML format&lt;br /&gt;
* Creates an instance of the StructureReaderManager  (typically in an application this would be a singleton). &lt;br /&gt;
* Creates a wrapper around a URL giving repeated access to the input stream of information, the URL resolves to an SDMX structure file containing mulitple Dataflows&lt;br /&gt;
* Convert the stream into SDMX structures&lt;br /&gt;
* Loop the Dataflows and print the ID to the console&lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
  SdmxMLModule.register();&lt;br /&gt;
  StructureReaderManager srm = new StructureReaderManagerImpl();&lt;br /&gt;
  ReadableDataLocation rdl = new ReadableDataLocationTmp(new URL(&amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2/structure/dataflow&amp;quot;));&lt;br /&gt;
  SdmxBeans beans = srm.parseStructures(rdl);&lt;br /&gt;
  beans.getDataflows().forEach((flow) -&amp;gt; System.out.println(flow.getId()));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Writing / Transforming Structures ==&lt;br /&gt;
The same code as  Reading Structures, but with the addition lines in BOLD&lt;br /&gt;
&lt;br /&gt;
* Register the SDMX-JSON module as we are wriring out in this format&lt;br /&gt;
* Creates an instance of the StructureWriterManager (typically in an application this would be a singleton). &lt;br /&gt;
* Writes the structures in FusionJson format to the system output&lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
  SdmxMLModule.register();&lt;br /&gt;
  '''SdmxJsonModule.register();'''&lt;br /&gt;
  StructureReaderManager srm = new StructureReaderManagerImpl();&lt;br /&gt;
  ReadableDataLocation rdl = new ReadableDataLocationTmp(new URL(&amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2/structure/dataflow&amp;quot;));&lt;br /&gt;
  SdmxBeans beans = srm.parseStructures(rdl);&lt;br /&gt;
  '''StructureWriterManager swm = new StructureWriterManagerImpl();'''&lt;br /&gt;
  '''swm.writeStructures(beans, FusionJsonStructureFormat.getInstance(), System.out);'''&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Data Read ==&lt;br /&gt;
Reading data requires access to both the dataset, and the structural metadata (DSD) which describes the data in terms of its Dimensions and Concepts.  &lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
    //SDMX WEB SERVICE&lt;br /&gt;
    String sdmxv2API = &amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2&amp;quot;;&lt;br /&gt;
    String dataflow = &amp;quot;dataflow/ECB/BSI/1.0&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    //Register modules for formats&lt;br /&gt;
    SdmxMLModule.register();&lt;br /&gt;
    	&lt;br /&gt;
    //Set up data reader and writer managers&lt;br /&gt;
    DataFormatManager dfm = new DataFormatManagerImpl(SdmxJsonDataFormat.INSTANCE, InformationFormatManager.getInstance());&lt;br /&gt;
    DataReaderManager drm = new DataReaderManagerImpl(dfm);&lt;br /&gt;
    	&lt;br /&gt;
    //Get Structures from URL into an in-memory store&lt;br /&gt;
    String structureURL = sdmxv2API + &amp;quot;/structure/&amp;quot;+dataflow+&amp;quot;?references=children&amp;quot;;&lt;br /&gt;
    SdmxBeanRetrievalManager beanRetrieval = new InMemoryRetrievalManagerFast(new ReadableDataLocationTmp(structureURL), new StructureReaderManagerImpl());&lt;br /&gt;
 &lt;br /&gt;
    //Get Data&lt;br /&gt;
    String dataQueryUrl = sdmxv2API+&amp;quot;/data/&amp;quot;+dataflow+&amp;quot;?c%5BFREQ%5D=A&amp;amp;c%5BREF_AREA%5D=DE,ES&amp;quot;;&lt;br /&gt;
    ReadableDataLocation sourceData = new ReadableDataLocationTmp(dataQueryUrl);&lt;br /&gt;
    DataReaderEngine dre = drm.getDataReaderEngine(sourceData, beanRetrieval, null);&lt;br /&gt;
    	&lt;br /&gt;
    while(dre.moveNextDataset()) {&lt;br /&gt;
      while(dre.moveNextKeyable()) {&lt;br /&gt;
        System.out.println(dre.getCurrentKey().getShortCode());&lt;br /&gt;
        while(dre.moveNextObservation()) {&lt;br /&gt;
          Observation obs = dre.getCurrentObservation();&lt;br /&gt;
          System.out.println(obs.getDimensionValue() + &amp;quot;=&amp;quot; + obs.getPrimaryMeasure());&lt;br /&gt;
        }&lt;br /&gt;
      }	&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Data Transformation ==&lt;br /&gt;
This example is a bit more involved, as the structures are no longer obtained as a file, but on demand from a web service.  This requires the registration of the REST&lt;br /&gt;
classes.  In addition, as the output data format is SDMX JSON, the writer requires not only access to the DSD, but also all the metadata related to the DSD (Codelists, Concepts).  This requires &lt;br /&gt;
the SdmxSuperBeanRetrievalManager, which is used to get a fully resolved tree of structural information.&lt;br /&gt;
&lt;br /&gt;
  public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
    //SDMX WEB SERVICE&lt;br /&gt;
    String sdmxv2API = &amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    //Register modules for formats&lt;br /&gt;
    SdmxMLModule.register();&lt;br /&gt;
    SdmxJsonModule.register();&lt;br /&gt;
    	&lt;br /&gt;
    //Manually register required instances		&lt;br /&gt;
    SingletonStore.registerInstance(new RESTQueryBrokerEngineImpl());&lt;br /&gt;
    SingletonStore.registerInstance(new StructureQueryBuilderRest());&lt;br /&gt;
    SingletonStore.registerInstance(new StructureReaderManagerImpl());&lt;br /&gt;
    	&lt;br /&gt;
    //Set up data reader and writer managers&lt;br /&gt;
    DataFormatManager dfm = new DataFormatManagerImpl(SdmxJsonDataFormat.INSTANCE, InformationFormatManager.getInstance());&lt;br /&gt;
    DataReaderManager drm = new DataReaderManagerImpl(dfm);&lt;br /&gt;
    DataWriterManager dwm = new DataWriterManagerImpl(dfm);&lt;br /&gt;
    	&lt;br /&gt;
    //JSON output format requires access to the metadata so labels can be resolved&lt;br /&gt;
    //Wrap the SDMX API ISdmxBeanRestRetrievalManager in a SdmxBeanRetrievalManager so the system can pull back the required structures on demand&lt;br /&gt;
    ISdmxBeanRestRetrievalManager restBeanRetrievalManager = new RESTSdmxBeanRetrievalManager(sdmxv2API, REST_API_VERSION.v2_0_0);&lt;br /&gt;
    SdmxBeanRetrievalManager beanRetrieval = new SdmxRestToBeanRetrievalManager(restBeanRetrievalManager);&lt;br /&gt;
 &lt;br /&gt;
    //Additionally wrap the SdmxBeanRetrievalManager to create a SdmxSuperBeanRetrievalManager, required when the full 'tree' of structral metadata is &lt;br /&gt;
    //required (i.e not just the SDMX Data Structure but resolved Concepts and Codelists in one fully resolved Object&lt;br /&gt;
    SdmxSuperBeanRetrievalManager sbRm = new SdmxSuperBeanRetrievalManagerImpl(beanRetrieval);&lt;br /&gt;
    	 &lt;br /&gt;
    //Register an instance of a SdmxBeanRetreivalContainer with the system, this is used as the default container to get a handle on implementations of the &lt;br /&gt;
    //structure retrieval interfaces - used by classes including the JSON writers&lt;br /&gt;
    SingletonStore.registerInstance(new SdmxBeanRetreivalContainer(beanRetrieval, null, sbRm, null, null, restBeanRetrievalManager));&lt;br /&gt;
    	&lt;br /&gt;
    //Get Data&lt;br /&gt;
    String dataQueryUrl = sdmxv2API+&amp;quot;/data/dataflow/ECB/BSI/1.0/?c%5BFREQ%5D=A&amp;amp;c%5BREF_AREA%5D=DE,ES&amp;quot;;&lt;br /&gt;
    ReadableDataLocation sourceData = new ReadableDataLocationTmp(dataQueryUrl);&lt;br /&gt;
    DataReaderEngine dre = drm.getDataReaderEngine(sourceData, beanRetrieval, null);&lt;br /&gt;
    	&lt;br /&gt;
    //Create Writer&lt;br /&gt;
    ISeriesObsDataWriterEngine dwe = dwm.getDataWriterEngine(SdmxJsonDataFormat.INSTANCE, System.out);&lt;br /&gt;
    	&lt;br /&gt;
    //Transform Data&lt;br /&gt;
    DataTransformOptions transformOptions = DataTransformOptions.getInstance().setCloseWriter(true); &lt;br /&gt;
    DataTransformationUtil.copyData(dre, dwe, transformOptions);&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7087</id>
		<title>DRAFT SDMX-CORE</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7087"/>
		<updated>2023-07-24T16:24:24Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Data Transformation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectire =&lt;br /&gt;
== Modules ==&lt;br /&gt;
The sdmx-io modules are as follows&lt;br /&gt;
===Interface Modules===&lt;br /&gt;
These modules contains Java Interfaces only, no Java classes.  The sdmx-io framework uses Interfaces over implementation classes in order to achieve loose coupling.&lt;br /&gt;
&lt;br /&gt;
 '''fusion-api'''  - contains generic Interfaces that are unrelated to SDMX. Each package in this project is broken down by function, i.e audit, cache, date, email, exception&lt;br /&gt;
 '''fusion-api-dao''' - contains Interface definitions for database persistence, not coupled to database platform, but all based on storeage and retrieval of Java Objects&lt;br /&gt;
 '''fusion-api-sdmx''' - contains Interfaces for SDMX Information model (SdmxBeans and related), high level Interfaces for SDMX related functions which cross mulitple modules&lt;br /&gt;
 '''fusion-api-service''' - contains Interfaces definitions for web services to use - allowing projects the implement web service entry points to not require web service depdenancies&lt;br /&gt;
&lt;br /&gt;
===Implementation Modules===&lt;br /&gt;
These modules contain Java classes which are core to SDMX, they implement Interfaces in the higher api modules&lt;br /&gt;
 '''fusion-sdmx-im''' - contains the implementation code for the SDMX Information Model (SdmxBeans and related structures such as Codelists, Concepts, etc)&lt;br /&gt;
 '''fusion-core-data''' - contains code to read/write data and generic data related features such as determining series/obs, validation, temporary data stores&lt;br /&gt;
 '''fusion-core-sdmx''' - contains core code for structural metadata, including temporary store, cross reference resolution, contains some data and reference metadata features &lt;br /&gt;
 '''fusion-core-structure''' - contains core code for processing structural metadata &lt;br /&gt;
 '''fusion-core-xlsx''' - contains code to read and write structures and data in Excel &lt;br /&gt;
&lt;br /&gt;
===Format Modules===&lt;br /&gt;
These modules contains Java classes for reading and writing SDMX Structureal Metadata, Reference Metadata, and Data&lt;br /&gt;
&lt;br /&gt;
 '''fusion-sdmx-csv''' - reading and writing SDMX-CSV format&lt;br /&gt;
 '''fusion-sdmx-edi''' - reading and writing SDMX-EDI format&lt;br /&gt;
 '''fusion-sdmx-json''' - reading and writing SDMX-JSON format&lt;br /&gt;
 '''fusion-sdmx-ml''' reading and writing SDMX-XML&lt;br /&gt;
&lt;br /&gt;
===Feature Modules===&lt;br /&gt;
These modules provide feature specific code&lt;br /&gt;
 '''fusion-core-dao''' - contains generic DAO implementations for storing and querying for objects, not coupled to a specific object store, but we use hibernate, mongodb is also an option&lt;br /&gt;
 '''fusion-audit''' - audit events and centralised error handling&lt;br /&gt;
 '''fusion-sdmx-kafka''' - connecting to and sending/recieving messages to Apache Kafka&lt;br /&gt;
 '''fusion-sdmx-publication''' - SDMX Publication Tables: SdmxBean implementations, and buisness logic to materilise table based on definition&lt;br /&gt;
 '''fusion-sdmx-reporttemplate''' - Reporting Templates: SdmxBean implementations, and buisness logic to genearte excel workbook from template definition, reading data from workbooks&lt;br /&gt;
 '''fusion-sdmx-rest''' - SDMX web services, and additional web service implementations from APIs defined in fusion-api-service&lt;br /&gt;
 '''fusion-sdmx-search''' - Lucene search engine for structures&lt;br /&gt;
 '''fusion-sdmx-security''' - authentication against LDAP/AD/Fusion Security - contains user definition (SecurityDetailsImpl)&lt;br /&gt;
 '''fusion-xl''' - exposes web services required by the FusionXL Excel Pluin&lt;br /&gt;
&lt;br /&gt;
===Utility Modules===&lt;br /&gt;
Utility classes, typically public static classes, the utils projects may organise code by function rather then using the generic packaging structure (api, engine, manager, model, ...)&lt;br /&gt;
 '''fusion-utils''' - generic utility classes, not specific to SDMX&lt;br /&gt;
 '''fusion-utils-hibernate''' - implementation code to use Hibernate as a means to connect to the DAO&lt;br /&gt;
 '''fusion-utils-http''' - calling HTTP web services&lt;br /&gt;
 '''fusion-utils-json''' - JSON related utility classes&lt;br /&gt;
 '''fusion-utils-mail''' - email utiliity classes&lt;br /&gt;
 '''fusion-utils-mongodb'''  - implementation code to use MongoDB a means to store Objects&lt;br /&gt;
 '''fusion-utils-sdmx''' - SDMX Specific utilty classes&lt;br /&gt;
 '''fusion-utils-spring''' - spring related utility classes&lt;br /&gt;
 '''fusion-utils-xlsx''' - reading/writing Excel workbooks related utility classes&lt;br /&gt;
&lt;br /&gt;
== Java Packages ==&lt;br /&gt;
Each module is partitioned into Java packages, with the exception of the utility modules, which typically seperate code by its function. &lt;br /&gt;
&lt;br /&gt;
The generic packages are as follows.&lt;br /&gt;
&lt;br /&gt;
 '''api''' - contains interfaces relevent to the module &lt;br /&gt;
 '''constant''' - contains Java enums and java classes that contain public static constants&lt;br /&gt;
 '''engine''' - classes that 'do the work', many are stateless singletons, there are also stateful for example DataReader/WriterEngine &lt;br /&gt;
 '''factory''' - singleton classes that are responisble for generating an engine, typically called by a manager class, factories enable new features to be plugged into the framework&lt;br /&gt;
 '''filter'''  - REST web service filters (defined in web.xml) - filters are called before the web service&lt;br /&gt;
 '''manager''' - the main entry point for all high level functions, the manager's job is to veryify the request (i.e. a security check) and manage the process of fulfiliing the request by delegating the work to an engine or a DAO, a manager should be a fairly thin layer&lt;br /&gt;
 '''model''' - data transfer objects &lt;br /&gt;
 '''service''' (or rest) - web service entry points&lt;br /&gt;
 '''util''' - utility classes, typically containing public static methods&lt;br /&gt;
&lt;br /&gt;
The general logical flow of a system is the following&lt;br /&gt;
&lt;br /&gt;
 service --&amp;gt; manager --&amp;gt; engine&lt;br /&gt;
                     --&amp;gt; dao&lt;br /&gt;
&lt;br /&gt;
The service (web service entry point) is a thin layer which collects the request arguments, with miniumal manipulation, and passes them to the respective Service Interface. The implementation of this Service Interface will create an apporpriate model object (or objects) which contain a consolidated collection of arguements, some validation of arguments can be performed at this point, and then pass these to the manager Interface.  The manager will ensure the arguments are valid and the user has permission to perform the action.  The manager then provides the workflow required to fulfil the task, by makking calls to engines, daos.&lt;br /&gt;
&lt;br /&gt;
= High Level Design =&lt;br /&gt;
&lt;br /&gt;
==[https://en.wikipedia.org/wiki/Inversion_of_control Inversion of Control] (IoC)==&lt;br /&gt;
&lt;br /&gt;
IoC is achieved by assigning all implementation classes to Interfaces and ensuring classes are stateless so that they can be singletons.  Managers are typically singletons.  This enables the system to be plugged togeather either by using the spring framework, or by using the sdmx.io framework.&lt;br /&gt;
&lt;br /&gt;
===Spring Framework===&lt;br /&gt;
Spring is used in the Java web application, web.xml references a number of spring bean files, which are located under src/main/resources/spring subfolder of the web application library.  The spring beans define the classes and which dependancies they are using. This works well for very large systems such as Fusion Metadata Registry which contains a large number of services and class definitions.&lt;br /&gt;
&lt;br /&gt;
===SDMX.IO IoC framework===&lt;br /&gt;
In order to remove the dependency on spring, and to simplify simpler projects, Sdmx.io provides a framework which allows instances of singleton classes to be registered to and obtained via the '''SingletonStore''' class.  When the class is not a singleton instances can be registered with the '''FusionBeanStore''' class.  &lt;br /&gt;
&lt;br /&gt;
A running application would request a singleton instance in the following way.&lt;br /&gt;
&lt;br /&gt;
 private IActiveDirectorySecuritySettingsManager activeDirectorySecuritySettingsManager = SingletonStore.getSingleton(IActiveDirectorySecuritySettingsManager.class);&lt;br /&gt;
&lt;br /&gt;
This is typically done at the web service layer, as a web service is constructed outside of the spring framework, after the application has launched.&lt;br /&gt;
&lt;br /&gt;
There are some use cases where the singleton is not available at the time it is requested, typcially because it is during application startup and the bean has not yet been built and registered.  In this scenario the Singleton store can be asked to provide an instance when it is registered.&lt;br /&gt;
 &lt;br /&gt;
 SingletonStore.registerInterest(FusionProductInformationRetrievalManager.class, (bean) -&amp;gt; {&lt;br /&gt;
   infoRetreival = bean;&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
If the application wants multiple instances of an interface, then the FusionBeanStore is used&lt;br /&gt;
&lt;br /&gt;
 Collection&amp;lt;StructureWriterFactory&amp;gt; allBeans = FusionBeanStore.getBeans(StructureWriterFactory.class);&lt;br /&gt;
&lt;br /&gt;
===Using Spring/SDMX.IO===&lt;br /&gt;
In order to quickly register modules with the SDMX.IO framework, there are a number of classes that implement '''IFusionModule''', these classes have a register method, which on calling will automatically create and register instances of classes relevent to that module. &lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 CoreSDMXModule.register(); - register schema factories, cross reference resolution, reference metadata reader and writer manager&lt;br /&gt;
 SdmxMLModule.register();  - register SDMX-XML data and structure format readers and writers&lt;br /&gt;
 SdmxJsonModule.register(); - register SDMX-JSON data and structure format readers and writers&lt;br /&gt;
 FusionXLModule.register(); - register FusionXL classes for the excel plugin&lt;br /&gt;
 SdmxEDIModule.register(); - register SDMX-EDI data and structure format readers and writers&lt;br /&gt;
 FusionJsonModule.register();  - register Fusion-JSON data and structure format readers and writers&lt;br /&gt;
 SdmxCsvModule.register();  - register SDMX-CSV data format readers and writers&lt;br /&gt;
 FusionCoreDataModule.register();  - register SDMX-EDI data and structure format readers and writers&lt;br /&gt;
 XLSXModule.register();  - register reader and writer for Excel&lt;br /&gt;
 PublicationTableModule.register(); - classes to support Publication ables&lt;br /&gt;
  &lt;br /&gt;
The spring framework can be used in conjunction with the SDMX.IO IoC framework, as the class '''SpringBeansContainer''' which is a wrapper around the spring beans contained, can be used by both the SingletonStore and FusionBeansStore.  This allows SingletonStore and FusionBeansStore to search both the spring beans container, and any locally registered classes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Example Code =&lt;br /&gt;
== Reading Structures ==&lt;br /&gt;
* Register the SDMX-ML module as the response from the URL is in SDMX-ML format&lt;br /&gt;
* Creates an instance of the StructureReaderManager  (typically in an application this would be a singleton). &lt;br /&gt;
* Creates a wrapper around a URL giving repeated access to the input stream of information, the URL resolves to an SDMX structure file containing mulitple Dataflows&lt;br /&gt;
* Convert the stream into SDMX structures&lt;br /&gt;
* Loop the Dataflows and print the ID to the console&lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
  SdmxMLModule.register();&lt;br /&gt;
  StructureReaderManager srm = new StructureReaderManagerImpl();&lt;br /&gt;
  ReadableDataLocation rdl = new ReadableDataLocationTmp(new URL(&amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2/structure/dataflow&amp;quot;));&lt;br /&gt;
  SdmxBeans beans = srm.parseStructures(rdl);&lt;br /&gt;
  beans.getDataflows().forEach((flow) -&amp;gt; System.out.println(flow.getId()));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Writing / Transforming Structures ==&lt;br /&gt;
The same code as  Reading Structures, but with the addition lines in BOLD&lt;br /&gt;
&lt;br /&gt;
* Register the SDMX-JSON module as we are wriring out in this format&lt;br /&gt;
* Creates an instance of the StructureWriterManager (typically in an application this would be a singleton). &lt;br /&gt;
* Writes the structures in FusionJson format to the system output&lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
  SdmxMLModule.register();&lt;br /&gt;
  '''SdmxJsonModule.register();'''&lt;br /&gt;
  StructureReaderManager srm = new StructureReaderManagerImpl();&lt;br /&gt;
  ReadableDataLocation rdl = new ReadableDataLocationTmp(new URL(&amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2/structure/dataflow&amp;quot;));&lt;br /&gt;
  SdmxBeans beans = srm.parseStructures(rdl);&lt;br /&gt;
  '''StructureWriterManager swm = new StructureWriterManagerImpl();'''&lt;br /&gt;
  '''swm.writeStructures(beans, FusionJsonStructureFormat.getInstance(), System.out);'''&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Data Read ==&lt;br /&gt;
Reading data requires access to both the dataset, and the structural metadata (DSD) which describes the data in terms of its Dimensions and Concepts.  &lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
    //SDMX WEB SERVICE&lt;br /&gt;
    String sdmxv2API = &amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2&amp;quot;;&lt;br /&gt;
    String dataflow = &amp;quot;dataflow/ECB/BSI/1.0&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    //Register modules for formats&lt;br /&gt;
    SdmxMLModule.register();&lt;br /&gt;
    	&lt;br /&gt;
    //Set up data reader and writer managers&lt;br /&gt;
    DataFormatManager dfm = new DataFormatManagerImpl(SdmxJsonDataFormat.INSTANCE, InformationFormatManager.getInstance());&lt;br /&gt;
    DataReaderManager drm = new DataReaderManagerImpl(dfm);&lt;br /&gt;
    	&lt;br /&gt;
    //Get Structures from URL into an in-memory store&lt;br /&gt;
    String structureURL = sdmxv2API + &amp;quot;/structure/&amp;quot;+dataflow+&amp;quot;?references=children&amp;quot;;&lt;br /&gt;
    SdmxBeanRetrievalManager beanRetrieval = new InMemoryRetrievalManagerFast(new ReadableDataLocationTmp(structureURL), new StructureReaderManagerImpl());&lt;br /&gt;
 &lt;br /&gt;
    //Get Data&lt;br /&gt;
    String dataQueryUrl = sdmxv2API+&amp;quot;/data/&amp;quot;+dataflow+&amp;quot;?c%5BFREQ%5D=A&amp;amp;c%5BREF_AREA%5D=DE,ES&amp;quot;;&lt;br /&gt;
    ReadableDataLocation sourceData = new ReadableDataLocationTmp(dataQueryUrl);&lt;br /&gt;
    DataReaderEngine dre = drm.getDataReaderEngine(sourceData, beanRetrieval, null);&lt;br /&gt;
    	&lt;br /&gt;
    while(dre.moveNextDataset()) {&lt;br /&gt;
      while(dre.moveNextKeyable()) {&lt;br /&gt;
        System.out.println(dre.getCurrentKey().getShortCode());&lt;br /&gt;
        while(dre.moveNextObservation()) {&lt;br /&gt;
          Observation obs = dre.getCurrentObservation();&lt;br /&gt;
          System.out.println(obs.getDimensionValue() + &amp;quot;=&amp;quot; + obs.getPrimaryMeasure());&lt;br /&gt;
        }&lt;br /&gt;
      }	&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Data Transformation ==&lt;br /&gt;
This example is a bit more involved, as the structures are no longer obtained as a file, but on demand from a web service.  This requires the registration of the REST&lt;br /&gt;
classes.  In addition, as the output data format is SDMX JSON, the writer requires not only access to the DSD, but also all the metadata related to the DSD (Codelists, Concepts).  This requires &lt;br /&gt;
the SdmxSuperBeanRetrievalManager, which is used to get a fully resolved tree of structural information.&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
    	//SDMX WEB SERVICE&lt;br /&gt;
    	String sdmxv2API = &amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    	//Register modules for formats&lt;br /&gt;
    	SdmxMLModule.register();&lt;br /&gt;
    	SdmxJsonModule.register();&lt;br /&gt;
    	&lt;br /&gt;
    	//Manually register required instances		&lt;br /&gt;
    	SingletonStore.registerInstance(new RESTQueryBrokerEngineImpl());&lt;br /&gt;
    	SingletonStore.registerInstance(new StructureQueryBuilderRest());&lt;br /&gt;
    	SingletonStore.registerInstance(new StructureReaderManagerImpl());&lt;br /&gt;
    	&lt;br /&gt;
    	//Set up data reader and writer managers&lt;br /&gt;
    	DataFormatManager dfm = new DataFormatManagerImpl(SdmxJsonDataFormat.INSTANCE, InformationFormatManager.getInstance());&lt;br /&gt;
    	DataReaderManager drm = new DataReaderManagerImpl(dfm);&lt;br /&gt;
    	DataWriterManager dwm = new DataWriterManagerImpl(dfm);&lt;br /&gt;
    	&lt;br /&gt;
    	//JSON output format requires access to the metadata so labels can be resolved&lt;br /&gt;
    	//Wrap the SDMX API ISdmxBeanRestRetrievalManager in a SdmxBeanRetrievalManager so the system can pull back the required structures on demand&lt;br /&gt;
    	ISdmxBeanRestRetrievalManager restBeanRetrievalManager = new RESTSdmxBeanRetrievalManager(sdmxv2API, REST_API_VERSION.v2_0_0);&lt;br /&gt;
    	SdmxBeanRetrievalManager beanRetrieval = new SdmxRestToBeanRetrievalManager(restBeanRetrievalManager);&lt;br /&gt;
 &lt;br /&gt;
    	//Additionally wrap the SdmxBeanRetrievalManager to create a SdmxSuperBeanRetrievalManager, required when the full 'tree' of structral metadata is &lt;br /&gt;
    	//required (i.e not just the SDMX Data Structure but resolved Concepts and Codelists in one fully resolved Object&lt;br /&gt;
    	SdmxSuperBeanRetrievalManager sbRm = new SdmxSuperBeanRetrievalManagerImpl(beanRetrieval);&lt;br /&gt;
    	 &lt;br /&gt;
    	//Register an instance of a SdmxBeanRetreivalContainer with the system, this is used as the default container to get a handle on implementations of the &lt;br /&gt;
    	//structure retrieval interfaces - used by classes including the JSON writers&lt;br /&gt;
    	SingletonStore.registerInstance(new SdmxBeanRetreivalContainer(beanRetrieval, null, sbRm, null, null, restBeanRetrievalManager));&lt;br /&gt;
    	&lt;br /&gt;
    	//Get Data&lt;br /&gt;
    	String dataQueryUrl = sdmxv2API+&amp;quot;/data/dataflow/ECB/BSI/1.0/?c%5BFREQ%5D=A&amp;amp;c%5BREF_AREA%5D=DE,ES&amp;quot;;&lt;br /&gt;
    	ReadableDataLocation sourceData = new ReadableDataLocationTmp(dataQueryUrl);&lt;br /&gt;
    	DataReaderEngine dre = drm.getDataReaderEngine(sourceData, beanRetrieval, null);&lt;br /&gt;
    	&lt;br /&gt;
    	//Create Writer&lt;br /&gt;
    	ISeriesObsDataWriterEngine dwe = dwm.getDataWriterEngine(SdmxJsonDataFormat.INSTANCE, System.out);&lt;br /&gt;
    	&lt;br /&gt;
    	//Transform Data&lt;br /&gt;
    	DataTransformOptions transformOptions = DataTransformOptions.getInstance().setCloseWriter(true); &lt;br /&gt;
    	DataTransformationUtil.copyData(dre, dwe, transformOptions);&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7086</id>
		<title>DRAFT SDMX-CORE</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7086"/>
		<updated>2023-07-24T16:24:08Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Data Transformation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectire =&lt;br /&gt;
== Modules ==&lt;br /&gt;
The sdmx-io modules are as follows&lt;br /&gt;
===Interface Modules===&lt;br /&gt;
These modules contains Java Interfaces only, no Java classes.  The sdmx-io framework uses Interfaces over implementation classes in order to achieve loose coupling.&lt;br /&gt;
&lt;br /&gt;
 '''fusion-api'''  - contains generic Interfaces that are unrelated to SDMX. Each package in this project is broken down by function, i.e audit, cache, date, email, exception&lt;br /&gt;
 '''fusion-api-dao''' - contains Interface definitions for database persistence, not coupled to database platform, but all based on storeage and retrieval of Java Objects&lt;br /&gt;
 '''fusion-api-sdmx''' - contains Interfaces for SDMX Information model (SdmxBeans and related), high level Interfaces for SDMX related functions which cross mulitple modules&lt;br /&gt;
 '''fusion-api-service''' - contains Interfaces definitions for web services to use - allowing projects the implement web service entry points to not require web service depdenancies&lt;br /&gt;
&lt;br /&gt;
===Implementation Modules===&lt;br /&gt;
These modules contain Java classes which are core to SDMX, they implement Interfaces in the higher api modules&lt;br /&gt;
 '''fusion-sdmx-im''' - contains the implementation code for the SDMX Information Model (SdmxBeans and related structures such as Codelists, Concepts, etc)&lt;br /&gt;
 '''fusion-core-data''' - contains code to read/write data and generic data related features such as determining series/obs, validation, temporary data stores&lt;br /&gt;
 '''fusion-core-sdmx''' - contains core code for structural metadata, including temporary store, cross reference resolution, contains some data and reference metadata features &lt;br /&gt;
 '''fusion-core-structure''' - contains core code for processing structural metadata &lt;br /&gt;
 '''fusion-core-xlsx''' - contains code to read and write structures and data in Excel &lt;br /&gt;
&lt;br /&gt;
===Format Modules===&lt;br /&gt;
These modules contains Java classes for reading and writing SDMX Structureal Metadata, Reference Metadata, and Data&lt;br /&gt;
&lt;br /&gt;
 '''fusion-sdmx-csv''' - reading and writing SDMX-CSV format&lt;br /&gt;
 '''fusion-sdmx-edi''' - reading and writing SDMX-EDI format&lt;br /&gt;
 '''fusion-sdmx-json''' - reading and writing SDMX-JSON format&lt;br /&gt;
 '''fusion-sdmx-ml''' reading and writing SDMX-XML&lt;br /&gt;
&lt;br /&gt;
===Feature Modules===&lt;br /&gt;
These modules provide feature specific code&lt;br /&gt;
 '''fusion-core-dao''' - contains generic DAO implementations for storing and querying for objects, not coupled to a specific object store, but we use hibernate, mongodb is also an option&lt;br /&gt;
 '''fusion-audit''' - audit events and centralised error handling&lt;br /&gt;
 '''fusion-sdmx-kafka''' - connecting to and sending/recieving messages to Apache Kafka&lt;br /&gt;
 '''fusion-sdmx-publication''' - SDMX Publication Tables: SdmxBean implementations, and buisness logic to materilise table based on definition&lt;br /&gt;
 '''fusion-sdmx-reporttemplate''' - Reporting Templates: SdmxBean implementations, and buisness logic to genearte excel workbook from template definition, reading data from workbooks&lt;br /&gt;
 '''fusion-sdmx-rest''' - SDMX web services, and additional web service implementations from APIs defined in fusion-api-service&lt;br /&gt;
 '''fusion-sdmx-search''' - Lucene search engine for structures&lt;br /&gt;
 '''fusion-sdmx-security''' - authentication against LDAP/AD/Fusion Security - contains user definition (SecurityDetailsImpl)&lt;br /&gt;
 '''fusion-xl''' - exposes web services required by the FusionXL Excel Pluin&lt;br /&gt;
&lt;br /&gt;
===Utility Modules===&lt;br /&gt;
Utility classes, typically public static classes, the utils projects may organise code by function rather then using the generic packaging structure (api, engine, manager, model, ...)&lt;br /&gt;
 '''fusion-utils''' - generic utility classes, not specific to SDMX&lt;br /&gt;
 '''fusion-utils-hibernate''' - implementation code to use Hibernate as a means to connect to the DAO&lt;br /&gt;
 '''fusion-utils-http''' - calling HTTP web services&lt;br /&gt;
 '''fusion-utils-json''' - JSON related utility classes&lt;br /&gt;
 '''fusion-utils-mail''' - email utiliity classes&lt;br /&gt;
 '''fusion-utils-mongodb'''  - implementation code to use MongoDB a means to store Objects&lt;br /&gt;
 '''fusion-utils-sdmx''' - SDMX Specific utilty classes&lt;br /&gt;
 '''fusion-utils-spring''' - spring related utility classes&lt;br /&gt;
 '''fusion-utils-xlsx''' - reading/writing Excel workbooks related utility classes&lt;br /&gt;
&lt;br /&gt;
== Java Packages ==&lt;br /&gt;
Each module is partitioned into Java packages, with the exception of the utility modules, which typically seperate code by its function. &lt;br /&gt;
&lt;br /&gt;
The generic packages are as follows.&lt;br /&gt;
&lt;br /&gt;
 '''api''' - contains interfaces relevent to the module &lt;br /&gt;
 '''constant''' - contains Java enums and java classes that contain public static constants&lt;br /&gt;
 '''engine''' - classes that 'do the work', many are stateless singletons, there are also stateful for example DataReader/WriterEngine &lt;br /&gt;
 '''factory''' - singleton classes that are responisble for generating an engine, typically called by a manager class, factories enable new features to be plugged into the framework&lt;br /&gt;
 '''filter'''  - REST web service filters (defined in web.xml) - filters are called before the web service&lt;br /&gt;
 '''manager''' - the main entry point for all high level functions, the manager's job is to veryify the request (i.e. a security check) and manage the process of fulfiliing the request by delegating the work to an engine or a DAO, a manager should be a fairly thin layer&lt;br /&gt;
 '''model''' - data transfer objects &lt;br /&gt;
 '''service''' (or rest) - web service entry points&lt;br /&gt;
 '''util''' - utility classes, typically containing public static methods&lt;br /&gt;
&lt;br /&gt;
The general logical flow of a system is the following&lt;br /&gt;
&lt;br /&gt;
 service --&amp;gt; manager --&amp;gt; engine&lt;br /&gt;
                     --&amp;gt; dao&lt;br /&gt;
&lt;br /&gt;
The service (web service entry point) is a thin layer which collects the request arguments, with miniumal manipulation, and passes them to the respective Service Interface. The implementation of this Service Interface will create an apporpriate model object (or objects) which contain a consolidated collection of arguements, some validation of arguments can be performed at this point, and then pass these to the manager Interface.  The manager will ensure the arguments are valid and the user has permission to perform the action.  The manager then provides the workflow required to fulfil the task, by makking calls to engines, daos.&lt;br /&gt;
&lt;br /&gt;
= High Level Design =&lt;br /&gt;
&lt;br /&gt;
==[https://en.wikipedia.org/wiki/Inversion_of_control Inversion of Control] (IoC)==&lt;br /&gt;
&lt;br /&gt;
IoC is achieved by assigning all implementation classes to Interfaces and ensuring classes are stateless so that they can be singletons.  Managers are typically singletons.  This enables the system to be plugged togeather either by using the spring framework, or by using the sdmx.io framework.&lt;br /&gt;
&lt;br /&gt;
===Spring Framework===&lt;br /&gt;
Spring is used in the Java web application, web.xml references a number of spring bean files, which are located under src/main/resources/spring subfolder of the web application library.  The spring beans define the classes and which dependancies they are using. This works well for very large systems such as Fusion Metadata Registry which contains a large number of services and class definitions.&lt;br /&gt;
&lt;br /&gt;
===SDMX.IO IoC framework===&lt;br /&gt;
In order to remove the dependency on spring, and to simplify simpler projects, Sdmx.io provides a framework which allows instances of singleton classes to be registered to and obtained via the '''SingletonStore''' class.  When the class is not a singleton instances can be registered with the '''FusionBeanStore''' class.  &lt;br /&gt;
&lt;br /&gt;
A running application would request a singleton instance in the following way.&lt;br /&gt;
&lt;br /&gt;
 private IActiveDirectorySecuritySettingsManager activeDirectorySecuritySettingsManager = SingletonStore.getSingleton(IActiveDirectorySecuritySettingsManager.class);&lt;br /&gt;
&lt;br /&gt;
This is typically done at the web service layer, as a web service is constructed outside of the spring framework, after the application has launched.&lt;br /&gt;
&lt;br /&gt;
There are some use cases where the singleton is not available at the time it is requested, typcially because it is during application startup and the bean has not yet been built and registered.  In this scenario the Singleton store can be asked to provide an instance when it is registered.&lt;br /&gt;
 &lt;br /&gt;
 SingletonStore.registerInterest(FusionProductInformationRetrievalManager.class, (bean) -&amp;gt; {&lt;br /&gt;
   infoRetreival = bean;&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
If the application wants multiple instances of an interface, then the FusionBeanStore is used&lt;br /&gt;
&lt;br /&gt;
 Collection&amp;lt;StructureWriterFactory&amp;gt; allBeans = FusionBeanStore.getBeans(StructureWriterFactory.class);&lt;br /&gt;
&lt;br /&gt;
===Using Spring/SDMX.IO===&lt;br /&gt;
In order to quickly register modules with the SDMX.IO framework, there are a number of classes that implement '''IFusionModule''', these classes have a register method, which on calling will automatically create and register instances of classes relevent to that module. &lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 CoreSDMXModule.register(); - register schema factories, cross reference resolution, reference metadata reader and writer manager&lt;br /&gt;
 SdmxMLModule.register();  - register SDMX-XML data and structure format readers and writers&lt;br /&gt;
 SdmxJsonModule.register(); - register SDMX-JSON data and structure format readers and writers&lt;br /&gt;
 FusionXLModule.register(); - register FusionXL classes for the excel plugin&lt;br /&gt;
 SdmxEDIModule.register(); - register SDMX-EDI data and structure format readers and writers&lt;br /&gt;
 FusionJsonModule.register();  - register Fusion-JSON data and structure format readers and writers&lt;br /&gt;
 SdmxCsvModule.register();  - register SDMX-CSV data format readers and writers&lt;br /&gt;
 FusionCoreDataModule.register();  - register SDMX-EDI data and structure format readers and writers&lt;br /&gt;
 XLSXModule.register();  - register reader and writer for Excel&lt;br /&gt;
 PublicationTableModule.register(); - classes to support Publication ables&lt;br /&gt;
  &lt;br /&gt;
The spring framework can be used in conjunction with the SDMX.IO IoC framework, as the class '''SpringBeansContainer''' which is a wrapper around the spring beans contained, can be used by both the SingletonStore and FusionBeansStore.  This allows SingletonStore and FusionBeansStore to search both the spring beans container, and any locally registered classes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Example Code =&lt;br /&gt;
== Reading Structures ==&lt;br /&gt;
* Register the SDMX-ML module as the response from the URL is in SDMX-ML format&lt;br /&gt;
* Creates an instance of the StructureReaderManager  (typically in an application this would be a singleton). &lt;br /&gt;
* Creates a wrapper around a URL giving repeated access to the input stream of information, the URL resolves to an SDMX structure file containing mulitple Dataflows&lt;br /&gt;
* Convert the stream into SDMX structures&lt;br /&gt;
* Loop the Dataflows and print the ID to the console&lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
  SdmxMLModule.register();&lt;br /&gt;
  StructureReaderManager srm = new StructureReaderManagerImpl();&lt;br /&gt;
  ReadableDataLocation rdl = new ReadableDataLocationTmp(new URL(&amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2/structure/dataflow&amp;quot;));&lt;br /&gt;
  SdmxBeans beans = srm.parseStructures(rdl);&lt;br /&gt;
  beans.getDataflows().forEach((flow) -&amp;gt; System.out.println(flow.getId()));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Writing / Transforming Structures ==&lt;br /&gt;
The same code as  Reading Structures, but with the addition lines in BOLD&lt;br /&gt;
&lt;br /&gt;
* Register the SDMX-JSON module as we are wriring out in this format&lt;br /&gt;
* Creates an instance of the StructureWriterManager (typically in an application this would be a singleton). &lt;br /&gt;
* Writes the structures in FusionJson format to the system output&lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
  SdmxMLModule.register();&lt;br /&gt;
  '''SdmxJsonModule.register();'''&lt;br /&gt;
  StructureReaderManager srm = new StructureReaderManagerImpl();&lt;br /&gt;
  ReadableDataLocation rdl = new ReadableDataLocationTmp(new URL(&amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2/structure/dataflow&amp;quot;));&lt;br /&gt;
  SdmxBeans beans = srm.parseStructures(rdl);&lt;br /&gt;
  '''StructureWriterManager swm = new StructureWriterManagerImpl();'''&lt;br /&gt;
  '''swm.writeStructures(beans, FusionJsonStructureFormat.getInstance(), System.out);'''&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Data Read ==&lt;br /&gt;
Reading data requires access to both the dataset, and the structural metadata (DSD) which describes the data in terms of its Dimensions and Concepts.  &lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
    //SDMX WEB SERVICE&lt;br /&gt;
    String sdmxv2API = &amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2&amp;quot;;&lt;br /&gt;
    String dataflow = &amp;quot;dataflow/ECB/BSI/1.0&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    //Register modules for formats&lt;br /&gt;
    SdmxMLModule.register();&lt;br /&gt;
    	&lt;br /&gt;
    //Set up data reader and writer managers&lt;br /&gt;
    DataFormatManager dfm = new DataFormatManagerImpl(SdmxJsonDataFormat.INSTANCE, InformationFormatManager.getInstance());&lt;br /&gt;
    DataReaderManager drm = new DataReaderManagerImpl(dfm);&lt;br /&gt;
    	&lt;br /&gt;
    //Get Structures from URL into an in-memory store&lt;br /&gt;
    String structureURL = sdmxv2API + &amp;quot;/structure/&amp;quot;+dataflow+&amp;quot;?references=children&amp;quot;;&lt;br /&gt;
    SdmxBeanRetrievalManager beanRetrieval = new InMemoryRetrievalManagerFast(new ReadableDataLocationTmp(structureURL), new StructureReaderManagerImpl());&lt;br /&gt;
 &lt;br /&gt;
    //Get Data&lt;br /&gt;
    String dataQueryUrl = sdmxv2API+&amp;quot;/data/&amp;quot;+dataflow+&amp;quot;?c%5BFREQ%5D=A&amp;amp;c%5BREF_AREA%5D=DE,ES&amp;quot;;&lt;br /&gt;
    ReadableDataLocation sourceData = new ReadableDataLocationTmp(dataQueryUrl);&lt;br /&gt;
    DataReaderEngine dre = drm.getDataReaderEngine(sourceData, beanRetrieval, null);&lt;br /&gt;
    	&lt;br /&gt;
    while(dre.moveNextDataset()) {&lt;br /&gt;
      while(dre.moveNextKeyable()) {&lt;br /&gt;
        System.out.println(dre.getCurrentKey().getShortCode());&lt;br /&gt;
        while(dre.moveNextObservation()) {&lt;br /&gt;
          Observation obs = dre.getCurrentObservation();&lt;br /&gt;
          System.out.println(obs.getDimensionValue() + &amp;quot;=&amp;quot; + obs.getPrimaryMeasure());&lt;br /&gt;
        }&lt;br /&gt;
      }	&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== Data Transformation ==&lt;br /&gt;
This example is a bit more involved, as the structures are no longer obtained as a file, but on demand from a web service.  This requires the registration of the REST&lt;br /&gt;
classes.  In addition, as the output data format is SDMX JSON, the writer requires not only access to the DSD, but also all the metadata related to the DSD (Codelists, Concepts).  This requires &lt;br /&gt;
the SdmxSuperBeanRetrievalManager, which is used to get a fully resolved tree of structural information.&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
    	//SDMX WEB SERVICE&lt;br /&gt;
    	String sdmxv2API = &amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    	//Register modules for formats&lt;br /&gt;
    	SdmxMLModule.register();&lt;br /&gt;
    	SdmxJsonModule.register();&lt;br /&gt;
    	&lt;br /&gt;
    	//Manually register required instances		&lt;br /&gt;
    	SingletonStore.registerInstance(new RESTQueryBrokerEngineImpl());&lt;br /&gt;
    	SingletonStore.registerInstance(new StructureQueryBuilderRest());&lt;br /&gt;
    	SingletonStore.registerInstance(new StructureReaderManagerImpl());&lt;br /&gt;
    	&lt;br /&gt;
    	//Set up data reader and writer managers&lt;br /&gt;
    	DataFormatManager dfm = new DataFormatManagerImpl(SdmxJsonDataFormat.INSTANCE, InformationFormatManager.getInstance());&lt;br /&gt;
    	DataReaderManager drm = new DataReaderManagerImpl(dfm);&lt;br /&gt;
    	DataWriterManager dwm = new DataWriterManagerImpl(dfm);&lt;br /&gt;
    	&lt;br /&gt;
    	//JSON output format requires access to the metadata so labels can be resolved&lt;br /&gt;
    	//Wrap the SDMX API ISdmxBeanRestRetrievalManager in a SdmxBeanRetrievalManager so the system can pull back the required structures on demand&lt;br /&gt;
    	ISdmxBeanRestRetrievalManager restBeanRetrievalManager = new RESTSdmxBeanRetrievalManager(sdmxv2API, REST_API_VERSION.v2_0_0);&lt;br /&gt;
    	SdmxBeanRetrievalManager beanRetrieval = new SdmxRestToBeanRetrievalManager(restBeanRetrievalManager);&lt;br /&gt;
 &lt;br /&gt;
    	//Additionally wrap the SdmxBeanRetrievalManager to create a SdmxSuperBeanRetrievalManager, required when the full 'tree' of structral metadata is &lt;br /&gt;
    	//required (i.e not just the SDMX Data Structure but resolved Concepts and Codelists in one fully resolved Object&lt;br /&gt;
    	SdmxSuperBeanRetrievalManager sbRm = new SdmxSuperBeanRetrievalManagerImpl(beanRetrieval);&lt;br /&gt;
    	 &lt;br /&gt;
    	//Register an instance of a SdmxBeanRetreivalContainer with the system, this is used as the default container to get a handle on implementations of the &lt;br /&gt;
    	//structure retrieval interfaces - used by classes including the JSON writers&lt;br /&gt;
    	SingletonStore.registerInstance(new SdmxBeanRetreivalContainer(beanRetrieval, null, sbRm, null, null, restBeanRetrievalManager));&lt;br /&gt;
    	&lt;br /&gt;
    	//Get Data&lt;br /&gt;
    	String dataQueryUrl = sdmxv2API+&amp;quot;/data/dataflow/ECB/BSI/1.0/?c%5BFREQ%5D=A&amp;amp;c%5BREF_AREA%5D=DE,ES&amp;quot;;&lt;br /&gt;
    	ReadableDataLocation sourceData = new ReadableDataLocationTmp(dataQueryUrl);&lt;br /&gt;
    	DataReaderEngine dre = drm.getDataReaderEngine(sourceData, beanRetrieval, null);&lt;br /&gt;
    	&lt;br /&gt;
    	//Create Writer&lt;br /&gt;
    	ISeriesObsDataWriterEngine dwe = dwm.getDataWriterEngine(SdmxJsonDataFormat.INSTANCE, System.out);&lt;br /&gt;
    	&lt;br /&gt;
    	//Transform Data&lt;br /&gt;
    	DataTransformOptions transformOptions = DataTransformOptions.getInstance().setCloseWriter(true); &lt;br /&gt;
    	DataTransformationUtil.copyData(dre, dwe, transformOptions);&lt;br /&gt;
	}&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7085</id>
		<title>DRAFT SDMX-CORE</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7085"/>
		<updated>2023-07-24T16:11:44Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Writing / Transforming Structures */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectire =&lt;br /&gt;
== Modules ==&lt;br /&gt;
The sdmx-io modules are as follows&lt;br /&gt;
===Interface Modules===&lt;br /&gt;
These modules contains Java Interfaces only, no Java classes.  The sdmx-io framework uses Interfaces over implementation classes in order to achieve loose coupling.&lt;br /&gt;
&lt;br /&gt;
 '''fusion-api'''  - contains generic Interfaces that are unrelated to SDMX. Each package in this project is broken down by function, i.e audit, cache, date, email, exception&lt;br /&gt;
 '''fusion-api-dao''' - contains Interface definitions for database persistence, not coupled to database platform, but all based on storeage and retrieval of Java Objects&lt;br /&gt;
 '''fusion-api-sdmx''' - contains Interfaces for SDMX Information model (SdmxBeans and related), high level Interfaces for SDMX related functions which cross mulitple modules&lt;br /&gt;
 '''fusion-api-service''' - contains Interfaces definitions for web services to use - allowing projects the implement web service entry points to not require web service depdenancies&lt;br /&gt;
&lt;br /&gt;
===Implementation Modules===&lt;br /&gt;
These modules contain Java classes which are core to SDMX, they implement Interfaces in the higher api modules&lt;br /&gt;
 '''fusion-sdmx-im''' - contains the implementation code for the SDMX Information Model (SdmxBeans and related structures such as Codelists, Concepts, etc)&lt;br /&gt;
 '''fusion-core-data''' - contains code to read/write data and generic data related features such as determining series/obs, validation, temporary data stores&lt;br /&gt;
 '''fusion-core-sdmx''' - contains core code for structural metadata, including temporary store, cross reference resolution, contains some data and reference metadata features &lt;br /&gt;
 '''fusion-core-structure''' - contains core code for processing structural metadata &lt;br /&gt;
 '''fusion-core-xlsx''' - contains code to read and write structures and data in Excel &lt;br /&gt;
&lt;br /&gt;
===Format Modules===&lt;br /&gt;
These modules contains Java classes for reading and writing SDMX Structureal Metadata, Reference Metadata, and Data&lt;br /&gt;
&lt;br /&gt;
 '''fusion-sdmx-csv''' - reading and writing SDMX-CSV format&lt;br /&gt;
 '''fusion-sdmx-edi''' - reading and writing SDMX-EDI format&lt;br /&gt;
 '''fusion-sdmx-json''' - reading and writing SDMX-JSON format&lt;br /&gt;
 '''fusion-sdmx-ml''' reading and writing SDMX-XML&lt;br /&gt;
&lt;br /&gt;
===Feature Modules===&lt;br /&gt;
These modules provide feature specific code&lt;br /&gt;
 '''fusion-core-dao''' - contains generic DAO implementations for storing and querying for objects, not coupled to a specific object store, but we use hibernate, mongodb is also an option&lt;br /&gt;
 '''fusion-audit''' - audit events and centralised error handling&lt;br /&gt;
 '''fusion-sdmx-kafka''' - connecting to and sending/recieving messages to Apache Kafka&lt;br /&gt;
 '''fusion-sdmx-publication''' - SDMX Publication Tables: SdmxBean implementations, and buisness logic to materilise table based on definition&lt;br /&gt;
 '''fusion-sdmx-reporttemplate''' - Reporting Templates: SdmxBean implementations, and buisness logic to genearte excel workbook from template definition, reading data from workbooks&lt;br /&gt;
 '''fusion-sdmx-rest''' - SDMX web services, and additional web service implementations from APIs defined in fusion-api-service&lt;br /&gt;
 '''fusion-sdmx-search''' - Lucene search engine for structures&lt;br /&gt;
 '''fusion-sdmx-security''' - authentication against LDAP/AD/Fusion Security - contains user definition (SecurityDetailsImpl)&lt;br /&gt;
 '''fusion-xl''' - exposes web services required by the FusionXL Excel Pluin&lt;br /&gt;
&lt;br /&gt;
===Utility Modules===&lt;br /&gt;
Utility classes, typically public static classes, the utils projects may organise code by function rather then using the generic packaging structure (api, engine, manager, model, ...)&lt;br /&gt;
 '''fusion-utils''' - generic utility classes, not specific to SDMX&lt;br /&gt;
 '''fusion-utils-hibernate''' - implementation code to use Hibernate as a means to connect to the DAO&lt;br /&gt;
 '''fusion-utils-http''' - calling HTTP web services&lt;br /&gt;
 '''fusion-utils-json''' - JSON related utility classes&lt;br /&gt;
 '''fusion-utils-mail''' - email utiliity classes&lt;br /&gt;
 '''fusion-utils-mongodb'''  - implementation code to use MongoDB a means to store Objects&lt;br /&gt;
 '''fusion-utils-sdmx''' - SDMX Specific utilty classes&lt;br /&gt;
 '''fusion-utils-spring''' - spring related utility classes&lt;br /&gt;
 '''fusion-utils-xlsx''' - reading/writing Excel workbooks related utility classes&lt;br /&gt;
&lt;br /&gt;
== Java Packages ==&lt;br /&gt;
Each module is partitioned into Java packages, with the exception of the utility modules, which typically seperate code by its function. &lt;br /&gt;
&lt;br /&gt;
The generic packages are as follows.&lt;br /&gt;
&lt;br /&gt;
 '''api''' - contains interfaces relevent to the module &lt;br /&gt;
 '''constant''' - contains Java enums and java classes that contain public static constants&lt;br /&gt;
 '''engine''' - classes that 'do the work', many are stateless singletons, there are also stateful for example DataReader/WriterEngine &lt;br /&gt;
 '''factory''' - singleton classes that are responisble for generating an engine, typically called by a manager class, factories enable new features to be plugged into the framework&lt;br /&gt;
 '''filter'''  - REST web service filters (defined in web.xml) - filters are called before the web service&lt;br /&gt;
 '''manager''' - the main entry point for all high level functions, the manager's job is to veryify the request (i.e. a security check) and manage the process of fulfiliing the request by delegating the work to an engine or a DAO, a manager should be a fairly thin layer&lt;br /&gt;
 '''model''' - data transfer objects &lt;br /&gt;
 '''service''' (or rest) - web service entry points&lt;br /&gt;
 '''util''' - utility classes, typically containing public static methods&lt;br /&gt;
&lt;br /&gt;
The general logical flow of a system is the following&lt;br /&gt;
&lt;br /&gt;
 service --&amp;gt; manager --&amp;gt; engine&lt;br /&gt;
                     --&amp;gt; dao&lt;br /&gt;
&lt;br /&gt;
The service (web service entry point) is a thin layer which collects the request arguments, with miniumal manipulation, and passes them to the respective Service Interface. The implementation of this Service Interface will create an apporpriate model object (or objects) which contain a consolidated collection of arguements, some validation of arguments can be performed at this point, and then pass these to the manager Interface.  The manager will ensure the arguments are valid and the user has permission to perform the action.  The manager then provides the workflow required to fulfil the task, by makking calls to engines, daos.&lt;br /&gt;
&lt;br /&gt;
= High Level Design =&lt;br /&gt;
&lt;br /&gt;
==[https://en.wikipedia.org/wiki/Inversion_of_control Inversion of Control] (IoC)==&lt;br /&gt;
&lt;br /&gt;
IoC is achieved by assigning all implementation classes to Interfaces and ensuring classes are stateless so that they can be singletons.  Managers are typically singletons.  This enables the system to be plugged togeather either by using the spring framework, or by using the sdmx.io framework.&lt;br /&gt;
&lt;br /&gt;
===Spring Framework===&lt;br /&gt;
Spring is used in the Java web application, web.xml references a number of spring bean files, which are located under src/main/resources/spring subfolder of the web application library.  The spring beans define the classes and which dependancies they are using. This works well for very large systems such as Fusion Metadata Registry which contains a large number of services and class definitions.&lt;br /&gt;
&lt;br /&gt;
===SDMX.IO IoC framework===&lt;br /&gt;
In order to remove the dependency on spring, and to simplify simpler projects, Sdmx.io provides a framework which allows instances of singleton classes to be registered to and obtained via the '''SingletonStore''' class.  When the class is not a singleton instances can be registered with the '''FusionBeanStore''' class.  &lt;br /&gt;
&lt;br /&gt;
A running application would request a singleton instance in the following way.&lt;br /&gt;
&lt;br /&gt;
 private IActiveDirectorySecuritySettingsManager activeDirectorySecuritySettingsManager = SingletonStore.getSingleton(IActiveDirectorySecuritySettingsManager.class);&lt;br /&gt;
&lt;br /&gt;
This is typically done at the web service layer, as a web service is constructed outside of the spring framework, after the application has launched.&lt;br /&gt;
&lt;br /&gt;
There are some use cases where the singleton is not available at the time it is requested, typcially because it is during application startup and the bean has not yet been built and registered.  In this scenario the Singleton store can be asked to provide an instance when it is registered.&lt;br /&gt;
 &lt;br /&gt;
 SingletonStore.registerInterest(FusionProductInformationRetrievalManager.class, (bean) -&amp;gt; {&lt;br /&gt;
   infoRetreival = bean;&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
If the application wants multiple instances of an interface, then the FusionBeanStore is used&lt;br /&gt;
&lt;br /&gt;
 Collection&amp;lt;StructureWriterFactory&amp;gt; allBeans = FusionBeanStore.getBeans(StructureWriterFactory.class);&lt;br /&gt;
&lt;br /&gt;
===Using Spring/SDMX.IO===&lt;br /&gt;
In order to quickly register modules with the SDMX.IO framework, there are a number of classes that implement '''IFusionModule''', these classes have a register method, which on calling will automatically create and register instances of classes relevent to that module. &lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 CoreSDMXModule.register(); - register schema factories, cross reference resolution, reference metadata reader and writer manager&lt;br /&gt;
 SdmxMLModule.register();  - register SDMX-XML data and structure format readers and writers&lt;br /&gt;
 SdmxJsonModule.register(); - register SDMX-JSON data and structure format readers and writers&lt;br /&gt;
 FusionXLModule.register(); - register FusionXL classes for the excel plugin&lt;br /&gt;
 SdmxEDIModule.register(); - register SDMX-EDI data and structure format readers and writers&lt;br /&gt;
 FusionJsonModule.register();  - register Fusion-JSON data and structure format readers and writers&lt;br /&gt;
 SdmxCsvModule.register();  - register SDMX-CSV data format readers and writers&lt;br /&gt;
 FusionCoreDataModule.register();  - register SDMX-EDI data and structure format readers and writers&lt;br /&gt;
 XLSXModule.register();  - register reader and writer for Excel&lt;br /&gt;
 PublicationTableModule.register(); - classes to support Publication ables&lt;br /&gt;
  &lt;br /&gt;
The spring framework can be used in conjunction with the SDMX.IO IoC framework, as the class '''SpringBeansContainer''' which is a wrapper around the spring beans contained, can be used by both the SingletonStore and FusionBeansStore.  This allows SingletonStore and FusionBeansStore to search both the spring beans container, and any locally registered classes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Example Code =&lt;br /&gt;
== Reading Structures ==&lt;br /&gt;
* Register the SDMX-ML module as the response from the URL is in SDMX-ML format&lt;br /&gt;
* Creates an instance of the StructureReaderManager  (typically in an application this would be a singleton). &lt;br /&gt;
* Creates a wrapper around a URL giving repeated access to the input stream of information, the URL resolves to an SDMX structure file containing mulitple Dataflows&lt;br /&gt;
* Convert the stream into SDMX structures&lt;br /&gt;
* Loop the Dataflows and print the ID to the console&lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
  SdmxMLModule.register();&lt;br /&gt;
  StructureReaderManager srm = new StructureReaderManagerImpl();&lt;br /&gt;
  ReadableDataLocation rdl = new ReadableDataLocationTmp(new URL(&amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2/structure/dataflow&amp;quot;));&lt;br /&gt;
  SdmxBeans beans = srm.parseStructures(rdl);&lt;br /&gt;
  beans.getDataflows().forEach((flow) -&amp;gt; System.out.println(flow.getId()));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Writing / Transforming Structures ==&lt;br /&gt;
The same code as  Reading Structures, but with the addition lines in BOLD&lt;br /&gt;
&lt;br /&gt;
* Register the SDMX-JSON module as we are wriring out in this format&lt;br /&gt;
* Creates an instance of the StructureWriterManager (typically in an application this would be a singleton). &lt;br /&gt;
* Writes the structures in FusionJson format to the system output&lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
  SdmxMLModule.register();&lt;br /&gt;
  '''SdmxJsonModule.register();'''&lt;br /&gt;
  StructureReaderManager srm = new StructureReaderManagerImpl();&lt;br /&gt;
  ReadableDataLocation rdl = new ReadableDataLocationTmp(new URL(&amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2/structure/dataflow&amp;quot;));&lt;br /&gt;
  SdmxBeans beans = srm.parseStructures(rdl);&lt;br /&gt;
  '''StructureWriterManager swm = new StructureWriterManagerImpl();'''&lt;br /&gt;
  '''swm.writeStructures(beans, FusionJsonStructureFormat.getInstance(), System.out);'''&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Data Transformation ==&lt;br /&gt;
    public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
    	//SDMX WEB SERVICE&lt;br /&gt;
    	String sdmxv2API = &amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    	//Register modules for formats&lt;br /&gt;
    	SdmxMLModule.register();&lt;br /&gt;
    	SdmxJsonModule.register();&lt;br /&gt;
    	&lt;br /&gt;
    	//Manually register required instances		&lt;br /&gt;
    	SingletonStore.registerInstance(new RESTQueryBrokerEngineImpl());&lt;br /&gt;
    	SingletonStore.registerInstance(new StructureQueryBuilderRest());&lt;br /&gt;
    	SingletonStore.registerInstance(new StructureReaderManagerImpl());&lt;br /&gt;
    	&lt;br /&gt;
    	//Set up data reader and writer managers&lt;br /&gt;
    	DataFormatManager dfm = new DataFormatManagerImpl(SdmxJsonDataFormat.INSTANCE, InformationFormatManager.getInstance());&lt;br /&gt;
    	DataReaderManager drm = new DataReaderManagerImpl(dfm);&lt;br /&gt;
    	DataWriterManager dwm = new DataWriterManagerImpl(dfm);&lt;br /&gt;
    	&lt;br /&gt;
    	//JSON output format requires access to the metadata so labels can be resolved&lt;br /&gt;
    	//Wrap the SDMX API ISdmxBeanRestRetrievalManager in a SdmxBeanRetrievalManager so the system can pull back the required structures on demand&lt;br /&gt;
    	ISdmxBeanRestRetrievalManager restBeanRetrievalManager = new RESTSdmxBeanRetrievalManager(sdmxv2API, REST_API_VERSION.v2_0_0);&lt;br /&gt;
    	SdmxBeanRetrievalManager beanRetrieval = new SdmxRestToBeanRetrievalManager(restBeanRetrievalManager);&lt;br /&gt;
 &lt;br /&gt;
    	//Additionally wrap the SdmxBeanRetrievalManager to create a SdmxSuperBeanRetrievalManager, required when the full 'tree' of structral metadata is &lt;br /&gt;
    	//required (i.e not just the SDMX Data Structure but resolved Concepts and Codelists in one fully resolved Object&lt;br /&gt;
    	SdmxSuperBeanRetrievalManager sbRm = new SdmxSuperBeanRetrievalManagerImpl(beanRetrieval);&lt;br /&gt;
    	 &lt;br /&gt;
    	//Register an instance of a SdmxBeanRetreivalContainer with the system, this is used as the default container to get a handle on implementations of the &lt;br /&gt;
    	//structure retrieval interfaces - used by classes including the JSON writers&lt;br /&gt;
    	SingletonStore.registerInstance(new SdmxBeanRetreivalContainer(beanRetrieval, null, sbRm, null, null, restBeanRetrievalManager));&lt;br /&gt;
    	&lt;br /&gt;
    	//Get Data&lt;br /&gt;
    	String dataQueryUrl = sdmxv2API+&amp;quot;/data/dataflow/ECB/BSI/1.0/?c%5BFREQ%5D=A&amp;amp;c%5BREF_AREA%5D=DE,ES&amp;quot;;&lt;br /&gt;
    	ReadableDataLocation sourceData = new ReadableDataLocationTmp(dataQueryUrl);&lt;br /&gt;
    	DataReaderEngine dre = drm.getDataReaderEngine(sourceData, beanRetrieval, null);&lt;br /&gt;
    	&lt;br /&gt;
    	//Create Writer&lt;br /&gt;
    	ISeriesObsDataWriterEngine dwe = dwm.getDataWriterEngine(SdmxJsonDataFormat.INSTANCE, System.out);&lt;br /&gt;
    	&lt;br /&gt;
    	//Transform Data&lt;br /&gt;
    	DataTransformOptions transformOptions = DataTransformOptions.getInstance().setCloseWriter(true); &lt;br /&gt;
    	DataTransformationUtil.copyData(dre, dwe, transformOptions);&lt;br /&gt;
	}&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7084</id>
		<title>DRAFT SDMX-CORE</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7084"/>
		<updated>2023-07-24T15:48:39Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Reading Structures */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectire =&lt;br /&gt;
== Modules ==&lt;br /&gt;
The sdmx-io modules are as follows&lt;br /&gt;
===Interface Modules===&lt;br /&gt;
These modules contains Java Interfaces only, no Java classes.  The sdmx-io framework uses Interfaces over implementation classes in order to achieve loose coupling.&lt;br /&gt;
&lt;br /&gt;
 '''fusion-api'''  - contains generic Interfaces that are unrelated to SDMX. Each package in this project is broken down by function, i.e audit, cache, date, email, exception&lt;br /&gt;
 '''fusion-api-dao''' - contains Interface definitions for database persistence, not coupled to database platform, but all based on storeage and retrieval of Java Objects&lt;br /&gt;
 '''fusion-api-sdmx''' - contains Interfaces for SDMX Information model (SdmxBeans and related), high level Interfaces for SDMX related functions which cross mulitple modules&lt;br /&gt;
 '''fusion-api-service''' - contains Interfaces definitions for web services to use - allowing projects the implement web service entry points to not require web service depdenancies&lt;br /&gt;
&lt;br /&gt;
===Implementation Modules===&lt;br /&gt;
These modules contain Java classes which are core to SDMX, they implement Interfaces in the higher api modules&lt;br /&gt;
 '''fusion-sdmx-im''' - contains the implementation code for the SDMX Information Model (SdmxBeans and related structures such as Codelists, Concepts, etc)&lt;br /&gt;
 '''fusion-core-data''' - contains code to read/write data and generic data related features such as determining series/obs, validation, temporary data stores&lt;br /&gt;
 '''fusion-core-sdmx''' - contains core code for structural metadata, including temporary store, cross reference resolution, contains some data and reference metadata features &lt;br /&gt;
 '''fusion-core-structure''' - contains core code for processing structural metadata &lt;br /&gt;
 '''fusion-core-xlsx''' - contains code to read and write structures and data in Excel &lt;br /&gt;
&lt;br /&gt;
===Format Modules===&lt;br /&gt;
These modules contains Java classes for reading and writing SDMX Structureal Metadata, Reference Metadata, and Data&lt;br /&gt;
&lt;br /&gt;
 '''fusion-sdmx-csv''' - reading and writing SDMX-CSV format&lt;br /&gt;
 '''fusion-sdmx-edi''' - reading and writing SDMX-EDI format&lt;br /&gt;
 '''fusion-sdmx-json''' - reading and writing SDMX-JSON format&lt;br /&gt;
 '''fusion-sdmx-ml''' reading and writing SDMX-XML&lt;br /&gt;
&lt;br /&gt;
===Feature Modules===&lt;br /&gt;
These modules provide feature specific code&lt;br /&gt;
 '''fusion-core-dao''' - contains generic DAO implementations for storing and querying for objects, not coupled to a specific object store, but we use hibernate, mongodb is also an option&lt;br /&gt;
 '''fusion-audit''' - audit events and centralised error handling&lt;br /&gt;
 '''fusion-sdmx-kafka''' - connecting to and sending/recieving messages to Apache Kafka&lt;br /&gt;
 '''fusion-sdmx-publication''' - SDMX Publication Tables: SdmxBean implementations, and buisness logic to materilise table based on definition&lt;br /&gt;
 '''fusion-sdmx-reporttemplate''' - Reporting Templates: SdmxBean implementations, and buisness logic to genearte excel workbook from template definition, reading data from workbooks&lt;br /&gt;
 '''fusion-sdmx-rest''' - SDMX web services, and additional web service implementations from APIs defined in fusion-api-service&lt;br /&gt;
 '''fusion-sdmx-search''' - Lucene search engine for structures&lt;br /&gt;
 '''fusion-sdmx-security''' - authentication against LDAP/AD/Fusion Security - contains user definition (SecurityDetailsImpl)&lt;br /&gt;
 '''fusion-xl''' - exposes web services required by the FusionXL Excel Pluin&lt;br /&gt;
&lt;br /&gt;
===Utility Modules===&lt;br /&gt;
Utility classes, typically public static classes, the utils projects may organise code by function rather then using the generic packaging structure (api, engine, manager, model, ...)&lt;br /&gt;
 '''fusion-utils''' - generic utility classes, not specific to SDMX&lt;br /&gt;
 '''fusion-utils-hibernate''' - implementation code to use Hibernate as a means to connect to the DAO&lt;br /&gt;
 '''fusion-utils-http''' - calling HTTP web services&lt;br /&gt;
 '''fusion-utils-json''' - JSON related utility classes&lt;br /&gt;
 '''fusion-utils-mail''' - email utiliity classes&lt;br /&gt;
 '''fusion-utils-mongodb'''  - implementation code to use MongoDB a means to store Objects&lt;br /&gt;
 '''fusion-utils-sdmx''' - SDMX Specific utilty classes&lt;br /&gt;
 '''fusion-utils-spring''' - spring related utility classes&lt;br /&gt;
 '''fusion-utils-xlsx''' - reading/writing Excel workbooks related utility classes&lt;br /&gt;
&lt;br /&gt;
== Java Packages ==&lt;br /&gt;
Each module is partitioned into Java packages, with the exception of the utility modules, which typically seperate code by its function. &lt;br /&gt;
&lt;br /&gt;
The generic packages are as follows.&lt;br /&gt;
&lt;br /&gt;
 '''api''' - contains interfaces relevent to the module &lt;br /&gt;
 '''constant''' - contains Java enums and java classes that contain public static constants&lt;br /&gt;
 '''engine''' - classes that 'do the work', many are stateless singletons, there are also stateful for example DataReader/WriterEngine &lt;br /&gt;
 '''factory''' - singleton classes that are responisble for generating an engine, typically called by a manager class, factories enable new features to be plugged into the framework&lt;br /&gt;
 '''filter'''  - REST web service filters (defined in web.xml) - filters are called before the web service&lt;br /&gt;
 '''manager''' - the main entry point for all high level functions, the manager's job is to veryify the request (i.e. a security check) and manage the process of fulfiliing the request by delegating the work to an engine or a DAO, a manager should be a fairly thin layer&lt;br /&gt;
 '''model''' - data transfer objects &lt;br /&gt;
 '''service''' (or rest) - web service entry points&lt;br /&gt;
 '''util''' - utility classes, typically containing public static methods&lt;br /&gt;
&lt;br /&gt;
The general logical flow of a system is the following&lt;br /&gt;
&lt;br /&gt;
 service --&amp;gt; manager --&amp;gt; engine&lt;br /&gt;
                     --&amp;gt; dao&lt;br /&gt;
&lt;br /&gt;
The service (web service entry point) is a thin layer which collects the request arguments, with miniumal manipulation, and passes them to the respective Service Interface. The implementation of this Service Interface will create an apporpriate model object (or objects) which contain a consolidated collection of arguements, some validation of arguments can be performed at this point, and then pass these to the manager Interface.  The manager will ensure the arguments are valid and the user has permission to perform the action.  The manager then provides the workflow required to fulfil the task, by makking calls to engines, daos.&lt;br /&gt;
&lt;br /&gt;
= High Level Design =&lt;br /&gt;
&lt;br /&gt;
==[https://en.wikipedia.org/wiki/Inversion_of_control Inversion of Control] (IoC)==&lt;br /&gt;
&lt;br /&gt;
IoC is achieved by assigning all implementation classes to Interfaces and ensuring classes are stateless so that they can be singletons.  Managers are typically singletons.  This enables the system to be plugged togeather either by using the spring framework, or by using the sdmx.io framework.&lt;br /&gt;
&lt;br /&gt;
===Spring Framework===&lt;br /&gt;
Spring is used in the Java web application, web.xml references a number of spring bean files, which are located under src/main/resources/spring subfolder of the web application library.  The spring beans define the classes and which dependancies they are using. This works well for very large systems such as Fusion Metadata Registry which contains a large number of services and class definitions.&lt;br /&gt;
&lt;br /&gt;
===SDMX.IO IoC framework===&lt;br /&gt;
In order to remove the dependency on spring, and to simplify simpler projects, Sdmx.io provides a framework which allows instances of singleton classes to be registered to and obtained via the '''SingletonStore''' class.  When the class is not a singleton instances can be registered with the '''FusionBeanStore''' class.  &lt;br /&gt;
&lt;br /&gt;
A running application would request a singleton instance in the following way.&lt;br /&gt;
&lt;br /&gt;
 private IActiveDirectorySecuritySettingsManager activeDirectorySecuritySettingsManager = SingletonStore.getSingleton(IActiveDirectorySecuritySettingsManager.class);&lt;br /&gt;
&lt;br /&gt;
This is typically done at the web service layer, as a web service is constructed outside of the spring framework, after the application has launched.&lt;br /&gt;
&lt;br /&gt;
There are some use cases where the singleton is not available at the time it is requested, typcially because it is during application startup and the bean has not yet been built and registered.  In this scenario the Singleton store can be asked to provide an instance when it is registered.&lt;br /&gt;
 &lt;br /&gt;
 SingletonStore.registerInterest(FusionProductInformationRetrievalManager.class, (bean) -&amp;gt; {&lt;br /&gt;
   infoRetreival = bean;&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
If the application wants multiple instances of an interface, then the FusionBeanStore is used&lt;br /&gt;
&lt;br /&gt;
 Collection&amp;lt;StructureWriterFactory&amp;gt; allBeans = FusionBeanStore.getBeans(StructureWriterFactory.class);&lt;br /&gt;
&lt;br /&gt;
===Using Spring/SDMX.IO===&lt;br /&gt;
In order to quickly register modules with the SDMX.IO framework, there are a number of classes that implement '''IFusionModule''', these classes have a register method, which on calling will automatically create and register instances of classes relevent to that module. &lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 CoreSDMXModule.register(); - register schema factories, cross reference resolution, reference metadata reader and writer manager&lt;br /&gt;
 SdmxMLModule.register();  - register SDMX-XML data and structure format readers and writers&lt;br /&gt;
 SdmxJsonModule.register(); - register SDMX-JSON data and structure format readers and writers&lt;br /&gt;
 FusionXLModule.register(); - register FusionXL classes for the excel plugin&lt;br /&gt;
 SdmxEDIModule.register(); - register SDMX-EDI data and structure format readers and writers&lt;br /&gt;
 FusionJsonModule.register();  - register Fusion-JSON data and structure format readers and writers&lt;br /&gt;
 SdmxCsvModule.register();  - register SDMX-CSV data format readers and writers&lt;br /&gt;
 FusionCoreDataModule.register();  - register SDMX-EDI data and structure format readers and writers&lt;br /&gt;
 XLSXModule.register();  - register reader and writer for Excel&lt;br /&gt;
 PublicationTableModule.register(); - classes to support Publication ables&lt;br /&gt;
  &lt;br /&gt;
The spring framework can be used in conjunction with the SDMX.IO IoC framework, as the class '''SpringBeansContainer''' which is a wrapper around the spring beans contained, can be used by both the SingletonStore and FusionBeansStore.  This allows SingletonStore and FusionBeansStore to search both the spring beans container, and any locally registered classes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Example Code =&lt;br /&gt;
== Reading Structures ==&lt;br /&gt;
* Register the SDMX-ML module as the response from the URL is in SDMX-ML format&lt;br /&gt;
* Creates an instance of the StructureReaderManager  (typically in an application this would be a singleton). &lt;br /&gt;
* Creates a wrapper around a URL giving repeated access to the input stream of information, the URL resolves to an SDMX structure file containing mulitple Dataflows&lt;br /&gt;
* Convert the stream into SDMX structures&lt;br /&gt;
* Loop the Dataflows and print the ID to the console&lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
  SdmxMLModule.register();&lt;br /&gt;
  StructureReaderManager srm = new StructureReaderManagerImpl();&lt;br /&gt;
  ReadableDataLocation rdl = new ReadableDataLocationTmp(new URL(&amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2/structure/dataflow&amp;quot;));&lt;br /&gt;
  SdmxBeans beans = srm.parseStructures(rdl);&lt;br /&gt;
  beans.getDataflows().forEach((flow) -&amp;gt; System.out.println(flow.getId()));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Writing / Transforming Structures ==&lt;br /&gt;
The same code as  Reading Structures, but with the addition lines in BOLD&lt;br /&gt;
&lt;br /&gt;
* Register the SDMX-JSON module as we are wriring out in this format&lt;br /&gt;
* Creates an instance of the StructureWriterManager (typically in an application this would be a singleton). &lt;br /&gt;
* Writes the structures in FusionJson format to the system output&lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
  SdmxMLModule.register();&lt;br /&gt;
  '''SdmxJsonModule.register();'''&lt;br /&gt;
  StructureReaderManager srm = new StructureReaderManagerImpl();&lt;br /&gt;
  ReadableDataLocation rdl = new ReadableDataLocationTmp(new URL(&amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2/structure/dataflow&amp;quot;));&lt;br /&gt;
  SdmxBeans beans = srm.parseStructures(rdl);&lt;br /&gt;
  '''StructureWriterManager swm = new StructureWriterManagerImpl();'''&lt;br /&gt;
  '''swm.writeStructures(beans, FusionJsonStructureFormat.getInstance(), System.out);'''&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7083</id>
		<title>DRAFT SDMX-CORE</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7083"/>
		<updated>2023-07-24T15:45:16Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Reading Structures */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectire =&lt;br /&gt;
== Modules ==&lt;br /&gt;
The sdmx-io modules are as follows&lt;br /&gt;
===Interface Modules===&lt;br /&gt;
These modules contains Java Interfaces only, no Java classes.  The sdmx-io framework uses Interfaces over implementation classes in order to achieve loose coupling.&lt;br /&gt;
&lt;br /&gt;
 '''fusion-api'''  - contains generic Interfaces that are unrelated to SDMX. Each package in this project is broken down by function, i.e audit, cache, date, email, exception&lt;br /&gt;
 '''fusion-api-dao''' - contains Interface definitions for database persistence, not coupled to database platform, but all based on storeage and retrieval of Java Objects&lt;br /&gt;
 '''fusion-api-sdmx''' - contains Interfaces for SDMX Information model (SdmxBeans and related), high level Interfaces for SDMX related functions which cross mulitple modules&lt;br /&gt;
 '''fusion-api-service''' - contains Interfaces definitions for web services to use - allowing projects the implement web service entry points to not require web service depdenancies&lt;br /&gt;
&lt;br /&gt;
===Implementation Modules===&lt;br /&gt;
These modules contain Java classes which are core to SDMX, they implement Interfaces in the higher api modules&lt;br /&gt;
 '''fusion-sdmx-im''' - contains the implementation code for the SDMX Information Model (SdmxBeans and related structures such as Codelists, Concepts, etc)&lt;br /&gt;
 '''fusion-core-data''' - contains code to read/write data and generic data related features such as determining series/obs, validation, temporary data stores&lt;br /&gt;
 '''fusion-core-sdmx''' - contains core code for structural metadata, including temporary store, cross reference resolution, contains some data and reference metadata features &lt;br /&gt;
 '''fusion-core-structure''' - contains core code for processing structural metadata &lt;br /&gt;
 '''fusion-core-xlsx''' - contains code to read and write structures and data in Excel &lt;br /&gt;
&lt;br /&gt;
===Format Modules===&lt;br /&gt;
These modules contains Java classes for reading and writing SDMX Structureal Metadata, Reference Metadata, and Data&lt;br /&gt;
&lt;br /&gt;
 '''fusion-sdmx-csv''' - reading and writing SDMX-CSV format&lt;br /&gt;
 '''fusion-sdmx-edi''' - reading and writing SDMX-EDI format&lt;br /&gt;
 '''fusion-sdmx-json''' - reading and writing SDMX-JSON format&lt;br /&gt;
 '''fusion-sdmx-ml''' reading and writing SDMX-XML&lt;br /&gt;
&lt;br /&gt;
===Feature Modules===&lt;br /&gt;
These modules provide feature specific code&lt;br /&gt;
 '''fusion-core-dao''' - contains generic DAO implementations for storing and querying for objects, not coupled to a specific object store, but we use hibernate, mongodb is also an option&lt;br /&gt;
 '''fusion-audit''' - audit events and centralised error handling&lt;br /&gt;
 '''fusion-sdmx-kafka''' - connecting to and sending/recieving messages to Apache Kafka&lt;br /&gt;
 '''fusion-sdmx-publication''' - SDMX Publication Tables: SdmxBean implementations, and buisness logic to materilise table based on definition&lt;br /&gt;
 '''fusion-sdmx-reporttemplate''' - Reporting Templates: SdmxBean implementations, and buisness logic to genearte excel workbook from template definition, reading data from workbooks&lt;br /&gt;
 '''fusion-sdmx-rest''' - SDMX web services, and additional web service implementations from APIs defined in fusion-api-service&lt;br /&gt;
 '''fusion-sdmx-search''' - Lucene search engine for structures&lt;br /&gt;
 '''fusion-sdmx-security''' - authentication against LDAP/AD/Fusion Security - contains user definition (SecurityDetailsImpl)&lt;br /&gt;
 '''fusion-xl''' - exposes web services required by the FusionXL Excel Pluin&lt;br /&gt;
&lt;br /&gt;
===Utility Modules===&lt;br /&gt;
Utility classes, typically public static classes, the utils projects may organise code by function rather then using the generic packaging structure (api, engine, manager, model, ...)&lt;br /&gt;
 '''fusion-utils''' - generic utility classes, not specific to SDMX&lt;br /&gt;
 '''fusion-utils-hibernate''' - implementation code to use Hibernate as a means to connect to the DAO&lt;br /&gt;
 '''fusion-utils-http''' - calling HTTP web services&lt;br /&gt;
 '''fusion-utils-json''' - JSON related utility classes&lt;br /&gt;
 '''fusion-utils-mail''' - email utiliity classes&lt;br /&gt;
 '''fusion-utils-mongodb'''  - implementation code to use MongoDB a means to store Objects&lt;br /&gt;
 '''fusion-utils-sdmx''' - SDMX Specific utilty classes&lt;br /&gt;
 '''fusion-utils-spring''' - spring related utility classes&lt;br /&gt;
 '''fusion-utils-xlsx''' - reading/writing Excel workbooks related utility classes&lt;br /&gt;
&lt;br /&gt;
== Java Packages ==&lt;br /&gt;
Each module is partitioned into Java packages, with the exception of the utility modules, which typically seperate code by its function. &lt;br /&gt;
&lt;br /&gt;
The generic packages are as follows.&lt;br /&gt;
&lt;br /&gt;
 '''api''' - contains interfaces relevent to the module &lt;br /&gt;
 '''constant''' - contains Java enums and java classes that contain public static constants&lt;br /&gt;
 '''engine''' - classes that 'do the work', many are stateless singletons, there are also stateful for example DataReader/WriterEngine &lt;br /&gt;
 '''factory''' - singleton classes that are responisble for generating an engine, typically called by a manager class, factories enable new features to be plugged into the framework&lt;br /&gt;
 '''filter'''  - REST web service filters (defined in web.xml) - filters are called before the web service&lt;br /&gt;
 '''manager''' - the main entry point for all high level functions, the manager's job is to veryify the request (i.e. a security check) and manage the process of fulfiliing the request by delegating the work to an engine or a DAO, a manager should be a fairly thin layer&lt;br /&gt;
 '''model''' - data transfer objects &lt;br /&gt;
 '''service''' (or rest) - web service entry points&lt;br /&gt;
 '''util''' - utility classes, typically containing public static methods&lt;br /&gt;
&lt;br /&gt;
The general logical flow of a system is the following&lt;br /&gt;
&lt;br /&gt;
 service --&amp;gt; manager --&amp;gt; engine&lt;br /&gt;
                     --&amp;gt; dao&lt;br /&gt;
&lt;br /&gt;
The service (web service entry point) is a thin layer which collects the request arguments, with miniumal manipulation, and passes them to the respective Service Interface. The implementation of this Service Interface will create an apporpriate model object (or objects) which contain a consolidated collection of arguements, some validation of arguments can be performed at this point, and then pass these to the manager Interface.  The manager will ensure the arguments are valid and the user has permission to perform the action.  The manager then provides the workflow required to fulfil the task, by makking calls to engines, daos.&lt;br /&gt;
&lt;br /&gt;
= High Level Design =&lt;br /&gt;
&lt;br /&gt;
==[https://en.wikipedia.org/wiki/Inversion_of_control Inversion of Control] (IoC)==&lt;br /&gt;
&lt;br /&gt;
IoC is achieved by assigning all implementation classes to Interfaces and ensuring classes are stateless so that they can be singletons.  Managers are typically singletons.  This enables the system to be plugged togeather either by using the spring framework, or by using the sdmx.io framework.&lt;br /&gt;
&lt;br /&gt;
===Spring Framework===&lt;br /&gt;
Spring is used in the Java web application, web.xml references a number of spring bean files, which are located under src/main/resources/spring subfolder of the web application library.  The spring beans define the classes and which dependancies they are using. This works well for very large systems such as Fusion Metadata Registry which contains a large number of services and class definitions.&lt;br /&gt;
&lt;br /&gt;
===SDMX.IO IoC framework===&lt;br /&gt;
In order to remove the dependency on spring, and to simplify simpler projects, Sdmx.io provides a framework which allows instances of singleton classes to be registered to and obtained via the '''SingletonStore''' class.  When the class is not a singleton instances can be registered with the '''FusionBeanStore''' class.  &lt;br /&gt;
&lt;br /&gt;
A running application would request a singleton instance in the following way.&lt;br /&gt;
&lt;br /&gt;
 private IActiveDirectorySecuritySettingsManager activeDirectorySecuritySettingsManager = SingletonStore.getSingleton(IActiveDirectorySecuritySettingsManager.class);&lt;br /&gt;
&lt;br /&gt;
This is typically done at the web service layer, as a web service is constructed outside of the spring framework, after the application has launched.&lt;br /&gt;
&lt;br /&gt;
There are some use cases where the singleton is not available at the time it is requested, typcially because it is during application startup and the bean has not yet been built and registered.  In this scenario the Singleton store can be asked to provide an instance when it is registered.&lt;br /&gt;
 &lt;br /&gt;
 SingletonStore.registerInterest(FusionProductInformationRetrievalManager.class, (bean) -&amp;gt; {&lt;br /&gt;
   infoRetreival = bean;&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
If the application wants multiple instances of an interface, then the FusionBeanStore is used&lt;br /&gt;
&lt;br /&gt;
 Collection&amp;lt;StructureWriterFactory&amp;gt; allBeans = FusionBeanStore.getBeans(StructureWriterFactory.class);&lt;br /&gt;
&lt;br /&gt;
===Using Spring/SDMX.IO===&lt;br /&gt;
In order to quickly register modules with the SDMX.IO framework, there are a number of classes that implement '''IFusionModule''', these classes have a register method, which on calling will automatically create and register instances of classes relevent to that module. &lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 CoreSDMXModule.register(); - register schema factories, cross reference resolution, reference metadata reader and writer manager&lt;br /&gt;
 SdmxMLModule.register();  - register SDMX-XML data and structure format readers and writers&lt;br /&gt;
 SdmxJsonModule.register(); - register SDMX-JSON data and structure format readers and writers&lt;br /&gt;
 FusionXLModule.register(); - register FusionXL classes for the excel plugin&lt;br /&gt;
 SdmxEDIModule.register(); - register SDMX-EDI data and structure format readers and writers&lt;br /&gt;
 FusionJsonModule.register();  - register Fusion-JSON data and structure format readers and writers&lt;br /&gt;
 SdmxCsvModule.register();  - register SDMX-CSV data format readers and writers&lt;br /&gt;
 FusionCoreDataModule.register();  - register SDMX-EDI data and structure format readers and writers&lt;br /&gt;
 XLSXModule.register();  - register reader and writer for Excel&lt;br /&gt;
 PublicationTableModule.register(); - classes to support Publication ables&lt;br /&gt;
  &lt;br /&gt;
The spring framework can be used in conjunction with the SDMX.IO IoC framework, as the class '''SpringBeansContainer''' which is a wrapper around the spring beans contained, can be used by both the SingletonStore and FusionBeansStore.  This allows SingletonStore and FusionBeansStore to search both the spring beans container, and any locally registered classes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Example Code =&lt;br /&gt;
== Reading Structures ==&lt;br /&gt;
* Register the SDMX-ML module as the response from the URL is in SDMX-ML format&lt;br /&gt;
* Creates an instance of the StructureReaderManager  (typically in an application this would be a singleton). &lt;br /&gt;
* Creates a wrapper around a URL giving repeated access to the input stream of information, the URL resolves to an SDMX structure file containing mulitple Dataflows&lt;br /&gt;
* Convert the stream into SDMX structures&lt;br /&gt;
* Loop the Dataflows and print the ID to the console&lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
  SdmxMLModule.register();&lt;br /&gt;
  StructureReaderManager srm = new StructureReaderManagerImpl();&lt;br /&gt;
  ReadableDataLocation rdl = new ReadableDataLocationTmp(new URL(&amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2/structure/dataflow&amp;quot;));&lt;br /&gt;
  SdmxBeans beans = srm.parseStructures(rdl);&lt;br /&gt;
  beans.getDataflows().forEach((flow) -&amp;gt; System.out.println(flow.getId()));&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7082</id>
		<title>DRAFT SDMX-CORE</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7082"/>
		<updated>2023-07-24T15:44:02Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* High Level Design */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectire =&lt;br /&gt;
== Modules ==&lt;br /&gt;
The sdmx-io modules are as follows&lt;br /&gt;
===Interface Modules===&lt;br /&gt;
These modules contains Java Interfaces only, no Java classes.  The sdmx-io framework uses Interfaces over implementation classes in order to achieve loose coupling.&lt;br /&gt;
&lt;br /&gt;
 '''fusion-api'''  - contains generic Interfaces that are unrelated to SDMX. Each package in this project is broken down by function, i.e audit, cache, date, email, exception&lt;br /&gt;
 '''fusion-api-dao''' - contains Interface definitions for database persistence, not coupled to database platform, but all based on storeage and retrieval of Java Objects&lt;br /&gt;
 '''fusion-api-sdmx''' - contains Interfaces for SDMX Information model (SdmxBeans and related), high level Interfaces for SDMX related functions which cross mulitple modules&lt;br /&gt;
 '''fusion-api-service''' - contains Interfaces definitions for web services to use - allowing projects the implement web service entry points to not require web service depdenancies&lt;br /&gt;
&lt;br /&gt;
===Implementation Modules===&lt;br /&gt;
These modules contain Java classes which are core to SDMX, they implement Interfaces in the higher api modules&lt;br /&gt;
 '''fusion-sdmx-im''' - contains the implementation code for the SDMX Information Model (SdmxBeans and related structures such as Codelists, Concepts, etc)&lt;br /&gt;
 '''fusion-core-data''' - contains code to read/write data and generic data related features such as determining series/obs, validation, temporary data stores&lt;br /&gt;
 '''fusion-core-sdmx''' - contains core code for structural metadata, including temporary store, cross reference resolution, contains some data and reference metadata features &lt;br /&gt;
 '''fusion-core-structure''' - contains core code for processing structural metadata &lt;br /&gt;
 '''fusion-core-xlsx''' - contains code to read and write structures and data in Excel &lt;br /&gt;
&lt;br /&gt;
===Format Modules===&lt;br /&gt;
These modules contains Java classes for reading and writing SDMX Structureal Metadata, Reference Metadata, and Data&lt;br /&gt;
&lt;br /&gt;
 '''fusion-sdmx-csv''' - reading and writing SDMX-CSV format&lt;br /&gt;
 '''fusion-sdmx-edi''' - reading and writing SDMX-EDI format&lt;br /&gt;
 '''fusion-sdmx-json''' - reading and writing SDMX-JSON format&lt;br /&gt;
 '''fusion-sdmx-ml''' reading and writing SDMX-XML&lt;br /&gt;
&lt;br /&gt;
===Feature Modules===&lt;br /&gt;
These modules provide feature specific code&lt;br /&gt;
 '''fusion-core-dao''' - contains generic DAO implementations for storing and querying for objects, not coupled to a specific object store, but we use hibernate, mongodb is also an option&lt;br /&gt;
 '''fusion-audit''' - audit events and centralised error handling&lt;br /&gt;
 '''fusion-sdmx-kafka''' - connecting to and sending/recieving messages to Apache Kafka&lt;br /&gt;
 '''fusion-sdmx-publication''' - SDMX Publication Tables: SdmxBean implementations, and buisness logic to materilise table based on definition&lt;br /&gt;
 '''fusion-sdmx-reporttemplate''' - Reporting Templates: SdmxBean implementations, and buisness logic to genearte excel workbook from template definition, reading data from workbooks&lt;br /&gt;
 '''fusion-sdmx-rest''' - SDMX web services, and additional web service implementations from APIs defined in fusion-api-service&lt;br /&gt;
 '''fusion-sdmx-search''' - Lucene search engine for structures&lt;br /&gt;
 '''fusion-sdmx-security''' - authentication against LDAP/AD/Fusion Security - contains user definition (SecurityDetailsImpl)&lt;br /&gt;
 '''fusion-xl''' - exposes web services required by the FusionXL Excel Pluin&lt;br /&gt;
&lt;br /&gt;
===Utility Modules===&lt;br /&gt;
Utility classes, typically public static classes, the utils projects may organise code by function rather then using the generic packaging structure (api, engine, manager, model, ...)&lt;br /&gt;
 '''fusion-utils''' - generic utility classes, not specific to SDMX&lt;br /&gt;
 '''fusion-utils-hibernate''' - implementation code to use Hibernate as a means to connect to the DAO&lt;br /&gt;
 '''fusion-utils-http''' - calling HTTP web services&lt;br /&gt;
 '''fusion-utils-json''' - JSON related utility classes&lt;br /&gt;
 '''fusion-utils-mail''' - email utiliity classes&lt;br /&gt;
 '''fusion-utils-mongodb'''  - implementation code to use MongoDB a means to store Objects&lt;br /&gt;
 '''fusion-utils-sdmx''' - SDMX Specific utilty classes&lt;br /&gt;
 '''fusion-utils-spring''' - spring related utility classes&lt;br /&gt;
 '''fusion-utils-xlsx''' - reading/writing Excel workbooks related utility classes&lt;br /&gt;
&lt;br /&gt;
== Java Packages ==&lt;br /&gt;
Each module is partitioned into Java packages, with the exception of the utility modules, which typically seperate code by its function. &lt;br /&gt;
&lt;br /&gt;
The generic packages are as follows.&lt;br /&gt;
&lt;br /&gt;
 '''api''' - contains interfaces relevent to the module &lt;br /&gt;
 '''constant''' - contains Java enums and java classes that contain public static constants&lt;br /&gt;
 '''engine''' - classes that 'do the work', many are stateless singletons, there are also stateful for example DataReader/WriterEngine &lt;br /&gt;
 '''factory''' - singleton classes that are responisble for generating an engine, typically called by a manager class, factories enable new features to be plugged into the framework&lt;br /&gt;
 '''filter'''  - REST web service filters (defined in web.xml) - filters are called before the web service&lt;br /&gt;
 '''manager''' - the main entry point for all high level functions, the manager's job is to veryify the request (i.e. a security check) and manage the process of fulfiliing the request by delegating the work to an engine or a DAO, a manager should be a fairly thin layer&lt;br /&gt;
 '''model''' - data transfer objects &lt;br /&gt;
 '''service''' (or rest) - web service entry points&lt;br /&gt;
 '''util''' - utility classes, typically containing public static methods&lt;br /&gt;
&lt;br /&gt;
The general logical flow of a system is the following&lt;br /&gt;
&lt;br /&gt;
 service --&amp;gt; manager --&amp;gt; engine&lt;br /&gt;
                     --&amp;gt; dao&lt;br /&gt;
&lt;br /&gt;
The service (web service entry point) is a thin layer which collects the request arguments, with miniumal manipulation, and passes them to the respective Service Interface. The implementation of this Service Interface will create an apporpriate model object (or objects) which contain a consolidated collection of arguements, some validation of arguments can be performed at this point, and then pass these to the manager Interface.  The manager will ensure the arguments are valid and the user has permission to perform the action.  The manager then provides the workflow required to fulfil the task, by makking calls to engines, daos.&lt;br /&gt;
&lt;br /&gt;
= High Level Design =&lt;br /&gt;
&lt;br /&gt;
==[https://en.wikipedia.org/wiki/Inversion_of_control Inversion of Control] (IoC)==&lt;br /&gt;
&lt;br /&gt;
IoC is achieved by assigning all implementation classes to Interfaces and ensuring classes are stateless so that they can be singletons.  Managers are typically singletons.  This enables the system to be plugged togeather either by using the spring framework, or by using the sdmx.io framework.&lt;br /&gt;
&lt;br /&gt;
===Spring Framework===&lt;br /&gt;
Spring is used in the Java web application, web.xml references a number of spring bean files, which are located under src/main/resources/spring subfolder of the web application library.  The spring beans define the classes and which dependancies they are using. This works well for very large systems such as Fusion Metadata Registry which contains a large number of services and class definitions.&lt;br /&gt;
&lt;br /&gt;
===SDMX.IO IoC framework===&lt;br /&gt;
In order to remove the dependency on spring, and to simplify simpler projects, Sdmx.io provides a framework which allows instances of singleton classes to be registered to and obtained via the '''SingletonStore''' class.  When the class is not a singleton instances can be registered with the '''FusionBeanStore''' class.  &lt;br /&gt;
&lt;br /&gt;
A running application would request a singleton instance in the following way.&lt;br /&gt;
&lt;br /&gt;
 private IActiveDirectorySecuritySettingsManager activeDirectorySecuritySettingsManager = SingletonStore.getSingleton(IActiveDirectorySecuritySettingsManager.class);&lt;br /&gt;
&lt;br /&gt;
This is typically done at the web service layer, as a web service is constructed outside of the spring framework, after the application has launched.&lt;br /&gt;
&lt;br /&gt;
There are some use cases where the singleton is not available at the time it is requested, typcially because it is during application startup and the bean has not yet been built and registered.  In this scenario the Singleton store can be asked to provide an instance when it is registered.&lt;br /&gt;
 &lt;br /&gt;
 SingletonStore.registerInterest(FusionProductInformationRetrievalManager.class, (bean) -&amp;gt; {&lt;br /&gt;
   infoRetreival = bean;&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
If the application wants multiple instances of an interface, then the FusionBeanStore is used&lt;br /&gt;
&lt;br /&gt;
 Collection&amp;lt;StructureWriterFactory&amp;gt; allBeans = FusionBeanStore.getBeans(StructureWriterFactory.class);&lt;br /&gt;
&lt;br /&gt;
===Using Spring/SDMX.IO===&lt;br /&gt;
In order to quickly register modules with the SDMX.IO framework, there are a number of classes that implement '''IFusionModule''', these classes have a register method, which on calling will automatically create and register instances of classes relevent to that module. &lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 CoreSDMXModule.register(); - register schema factories, cross reference resolution, reference metadata reader and writer manager&lt;br /&gt;
 SdmxMLModule.register();  - register SDMX-XML data and structure format readers and writers&lt;br /&gt;
 SdmxJsonModule.register(); - register SDMX-JSON data and structure format readers and writers&lt;br /&gt;
 FusionXLModule.register(); - register FusionXL classes for the excel plugin&lt;br /&gt;
 SdmxEDIModule.register(); - register SDMX-EDI data and structure format readers and writers&lt;br /&gt;
 FusionJsonModule.register();  - register Fusion-JSON data and structure format readers and writers&lt;br /&gt;
 SdmxCsvModule.register();  - register SDMX-CSV data format readers and writers&lt;br /&gt;
 FusionCoreDataModule.register();  - register SDMX-EDI data and structure format readers and writers&lt;br /&gt;
 XLSXModule.register();  - register reader and writer for Excel&lt;br /&gt;
 PublicationTableModule.register(); - classes to support Publication ables&lt;br /&gt;
  &lt;br /&gt;
The spring framework can be used in conjunction with the SDMX.IO IoC framework, as the class '''SpringBeansContainer''' which is a wrapper around the spring beans contained, can be used by both the SingletonStore and FusionBeansStore.  This allows SingletonStore and FusionBeansStore to search both the spring beans container, and any locally registered classes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Example Code =&lt;br /&gt;
== Reading Structures ==&lt;br /&gt;
* Creates an instance of the StructureReaderManager  (typically in an application this would be a singleton). &lt;br /&gt;
* Creates a wrapper around a URL giving repeated access to the input stream of information, the URL resolves to an SDMX structure file containing mulitple Dataflows&lt;br /&gt;
* Convert the stream into SDMX structures&lt;br /&gt;
* Loop the Dataflows and print the ID to the console&lt;br /&gt;
&lt;br /&gt;
 public static void main(String[] args) throws MalformedURLException {&lt;br /&gt;
  StructureReaderManager srm = new StructureReaderManagerImpl();&lt;br /&gt;
  ReadableDataLocation rdl = new ReadableDataLocationTmp(new URL(&amp;quot;https://demo11.metadatatechnology.com/FusionRegistry/sdmx/v2/structure/dataflow&amp;quot;));&lt;br /&gt;
  SdmxBeans beans = srm.parseStructures(rdl);&lt;br /&gt;
  beans.getDataflows().forEach((flow) -&amp;gt; System.out.println(flow.getId()));&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7081</id>
		<title>DRAFT SDMX-CORE</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7081"/>
		<updated>2023-07-24T15:37:12Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Using Spring/SDMX.IO */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectire =&lt;br /&gt;
== Modules ==&lt;br /&gt;
The sdmx-io modules are as follows&lt;br /&gt;
===Interface Modules===&lt;br /&gt;
These modules contains Java Interfaces only, no Java classes.  The sdmx-io framework uses Interfaces over implementation classes in order to achieve loose coupling.&lt;br /&gt;
&lt;br /&gt;
 '''fusion-api'''  - contains generic Interfaces that are unrelated to SDMX. Each package in this project is broken down by function, i.e audit, cache, date, email, exception&lt;br /&gt;
 '''fusion-api-dao''' - contains Interface definitions for database persistence, not coupled to database platform, but all based on storeage and retrieval of Java Objects&lt;br /&gt;
 '''fusion-api-sdmx''' - contains Interfaces for SDMX Information model (SdmxBeans and related), high level Interfaces for SDMX related functions which cross mulitple modules&lt;br /&gt;
 '''fusion-api-service''' - contains Interfaces definitions for web services to use - allowing projects the implement web service entry points to not require web service depdenancies&lt;br /&gt;
&lt;br /&gt;
===Implementation Modules===&lt;br /&gt;
These modules contain Java classes which are core to SDMX, they implement Interfaces in the higher api modules&lt;br /&gt;
 '''fusion-sdmx-im''' - contains the implementation code for the SDMX Information Model (SdmxBeans and related structures such as Codelists, Concepts, etc)&lt;br /&gt;
 '''fusion-core-data''' - contains code to read/write data and generic data related features such as determining series/obs, validation, temporary data stores&lt;br /&gt;
 '''fusion-core-sdmx''' - contains core code for structural metadata, including temporary store, cross reference resolution, contains some data and reference metadata features &lt;br /&gt;
 '''fusion-core-structure''' - contains core code for processing structural metadata &lt;br /&gt;
 '''fusion-core-xlsx''' - contains code to read and write structures and data in Excel &lt;br /&gt;
&lt;br /&gt;
===Format Modules===&lt;br /&gt;
These modules contains Java classes for reading and writing SDMX Structureal Metadata, Reference Metadata, and Data&lt;br /&gt;
&lt;br /&gt;
 '''fusion-sdmx-csv''' - reading and writing SDMX-CSV format&lt;br /&gt;
 '''fusion-sdmx-edi''' - reading and writing SDMX-EDI format&lt;br /&gt;
 '''fusion-sdmx-json''' - reading and writing SDMX-JSON format&lt;br /&gt;
 '''fusion-sdmx-ml''' reading and writing SDMX-XML&lt;br /&gt;
&lt;br /&gt;
===Feature Modules===&lt;br /&gt;
These modules provide feature specific code&lt;br /&gt;
 '''fusion-core-dao''' - contains generic DAO implementations for storing and querying for objects, not coupled to a specific object store, but we use hibernate, mongodb is also an option&lt;br /&gt;
 '''fusion-audit''' - audit events and centralised error handling&lt;br /&gt;
 '''fusion-sdmx-kafka''' - connecting to and sending/recieving messages to Apache Kafka&lt;br /&gt;
 '''fusion-sdmx-publication''' - SDMX Publication Tables: SdmxBean implementations, and buisness logic to materilise table based on definition&lt;br /&gt;
 '''fusion-sdmx-reporttemplate''' - Reporting Templates: SdmxBean implementations, and buisness logic to genearte excel workbook from template definition, reading data from workbooks&lt;br /&gt;
 '''fusion-sdmx-rest''' - SDMX web services, and additional web service implementations from APIs defined in fusion-api-service&lt;br /&gt;
 '''fusion-sdmx-search''' - Lucene search engine for structures&lt;br /&gt;
 '''fusion-sdmx-security''' - authentication against LDAP/AD/Fusion Security - contains user definition (SecurityDetailsImpl)&lt;br /&gt;
 '''fusion-xl''' - exposes web services required by the FusionXL Excel Pluin&lt;br /&gt;
&lt;br /&gt;
===Utility Modules===&lt;br /&gt;
Utility classes, typically public static classes, the utils projects may organise code by function rather then using the generic packaging structure (api, engine, manager, model, ...)&lt;br /&gt;
 '''fusion-utils''' - generic utility classes, not specific to SDMX&lt;br /&gt;
 '''fusion-utils-hibernate''' - implementation code to use Hibernate as a means to connect to the DAO&lt;br /&gt;
 '''fusion-utils-http''' - calling HTTP web services&lt;br /&gt;
 '''fusion-utils-json''' - JSON related utility classes&lt;br /&gt;
 '''fusion-utils-mail''' - email utiliity classes&lt;br /&gt;
 '''fusion-utils-mongodb'''  - implementation code to use MongoDB a means to store Objects&lt;br /&gt;
 '''fusion-utils-sdmx''' - SDMX Specific utilty classes&lt;br /&gt;
 '''fusion-utils-spring''' - spring related utility classes&lt;br /&gt;
 '''fusion-utils-xlsx''' - reading/writing Excel workbooks related utility classes&lt;br /&gt;
&lt;br /&gt;
== Java Packages ==&lt;br /&gt;
Each module is partitioned into Java packages, with the exception of the utility modules, which typically seperate code by its function. &lt;br /&gt;
&lt;br /&gt;
The generic packages are as follows.&lt;br /&gt;
&lt;br /&gt;
 '''api''' - contains interfaces relevent to the module &lt;br /&gt;
 '''constant''' - contains Java enums and java classes that contain public static constants&lt;br /&gt;
 '''engine''' - classes that 'do the work', many are stateless singletons, there are also stateful for example DataReader/WriterEngine &lt;br /&gt;
 '''factory''' - singleton classes that are responisble for generating an engine, typically called by a manager class, factories enable new features to be plugged into the framework&lt;br /&gt;
 '''filter'''  - REST web service filters (defined in web.xml) - filters are called before the web service&lt;br /&gt;
 '''manager''' - the main entry point for all high level functions, the manager's job is to veryify the request (i.e. a security check) and manage the process of fulfiliing the request by delegating the work to an engine or a DAO, a manager should be a fairly thin layer&lt;br /&gt;
 '''model''' - data transfer objects &lt;br /&gt;
 '''service''' (or rest) - web service entry points&lt;br /&gt;
 '''util''' - utility classes, typically containing public static methods&lt;br /&gt;
&lt;br /&gt;
The general logical flow of a system is the following&lt;br /&gt;
&lt;br /&gt;
 service --&amp;gt; manager --&amp;gt; engine&lt;br /&gt;
                     --&amp;gt; dao&lt;br /&gt;
&lt;br /&gt;
The service (web service entry point) is a thin layer which collects the request arguments, with miniumal manipulation, and passes them to the respective Service Interface. The implementation of this Service Interface will create an apporpriate model object (or objects) which contain a consolidated collection of arguements, some validation of arguments can be performed at this point, and then pass these to the manager Interface.  The manager will ensure the arguments are valid and the user has permission to perform the action.  The manager then provides the workflow required to fulfil the task, by makking calls to engines, daos.&lt;br /&gt;
&lt;br /&gt;
= High Level Design =&lt;br /&gt;
&lt;br /&gt;
==[https://en.wikipedia.org/wiki/Inversion_of_control Inversion of Control] (IoC)==&lt;br /&gt;
&lt;br /&gt;
IoC is achieved by assigning all implementation classes to Interfaces and ensuring classes are stateless so that they can be singletons.  Managers are typically singletons.  This enables the system to be plugged togeather either by using the spring framework, or by using the sdmx.io framework.&lt;br /&gt;
&lt;br /&gt;
===Spring Framework===&lt;br /&gt;
Spring is used in the Java web application, web.xml references a number of spring bean files, which are located under src/main/resources/spring subfolder of the web application library.  The spring beans define the classes and which dependancies they are using. This works well for very large systems such as Fusion Metadata Registry which contains a large number of services and class definitions.&lt;br /&gt;
&lt;br /&gt;
===SDMX.IO IoC framework===&lt;br /&gt;
In order to remove the dependency on spring, and to simplify simpler projects, Sdmx.io provides a framework which allows instances of singleton classes to be registered to and obtained via the '''SingletonStore''' class.  When the class is not a singleton instances can be registered with the '''FusionBeanStore''' class.  &lt;br /&gt;
&lt;br /&gt;
A running application would request a singleton instance in the following way.&lt;br /&gt;
&lt;br /&gt;
 private IActiveDirectorySecuritySettingsManager activeDirectorySecuritySettingsManager = SingletonStore.getSingleton(IActiveDirectorySecuritySettingsManager.class);&lt;br /&gt;
&lt;br /&gt;
This is typically done at the web service layer, as a web service is constructed outside of the spring framework, after the application has launched.&lt;br /&gt;
&lt;br /&gt;
There are some use cases where the singleton is not available at the time it is requested, typcially because it is during application startup and the bean has not yet been built and registered.  In this scenario the Singleton store can be asked to provide an instance when it is registered.&lt;br /&gt;
 &lt;br /&gt;
 SingletonStore.registerInterest(FusionProductInformationRetrievalManager.class, (bean) -&amp;gt; {&lt;br /&gt;
   infoRetreival = bean;&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
If the application wants multiple instances of an interface, then the FusionBeanStore is used&lt;br /&gt;
&lt;br /&gt;
 Collection&amp;lt;StructureWriterFactory&amp;gt; allBeans = FusionBeanStore.getBeans(StructureWriterFactory.class);&lt;br /&gt;
&lt;br /&gt;
===Using Spring/SDMX.IO===&lt;br /&gt;
In order to quickly register modules with the SDMX.IO framework, there are a number of classes that implement '''IFusionModule''', these classes have a register method, which on calling will automatically create and register instances of classes relevent to that module. &lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 CoreSDMXModule.register(); - register schema factories, cross reference resolution, reference metadata reader and writer manager&lt;br /&gt;
 SdmxMLModule.register();  - register SDMX-XML data and structure format readers and writers&lt;br /&gt;
 SdmxJsonModule.register(); - register SDMX-JSON data and structure format readers and writers&lt;br /&gt;
 FusionXLModule.register(); - register FusionXL classes for the excel plugin&lt;br /&gt;
 SdmxEDIModule.register(); - register SDMX-EDI data and structure format readers and writers&lt;br /&gt;
 FusionJsonModule.register();  - register Fusion-JSON data and structure format readers and writers&lt;br /&gt;
 SdmxCsvModule.register();  - register SDMX-CSV data format readers and writers&lt;br /&gt;
 FusionCoreDataModule.register();  - register SDMX-EDI data and structure format readers and writers&lt;br /&gt;
 XLSXModule.register();  - register reader and writer for Excel&lt;br /&gt;
 PublicationTableModule.register(); - classes to support Publication ables&lt;br /&gt;
  &lt;br /&gt;
The spring framework can be used in conjunction with the SDMX.IO IoC framework, as the class '''SpringBeansContainer''' which is a wrapper around the spring beans contained, can be used by both the SingletonStore and FusionBeansStore.  This allows SingletonStore and FusionBeansStore to search both the spring beans container, and any locally registered classes.&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7080</id>
		<title>DRAFT SDMX-CORE</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7080"/>
		<updated>2023-07-24T13:01:44Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* SDMX.IO IoC framework */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectire =&lt;br /&gt;
== Modules ==&lt;br /&gt;
The sdmx-io modules are as follows&lt;br /&gt;
===Interface Modules===&lt;br /&gt;
These modules contains Java Interfaces only, no Java classes.  The sdmx-io framework uses Interfaces over implementation classes in order to achieve loose coupling.&lt;br /&gt;
&lt;br /&gt;
 '''fusion-api'''  - contains generic Interfaces that are unrelated to SDMX. Each package in this project is broken down by function, i.e audit, cache, date, email, exception&lt;br /&gt;
 '''fusion-api-dao''' - contains Interface definitions for database persistence, not coupled to database platform, but all based on storeage and retrieval of Java Objects&lt;br /&gt;
 '''fusion-api-sdmx''' - contains Interfaces for SDMX Information model (SdmxBeans and related), high level Interfaces for SDMX related functions which cross mulitple modules&lt;br /&gt;
 '''fusion-api-service''' - contains Interfaces definitions for web services to use - allowing projects the implement web service entry points to not require web service depdenancies&lt;br /&gt;
&lt;br /&gt;
===Implementation Modules===&lt;br /&gt;
These modules contain Java classes which are core to SDMX, they implement Interfaces in the higher api modules&lt;br /&gt;
 '''fusion-sdmx-im''' - contains the implementation code for the SDMX Information Model (SdmxBeans and related structures such as Codelists, Concepts, etc)&lt;br /&gt;
 '''fusion-core-data''' - contains code to read/write data and generic data related features such as determining series/obs, validation, temporary data stores&lt;br /&gt;
 '''fusion-core-sdmx''' - contains core code for structural metadata, including temporary store, cross reference resolution, contains some data and reference metadata features &lt;br /&gt;
 '''fusion-core-structure''' - contains core code for processing structural metadata &lt;br /&gt;
 '''fusion-core-xlsx''' - contains code to read and write structures and data in Excel &lt;br /&gt;
&lt;br /&gt;
===Format Modules===&lt;br /&gt;
These modules contains Java classes for reading and writing SDMX Structureal Metadata, Reference Metadata, and Data&lt;br /&gt;
&lt;br /&gt;
 '''fusion-sdmx-csv''' - reading and writing SDMX-CSV format&lt;br /&gt;
 '''fusion-sdmx-edi''' - reading and writing SDMX-EDI format&lt;br /&gt;
 '''fusion-sdmx-json''' - reading and writing SDMX-JSON format&lt;br /&gt;
 '''fusion-sdmx-ml''' reading and writing SDMX-XML&lt;br /&gt;
&lt;br /&gt;
===Feature Modules===&lt;br /&gt;
These modules provide feature specific code&lt;br /&gt;
 '''fusion-core-dao''' - contains generic DAO implementations for storing and querying for objects, not coupled to a specific object store, but we use hibernate, mongodb is also an option&lt;br /&gt;
 '''fusion-audit''' - audit events and centralised error handling&lt;br /&gt;
 '''fusion-sdmx-kafka''' - connecting to and sending/recieving messages to Apache Kafka&lt;br /&gt;
 '''fusion-sdmx-publication''' - SDMX Publication Tables: SdmxBean implementations, and buisness logic to materilise table based on definition&lt;br /&gt;
 '''fusion-sdmx-reporttemplate''' - Reporting Templates: SdmxBean implementations, and buisness logic to genearte excel workbook from template definition, reading data from workbooks&lt;br /&gt;
 '''fusion-sdmx-rest''' - SDMX web services, and additional web service implementations from APIs defined in fusion-api-service&lt;br /&gt;
 '''fusion-sdmx-search''' - Lucene search engine for structures&lt;br /&gt;
 '''fusion-sdmx-security''' - authentication against LDAP/AD/Fusion Security - contains user definition (SecurityDetailsImpl)&lt;br /&gt;
 '''fusion-xl''' - exposes web services required by the FusionXL Excel Pluin&lt;br /&gt;
&lt;br /&gt;
===Utility Modules===&lt;br /&gt;
Utility classes, typically public static classes, the utils projects may organise code by function rather then using the generic packaging structure (api, engine, manager, model, ...)&lt;br /&gt;
 '''fusion-utils''' - generic utility classes, not specific to SDMX&lt;br /&gt;
 '''fusion-utils-hibernate''' - implementation code to use Hibernate as a means to connect to the DAO&lt;br /&gt;
 '''fusion-utils-http''' - calling HTTP web services&lt;br /&gt;
 '''fusion-utils-json''' - JSON related utility classes&lt;br /&gt;
 '''fusion-utils-mail''' - email utiliity classes&lt;br /&gt;
 '''fusion-utils-mongodb'''  - implementation code to use MongoDB a means to store Objects&lt;br /&gt;
 '''fusion-utils-sdmx''' - SDMX Specific utilty classes&lt;br /&gt;
 '''fusion-utils-spring''' - spring related utility classes&lt;br /&gt;
 '''fusion-utils-xlsx''' - reading/writing Excel workbooks related utility classes&lt;br /&gt;
&lt;br /&gt;
== Java Packages ==&lt;br /&gt;
Each module is partitioned into Java packages, with the exception of the utility modules, which typically seperate code by its function. &lt;br /&gt;
&lt;br /&gt;
The generic packages are as follows.&lt;br /&gt;
&lt;br /&gt;
 '''api''' - contains interfaces relevent to the module &lt;br /&gt;
 '''constant''' - contains Java enums and java classes that contain public static constants&lt;br /&gt;
 '''engine''' - classes that 'do the work', many are stateless singletons, there are also stateful for example DataReader/WriterEngine &lt;br /&gt;
 '''factory''' - singleton classes that are responisble for generating an engine, typically called by a manager class, factories enable new features to be plugged into the framework&lt;br /&gt;
 '''filter'''  - REST web service filters (defined in web.xml) - filters are called before the web service&lt;br /&gt;
 '''manager''' - the main entry point for all high level functions, the manager's job is to veryify the request (i.e. a security check) and manage the process of fulfiliing the request by delegating the work to an engine or a DAO, a manager should be a fairly thin layer&lt;br /&gt;
 '''model''' - data transfer objects &lt;br /&gt;
 '''service''' (or rest) - web service entry points&lt;br /&gt;
 '''util''' - utility classes, typically containing public static methods&lt;br /&gt;
&lt;br /&gt;
The general logical flow of a system is the following&lt;br /&gt;
&lt;br /&gt;
 service --&amp;gt; manager --&amp;gt; engine&lt;br /&gt;
                     --&amp;gt; dao&lt;br /&gt;
&lt;br /&gt;
The service (web service entry point) is a thin layer which collects the request arguments, with miniumal manipulation, and passes them to the respective Service Interface. The implementation of this Service Interface will create an apporpriate model object (or objects) which contain a consolidated collection of arguements, some validation of arguments can be performed at this point, and then pass these to the manager Interface.  The manager will ensure the arguments are valid and the user has permission to perform the action.  The manager then provides the workflow required to fulfil the task, by makking calls to engines, daos.&lt;br /&gt;
&lt;br /&gt;
= High Level Design =&lt;br /&gt;
&lt;br /&gt;
==[https://en.wikipedia.org/wiki/Inversion_of_control Inversion of Control] (IoC)==&lt;br /&gt;
&lt;br /&gt;
IoC is achieved by assigning all implementation classes to Interfaces and ensuring classes are stateless so that they can be singletons.  Managers are typically singletons.  This enables the system to be plugged togeather either by using the spring framework, or by using the sdmx.io framework.&lt;br /&gt;
&lt;br /&gt;
===Spring Framework===&lt;br /&gt;
Spring is used in the Java web application, web.xml references a number of spring bean files, which are located under src/main/resources/spring subfolder of the web application library.  The spring beans define the classes and which dependancies they are using. This works well for very large systems such as Fusion Metadata Registry which contains a large number of services and class definitions.&lt;br /&gt;
&lt;br /&gt;
===SDMX.IO IoC framework===&lt;br /&gt;
In order to remove the dependency on spring, and to simplify simpler projects, Sdmx.io provides a framework which allows instances of singleton classes to be registered to and obtained via the '''SingletonStore''' class.  When the class is not a singleton instances can be registered with the '''FusionBeanStore''' class.  &lt;br /&gt;
&lt;br /&gt;
A running application would request a singleton instance in the following way.&lt;br /&gt;
&lt;br /&gt;
 private IActiveDirectorySecuritySettingsManager activeDirectorySecuritySettingsManager = SingletonStore.getSingleton(IActiveDirectorySecuritySettingsManager.class);&lt;br /&gt;
&lt;br /&gt;
This is typically done at the web service layer, as a web service is constructed outside of the spring framework, after the application has launched.&lt;br /&gt;
&lt;br /&gt;
There are some use cases where the singleton is not available at the time it is requested, typcially because it is during application startup and the bean has not yet been built and registered.  In this scenario the Singleton store can be asked to provide an instance when it is registered.&lt;br /&gt;
 &lt;br /&gt;
 SingletonStore.registerInterest(FusionProductInformationRetrievalManager.class, (bean) -&amp;gt; {&lt;br /&gt;
   infoRetreival = bean;&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
If the application wants multiple instances of an interface, then the FusionBeanStore is used&lt;br /&gt;
&lt;br /&gt;
 Collection&amp;lt;StructureWriterFactory&amp;gt; allBeans = FusionBeanStore.getBeans(StructureWriterFactory.class);&lt;br /&gt;
&lt;br /&gt;
===Using Spring/SDMX.IO===&lt;br /&gt;
In order to quickly register modules with the SDMX.IO framework, there are a number of classes that implement '''IFusionModule''', these classes have a register method, which on calling will automatically create and register instances of classes relevent to that module. &lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 CoreSDMXModule.register();&lt;br /&gt;
 SdmxMLModule.register();&lt;br /&gt;
 SdmxJsonModule.register();&lt;br /&gt;
 FusionXLModule.register();&lt;br /&gt;
 SdmxEDIModule.register();&lt;br /&gt;
 FusionJsonModule.register();&lt;br /&gt;
 SdmxCsvModule.register();&lt;br /&gt;
 FusionCoreDataModule.register();&lt;br /&gt;
 XLSXModule.register();&lt;br /&gt;
 PublicationTableModule.register();&lt;br /&gt;
  &lt;br /&gt;
The spring framework can be used in conjunction with the SDMX.IO IoC framework, as the class '''SpringBeansContainer''' which is a wrapper around the spring beans contained, can be used by both the SingletonStore and FusionBeansStore.  This allows SingletonStore and FusionBeansStore to search both the spring beans container, and any locally registered classes.&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7079</id>
		<title>DRAFT SDMX-CORE</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7079"/>
		<updated>2023-07-24T13:01:22Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Inversion of Control (IoC) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectire =&lt;br /&gt;
== Modules ==&lt;br /&gt;
The sdmx-io modules are as follows&lt;br /&gt;
===Interface Modules===&lt;br /&gt;
These modules contains Java Interfaces only, no Java classes.  The sdmx-io framework uses Interfaces over implementation classes in order to achieve loose coupling.&lt;br /&gt;
&lt;br /&gt;
 '''fusion-api'''  - contains generic Interfaces that are unrelated to SDMX. Each package in this project is broken down by function, i.e audit, cache, date, email, exception&lt;br /&gt;
 '''fusion-api-dao''' - contains Interface definitions for database persistence, not coupled to database platform, but all based on storeage and retrieval of Java Objects&lt;br /&gt;
 '''fusion-api-sdmx''' - contains Interfaces for SDMX Information model (SdmxBeans and related), high level Interfaces for SDMX related functions which cross mulitple modules&lt;br /&gt;
 '''fusion-api-service''' - contains Interfaces definitions for web services to use - allowing projects the implement web service entry points to not require web service depdenancies&lt;br /&gt;
&lt;br /&gt;
===Implementation Modules===&lt;br /&gt;
These modules contain Java classes which are core to SDMX, they implement Interfaces in the higher api modules&lt;br /&gt;
 '''fusion-sdmx-im''' - contains the implementation code for the SDMX Information Model (SdmxBeans and related structures such as Codelists, Concepts, etc)&lt;br /&gt;
 '''fusion-core-data''' - contains code to read/write data and generic data related features such as determining series/obs, validation, temporary data stores&lt;br /&gt;
 '''fusion-core-sdmx''' - contains core code for structural metadata, including temporary store, cross reference resolution, contains some data and reference metadata features &lt;br /&gt;
 '''fusion-core-structure''' - contains core code for processing structural metadata &lt;br /&gt;
 '''fusion-core-xlsx''' - contains code to read and write structures and data in Excel &lt;br /&gt;
&lt;br /&gt;
===Format Modules===&lt;br /&gt;
These modules contains Java classes for reading and writing SDMX Structureal Metadata, Reference Metadata, and Data&lt;br /&gt;
&lt;br /&gt;
 '''fusion-sdmx-csv''' - reading and writing SDMX-CSV format&lt;br /&gt;
 '''fusion-sdmx-edi''' - reading and writing SDMX-EDI format&lt;br /&gt;
 '''fusion-sdmx-json''' - reading and writing SDMX-JSON format&lt;br /&gt;
 '''fusion-sdmx-ml''' reading and writing SDMX-XML&lt;br /&gt;
&lt;br /&gt;
===Feature Modules===&lt;br /&gt;
These modules provide feature specific code&lt;br /&gt;
 '''fusion-core-dao''' - contains generic DAO implementations for storing and querying for objects, not coupled to a specific object store, but we use hibernate, mongodb is also an option&lt;br /&gt;
 '''fusion-audit''' - audit events and centralised error handling&lt;br /&gt;
 '''fusion-sdmx-kafka''' - connecting to and sending/recieving messages to Apache Kafka&lt;br /&gt;
 '''fusion-sdmx-publication''' - SDMX Publication Tables: SdmxBean implementations, and buisness logic to materilise table based on definition&lt;br /&gt;
 '''fusion-sdmx-reporttemplate''' - Reporting Templates: SdmxBean implementations, and buisness logic to genearte excel workbook from template definition, reading data from workbooks&lt;br /&gt;
 '''fusion-sdmx-rest''' - SDMX web services, and additional web service implementations from APIs defined in fusion-api-service&lt;br /&gt;
 '''fusion-sdmx-search''' - Lucene search engine for structures&lt;br /&gt;
 '''fusion-sdmx-security''' - authentication against LDAP/AD/Fusion Security - contains user definition (SecurityDetailsImpl)&lt;br /&gt;
 '''fusion-xl''' - exposes web services required by the FusionXL Excel Pluin&lt;br /&gt;
&lt;br /&gt;
===Utility Modules===&lt;br /&gt;
Utility classes, typically public static classes, the utils projects may organise code by function rather then using the generic packaging structure (api, engine, manager, model, ...)&lt;br /&gt;
 '''fusion-utils''' - generic utility classes, not specific to SDMX&lt;br /&gt;
 '''fusion-utils-hibernate''' - implementation code to use Hibernate as a means to connect to the DAO&lt;br /&gt;
 '''fusion-utils-http''' - calling HTTP web services&lt;br /&gt;
 '''fusion-utils-json''' - JSON related utility classes&lt;br /&gt;
 '''fusion-utils-mail''' - email utiliity classes&lt;br /&gt;
 '''fusion-utils-mongodb'''  - implementation code to use MongoDB a means to store Objects&lt;br /&gt;
 '''fusion-utils-sdmx''' - SDMX Specific utilty classes&lt;br /&gt;
 '''fusion-utils-spring''' - spring related utility classes&lt;br /&gt;
 '''fusion-utils-xlsx''' - reading/writing Excel workbooks related utility classes&lt;br /&gt;
&lt;br /&gt;
== Java Packages ==&lt;br /&gt;
Each module is partitioned into Java packages, with the exception of the utility modules, which typically seperate code by its function. &lt;br /&gt;
&lt;br /&gt;
The generic packages are as follows.&lt;br /&gt;
&lt;br /&gt;
 '''api''' - contains interfaces relevent to the module &lt;br /&gt;
 '''constant''' - contains Java enums and java classes that contain public static constants&lt;br /&gt;
 '''engine''' - classes that 'do the work', many are stateless singletons, there are also stateful for example DataReader/WriterEngine &lt;br /&gt;
 '''factory''' - singleton classes that are responisble for generating an engine, typically called by a manager class, factories enable new features to be plugged into the framework&lt;br /&gt;
 '''filter'''  - REST web service filters (defined in web.xml) - filters are called before the web service&lt;br /&gt;
 '''manager''' - the main entry point for all high level functions, the manager's job is to veryify the request (i.e. a security check) and manage the process of fulfiliing the request by delegating the work to an engine or a DAO, a manager should be a fairly thin layer&lt;br /&gt;
 '''model''' - data transfer objects &lt;br /&gt;
 '''service''' (or rest) - web service entry points&lt;br /&gt;
 '''util''' - utility classes, typically containing public static methods&lt;br /&gt;
&lt;br /&gt;
The general logical flow of a system is the following&lt;br /&gt;
&lt;br /&gt;
 service --&amp;gt; manager --&amp;gt; engine&lt;br /&gt;
                     --&amp;gt; dao&lt;br /&gt;
&lt;br /&gt;
The service (web service entry point) is a thin layer which collects the request arguments, with miniumal manipulation, and passes them to the respective Service Interface. The implementation of this Service Interface will create an apporpriate model object (or objects) which contain a consolidated collection of arguements, some validation of arguments can be performed at this point, and then pass these to the manager Interface.  The manager will ensure the arguments are valid and the user has permission to perform the action.  The manager then provides the workflow required to fulfil the task, by makking calls to engines, daos.&lt;br /&gt;
&lt;br /&gt;
= High Level Design =&lt;br /&gt;
&lt;br /&gt;
==[https://en.wikipedia.org/wiki/Inversion_of_control Inversion of Control] (IoC)==&lt;br /&gt;
&lt;br /&gt;
IoC is achieved by assigning all implementation classes to Interfaces and ensuring classes are stateless so that they can be singletons.  Managers are typically singletons.  This enables the system to be plugged togeather either by using the spring framework, or by using the sdmx.io framework.&lt;br /&gt;
&lt;br /&gt;
===Spring Framework===&lt;br /&gt;
Spring is used in the Java web application, web.xml references a number of spring bean files, which are located under src/main/resources/spring subfolder of the web application library.  The spring beans define the classes and which dependancies they are using. This works well for very large systems such as Fusion Metadata Registry which contains a large number of services and class definitions.&lt;br /&gt;
&lt;br /&gt;
===SDMX.IO IoC framework===&lt;br /&gt;
In order to remove the dependency on spring, and to simplify simpler projects, Sdmx.io provides a framework which allows instances of singleton classes to be registered to and obtained via the '''SingletonStore''' class.  When the class is not a singleton instances can be registered with the '''FusionBeanStore''' class.  &lt;br /&gt;
&lt;br /&gt;
A running application would request a singleton instance in the following way.&lt;br /&gt;
&lt;br /&gt;
 private IActiveDirectorySecuritySettingsManager activeDirectorySecuritySettingsManager = SingletonStore.getSingleton(IActiveDirectorySecuritySettingsManager.class);&lt;br /&gt;
&lt;br /&gt;
This is typically done at the web service layer, as a web service is constructed outside of the spring framework, after the application has launched.&lt;br /&gt;
&lt;br /&gt;
There are some use cases where the singleton is not available at the time it is requested, typcially because it is during application startup and the bean has not yet been built and registered.  In this scenario the Singleton store can be asked to provide an instance when it is registered.&lt;br /&gt;
 &lt;br /&gt;
 SingletonStore.registerInterest(FusionProductInformationRetrievalManager.class, (bean) -&amp;gt; {&lt;br /&gt;
			infoRetreival = bean;&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
If the application wants multiple instances of an interface, then the FusionBeanStore is used&lt;br /&gt;
&lt;br /&gt;
 Collection&amp;lt;StructureWriterFactory&amp;gt; allBeans = FusionBeanStore.getBeans(StructureWriterFactory.class);&lt;br /&gt;
&lt;br /&gt;
===Using Spring/SDMX.IO===&lt;br /&gt;
In order to quickly register modules with the SDMX.IO framework, there are a number of classes that implement '''IFusionModule''', these classes have a register method, which on calling will automatically create and register instances of classes relevent to that module. &lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
 CoreSDMXModule.register();&lt;br /&gt;
 SdmxMLModule.register();&lt;br /&gt;
 SdmxJsonModule.register();&lt;br /&gt;
 FusionXLModule.register();&lt;br /&gt;
 SdmxEDIModule.register();&lt;br /&gt;
 FusionJsonModule.register();&lt;br /&gt;
 SdmxCsvModule.register();&lt;br /&gt;
 FusionCoreDataModule.register();&lt;br /&gt;
 XLSXModule.register();&lt;br /&gt;
 PublicationTableModule.register();&lt;br /&gt;
  &lt;br /&gt;
The spring framework can be used in conjunction with the SDMX.IO IoC framework, as the class '''SpringBeansContainer''' which is a wrapper around the spring beans contained, can be used by both the SingletonStore and FusionBeansStore.  This allows SingletonStore and FusionBeansStore to search both the spring beans container, and any locally registered classes.&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7078</id>
		<title>DRAFT SDMX-CORE</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7078"/>
		<updated>2023-07-24T12:37:15Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Java Packages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectire =&lt;br /&gt;
== Modules ==&lt;br /&gt;
The sdmx-io modules are as follows&lt;br /&gt;
===Interface Modules===&lt;br /&gt;
These modules contains Java Interfaces only, no Java classes.  The sdmx-io framework uses Interfaces over implementation classes in order to achieve loose coupling.&lt;br /&gt;
&lt;br /&gt;
 '''fusion-api'''  - contains generic Interfaces that are unrelated to SDMX. Each package in this project is broken down by function, i.e audit, cache, date, email, exception&lt;br /&gt;
 '''fusion-api-dao''' - contains Interface definitions for database persistence, not coupled to database platform, but all based on storeage and retrieval of Java Objects&lt;br /&gt;
 '''fusion-api-sdmx''' - contains Interfaces for SDMX Information model (SdmxBeans and related), high level Interfaces for SDMX related functions which cross mulitple modules&lt;br /&gt;
 '''fusion-api-service''' - contains Interfaces definitions for web services to use - allowing projects the implement web service entry points to not require web service depdenancies&lt;br /&gt;
&lt;br /&gt;
===Implementation Modules===&lt;br /&gt;
These modules contain Java classes which are core to SDMX, they implement Interfaces in the higher api modules&lt;br /&gt;
 '''fusion-sdmx-im''' - contains the implementation code for the SDMX Information Model (SdmxBeans and related structures such as Codelists, Concepts, etc)&lt;br /&gt;
 '''fusion-core-data''' - contains code to read/write data and generic data related features such as determining series/obs, validation, temporary data stores&lt;br /&gt;
 '''fusion-core-sdmx''' - contains core code for structural metadata, including temporary store, cross reference resolution, contains some data and reference metadata features &lt;br /&gt;
 '''fusion-core-structure''' - contains core code for processing structural metadata &lt;br /&gt;
 '''fusion-core-xlsx''' - contains code to read and write structures and data in Excel &lt;br /&gt;
&lt;br /&gt;
===Format Modules===&lt;br /&gt;
These modules contains Java classes for reading and writing SDMX Structureal Metadata, Reference Metadata, and Data&lt;br /&gt;
&lt;br /&gt;
 '''fusion-sdmx-csv''' - reading and writing SDMX-CSV format&lt;br /&gt;
 '''fusion-sdmx-edi''' - reading and writing SDMX-EDI format&lt;br /&gt;
 '''fusion-sdmx-json''' - reading and writing SDMX-JSON format&lt;br /&gt;
 '''fusion-sdmx-ml''' reading and writing SDMX-XML&lt;br /&gt;
&lt;br /&gt;
===Feature Modules===&lt;br /&gt;
These modules provide feature specific code&lt;br /&gt;
 '''fusion-core-dao''' - contains generic DAO implementations for storing and querying for objects, not coupled to a specific object store, but we use hibernate, mongodb is also an option&lt;br /&gt;
 '''fusion-audit''' - audit events and centralised error handling&lt;br /&gt;
 '''fusion-sdmx-kafka''' - connecting to and sending/recieving messages to Apache Kafka&lt;br /&gt;
 '''fusion-sdmx-publication''' - SDMX Publication Tables: SdmxBean implementations, and buisness logic to materilise table based on definition&lt;br /&gt;
 '''fusion-sdmx-reporttemplate''' - Reporting Templates: SdmxBean implementations, and buisness logic to genearte excel workbook from template definition, reading data from workbooks&lt;br /&gt;
 '''fusion-sdmx-rest''' - SDMX web services, and additional web service implementations from APIs defined in fusion-api-service&lt;br /&gt;
 '''fusion-sdmx-search''' - Lucene search engine for structures&lt;br /&gt;
 '''fusion-sdmx-security''' - authentication against LDAP/AD/Fusion Security - contains user definition (SecurityDetailsImpl)&lt;br /&gt;
 '''fusion-xl''' - exposes web services required by the FusionXL Excel Pluin&lt;br /&gt;
&lt;br /&gt;
===Utility Modules===&lt;br /&gt;
Utility classes, typically public static classes, the utils projects may organise code by function rather then using the generic packaging structure (api, engine, manager, model, ...)&lt;br /&gt;
 '''fusion-utils''' - generic utility classes, not specific to SDMX&lt;br /&gt;
 '''fusion-utils-hibernate''' - implementation code to use Hibernate as a means to connect to the DAO&lt;br /&gt;
 '''fusion-utils-http''' - calling HTTP web services&lt;br /&gt;
 '''fusion-utils-json''' - JSON related utility classes&lt;br /&gt;
 '''fusion-utils-mail''' - email utiliity classes&lt;br /&gt;
 '''fusion-utils-mongodb'''  - implementation code to use MongoDB a means to store Objects&lt;br /&gt;
 '''fusion-utils-sdmx''' - SDMX Specific utilty classes&lt;br /&gt;
 '''fusion-utils-spring''' - spring related utility classes&lt;br /&gt;
 '''fusion-utils-xlsx''' - reading/writing Excel workbooks related utility classes&lt;br /&gt;
&lt;br /&gt;
== Java Packages ==&lt;br /&gt;
Each module is partitioned into Java packages, with the exception of the utility modules, which typically seperate code by its function. &lt;br /&gt;
&lt;br /&gt;
The generic packages are as follows.&lt;br /&gt;
&lt;br /&gt;
 '''api''' - contains interfaces relevent to the module &lt;br /&gt;
 '''constant''' - contains Java enums and java classes that contain public static constants&lt;br /&gt;
 '''engine''' - classes that 'do the work', many are stateless singletons, there are also stateful for example DataReader/WriterEngine &lt;br /&gt;
 '''factory''' - singleton classes that are responisble for generating an engine, typically called by a manager class, factories enable new features to be plugged into the framework&lt;br /&gt;
 '''filter'''  - REST web service filters (defined in web.xml) - filters are called before the web service&lt;br /&gt;
 '''manager''' - the main entry point for all high level functions, the manager's job is to veryify the request (i.e. a security check) and manage the process of fulfiliing the request by delegating the work to an engine or a DAO, a manager should be a fairly thin layer&lt;br /&gt;
 '''model''' - data transfer objects &lt;br /&gt;
 '''service''' (or rest) - web service entry points&lt;br /&gt;
 '''util''' - utility classes, typically containing public static methods&lt;br /&gt;
&lt;br /&gt;
The general logical flow of a system is the following&lt;br /&gt;
&lt;br /&gt;
 service --&amp;gt; manager --&amp;gt; engine&lt;br /&gt;
                     --&amp;gt; dao&lt;br /&gt;
&lt;br /&gt;
The service (web service entry point) is a thin layer which collects the request arguments, with miniumal manipulation, and passes them to the respective Service Interface. The implementation of this Service Interface will create an apporpriate model object (or objects) which contain a consolidated collection of arguements, some validation of arguments can be performed at this point, and then pass these to the manager Interface.  The manager will ensure the arguments are valid and the user has permission to perform the action.  The manager then provides the workflow required to fulfil the task, by makking calls to engines, daos.&lt;br /&gt;
&lt;br /&gt;
= High Level Design =&lt;br /&gt;
&lt;br /&gt;
==[https://en.wikipedia.org/wiki/Inversion_of_control Inversion of Control] (IoC)==&lt;br /&gt;
&lt;br /&gt;
IoC is achieved by assigning all implementation classes to Interfaces.  Each&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7077</id>
		<title>DRAFT SDMX-CORE</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7077"/>
		<updated>2023-07-24T12:31:07Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Java Packages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectire =&lt;br /&gt;
== Modules ==&lt;br /&gt;
The sdmx-io modules are as follows&lt;br /&gt;
===Interface Modules===&lt;br /&gt;
These modules contains Java Interfaces only, no Java classes.  The sdmx-io framework uses Interfaces over implementation classes in order to achieve loose coupling.&lt;br /&gt;
&lt;br /&gt;
 '''fusion-api'''  - contains generic Interfaces that are unrelated to SDMX. Each package in this project is broken down by function, i.e audit, cache, date, email, exception&lt;br /&gt;
 '''fusion-api-dao''' - contains Interface definitions for database persistence, not coupled to database platform, but all based on storeage and retrieval of Java Objects&lt;br /&gt;
 '''fusion-api-sdmx''' - contains Interfaces for SDMX Information model (SdmxBeans and related), high level Interfaces for SDMX related functions which cross mulitple modules&lt;br /&gt;
 '''fusion-api-service''' - contains Interfaces definitions for web services to use - allowing projects the implement web service entry points to not require web service depdenancies&lt;br /&gt;
&lt;br /&gt;
===Implementation Modules===&lt;br /&gt;
These modules contain Java classes which are core to SDMX, they implement Interfaces in the higher api modules&lt;br /&gt;
 '''fusion-sdmx-im''' - contains the implementation code for the SDMX Information Model (SdmxBeans and related structures such as Codelists, Concepts, etc)&lt;br /&gt;
 '''fusion-core-data''' - contains code to read/write data and generic data related features such as determining series/obs, validation, temporary data stores&lt;br /&gt;
 '''fusion-core-sdmx''' - contains core code for structural metadata, including temporary store, cross reference resolution, contains some data and reference metadata features &lt;br /&gt;
 '''fusion-core-structure''' - contains core code for processing structural metadata &lt;br /&gt;
 '''fusion-core-xlsx''' - contains code to read and write structures and data in Excel &lt;br /&gt;
&lt;br /&gt;
===Format Modules===&lt;br /&gt;
These modules contains Java classes for reading and writing SDMX Structureal Metadata, Reference Metadata, and Data&lt;br /&gt;
&lt;br /&gt;
 '''fusion-sdmx-csv''' - reading and writing SDMX-CSV format&lt;br /&gt;
 '''fusion-sdmx-edi''' - reading and writing SDMX-EDI format&lt;br /&gt;
 '''fusion-sdmx-json''' - reading and writing SDMX-JSON format&lt;br /&gt;
 '''fusion-sdmx-ml''' reading and writing SDMX-XML&lt;br /&gt;
&lt;br /&gt;
===Feature Modules===&lt;br /&gt;
These modules provide feature specific code&lt;br /&gt;
 '''fusion-core-dao''' - contains generic DAO implementations for storing and querying for objects, not coupled to a specific object store, but we use hibernate, mongodb is also an option&lt;br /&gt;
 '''fusion-audit''' - audit events and centralised error handling&lt;br /&gt;
 '''fusion-sdmx-kafka''' - connecting to and sending/recieving messages to Apache Kafka&lt;br /&gt;
 '''fusion-sdmx-publication''' - SDMX Publication Tables: SdmxBean implementations, and buisness logic to materilise table based on definition&lt;br /&gt;
 '''fusion-sdmx-reporttemplate''' - Reporting Templates: SdmxBean implementations, and buisness logic to genearte excel workbook from template definition, reading data from workbooks&lt;br /&gt;
 '''fusion-sdmx-rest''' - SDMX web services, and additional web service implementations from APIs defined in fusion-api-service&lt;br /&gt;
 '''fusion-sdmx-search''' - Lucene search engine for structures&lt;br /&gt;
 '''fusion-sdmx-security''' - authentication against LDAP/AD/Fusion Security - contains user definition (SecurityDetailsImpl)&lt;br /&gt;
 '''fusion-xl''' - exposes web services required by the FusionXL Excel Pluin&lt;br /&gt;
&lt;br /&gt;
===Utility Modules===&lt;br /&gt;
Utility classes, typically public static classes, the utils projects may organise code by function rather then using the generic packaging structure (api, engine, manager, model, ...)&lt;br /&gt;
 '''fusion-utils''' - generic utility classes, not specific to SDMX&lt;br /&gt;
 '''fusion-utils-hibernate''' - implementation code to use Hibernate as a means to connect to the DAO&lt;br /&gt;
 '''fusion-utils-http''' - calling HTTP web services&lt;br /&gt;
 '''fusion-utils-json''' - JSON related utility classes&lt;br /&gt;
 '''fusion-utils-mail''' - email utiliity classes&lt;br /&gt;
 '''fusion-utils-mongodb'''  - implementation code to use MongoDB a means to store Objects&lt;br /&gt;
 '''fusion-utils-sdmx''' - SDMX Specific utilty classes&lt;br /&gt;
 '''fusion-utils-spring''' - spring related utility classes&lt;br /&gt;
 '''fusion-utils-xlsx''' - reading/writing Excel workbooks related utility classes&lt;br /&gt;
&lt;br /&gt;
== Java Packages ==&lt;br /&gt;
Each module is partitioned into Java packages, with the exception of the utility modules, which typically seperate code by its function. &lt;br /&gt;
&lt;br /&gt;
The generic packages are as follows.&lt;br /&gt;
&lt;br /&gt;
 '''api''' - contains interfaces relevent to the module &lt;br /&gt;
 '''constant''' - contains Java enums and java classes that contain public static constants&lt;br /&gt;
 '''engine''' - classes that 'do the work', many are stateless singletons, there are also stateful for example DataReader/WriterEngine &lt;br /&gt;
 '''factory''' - singleton classes that are responisble for generating an engine, typically called by a manager class, factories enable new features to be plugged into the framework&lt;br /&gt;
 '''filter'''  - REST web service filters (defined in web.xml) - filters are called before the web service&lt;br /&gt;
 '''manager''' - the main entry point for all high level functions, the manager's job is to veryify the request (i.e. a security check) and manage the process of fulfiliing the request by delegating the work to an engine or a DAO, a manager should be a fairly thin layer&lt;br /&gt;
 '''model''' - data transfer objects &lt;br /&gt;
 '''service''' (or rest) - web service entry points&lt;br /&gt;
 '''util''' - utility classes, typically containing public static methods&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7076</id>
		<title>DRAFT SDMX-CORE</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7076"/>
		<updated>2023-07-24T12:30:49Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Interface Modules */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectire =&lt;br /&gt;
== Modules ==&lt;br /&gt;
The sdmx-io modules are as follows&lt;br /&gt;
===Interface Modules===&lt;br /&gt;
These modules contains Java Interfaces only, no Java classes.  The sdmx-io framework uses Interfaces over implementation classes in order to achieve loose coupling.&lt;br /&gt;
&lt;br /&gt;
 '''fusion-api'''  - contains generic Interfaces that are unrelated to SDMX. Each package in this project is broken down by function, i.e audit, cache, date, email, exception&lt;br /&gt;
 '''fusion-api-dao''' - contains Interface definitions for database persistence, not coupled to database platform, but all based on storeage and retrieval of Java Objects&lt;br /&gt;
 '''fusion-api-sdmx''' - contains Interfaces for SDMX Information model (SdmxBeans and related), high level Interfaces for SDMX related functions which cross mulitple modules&lt;br /&gt;
 '''fusion-api-service''' - contains Interfaces definitions for web services to use - allowing projects the implement web service entry points to not require web service depdenancies&lt;br /&gt;
&lt;br /&gt;
===Implementation Modules===&lt;br /&gt;
These modules contain Java classes which are core to SDMX, they implement Interfaces in the higher api modules&lt;br /&gt;
 '''fusion-sdmx-im''' - contains the implementation code for the SDMX Information Model (SdmxBeans and related structures such as Codelists, Concepts, etc)&lt;br /&gt;
 '''fusion-core-data''' - contains code to read/write data and generic data related features such as determining series/obs, validation, temporary data stores&lt;br /&gt;
 '''fusion-core-sdmx''' - contains core code for structural metadata, including temporary store, cross reference resolution, contains some data and reference metadata features &lt;br /&gt;
 '''fusion-core-structure''' - contains core code for processing structural metadata &lt;br /&gt;
 '''fusion-core-xlsx''' - contains code to read and write structures and data in Excel &lt;br /&gt;
&lt;br /&gt;
===Format Modules===&lt;br /&gt;
These modules contains Java classes for reading and writing SDMX Structureal Metadata, Reference Metadata, and Data&lt;br /&gt;
&lt;br /&gt;
 '''fusion-sdmx-csv''' - reading and writing SDMX-CSV format&lt;br /&gt;
 '''fusion-sdmx-edi''' - reading and writing SDMX-EDI format&lt;br /&gt;
 '''fusion-sdmx-json''' - reading and writing SDMX-JSON format&lt;br /&gt;
 '''fusion-sdmx-ml''' reading and writing SDMX-XML&lt;br /&gt;
&lt;br /&gt;
===Feature Modules===&lt;br /&gt;
These modules provide feature specific code&lt;br /&gt;
 '''fusion-core-dao''' - contains generic DAO implementations for storing and querying for objects, not coupled to a specific object store, but we use hibernate, mongodb is also an option&lt;br /&gt;
 '''fusion-audit''' - audit events and centralised error handling&lt;br /&gt;
 '''fusion-sdmx-kafka''' - connecting to and sending/recieving messages to Apache Kafka&lt;br /&gt;
 '''fusion-sdmx-publication''' - SDMX Publication Tables: SdmxBean implementations, and buisness logic to materilise table based on definition&lt;br /&gt;
 '''fusion-sdmx-reporttemplate''' - Reporting Templates: SdmxBean implementations, and buisness logic to genearte excel workbook from template definition, reading data from workbooks&lt;br /&gt;
 '''fusion-sdmx-rest''' - SDMX web services, and additional web service implementations from APIs defined in fusion-api-service&lt;br /&gt;
 '''fusion-sdmx-search''' - Lucene search engine for structures&lt;br /&gt;
 '''fusion-sdmx-security''' - authentication against LDAP/AD/Fusion Security - contains user definition (SecurityDetailsImpl)&lt;br /&gt;
 '''fusion-xl''' - exposes web services required by the FusionXL Excel Pluin&lt;br /&gt;
&lt;br /&gt;
===Utility Modules===&lt;br /&gt;
Utility classes, typically public static classes, the utils projects may organise code by function rather then using the generic packaging structure (api, engine, manager, model, ...)&lt;br /&gt;
 '''fusion-utils''' - generic utility classes, not specific to SDMX&lt;br /&gt;
 '''fusion-utils-hibernate''' - implementation code to use Hibernate as a means to connect to the DAO&lt;br /&gt;
 '''fusion-utils-http''' - calling HTTP web services&lt;br /&gt;
 '''fusion-utils-json''' - JSON related utility classes&lt;br /&gt;
 '''fusion-utils-mail''' - email utiliity classes&lt;br /&gt;
 '''fusion-utils-mongodb'''  - implementation code to use MongoDB a means to store Objects&lt;br /&gt;
 '''fusion-utils-sdmx''' - SDMX Specific utilty classes&lt;br /&gt;
 '''fusion-utils-spring''' - spring related utility classes&lt;br /&gt;
 '''fusion-utils-xlsx''' - reading/writing Excel workbooks related utility classes&lt;br /&gt;
&lt;br /&gt;
== Java Packages ==&lt;br /&gt;
Each module is partitioned into Java packages, with the exception of the utility modules, which typically seperate code by its function. &lt;br /&gt;
&lt;br /&gt;
The generic packages as as follows.&lt;br /&gt;
&lt;br /&gt;
 '''api''' - contains interfaces relevent to the module &lt;br /&gt;
 '''constant''' - contains Java enums and java classes that contain public static constants&lt;br /&gt;
 '''engine''' - classes that 'do the work', many are stateless singletons, there are also stateful for example DataReader/WriterEngine &lt;br /&gt;
 '''factory''' - singleton classes that are responisble for generating an engine, typically called by a manager class, factories enable new features to be plugged into the framework&lt;br /&gt;
 '''filter'''  - REST web service filters (defined in web.xml) - filters are called before the web service&lt;br /&gt;
 '''manager''' - the main entry point for all high level functions, the manager's job is to veryify the request (i.e. a security check) and manage the process of fulfiliing the request by delegating the work to an engine or a DAO, a manager should be a fairly thin layer&lt;br /&gt;
 '''model''' - data transfer objects &lt;br /&gt;
 '''service''' (or rest) - web service entry points&lt;br /&gt;
 '''util''' - utility classes, typically containing public static methods&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7075</id>
		<title>DRAFT SDMX-CORE</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7075"/>
		<updated>2023-07-24T12:30:35Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Modules */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectire =&lt;br /&gt;
== Modules ==&lt;br /&gt;
The sdmx-io modules are as follows&lt;br /&gt;
===Interface Modules===&lt;br /&gt;
These modules contains Java Interfaces only, no Java classes.  The sdmx-io framework uses Interfaces over implementation classes in order to achieve loose coupling.&lt;br /&gt;
&lt;br /&gt;
 '''fusion-api'''  - contains generic Interfaces that are unrelated to SDMX. Each package in this project is broken down by function, i.e audit, cache, date, email, exception&lt;br /&gt;
 '''fusion-api-dao''' - contains Interface definitions for database persistence, not coupled to database platform, but all based on storeage and retrieval of Java Objects&lt;br /&gt;
 '''fusion-api-sdmx''' - contains Interfaces for SDMX Information model (SdmxBeans and related), high level Interfaces for SDMX related functions which cross mulitple modules&lt;br /&gt;
 '''fusion-api-service''' - contains Interfaces definitions for web services to use - allowing projects the implement web service entry points to not require web service depdenancies&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Implementation Modules&amp;lt;/u&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
These modules contain Java classes which are core to SDMX, they implement Interfaces in the higher api modules&lt;br /&gt;
 '''fusion-sdmx-im''' - contains the implementation code for the SDMX Information Model (SdmxBeans and related structures such as Codelists, Concepts, etc)&lt;br /&gt;
 '''fusion-core-data''' - contains code to read/write data and generic data related features such as determining series/obs, validation, temporary data stores&lt;br /&gt;
 '''fusion-core-sdmx''' - contains core code for structural metadata, including temporary store, cross reference resolution, contains some data and reference metadata features &lt;br /&gt;
 '''fusion-core-structure''' - contains core code for processing structural metadata &lt;br /&gt;
 '''fusion-core-xlsx''' - contains code to read and write structures and data in Excel &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Format Modules&amp;lt;/u&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
These modules contains Java classes for reading and writing SDMX Structureal Metadata, Reference Metadata, and Data&lt;br /&gt;
&lt;br /&gt;
 '''fusion-sdmx-csv''' - reading and writing SDMX-CSV format&lt;br /&gt;
 '''fusion-sdmx-edi''' - reading and writing SDMX-EDI format&lt;br /&gt;
 '''fusion-sdmx-json''' - reading and writing SDMX-JSON format&lt;br /&gt;
 '''fusion-sdmx-ml''' reading and writing SDMX-XML &lt;br /&gt;
&lt;br /&gt;
===Feature Modules===&lt;br /&gt;
These modules provide feature specific code&lt;br /&gt;
 '''fusion-core-dao''' - contains generic DAO implementations for storing and querying for objects, not coupled to a specific object store, but we use hibernate, mongodb is also an option&lt;br /&gt;
 '''fusion-audit''' - audit events and centralised error handling&lt;br /&gt;
 '''fusion-sdmx-kafka''' - connecting to and sending/recieving messages to Apache Kafka&lt;br /&gt;
 '''fusion-sdmx-publication''' - SDMX Publication Tables: SdmxBean implementations, and buisness logic to materilise table based on definition&lt;br /&gt;
 '''fusion-sdmx-reporttemplate''' - Reporting Templates: SdmxBean implementations, and buisness logic to genearte excel workbook from template definition, reading data from workbooks&lt;br /&gt;
 '''fusion-sdmx-rest''' - SDMX web services, and additional web service implementations from APIs defined in fusion-api-service&lt;br /&gt;
 '''fusion-sdmx-search''' - Lucene search engine for structures&lt;br /&gt;
 '''fusion-sdmx-security''' - authentication against LDAP/AD/Fusion Security - contains user definition (SecurityDetailsImpl)&lt;br /&gt;
 '''fusion-xl''' - exposes web services required by the FusionXL Excel Pluin&lt;br /&gt;
&lt;br /&gt;
===Utility Modules===&lt;br /&gt;
Utility classes, typically public static classes, the utils projects may organise code by function rather then using the generic packaging structure (api, engine, manager, model, ...)&lt;br /&gt;
 '''fusion-utils''' - generic utility classes, not specific to SDMX&lt;br /&gt;
 '''fusion-utils-hibernate''' - implementation code to use Hibernate as a means to connect to the DAO&lt;br /&gt;
 '''fusion-utils-http''' - calling HTTP web services&lt;br /&gt;
 '''fusion-utils-json''' - JSON related utility classes&lt;br /&gt;
 '''fusion-utils-mail''' - email utiliity classes&lt;br /&gt;
 '''fusion-utils-mongodb'''  - implementation code to use MongoDB a means to store Objects&lt;br /&gt;
 '''fusion-utils-sdmx''' - SDMX Specific utilty classes&lt;br /&gt;
 '''fusion-utils-spring''' - spring related utility classes&lt;br /&gt;
 '''fusion-utils-xlsx''' - reading/writing Excel workbooks related utility classes&lt;br /&gt;
&lt;br /&gt;
== Java Packages ==&lt;br /&gt;
Each module is partitioned into Java packages, with the exception of the utility modules, which typically seperate code by its function. &lt;br /&gt;
&lt;br /&gt;
The generic packages as as follows.&lt;br /&gt;
&lt;br /&gt;
 '''api''' - contains interfaces relevent to the module &lt;br /&gt;
 '''constant''' - contains Java enums and java classes that contain public static constants&lt;br /&gt;
 '''engine''' - classes that 'do the work', many are stateless singletons, there are also stateful for example DataReader/WriterEngine &lt;br /&gt;
 '''factory''' - singleton classes that are responisble for generating an engine, typically called by a manager class, factories enable new features to be plugged into the framework&lt;br /&gt;
 '''filter'''  - REST web service filters (defined in web.xml) - filters are called before the web service&lt;br /&gt;
 '''manager''' - the main entry point for all high level functions, the manager's job is to veryify the request (i.e. a security check) and manage the process of fulfiliing the request by delegating the work to an engine or a DAO, a manager should be a fairly thin layer&lt;br /&gt;
 '''model''' - data transfer objects &lt;br /&gt;
 '''service''' (or rest) - web service entry points&lt;br /&gt;
 '''util''' - utility classes, typically containing public static methods&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7074</id>
		<title>DRAFT SDMX-CORE</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7074"/>
		<updated>2023-07-24T12:29:59Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Packages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectire =&lt;br /&gt;
== Modules ==&lt;br /&gt;
The sdmx-io modules are as follows&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Interface Modules&amp;lt;/u&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
These modules contains Java Interfaces only, no Java classes.  The sdmx-io framework uses Interfaces over implementation classes in order to achieve loose coupling.&lt;br /&gt;
&lt;br /&gt;
 '''fusion-api'''  - contains generic Interfaces that are unrelated to SDMX. Each package in this project is broken down by function, i.e audit, cache, date, email, exception&lt;br /&gt;
 '''fusion-api-dao''' - contains Interface definitions for database persistence, not coupled to database platform, but all based on storeage and retrieval of Java Objects&lt;br /&gt;
 '''fusion-api-sdmx''' - contains Interfaces for SDMX Information model (SdmxBeans and related), high level Interfaces for SDMX related functions which cross mulitple modules&lt;br /&gt;
 '''fusion-api-service''' - contains Interfaces definitions for web services to use - allowing projects the implement web service entry points to not require web service depdenancies&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Implementation Modules&amp;lt;/u&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
These modules contain Java classes which are core to SDMX, they implement Interfaces in the higher api modules&lt;br /&gt;
 '''fusion-sdmx-im''' - contains the implementation code for the SDMX Information Model (SdmxBeans and related structures such as Codelists, Concepts, etc)&lt;br /&gt;
 '''fusion-core-data''' - contains code to read/write data and generic data related features such as determining series/obs, validation, temporary data stores&lt;br /&gt;
 '''fusion-core-sdmx''' - contains core code for structural metadata, including temporary store, cross reference resolution, contains some data and reference metadata features &lt;br /&gt;
 '''fusion-core-structure''' - contains core code for processing structural metadata &lt;br /&gt;
 '''fusion-core-xlsx''' - contains code to read and write structures and data in Excel &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Format Modules&amp;lt;/u&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
These modules contains Java classes for reading and writing SDMX Structureal Metadata, Reference Metadata, and Data&lt;br /&gt;
&lt;br /&gt;
 '''fusion-sdmx-csv''' - reading and writing SDMX-CSV format&lt;br /&gt;
 '''fusion-sdmx-edi''' - reading and writing SDMX-EDI format&lt;br /&gt;
 '''fusion-sdmx-json''' - reading and writing SDMX-JSON format&lt;br /&gt;
 '''fusion-sdmx-ml''' reading and writing SDMX-XML &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Feature Modules&amp;lt;/u&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
These modules provide feature specific code&lt;br /&gt;
 '''fusion-core-dao''' - contains generic DAO implementations for storing and querying for objects, not coupled to a specific object store, but we use hibernate, mongodb is also an option&lt;br /&gt;
 '''fusion-audit''' - audit events and centralised error handling&lt;br /&gt;
 '''fusion-sdmx-kafka''' - connecting to and sending/recieving messages to Apache Kafka&lt;br /&gt;
 '''fusion-sdmx-publication''' - SDMX Publication Tables: SdmxBean implementations, and buisness logic to materilise table based on definition&lt;br /&gt;
 '''fusion-sdmx-reporttemplate''' - Reporting Templates: SdmxBean implementations, and buisness logic to genearte excel workbook from template definition, reading data from workbooks&lt;br /&gt;
 '''fusion-sdmx-rest''' - SDMX web services, and additional web service implementations from APIs defined in fusion-api-service&lt;br /&gt;
 '''fusion-sdmx-search''' - Lucene search engine for structures&lt;br /&gt;
 '''fusion-sdmx-security''' - authentication against LDAP/AD/Fusion Security - contains user definition (SecurityDetailsImpl)&lt;br /&gt;
 '''fusion-xl''' - exposes web services required by the FusionXL Excel Pluin&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Utility Modules&amp;lt;/u&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Utility classes, typically public static classes, the utils projects may organise code by function rather then using the generic packaging structure (api, engine, manager, model, ...)&lt;br /&gt;
 '''fusion-utils''' - generic utility classes, not specific to SDMX&lt;br /&gt;
 '''fusion-utils-hibernate''' - implementation code to use Hibernate as a means to connect to the DAO&lt;br /&gt;
 '''fusion-utils-http''' - calling HTTP web services&lt;br /&gt;
 '''fusion-utils-json''' - JSON related utility classes&lt;br /&gt;
 '''fusion-utils-mail''' - email utiliity classes&lt;br /&gt;
 '''fusion-utils-mongodb'''  - implementation code to use MongoDB a means to store Objects&lt;br /&gt;
 '''fusion-utils-sdmx''' - SDMX Specific utilty classes&lt;br /&gt;
 '''fusion-utils-spring''' - spring related utility classes&lt;br /&gt;
 '''fusion-utils-xlsx''' - reading/writing Excel workbooks related utility classes&lt;br /&gt;
&lt;br /&gt;
== Java Packages ==&lt;br /&gt;
Each module is partitioned into Java packages, with the exception of the utility modules, which typically seperate code by its function. &lt;br /&gt;
&lt;br /&gt;
The generic packages as as follows.&lt;br /&gt;
&lt;br /&gt;
 '''api''' - contains interfaces relevent to the module &lt;br /&gt;
 '''constant''' - contains Java enums and java classes that contain public static constants&lt;br /&gt;
 '''engine''' - classes that 'do the work', many are stateless singletons, there are also stateful for example DataReader/WriterEngine &lt;br /&gt;
 '''factory''' - singleton classes that are responisble for generating an engine, typically called by a manager class, factories enable new features to be plugged into the framework&lt;br /&gt;
 '''filter'''  - REST web service filters (defined in web.xml) - filters are called before the web service&lt;br /&gt;
 '''manager''' - the main entry point for all high level functions, the manager's job is to veryify the request (i.e. a security check) and manage the process of fulfiliing the request by delegating the work to an engine or a DAO, a manager should be a fairly thin layer&lt;br /&gt;
 '''model''' - data transfer objects &lt;br /&gt;
 '''service''' (or rest) - web service entry points&lt;br /&gt;
 '''util''' - utility classes, typically containing public static methods&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7073</id>
		<title>DRAFT SDMX-CORE</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7073"/>
		<updated>2023-07-24T10:09:15Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Architectire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectire =&lt;br /&gt;
== Modules ==&lt;br /&gt;
The sdmx-io modules are as follows&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Interface Modules&amp;lt;/u&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
These modules contains Java Interfaces only, no Java classes.  The sdmx-io framework uses Interfaces over implementation classes in order to achieve loose coupling.&lt;br /&gt;
&lt;br /&gt;
 '''fusion-api'''  - contains generic Interfaces that are unrelated to SDMX. Each package in this project is broken down by function, i.e audit, cache, date, email, exception&lt;br /&gt;
 '''fusion-api-dao''' - contains Interface definitions for database persistence, not coupled to database platform, but all based on storeage and retrieval of Java Objects&lt;br /&gt;
 '''fusion-api-sdmx''' - contains Interfaces for SDMX Information model (SdmxBeans and related), high level Interfaces for SDMX related functions which cross mulitple modules&lt;br /&gt;
 '''fusion-api-service''' - contains Interfaces definitions for web services to use - allowing projects the implement web service entry points to not require web service depdenancies&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Implementation Modules&amp;lt;/u&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
These modules contain Java classes which are core to SDMX, they implement Interfaces in the higher api modules&lt;br /&gt;
 '''fusion-sdmx-im''' - contains the implementation code for the SDMX Information Model (SdmxBeans and related structures such as Codelists, Concepts, etc)&lt;br /&gt;
 '''fusion-core-data''' - contains code to read/write data and generic data related features such as determining series/obs, validation, temporary data stores&lt;br /&gt;
 '''fusion-core-sdmx''' - contains core code for structural metadata, including temporary store, cross reference resolution, contains some data and reference metadata features &lt;br /&gt;
 '''fusion-core-structure''' - contains core code for processing structural metadata &lt;br /&gt;
 '''fusion-core-xlsx''' - contains code to read and write structures and data in Excel &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Format Modules&amp;lt;/u&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
These modules contains Java classes for reading and writing SDMX Structureal Metadata, Reference Metadata, and Data&lt;br /&gt;
&lt;br /&gt;
 '''fusion-sdmx-csv''' - reading and writing SDMX-CSV format&lt;br /&gt;
 '''fusion-sdmx-edi''' - reading and writing SDMX-EDI format&lt;br /&gt;
 '''fusion-sdmx-json''' - reading and writing SDMX-JSON format&lt;br /&gt;
 '''fusion-sdmx-ml''' reading and writing SDMX-XML &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Feature Modules&amp;lt;/u&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
These modules provide feature specific code&lt;br /&gt;
 '''fusion-core-dao''' - contains generic DAO implementations for storing and querying for objects, not coupled to a specific object store, but we use hibernate, mongodb is also an option&lt;br /&gt;
 '''fusion-audit''' - audit events and centralised error handling&lt;br /&gt;
 '''fusion-sdmx-kafka''' - connecting to and sending/recieving messages to Apache Kafka&lt;br /&gt;
 '''fusion-sdmx-publication''' - SDMX Publication Tables: SdmxBean implementations, and buisness logic to materilise table based on definition&lt;br /&gt;
 '''fusion-sdmx-reporttemplate''' - Reporting Templates: SdmxBean implementations, and buisness logic to genearte excel workbook from template definition, reading data from workbooks&lt;br /&gt;
 '''fusion-sdmx-rest''' - SDMX web services, and additional web service implementations from APIs defined in fusion-api-service&lt;br /&gt;
 '''fusion-sdmx-search''' - Lucene search engine for structures&lt;br /&gt;
 '''fusion-sdmx-security''' - authentication against LDAP/AD/Fusion Security - contains user definition (SecurityDetailsImpl)&lt;br /&gt;
 '''fusion-xl''' - exposes web services required by the FusionXL Excel Pluin&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Utility Modules&amp;lt;/u&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Utility classes, typically public static classes, the utils projects may organise code by function rather then using the generic packaging structure (api, engine, manager, model, ...)&lt;br /&gt;
 '''fusion-utils''' - generic utility classes, not specific to SDMX&lt;br /&gt;
 '''fusion-utils-hibernate''' - implementation code to use Hibernate as a means to connect to the DAO&lt;br /&gt;
 '''fusion-utils-http''' - calling HTTP web services&lt;br /&gt;
 '''fusion-utils-json''' - JSON related utility classes&lt;br /&gt;
 '''fusion-utils-mail''' - email utiliity classes&lt;br /&gt;
 '''fusion-utils-mongodb'''  - implementation code to use MongoDB a means to store Objects&lt;br /&gt;
 '''fusion-utils-sdmx''' - SDMX Specific utilty classes&lt;br /&gt;
 '''fusion-utils-spring''' - spring related utility classes&lt;br /&gt;
 '''fusion-utils-xlsx''' - reading/writing Excel workbooks related utility classes&lt;br /&gt;
&lt;br /&gt;
== Packages ==&lt;br /&gt;
&lt;br /&gt;
The packages are generally split into the following&lt;br /&gt;
 '''api''' - contains interfaces relevent to the module &lt;br /&gt;
 '''constant''' &lt;br /&gt;
 '''engine'''&lt;br /&gt;
 '''factory'''&lt;br /&gt;
 '''filter''' &lt;br /&gt;
 '''manager'''&lt;br /&gt;
 '''model'''&lt;br /&gt;
 '''service''' (or rest)&lt;br /&gt;
 '''util'''&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sdmx Core makes heavy use of Interfaces as opposed to Implementation code, this allows classes to work to interfaces without needing to concern themselves about the actual implementation used.&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7072</id>
		<title>DRAFT SDMX-CORE</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7072"/>
		<updated>2023-07-24T10:08:41Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Architectire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectire =&lt;br /&gt;
The sdmx-io modules are as follows&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Interface Modules&amp;lt;/u&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
These modules contains Java Interfaces only, no Java classes.  The sdmx-io framework uses Interfaces over implementation classes in order to achieve loose coupling.&lt;br /&gt;
&lt;br /&gt;
 '''fusion-api'''  - contains generic Interfaces that are unrelated to SDMX. Each package in this project is broken down by function, i.e audit, cache, date, email, exception&lt;br /&gt;
 '''fusion-api-dao''' - contains Interface definitions for database persistence, not coupled to database platform, but all based on storeage and retrieval of Java Objects&lt;br /&gt;
 '''fusion-api-sdmx''' - contains Interfaces for SDMX Information model (SdmxBeans and related), high level Interfaces for SDMX related functions which cross mulitple modules&lt;br /&gt;
 '''fusion-api-service''' - contains Interfaces definitions for web services to use - allowing projects the implement web service entry points to not require web service depdenancies&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Implementation Modules&amp;lt;/u&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
These modules contain Java classes which are core to SDMX, they implement Interfaces in the higher api modules&lt;br /&gt;
 '''fusion-sdmx-im''' - contains the implementation code for the SDMX Information Model (SdmxBeans and related structures such as Codelists, Concepts, etc)&lt;br /&gt;
 '''fusion-core-data''' - contains code to read/write data and generic data related features such as determining series/obs, validation, temporary data stores&lt;br /&gt;
 '''fusion-core-sdmx''' - contains core code for structural metadata, including temporary store, cross reference resolution, contains some data and reference metadata features &lt;br /&gt;
 '''fusion-core-structure''' - contains core code for processing structural metadata &lt;br /&gt;
 '''fusion-core-xlsx''' - contains code to read and write structures and data in Excel &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Format Modules&amp;lt;/u&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
These modules contains Java classes for reading and writing SDMX Structureal Metadata, Reference Metadata, and Data&lt;br /&gt;
&lt;br /&gt;
 '''fusion-sdmx-csv''' - reading and writing SDMX-CSV format&lt;br /&gt;
 '''fusion-sdmx-edi''' - reading and writing SDMX-EDI format&lt;br /&gt;
 '''fusion-sdmx-json''' - reading and writing SDMX-JSON format&lt;br /&gt;
 '''fusion-sdmx-ml''' reading and writing SDMX-XML &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Feature Modules&amp;lt;/u&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
These modules provide feature specific code&lt;br /&gt;
 '''fusion-core-dao''' - contains generic DAO implementations for storing and querying for objects, not coupled to a specific object store, but we use hibernate, mongodb is also an option&lt;br /&gt;
 '''fusion-audit''' - audit events and centralised error handling&lt;br /&gt;
 '''fusion-sdmx-kafka''' - connecting to and sending/recieving messages to Apache Kafka&lt;br /&gt;
 '''fusion-sdmx-publication''' - SDMX Publication Tables: SdmxBean implementations, and buisness logic to materilise table based on definition&lt;br /&gt;
 '''fusion-sdmx-reporttemplate''' - Reporting Templates: SdmxBean implementations, and buisness logic to genearte excel workbook from template definition, reading data from workbooks&lt;br /&gt;
 '''fusion-sdmx-rest''' - SDMX web services, and additional web service implementations from APIs defined in fusion-api-service&lt;br /&gt;
 '''fusion-sdmx-search''' - Lucene search engine for structures&lt;br /&gt;
 '''fusion-sdmx-security''' - authentication against LDAP/AD/Fusion Security - contains user definition (SecurityDetailsImpl)&lt;br /&gt;
 '''fusion-xl''' - exposes web services required by the FusionXL Excel Pluin&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Utility Modules&amp;lt;/u&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Utility classes, typically public static classes, the utils projects may organise code by function rather then using the generic packaging structure (api, engine, manager, model, ...)&lt;br /&gt;
 '''fusion-utils''' - generic utility classes, not specific to SDMX&lt;br /&gt;
 '''fusion-utils-hibernate''' - implementation code to use Hibernate as a means to connect to the DAO&lt;br /&gt;
 '''fusion-utils-http''' - calling HTTP web services&lt;br /&gt;
 '''fusion-utils-json''' - JSON related utility classes&lt;br /&gt;
 '''fusion-utils-mail''' - email utiliity classes&lt;br /&gt;
 '''fusion-utils-mongodb'''  - implementation code to use MongoDB a means to store Objects&lt;br /&gt;
 '''fusion-utils-sdmx''' - SDMX Specific utilty classes&lt;br /&gt;
 '''fusion-utils-spring''' - spring related utility classes&lt;br /&gt;
 '''fusion-utils-xlsx''' - reading/writing Excel workbooks related utility classes&lt;br /&gt;
&lt;br /&gt;
The packages are generally split into the following&lt;br /&gt;
 '''api''' - contains interfaces relevent to the module &lt;br /&gt;
 '''constant''' &lt;br /&gt;
 '''engine'''&lt;br /&gt;
 '''factory'''&lt;br /&gt;
 '''filter''' &lt;br /&gt;
 '''manager'''&lt;br /&gt;
 '''model'''&lt;br /&gt;
 '''service''' (or rest)&lt;br /&gt;
 '''util'''&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sdmx Core makes heavy use of Interfaces as opposed to Implementation code, this allows classes to work to interfaces without needing to concern themselves about the actual implementation used.&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7071</id>
		<title>DRAFT SDMX-CORE</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7071"/>
		<updated>2023-07-24T09:44:01Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Architectire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectire =&lt;br /&gt;
The sdmx-io modules are as follows&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Interface Modules&amp;lt;/u&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
These modules contains Java Interfaces only, no Java classes.  The sdmx-io framework uses Interfaces over implementation classes in order to achieve loose coupling.&lt;br /&gt;
&lt;br /&gt;
 '''fusion-api'''  - contains generic Interfaces that are unrelated to SDMX. Each package in this project is broken down by function, i.e audit, cache, date, email, exception&lt;br /&gt;
 '''fusion-api-dao''' - contains Interface definitions for database persistence, not coupled to database platform, but all based on storeage and retrieval of Java Objects&lt;br /&gt;
 '''fusion-api-sdmx''' - contains Interfaces for SDMX Information model (SdmxBeans and related), high level Interfaces for SDMX related functions which cross mulitple modules&lt;br /&gt;
 '''fusion-api-service''' - contains Interfaces definitions for web services to use - allowing projects the implement web service entry points to not require web service depdenancies&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Implementation Modules&amp;lt;/u&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
These modules contain Java classes which are core to SDMX, they implement Interfaces in the higher api modules&lt;br /&gt;
 '''fusion-sdmx-im''' - contains the implementation code for the SDMX Information Model (SdmxBeans and related structures such as Codelists, Concepts, etc)&lt;br /&gt;
 '''fusion-core-data''' - contains code to read/write data and generic data related features such as determining series/obs, validation, temporary data stores&lt;br /&gt;
 '''fusion-core-sdmx''' - contains core code for structural metadata, including temporary store, cross reference resolution, contains some data and reference metadata features &lt;br /&gt;
 '''fusion-core-structure''' - contains core code for processing structural metadata &lt;br /&gt;
 '''fusion-core-xlsx''' - contains code to read and write structures and data in Excel &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Format Modules&amp;lt;/u&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
These modules contains Java classes for reading and writing SDMX Structureal Metadata, Reference Metadata, and Data&lt;br /&gt;
&lt;br /&gt;
 '''fusion-sdmx-csv''' - reading and writing SDMX-CSV format&lt;br /&gt;
 '''fusion-sdmx-edi''' - reading and writing SDMX-EDI format&lt;br /&gt;
 '''fusion-sdmx-json''' - reading and writing SDMX-JSON format&lt;br /&gt;
 '''fusion-sdmx-ml''' reading and writing SDMX-XML &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Feature Modules&amp;lt;/u&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
These modules provide feature specific code&lt;br /&gt;
 '''fusion-core-dao''' - &lt;br /&gt;
 '''fusion-audit''' - audit events and centralised error handling&lt;br /&gt;
 '''fusion-sdmx-kafka''' - connecting to, and sending/recieving messages to Apache Kafka&lt;br /&gt;
 '''fusion-sdmx-publication''' - SDMX Publication Tables: SdmxBean implementations, and buisness logic to materilise table based on definition&lt;br /&gt;
 '''fusion-sdmx-reporttemplate''' - Reporting Templates: SdmxBean implementations, and buisness logic to genearte excel workbook from template definition, reading data from workbooks&lt;br /&gt;
 '''fusion-sdmx-rest''' - SDMX web services, and additional web service implementations from APIs defined in fusion-api-service&lt;br /&gt;
 '''fusion-sdmx-search''' - Lucene search engine for structures&lt;br /&gt;
 '''fusion-sdmx-security''' - authentication against LDAP/AD/Fusion Security - contains user definition (SecurityDetailsImpl)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Utility Modules&amp;lt;/u&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 '''fusion-utils'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The packages are generally split into the following&lt;br /&gt;
 '''api''' - contains interfaces relevent to the module &lt;br /&gt;
 '''constant'''&lt;br /&gt;
 '''engine'''&lt;br /&gt;
 '''factory'''&lt;br /&gt;
 '''filter''' &lt;br /&gt;
 '''manager'''&lt;br /&gt;
 '''model'''&lt;br /&gt;
 '''service''' (or rest)&lt;br /&gt;
 '''util'''&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sdmx Core makes heavy use of Interfaces as opposed to Implementation code, this allows classes to work to interfaces without needing to concern themselves about the actual implementation used.&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7070</id>
		<title>DRAFT SDMX-CORE</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=DRAFT_SDMX-CORE&amp;diff=7070"/>
		<updated>2023-07-24T09:12:12Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: Created page with &amp;quot;= Architectire = The sdmx-io modules are as follows  &amp;lt;u&amp;gt;Interface Modules&amp;lt;/u&amp;gt;&amp;lt;br/&amp;gt; These modules contains Java Interfaces only, no Java classes.  The sdmx-io framework uses In...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectire =&lt;br /&gt;
The sdmx-io modules are as follows&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Interface Modules&amp;lt;/u&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
These modules contains Java Interfaces only, no Java classes.  The sdmx-io framework uses Interfaces over implementation classes in order to achieve loose coupling.&lt;br /&gt;
&lt;br /&gt;
 '''fusion-api'''  - contains generic Interfaces that are unrelated to SDMX. Each package in this project is broken down by function, i.e audit, cache, date, email, exception&lt;br /&gt;
 '''fusion-api-dao''' - contains Interface definitions for database persistence, not coupled to database platform, but all based on storeage and retrieval of Java Objects&lt;br /&gt;
 '''fusion-api-sdmx''' - contains Interfaces for SDMX Information model (SdmxBeans and related), high level Interfaces for SDMX related functions which cross mulitple modules&lt;br /&gt;
 '''fusion-api-service''' - contains Interfaces definitions for web services to use - allowing projects the implement web service entry points to not require web service depdenancies&lt;br /&gt;
&lt;br /&gt;
 '''fusion-sdmx-im''' - contains the implementation code for the SDMX Information Model (SdmxBeans and related structures such as Codelists, Concepts, etc)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Format Modules&amp;lt;/u&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
These modules contains Java classes for reading and writing SDMX Structureal Metadata, Reference Metadata, and Data&lt;br /&gt;
&lt;br /&gt;
 '''fusion-sdmx-csv''' - reading and writing SDMX-CSV format&lt;br /&gt;
 '''fusion-sdmx-edi''' - reading and writing SDMX-EDI format&lt;br /&gt;
 '''fusion-sdmx-json''' - reading and writing SDMX-JSON format&lt;br /&gt;
 '''fusion-sdmx-ml''' reading and writing SDMX-XML &lt;br /&gt;
&lt;br /&gt;
 '''fusion-core-dao'''&lt;br /&gt;
 '''fusion-core-data'''&lt;br /&gt;
 '''fusion-core-sdmx'''&lt;br /&gt;
 '''fusion-audit'''&lt;br /&gt;
 '''fusion-sdmx-kafka'''&lt;br /&gt;
 '''fusion-sdmx-publication'''&lt;br /&gt;
 '''fusion-sdmx-reporttemplate'''&lt;br /&gt;
 '''fusion-sdmx-rest'''&lt;br /&gt;
 '''fusion-sdmx-search'''&lt;br /&gt;
 '''fusion-sdmx-security'''&lt;br /&gt;
&lt;br /&gt;
'''Utility Classes'''&lt;br /&gt;
 '''fusion-utils'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The packages are generally split into the following&lt;br /&gt;
 '''api''' - contains interfaces relevent to the module &lt;br /&gt;
 '''constant'''&lt;br /&gt;
 '''engine'''&lt;br /&gt;
 '''factory'''&lt;br /&gt;
 '''filter''' &lt;br /&gt;
 '''manager'''&lt;br /&gt;
 '''model'''&lt;br /&gt;
 '''service''' (or rest)&lt;br /&gt;
 '''util'''&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sdmx Core makes heavy use of Interfaces as opposed to Implementation code, this allows classes to work to interfaces without needing to concern themselves about the actual implementation used.&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=FMR_Workbench&amp;diff=6955</id>
		<title>FMR Workbench</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=FMR_Workbench&amp;diff=6955"/>
		<updated>2023-07-17T16:18:40Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Structure Navigation and Export */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
[[File:Fmr wb overview.png|thumb]]&lt;br /&gt;
The '''F'''MR '''W'''ork'''B'''ench (FWB) is a User Interface (UI) for browsing and maintaining SDMX Structures obtained from SDMX compliant Structure Web Services.  The UI of the FWB is a stripped-down version of the Fusion Metadata Registry (FMR) User Interface; it is stripped down because the UI of the FWB supports the use case of viewing and maintaining structural metadata, whilst the FMR supports additional use cases including [[Validate_data|data validation]], [[Convert_data_between_SDMX_formats_V11|data conversion]], and has administrative UI pages.  Whilst the FMR uses a database to store its configuration settings, the FWB configuration is stored in a file.  '''The FWB has no database requirements'''.&lt;br /&gt;
&lt;br /&gt;
The FWB UI browses and displays the SDMX structures of the '''Environment''' it is connected to. An Environment is a connection to a collection of related SDMX web services for a single SDMX service offering. Related web services include the web service entry point to retrieve the structures, the entry point to save structures, and the entry point to delete structures.&lt;br /&gt;
&lt;br /&gt;
The UI of the FWB enables the user to switch their connection to an alternative Environment; the list of available Environments is defined in the configuration file for the FWB.  The connected Environment is associated with the current user; this enables multiple users of the FWB to be connected to different Environments simultaneously.&lt;br /&gt;
&lt;br /&gt;
= Getting Started = &lt;br /&gt;
The FMR Workbench (FWB) is deployed as a Web Application Archive (war) file.  The war file must be deployed to a Java Servlet container such as Apache Tomcat.  The Servlet container will host the application so that it can be accessed over HTTP as a web application.&lt;br /&gt;
&lt;br /&gt;
== Configuration File Location == &lt;br /&gt;
The FMR Workbench does not use a database, instead it obtains its configuration settings from a configuration file called fwb_config.json.&lt;br /&gt;
&lt;br /&gt;
An example configuration file is provided with the software.  The configuration file needs to be placed in the following directory (the directory must be created if it does not exist):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;USER HOME&amp;gt;\MetadataTechnology\FusionRegistry&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 C:\Users\Matthew Nelson\MetadataTechnology\FusionRegistry&lt;br /&gt;
&lt;br /&gt;
== Configuration File Properties ==&lt;br /&gt;
[[File:FWB Environment Selection.png|thumb|Showing the switch environment options]]&lt;br /&gt;
&lt;br /&gt;
The configuration file is split into 2 parts:&lt;br /&gt;
 &lt;br /&gt;
# Server Properties&lt;br /&gt;
# Environment Definitions&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;Properties&amp;quot;: { &amp;lt;span style=&amp;quot;color:#C00000&amp;quot;&amp;gt;server properties go here&amp;lt;/span&amp;gt; },&lt;br /&gt;
    &amp;quot;Environments&amp;quot;: [ &amp;lt;span style=&amp;quot;color:#C00000&amp;quot;&amp;gt;environment definitions go here&amp;lt;/span&amp;gt; ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&amp;lt;br/&amp;gt;&lt;br /&gt;
There is only 1 property which is required for the FWB, this is the URL to the FWB application. This property enables the application to know where to find required resources, and how to redirect users to the correct pages. &lt;br /&gt;
&lt;br /&gt;
 &amp;quot;Properties&amp;quot;: {&lt;br /&gt;
    server.url: &amp;quot;http://localhost:8080/fwb&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Localhost can be used for testing purposes when deploying the application to the same computer that the web browser is run from. For a live deployment this URL must be changed accordingly.&lt;br /&gt;
&lt;br /&gt;
'''Environments'''&amp;lt;br/&amp;gt;&lt;br /&gt;
The Environment property has an array of JSON Objects. Each JSON Object in this array defines a distinct Environment which the FWB can switch to in order to browse and optionally create/maintain the SDMX Structures of that Environment. &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
An Environment consists of an id and a name and defines the web service entry points to retrieve, save, and delete structures. The retrieve web service is required, the save and delete entry points are optional.  &lt;br /&gt;
&lt;br /&gt;
The Environment definition also contains details on the authentication mechanism used to access the contents of the web services.&lt;br /&gt;
&lt;br /&gt;
An example of an Environment definition is given below:&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;DOT_STAT&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot; : &amp;quot;Dot Stat Test&amp;quot;,&lt;br /&gt;
    &amp;quot;api&amp;quot;: {&lt;br /&gt;
        &amp;quot;query&amp;quot;: &amp;quot;https://nsi-demo-reset.siscc.org/rest&amp;quot;,&lt;br /&gt;
        &amp;quot;persist&amp;quot;: &amp;quot;https://nsi-demo-reset.siscc.org/rest/structure&amp;quot;,&lt;br /&gt;
        &amp;quot;delete&amp;quot;: &amp;quot;https://nsi-demo-stable.siscc.org/rest/structure&amp;quot;,&lt;br /&gt;
        &amp;quot;version&amp;quot;: &amp;quot;1.5.0&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;agencies&amp;quot;: [&amp;quot;SDMX&amp;quot;, &amp;quot;METATECH&amp;quot;],&lt;br /&gt;
    &amp;quot;auth&amp;quot;: &amp;quot;OIDC_PKCE&amp;quot;,&lt;br /&gt;
    &amp;quot;locale&amp;quot;: [&amp;quot;en&amp;quot;, &amp;quot;fr&amp;quot;],&lt;br /&gt;
    &amp;quot;oidc&amp;quot;: {&lt;br /&gt;
        &amp;quot;config&amp;quot;: &amp;quot;https://keycloak.siscc.org/auth/realms/OECD/.well-known/openid-configuration&amp;quot;,&lt;br /&gt;
        &amp;quot;clientId&amp;quot;: &amp;quot;app&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;format&amp;quot;: &amp;quot;mlv2.1&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following table describes the properties for an Environment definition based on the above example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Property !! Description&lt;br /&gt;
|-&lt;br /&gt;
| '''id''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; This is the ID of the Environment.  It is used in the REST API to switch environments&lt;br /&gt;
|-&lt;br /&gt;
| '''name''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; The name of the Environment as presented to the user&lt;br /&gt;
|-&lt;br /&gt;
| '''api''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; contains the base SDMX REST URL for each web service of the Environment&lt;br /&gt;
|-&lt;br /&gt;
| '''api.query''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; structure query web service&lt;br /&gt;
|-&lt;br /&gt;
| '''api.persist''' || &amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''Optional'''&amp;lt;/span&amp;gt; to support add/edit functionality.  HTTP POST messages will be sent to this URL&lt;br /&gt;
|-&lt;br /&gt;
| '''api.delete''' || &amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''Optional'''&amp;lt;/span&amp;gt; to support delete functionality, HTTP DELETE messages will be sent to this URL&lt;br /&gt;
|-&lt;br /&gt;
| '''api.version''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; the Version of the SDMX REST API.  Supported values are 1.5.0 and 2.0.0&lt;br /&gt;
|-&lt;br /&gt;
| '''api.timeout''' || &amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''Optional'''&amp;lt;/span&amp;gt; maximum number of seconds to wait for response from API before timing out. Defaults to120 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| '''format''' || The SDMX structure format used when POSTing structures to web service (for the use case of structure persistence).  &amp;lt;br/&amp;gt;&lt;br /&gt;
Options include:&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''mlv2.1'''&amp;lt;/span&amp;gt; – XML format SDMX-ML v.2.1 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''mlv3.0'''&amp;lt;/span&amp;gt; – XML format SDMX-ML v.3.0 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''jsonv1'''&amp;lt;/span&amp;gt; – JSON format SDMX-JSON v.1.0 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''jsonv2'''&amp;lt;/span&amp;gt; – JSON format SDMX-JSON v.2.0 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''fusion'''&amp;lt;/span&amp;gt; – the FMR specific format. This format should be used if connected to another FMR instance as it covers both SDMX structures and non-SDMX structures such as Publication Tables and Reporting Templates &amp;lt;br/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Apache Tomcat Example ==&lt;br /&gt;
[[File:FMR Workbench Home.png|thumb|Showing the home page of the Fusion Workbench]]&lt;br /&gt;
&lt;br /&gt;
If using Apache Tomcat, the war file would be placed under the ‘&amp;lt;tomcat&amp;gt;\webapps’ folder.  &lt;br /&gt;
&lt;br /&gt;
The name of the war file will be the name of the Web Application when accessed in the web browser, for example if the war file is called fwb.war, the application would be accessed using the following URL syntax:&lt;br /&gt;
&lt;br /&gt;
 http(s)://[server]:[port]/'''fwb'''&lt;br /&gt;
&lt;br /&gt;
Apache Tomcat can be started using the '''bin\startup.bat''' or on unix '''bin\startup.sh script'''.  An alternative is to start Tomcat as a windows service.&lt;br /&gt;
&lt;br /&gt;
On Tomcat startup the war file will be unpacked, creating a folder of the same name in the &amp;lt;tomcat&amp;gt;\webapps folder.&lt;br /&gt;
&lt;br /&gt;
After Tomcat has started the Fusion Workbench would be accessed from the following URL.&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/fwb&lt;br /&gt;
&lt;br /&gt;
This URL assumes the following conditions are true:&lt;br /&gt;
# The web browser is running on the same machine as the Tomcat server ('''localhost''' refers to the local machine).&lt;br /&gt;
# No configuration changes have been made to the official distribution of Apache Tomcat (default port is '''8080''').&lt;br /&gt;
# The FWB distribution has the file name fwb.war (fwb.war resolves to '''/fwb''' in the URL path)&lt;br /&gt;
&lt;br /&gt;
Assuming the configuration files are in the correct folder and are valid JSON with no missing required properties, the URL will resolve to the UI of the FWB.&lt;br /&gt;
&lt;br /&gt;
== Error Resolution ==&lt;br /&gt;
If the home page of the FWB fails to load, please check the log files from Apache Tomcat. Other than the Apache Tomcat log files, the FWB will create 2 application specific log files:&lt;br /&gt;
# FMRWorkbench.log – this file contains all logging output from the FWB.   Logs are output if they have a level of INFO or higher.&lt;br /&gt;
# FMRWorkbenchErrors.log – this file contains a subset of the logs from FMRWorkbench.log.  It only contains logs that were written with a severity of WARN or higher.&lt;br /&gt;
&lt;br /&gt;
To change the logging level, edit the '''logback.xml''' file which is found under the following location in Tomcat&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tomcat home&amp;gt;\webapps\fwb\WEB-INF\classes\logback.xml&lt;br /&gt;
&lt;br /&gt;
= Switching Services =&lt;br /&gt;
[[File:Fmr wb service.png|thumb]]&lt;br /&gt;
The header bar of the FMR-Workbench contains a button showing the currently connected service, clicking on this button will open a window to allow a different service to be connected.  By default the service is connected to anonymously, meaning only browser functionality will be supported.&lt;br /&gt;
&lt;br /&gt;
To authenticate, click on the Login button after connecting to the service.  &lt;br /&gt;
&lt;br /&gt;
= Authentication =&lt;br /&gt;
The FMR Workbench supports 2 forms of authentication with the connected service: Basic Authentication and OpenID Connect. The type of authentication is set up in the Config file of the FMR-Workbench.  &lt;br /&gt;
&lt;br /&gt;
== Basic Authentication ==&lt;br /&gt;
Clicking Login will take the user to the FMR-Workbench login page where the user is invited to enter a username and password.  These details are stored in the FMR-Workbench against the user's session, and they are used whenever the user interacts with the target service.  An initial check is performed against the target server to ensure the credentials can be used to obtain some structures, if the check fails then the details are deemed to be invalid and will be discarded.&lt;br /&gt;
&lt;br /&gt;
== Open ID Connect ==&lt;br /&gt;
Clicking Login will take the user to the OpenID Connect login page (defined in the configuration file of the FMR-Workbench).  The user authenticates with the chosen OpenID Connect authentication provider, on success the user is redirected back to the FMR-Workbench with a token.  The token is stored against the user's session, and used to authenticate with the target service. &lt;br /&gt;
&lt;br /&gt;
= Structure Navigation and Export =&lt;br /&gt;
The FMR-Workbench front end will display structures in the same way the FMR provides - clicking on a sidebar item (example Codelists) will display the Codelist page and all the Codelists in the connected service.  This is achieved by the front end issuing a SDMX web service query to the FMR Workbench for all Codelists as stubs.  This query is then forwarded to the connected service, and the response is written back to the client.  The FMR-Workbench can receive the query response from the connected service in any SDMX format.  The response will be parsed by the FMR-Workbench before being written out in the requested format.  This means the FMR-Workbench is able to write the response out in ANY format that the FMR Workbench supports, including Excel, SDMX, and JSON.  The user is therefore able to click on a Codelist and export it as Excel, even if the connected service does not support Excel as an output format.&lt;br /&gt;
&lt;br /&gt;
It is possible to automatically link to a page in the Fusion Registry against a specific service by providing the '''env''' argument in the URL, for example:&lt;br /&gt;
&lt;br /&gt;
 https://fwb.sdmxcloud.org/?env=DOT_STAT_STABLE&lt;br /&gt;
&lt;br /&gt;
The above link will take the user to a specific Concept Scheme in the User Interface, from the DOT_STAT environment.&lt;br /&gt;
&lt;br /&gt;
 https://fwb.sdmxcloud.org/items/conceptscheme.html?urn=urn:sdmx:org.sdmx.infomodel.conceptscheme.ConceptScheme=IMF:CS_BOP(1.11)&amp;amp;env=DOT_STAT_STABLE&lt;br /&gt;
&lt;br /&gt;
The above link will take the user to the Concept Scheme Wizard (the edit pages for a Concept Scheme).  The Concept Scheme wizard will be editing the CS_TOURISM concept in the DOT_STAT Environment.  As this page is a secure resource, the user will be automatically redirected to the login page if they are not already logged into the service.&lt;br /&gt;
&lt;br /&gt;
= SDMX Web Service =&lt;br /&gt;
It is important to note that the FMR-Workbench has the same web service entry points as the FMR, and whilst these web services work, they are not guaranteed to be fully compliant.  The web services of the FMR-Workbench forwards queries onto the connected service.  The queries may be modify to reduce the possibility of the target service not supporting the query. If the connected service reports any error in the query, the FMR-Workbench will report 'no structures' for the query.  &lt;br /&gt;
&lt;br /&gt;
The recommendation is therefore to not rely on the web services of the FMR-Workbench, instead use the web services provided by the target service directly. &lt;br /&gt;
&lt;br /&gt;
= Structure Creation/Modification =&lt;br /&gt;
If the user has logged into the connected service, they will be able to upload structures from the home page of the FMR-Workbench, or create/edit structures using the standard Wizards in the User Interface.  &lt;br /&gt;
&lt;br /&gt;
It is important to note that the FMR-Workbench contains the same User Interface as the FMR, and as such does not provision for the fact that the connected service may not support all the features of the FMR.  For example it may be possible in the FMR-Workbench to create a SDMX 3.0 DSD with multiple measures, but the target service may reject the save request.&lt;br /&gt;
&lt;br /&gt;
It is possible to load structures in any format supported by the FMR-Workbench, including Excel - these structures will be converted into a format supported by the connected service on the save request.&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=Main_Page&amp;diff=6952</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=Main_Page&amp;diff=6952"/>
		<updated>2023-07-13T12:56:55Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Using FMR-CL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:&amp;lt;span style=&amp;quot;opacity:0;position:absolute;&amp;quot;&amp;gt;{{FULLPAGENAME}}&amp;lt;/span&amp;gt;}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size:2.0rem;&amp;quot;&amp;gt;Fusion Metadata Registry (FMR) Knowledge Base&amp;lt;/span&amp;gt;&lt;br /&gt;
::[[File:FMR11 screenshot.png|Fusion Metadata Registry|500px]]&lt;br /&gt;
==Change Log and Supported Features==&lt;br /&gt;
[[Change Log]] for details of the latest version, bug fixes and updates&lt;br /&gt;
&lt;br /&gt;
[https://www.sdmx.io/fmr/#features FMR feature list]&lt;br /&gt;
&lt;br /&gt;
==Fusion Metadata Registry 11==&lt;br /&gt;
Fusion Metadata Registry 11 implements the [https://sdmx.org/wp-content/uploads/SDMX_3-0-0_SECTION_5_FINAL-1_0.pdf SDMX 3.0 specification for a structural metadata registry].&amp;lt;br&amp;gt;&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot; | [[Upgrading_to_Version_11.4|Upgrading to Version 11.4]] || '''A key change occurs in V11.4, without taking action you may not be able to use FMR'''.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot; | [[Upgrading_from_Version_10_to_Version_11|Upgrading From Version 10 to Version 11]] || Upgrading from FMR 10 to FMR 11.&lt;br /&gt;
|-&lt;br /&gt;
| [[FMR 11.0 release notes]] || Key changes in version 11, backward compatibility, breaking changes.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Using Fusion Metadata Registry 11====&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| [[Quick_Start_Guide|Quick Start Guide]] || Install and configure a basic FMR installation&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot; | [[:Category:How_To V11|How to Guides]]|| Guidance on specific tasks using FMR&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:FMR_Configuration_Reference|Configuration Reference]]|| Configuring FMR&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:Structural_Metadata_V11|Structural Metadata Management]] || Creating and maintaining SDMX structures using the FMR web user interface&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:Reference Metadata|Reference Metadata Management]] || Working with reference metadata using the FMR web user interface and web services API&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Use cases====&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot; | [[:Category:SDMX 3.0 Mapping Structures|Mapping]] || Mapping using Structure Maps and Representation Maps&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====SDMX 3.0 Theory====&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot; | [[:Category:Concepts_Reference_V11|Concepts Reference]] || Explanation of key concepts and terms used in SDMX&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:SDMX 3.0 Structures|SDMX 3.0 Structures Reference]] || Details on each of the key 'maintainable' and 'identifiable' SDMX structures&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:FMR_Formats_Reference|Formats Reference]] || Details on each of the data and structure formats available in Fusion Metadata Registry including XML, JSON and CSV&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:FMR_REST_API_Reference|REST API Web Services Reference]] || Purpose, parameters, request content and response content for each of the published web services together with examples&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Fusion Workbench ==&lt;br /&gt;
The FMR Workbench (FWB) provides a web user interface (UI) for browsing and maintaining SDMX Structures obtained from external SDMX compliant Structure Web Services, including (and not limited to) - any FMR installation, OECD.STAT, public SDMX web services, such as the SDMX Global Registry,BIS,ECB,ILO,UNICEF.&lt;br /&gt;
&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot; |  [[FMR_Workbench|FMR Workbench Getting Started]] || Getting started guide for the FMR Workbench&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FMR-CL ==&lt;br /&gt;
'''F'''usion '''M'''etadata '''R'''egistry-'''C'''ommand '''L'''ine (FMR-CL) is a command line application which performs functions against the web services of a running FMR instance.&lt;br /&gt;
&lt;br /&gt;
==== Using FMR-CL ====&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
|  style=&amp;quot;width:300px&amp;quot; |  [[Backup and Restore|Structure Backup]] || Supporting backup of structures and transaction history for restore in new installations of FMR&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FusionXL ==&lt;br /&gt;
[https://fmrwiki.sdmxcloud.org/Category:Fusion_XL '''FusionXL''']&lt;br /&gt;
FusionXL is a plugin for Microsoft Excel® which connects to the [https://registry.sdmx.org/overview.html Global Registry], Fusion Metadata Registry and Fusion Registry (including the [https://demo.metadatatechnology.com/FusionRegistry/overview.html Metadata Technology demo site]) in order to provide structure browsing, and maintenance.&lt;br /&gt;
&lt;br /&gt;
==Fusion Metadata Registry 10==&lt;br /&gt;
Fusion Metadata Registry 10 implements the [https://sdmx.org/wp-content/uploads/SDMX_2-1_SECTION_5_RegistrySpecification_2020-07.pdf SDMX 2.1 specification for a structural metadata registry].&lt;br /&gt;
====Using Fusion Metadata Registry 10====&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| [[Quick_Start_Guide|Quick Start Guide]] || Install and configure a basic FMR installation&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot; | [[:Category:How_To|How to Guides]]|| Guidance on specific tasks using FMR&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:FMR_Configuration_Reference|Configuration Reference]]|| Configuring FMR&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:Structural Metadata|Structural Metadata Management]] || Creating and maintaining SDMX structures using the FMR web user interface&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====SDMX 2.1 Theory====&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot; | [[:Category:Concepts_Reference V10|Concepts Reference]] || Explanation of key concepts and terms used in SDMX&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:SDMX 2.1 Structures|SDMX 2.1 Structures Reference]] || Details on each of the key 'maintainable' and 'identifiable' SDMX structures&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:FMR_Formats_Reference|Formats Reference]] || Details on each of the data and structure formats available in Fusion Metadata Registry including XML, JSON and CSV&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:FMR_REST_API_Reference|REST API Web Services Reference]] || Purpose, parameters, request content and response content for each of the published web services together with examples&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==About Fusion Metadata Registry==&lt;br /&gt;
&lt;br /&gt;
===Key Features===&lt;br /&gt;
* SDMX structural metadata registry&lt;br /&gt;
* Information model: FMR 10 = SDMX 2.1, FMR 11 = SDMX 3.0&lt;br /&gt;
* Formats: SDMX-EDI, SDMX-ML 1.0, 2.0, 2.1, 3.0, SDMX-JSON, SDMX-CSV (data)&lt;br /&gt;
* SDMX REST structure API&lt;br /&gt;
* Web user interface for browsing, authoring and maintaining structures&lt;br /&gt;
&lt;br /&gt;
===Use Cases===&lt;br /&gt;
&amp;lt;strong&amp;gt;Structural metadata management&amp;lt;/strong&amp;gt;&lt;br /&gt;
                            &amp;lt;ul&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Centralise and control structural metadata&amp;lt;/li&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Author and maintain structural metadata&amp;lt;/li&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Drive statistics production using centrally-controlled metadata&amp;lt;/li&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Provide an SDMX-compliant a REST structure API&amp;lt;/li&amp;gt;&lt;br /&gt;
                            &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;Data collection&amp;lt;/strong&amp;gt;&lt;br /&gt;
                            &amp;lt;ul&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Collect data using metadata-driven Excel forms&amp;lt;/li&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Map (transform) incoming data into standardised structures&amp;lt;/li&amp;gt;&lt;br /&gt;
                            &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;Data reporting&amp;lt;/strong&amp;gt;&lt;br /&gt;
                            &amp;lt;ul&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Validate prepared data for compliance with the data collector's specifications prior to reporting&amp;lt;/li&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Map (transform) outgoing data into the collector's required structure&amp;lt;/li&amp;gt;&lt;br /&gt;
                            &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;Statistics production&amp;lt;/strong&amp;gt;&lt;br /&gt;
                            &amp;lt;ul&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Data processing execution engine: data structural validation, mapping to different structures and conversion&amp;lt;/li&amp;gt;&lt;br /&gt;
                            &amp;lt;/ul&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=Main_Page&amp;diff=6951</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=Main_Page&amp;diff=6951"/>
		<updated>2023-07-13T12:56:43Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Fusion Workbench */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:&amp;lt;span style=&amp;quot;opacity:0;position:absolute;&amp;quot;&amp;gt;{{FULLPAGENAME}}&amp;lt;/span&amp;gt;}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size:2.0rem;&amp;quot;&amp;gt;Fusion Metadata Registry (FMR) Knowledge Base&amp;lt;/span&amp;gt;&lt;br /&gt;
::[[File:FMR11 screenshot.png|Fusion Metadata Registry|500px]]&lt;br /&gt;
==Change Log and Supported Features==&lt;br /&gt;
[[Change Log]] for details of the latest version, bug fixes and updates&lt;br /&gt;
&lt;br /&gt;
[https://www.sdmx.io/fmr/#features FMR feature list]&lt;br /&gt;
&lt;br /&gt;
==Fusion Metadata Registry 11==&lt;br /&gt;
Fusion Metadata Registry 11 implements the [https://sdmx.org/wp-content/uploads/SDMX_3-0-0_SECTION_5_FINAL-1_0.pdf SDMX 3.0 specification for a structural metadata registry].&amp;lt;br&amp;gt;&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot; | [[Upgrading_to_Version_11.4|Upgrading to Version 11.4]] || '''A key change occurs in V11.4, without taking action you may not be able to use FMR'''.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot; | [[Upgrading_from_Version_10_to_Version_11|Upgrading From Version 10 to Version 11]] || Upgrading from FMR 10 to FMR 11.&lt;br /&gt;
|-&lt;br /&gt;
| [[FMR 11.0 release notes]] || Key changes in version 11, backward compatibility, breaking changes.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Using Fusion Metadata Registry 11====&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| [[Quick_Start_Guide|Quick Start Guide]] || Install and configure a basic FMR installation&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot; | [[:Category:How_To V11|How to Guides]]|| Guidance on specific tasks using FMR&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:FMR_Configuration_Reference|Configuration Reference]]|| Configuring FMR&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:Structural_Metadata_V11|Structural Metadata Management]] || Creating and maintaining SDMX structures using the FMR web user interface&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:Reference Metadata|Reference Metadata Management]] || Working with reference metadata using the FMR web user interface and web services API&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Use cases====&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot; | [[:Category:SDMX 3.0 Mapping Structures|Mapping]] || Mapping using Structure Maps and Representation Maps&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====SDMX 3.0 Theory====&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot; | [[:Category:Concepts_Reference_V11|Concepts Reference]] || Explanation of key concepts and terms used in SDMX&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:SDMX 3.0 Structures|SDMX 3.0 Structures Reference]] || Details on each of the key 'maintainable' and 'identifiable' SDMX structures&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:FMR_Formats_Reference|Formats Reference]] || Details on each of the data and structure formats available in Fusion Metadata Registry including XML, JSON and CSV&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:FMR_REST_API_Reference|REST API Web Services Reference]] || Purpose, parameters, request content and response content for each of the published web services together with examples&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Fusion Workbench ==&lt;br /&gt;
The FMR Workbench (FWB) provides a web user interface (UI) for browsing and maintaining SDMX Structures obtained from external SDMX compliant Structure Web Services, including (and not limited to) - any FMR installation, OECD.STAT, public SDMX web services, such as the SDMX Global Registry,BIS,ECB,ILO,UNICEF.&lt;br /&gt;
&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot; |  [[FMR_Workbench|FMR Workbench Getting Started]] || Getting started guide for the FMR Workbench&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FMR-CL ==&lt;br /&gt;
'''F'''usion '''M'''etadata '''R'''egistry-'''C'''ommand '''L'''ine (FMR-CL) is a command line application which performs functions against the web services of a running FMR instance.&lt;br /&gt;
&lt;br /&gt;
==== Using FMR-CL ====&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| [[Backup and Restore|Structure Backup]] || Supporting backup of structures and transaction history for restore in new installations of FMR&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FusionXL ==&lt;br /&gt;
[https://fmrwiki.sdmxcloud.org/Category:Fusion_XL '''FusionXL''']&lt;br /&gt;
FusionXL is a plugin for Microsoft Excel® which connects to the [https://registry.sdmx.org/overview.html Global Registry], Fusion Metadata Registry and Fusion Registry (including the [https://demo.metadatatechnology.com/FusionRegistry/overview.html Metadata Technology demo site]) in order to provide structure browsing, and maintenance.&lt;br /&gt;
&lt;br /&gt;
==Fusion Metadata Registry 10==&lt;br /&gt;
Fusion Metadata Registry 10 implements the [https://sdmx.org/wp-content/uploads/SDMX_2-1_SECTION_5_RegistrySpecification_2020-07.pdf SDMX 2.1 specification for a structural metadata registry].&lt;br /&gt;
====Using Fusion Metadata Registry 10====&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| [[Quick_Start_Guide|Quick Start Guide]] || Install and configure a basic FMR installation&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot; | [[:Category:How_To|How to Guides]]|| Guidance on specific tasks using FMR&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:FMR_Configuration_Reference|Configuration Reference]]|| Configuring FMR&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:Structural Metadata|Structural Metadata Management]] || Creating and maintaining SDMX structures using the FMR web user interface&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====SDMX 2.1 Theory====&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot; | [[:Category:Concepts_Reference V10|Concepts Reference]] || Explanation of key concepts and terms used in SDMX&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:SDMX 2.1 Structures|SDMX 2.1 Structures Reference]] || Details on each of the key 'maintainable' and 'identifiable' SDMX structures&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:FMR_Formats_Reference|Formats Reference]] || Details on each of the data and structure formats available in Fusion Metadata Registry including XML, JSON and CSV&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:FMR_REST_API_Reference|REST API Web Services Reference]] || Purpose, parameters, request content and response content for each of the published web services together with examples&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==About Fusion Metadata Registry==&lt;br /&gt;
&lt;br /&gt;
===Key Features===&lt;br /&gt;
* SDMX structural metadata registry&lt;br /&gt;
* Information model: FMR 10 = SDMX 2.1, FMR 11 = SDMX 3.0&lt;br /&gt;
* Formats: SDMX-EDI, SDMX-ML 1.0, 2.0, 2.1, 3.0, SDMX-JSON, SDMX-CSV (data)&lt;br /&gt;
* SDMX REST structure API&lt;br /&gt;
* Web user interface for browsing, authoring and maintaining structures&lt;br /&gt;
&lt;br /&gt;
===Use Cases===&lt;br /&gt;
&amp;lt;strong&amp;gt;Structural metadata management&amp;lt;/strong&amp;gt;&lt;br /&gt;
                            &amp;lt;ul&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Centralise and control structural metadata&amp;lt;/li&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Author and maintain structural metadata&amp;lt;/li&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Drive statistics production using centrally-controlled metadata&amp;lt;/li&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Provide an SDMX-compliant a REST structure API&amp;lt;/li&amp;gt;&lt;br /&gt;
                            &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;Data collection&amp;lt;/strong&amp;gt;&lt;br /&gt;
                            &amp;lt;ul&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Collect data using metadata-driven Excel forms&amp;lt;/li&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Map (transform) incoming data into standardised structures&amp;lt;/li&amp;gt;&lt;br /&gt;
                            &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;Data reporting&amp;lt;/strong&amp;gt;&lt;br /&gt;
                            &amp;lt;ul&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Validate prepared data for compliance with the data collector's specifications prior to reporting&amp;lt;/li&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Map (transform) outgoing data into the collector's required structure&amp;lt;/li&amp;gt;&lt;br /&gt;
                            &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;Statistics production&amp;lt;/strong&amp;gt;&lt;br /&gt;
                            &amp;lt;ul&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Data processing execution engine: data structural validation, mapping to different structures and conversion&amp;lt;/li&amp;gt;&lt;br /&gt;
                            &amp;lt;/ul&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=Main_Page&amp;diff=6950</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=Main_Page&amp;diff=6950"/>
		<updated>2023-07-13T12:56:27Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Fusion Workbench */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:&amp;lt;span style=&amp;quot;opacity:0;position:absolute;&amp;quot;&amp;gt;{{FULLPAGENAME}}&amp;lt;/span&amp;gt;}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size:2.0rem;&amp;quot;&amp;gt;Fusion Metadata Registry (FMR) Knowledge Base&amp;lt;/span&amp;gt;&lt;br /&gt;
::[[File:FMR11 screenshot.png|Fusion Metadata Registry|500px]]&lt;br /&gt;
==Change Log and Supported Features==&lt;br /&gt;
[[Change Log]] for details of the latest version, bug fixes and updates&lt;br /&gt;
&lt;br /&gt;
[https://www.sdmx.io/fmr/#features FMR feature list]&lt;br /&gt;
&lt;br /&gt;
==Fusion Metadata Registry 11==&lt;br /&gt;
Fusion Metadata Registry 11 implements the [https://sdmx.org/wp-content/uploads/SDMX_3-0-0_SECTION_5_FINAL-1_0.pdf SDMX 3.0 specification for a structural metadata registry].&amp;lt;br&amp;gt;&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot; | [[Upgrading_to_Version_11.4|Upgrading to Version 11.4]] || '''A key change occurs in V11.4, without taking action you may not be able to use FMR'''.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot; | [[Upgrading_from_Version_10_to_Version_11|Upgrading From Version 10 to Version 11]] || Upgrading from FMR 10 to FMR 11.&lt;br /&gt;
|-&lt;br /&gt;
| [[FMR 11.0 release notes]] || Key changes in version 11, backward compatibility, breaking changes.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Using Fusion Metadata Registry 11====&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| [[Quick_Start_Guide|Quick Start Guide]] || Install and configure a basic FMR installation&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot; | [[:Category:How_To V11|How to Guides]]|| Guidance on specific tasks using FMR&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:FMR_Configuration_Reference|Configuration Reference]]|| Configuring FMR&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:Structural_Metadata_V11|Structural Metadata Management]] || Creating and maintaining SDMX structures using the FMR web user interface&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:Reference Metadata|Reference Metadata Management]] || Working with reference metadata using the FMR web user interface and web services API&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Use cases====&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot; | [[:Category:SDMX 3.0 Mapping Structures|Mapping]] || Mapping using Structure Maps and Representation Maps&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====SDMX 3.0 Theory====&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot; | [[:Category:Concepts_Reference_V11|Concepts Reference]] || Explanation of key concepts and terms used in SDMX&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:SDMX 3.0 Structures|SDMX 3.0 Structures Reference]] || Details on each of the key 'maintainable' and 'identifiable' SDMX structures&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:FMR_Formats_Reference|Formats Reference]] || Details on each of the data and structure formats available in Fusion Metadata Registry including XML, JSON and CSV&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:FMR_REST_API_Reference|REST API Web Services Reference]] || Purpose, parameters, request content and response content for each of the published web services together with examples&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Fusion Workbench ==&lt;br /&gt;
The FMR Workbench (FWB) provides a web user interface (UI) for browsing and maintaining SDMX Structures obtained from external SDMX compliant Structure Web Services, including (and not limited to) - any FMR installation, OECD.STAT, public SDMX web services, such as the SDMX Global Registry,BIS,ECB,ILO,UNICEF.&lt;br /&gt;
&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot;  [[FMR_Workbench|FMR Workbench Getting Started]] || Getting started guide for the FMR Workbench&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FMR-CL ==&lt;br /&gt;
'''F'''usion '''M'''etadata '''R'''egistry-'''C'''ommand '''L'''ine (FMR-CL) is a command line application which performs functions against the web services of a running FMR instance.&lt;br /&gt;
&lt;br /&gt;
==== Using FMR-CL ====&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| [[Backup and Restore|Structure Backup]] || Supporting backup of structures and transaction history for restore in new installations of FMR&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FusionXL ==&lt;br /&gt;
[https://fmrwiki.sdmxcloud.org/Category:Fusion_XL '''FusionXL''']&lt;br /&gt;
FusionXL is a plugin for Microsoft Excel® which connects to the [https://registry.sdmx.org/overview.html Global Registry], Fusion Metadata Registry and Fusion Registry (including the [https://demo.metadatatechnology.com/FusionRegistry/overview.html Metadata Technology demo site]) in order to provide structure browsing, and maintenance.&lt;br /&gt;
&lt;br /&gt;
==Fusion Metadata Registry 10==&lt;br /&gt;
Fusion Metadata Registry 10 implements the [https://sdmx.org/wp-content/uploads/SDMX_2-1_SECTION_5_RegistrySpecification_2020-07.pdf SDMX 2.1 specification for a structural metadata registry].&lt;br /&gt;
====Using Fusion Metadata Registry 10====&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| [[Quick_Start_Guide|Quick Start Guide]] || Install and configure a basic FMR installation&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot; | [[:Category:How_To|How to Guides]]|| Guidance on specific tasks using FMR&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:FMR_Configuration_Reference|Configuration Reference]]|| Configuring FMR&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:Structural Metadata|Structural Metadata Management]] || Creating and maintaining SDMX structures using the FMR web user interface&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====SDMX 2.1 Theory====&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot; | [[:Category:Concepts_Reference V10|Concepts Reference]] || Explanation of key concepts and terms used in SDMX&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:SDMX 2.1 Structures|SDMX 2.1 Structures Reference]] || Details on each of the key 'maintainable' and 'identifiable' SDMX structures&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:FMR_Formats_Reference|Formats Reference]] || Details on each of the data and structure formats available in Fusion Metadata Registry including XML, JSON and CSV&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:FMR_REST_API_Reference|REST API Web Services Reference]] || Purpose, parameters, request content and response content for each of the published web services together with examples&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==About Fusion Metadata Registry==&lt;br /&gt;
&lt;br /&gt;
===Key Features===&lt;br /&gt;
* SDMX structural metadata registry&lt;br /&gt;
* Information model: FMR 10 = SDMX 2.1, FMR 11 = SDMX 3.0&lt;br /&gt;
* Formats: SDMX-EDI, SDMX-ML 1.0, 2.0, 2.1, 3.0, SDMX-JSON, SDMX-CSV (data)&lt;br /&gt;
* SDMX REST structure API&lt;br /&gt;
* Web user interface for browsing, authoring and maintaining structures&lt;br /&gt;
&lt;br /&gt;
===Use Cases===&lt;br /&gt;
&amp;lt;strong&amp;gt;Structural metadata management&amp;lt;/strong&amp;gt;&lt;br /&gt;
                            &amp;lt;ul&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Centralise and control structural metadata&amp;lt;/li&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Author and maintain structural metadata&amp;lt;/li&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Drive statistics production using centrally-controlled metadata&amp;lt;/li&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Provide an SDMX-compliant a REST structure API&amp;lt;/li&amp;gt;&lt;br /&gt;
                            &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;Data collection&amp;lt;/strong&amp;gt;&lt;br /&gt;
                            &amp;lt;ul&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Collect data using metadata-driven Excel forms&amp;lt;/li&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Map (transform) incoming data into standardised structures&amp;lt;/li&amp;gt;&lt;br /&gt;
                            &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;Data reporting&amp;lt;/strong&amp;gt;&lt;br /&gt;
                            &amp;lt;ul&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Validate prepared data for compliance with the data collector's specifications prior to reporting&amp;lt;/li&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Map (transform) outgoing data into the collector's required structure&amp;lt;/li&amp;gt;&lt;br /&gt;
                            &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;Statistics production&amp;lt;/strong&amp;gt;&lt;br /&gt;
                            &amp;lt;ul&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Data processing execution engine: data structural validation, mapping to different structures and conversion&amp;lt;/li&amp;gt;&lt;br /&gt;
                            &amp;lt;/ul&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=Main_Page&amp;diff=6949</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=Main_Page&amp;diff=6949"/>
		<updated>2023-07-13T12:55:44Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* FMR-CL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:&amp;lt;span style=&amp;quot;opacity:0;position:absolute;&amp;quot;&amp;gt;{{FULLPAGENAME}}&amp;lt;/span&amp;gt;}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size:2.0rem;&amp;quot;&amp;gt;Fusion Metadata Registry (FMR) Knowledge Base&amp;lt;/span&amp;gt;&lt;br /&gt;
::[[File:FMR11 screenshot.png|Fusion Metadata Registry|500px]]&lt;br /&gt;
==Change Log and Supported Features==&lt;br /&gt;
[[Change Log]] for details of the latest version, bug fixes and updates&lt;br /&gt;
&lt;br /&gt;
[https://www.sdmx.io/fmr/#features FMR feature list]&lt;br /&gt;
&lt;br /&gt;
==Fusion Metadata Registry 11==&lt;br /&gt;
Fusion Metadata Registry 11 implements the [https://sdmx.org/wp-content/uploads/SDMX_3-0-0_SECTION_5_FINAL-1_0.pdf SDMX 3.0 specification for a structural metadata registry].&amp;lt;br&amp;gt;&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot; | [[Upgrading_to_Version_11.4|Upgrading to Version 11.4]] || '''A key change occurs in V11.4, without taking action you may not be able to use FMR'''.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot; | [[Upgrading_from_Version_10_to_Version_11|Upgrading From Version 10 to Version 11]] || Upgrading from FMR 10 to FMR 11.&lt;br /&gt;
|-&lt;br /&gt;
| [[FMR 11.0 release notes]] || Key changes in version 11, backward compatibility, breaking changes.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Using Fusion Metadata Registry 11====&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| [[Quick_Start_Guide|Quick Start Guide]] || Install and configure a basic FMR installation&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot; | [[:Category:How_To V11|How to Guides]]|| Guidance on specific tasks using FMR&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:FMR_Configuration_Reference|Configuration Reference]]|| Configuring FMR&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:Structural_Metadata_V11|Structural Metadata Management]] || Creating and maintaining SDMX structures using the FMR web user interface&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:Reference Metadata|Reference Metadata Management]] || Working with reference metadata using the FMR web user interface and web services API&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Use cases====&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot; | [[:Category:SDMX 3.0 Mapping Structures|Mapping]] || Mapping using Structure Maps and Representation Maps&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====SDMX 3.0 Theory====&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot; | [[:Category:Concepts_Reference_V11|Concepts Reference]] || Explanation of key concepts and terms used in SDMX&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:SDMX 3.0 Structures|SDMX 3.0 Structures Reference]] || Details on each of the key 'maintainable' and 'identifiable' SDMX structures&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:FMR_Formats_Reference|Formats Reference]] || Details on each of the data and structure formats available in Fusion Metadata Registry including XML, JSON and CSV&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:FMR_REST_API_Reference|REST API Web Services Reference]] || Purpose, parameters, request content and response content for each of the published web services together with examples&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Fusion Workbench ==&lt;br /&gt;
The FMR Workbench (FWB) provides a web user interface (UI) for browsing and maintaining SDMX Structures obtained from external SDMX compliant Structure Web Services, including (and not limited to) - any FMR installation, OECD.STAT, public SDMX web services, such as the SDMX Global Registry,BIS,ECB,ILO,UNICEF.&lt;br /&gt;
&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| [[FMR_Workbench|FMR Workbench Getting Started]] || Getting started guide for the FMR Workbench&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FMR-CL ==&lt;br /&gt;
'''F'''usion '''M'''etadata '''R'''egistry-'''C'''ommand '''L'''ine (FMR-CL) is a command line application which performs functions against the web services of a running FMR instance.&lt;br /&gt;
&lt;br /&gt;
==== Using FMR-CL ====&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| [[Backup and Restore|Structure Backup]] || Supporting backup of structures and transaction history for restore in new installations of FMR&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== FusionXL ==&lt;br /&gt;
[https://fmrwiki.sdmxcloud.org/Category:Fusion_XL '''FusionXL''']&lt;br /&gt;
FusionXL is a plugin for Microsoft Excel® which connects to the [https://registry.sdmx.org/overview.html Global Registry], Fusion Metadata Registry and Fusion Registry (including the [https://demo.metadatatechnology.com/FusionRegistry/overview.html Metadata Technology demo site]) in order to provide structure browsing, and maintenance.&lt;br /&gt;
&lt;br /&gt;
==Fusion Metadata Registry 10==&lt;br /&gt;
Fusion Metadata Registry 10 implements the [https://sdmx.org/wp-content/uploads/SDMX_2-1_SECTION_5_RegistrySpecification_2020-07.pdf SDMX 2.1 specification for a structural metadata registry].&lt;br /&gt;
====Using Fusion Metadata Registry 10====&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| [[Quick_Start_Guide|Quick Start Guide]] || Install and configure a basic FMR installation&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot; | [[:Category:How_To|How to Guides]]|| Guidance on specific tasks using FMR&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:FMR_Configuration_Reference|Configuration Reference]]|| Configuring FMR&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:Structural Metadata|Structural Metadata Management]] || Creating and maintaining SDMX structures using the FMR web user interface&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====SDMX 2.1 Theory====&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:300px&amp;quot; | [[:Category:Concepts_Reference V10|Concepts Reference]] || Explanation of key concepts and terms used in SDMX&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:SDMX 2.1 Structures|SDMX 2.1 Structures Reference]] || Details on each of the key 'maintainable' and 'identifiable' SDMX structures&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:FMR_Formats_Reference|Formats Reference]] || Details on each of the data and structure formats available in Fusion Metadata Registry including XML, JSON and CSV&lt;br /&gt;
|-&lt;br /&gt;
| [[:Category:FMR_REST_API_Reference|REST API Web Services Reference]] || Purpose, parameters, request content and response content for each of the published web services together with examples&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==About Fusion Metadata Registry==&lt;br /&gt;
&lt;br /&gt;
===Key Features===&lt;br /&gt;
* SDMX structural metadata registry&lt;br /&gt;
* Information model: FMR 10 = SDMX 2.1, FMR 11 = SDMX 3.0&lt;br /&gt;
* Formats: SDMX-EDI, SDMX-ML 1.0, 2.0, 2.1, 3.0, SDMX-JSON, SDMX-CSV (data)&lt;br /&gt;
* SDMX REST structure API&lt;br /&gt;
* Web user interface for browsing, authoring and maintaining structures&lt;br /&gt;
&lt;br /&gt;
===Use Cases===&lt;br /&gt;
&amp;lt;strong&amp;gt;Structural metadata management&amp;lt;/strong&amp;gt;&lt;br /&gt;
                            &amp;lt;ul&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Centralise and control structural metadata&amp;lt;/li&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Author and maintain structural metadata&amp;lt;/li&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Drive statistics production using centrally-controlled metadata&amp;lt;/li&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Provide an SDMX-compliant a REST structure API&amp;lt;/li&amp;gt;&lt;br /&gt;
                            &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;Data collection&amp;lt;/strong&amp;gt;&lt;br /&gt;
                            &amp;lt;ul&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Collect data using metadata-driven Excel forms&amp;lt;/li&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Map (transform) incoming data into standardised structures&amp;lt;/li&amp;gt;&lt;br /&gt;
                            &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;Data reporting&amp;lt;/strong&amp;gt;&lt;br /&gt;
                            &amp;lt;ul&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Validate prepared data for compliance with the data collector's specifications prior to reporting&amp;lt;/li&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Map (transform) outgoing data into the collector's required structure&amp;lt;/li&amp;gt;&lt;br /&gt;
                            &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;Statistics production&amp;lt;/strong&amp;gt;&lt;br /&gt;
                            &amp;lt;ul&amp;gt;&lt;br /&gt;
                                &amp;lt;li&amp;gt;Data processing execution engine: data structural validation, mapping to different structures and conversion&amp;lt;/li&amp;gt;&lt;br /&gt;
                            &amp;lt;/ul&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=FMR_Workbench&amp;diff=6947</id>
		<title>FMR Workbench</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=FMR_Workbench&amp;diff=6947"/>
		<updated>2023-07-13T12:51:12Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: Mnelson moved page DRAFT-FMR Workbench to FMR Workbench&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
[[File:Fmr wb overview.png|thumb]]&lt;br /&gt;
The '''F'''MR '''W'''ork'''B'''ench (FWB) is a User Interface (UI) for browsing and maintaining SDMX Structures obtained from SDMX compliant Structure Web Services.  The UI of the FWB is a stripped-down version of the Fusion Metadata Registry (FMR) User Interface; it is stripped down because the UI of the FWB supports the use case of viewing and maintaining structural metadata, whilst the FMR supports additional use cases including [[Validate_data|data validation]], [[Convert_data_between_SDMX_formats_V11|data conversion]], and has administrative UI pages.  Whilst the FMR uses a database to store its configuration settings, the FWB configuration is stored in a file.  '''The FWB has no database requirements'''.&lt;br /&gt;
&lt;br /&gt;
The FWB UI browses and displays the SDMX structures of the '''Environment''' it is connected to. An Environment is a connection to a collection of related SDMX web services for a single SDMX service offering. Related web services include the web service entry point to retrieve the structures, the entry point to save structures, and the entry point to delete structures.&lt;br /&gt;
&lt;br /&gt;
The UI of the FWB enables the user to switch their connection to an alternative Environment; the list of available Environments is defined in the configuration file for the FWB.  The connected Environment is associated with the current user; this enables multiple users of the FWB to be connected to different Environments simultaneously.&lt;br /&gt;
&lt;br /&gt;
= Getting Started = &lt;br /&gt;
The FMR Workbench (FWB) is deployed as a Web Application Archive (war) file.  The war file must be deployed to a Java Servlet container such as Apache Tomcat.  The Servlet container will host the application so that it can be accessed over HTTP as a web application.&lt;br /&gt;
&lt;br /&gt;
== Configuration File Location == &lt;br /&gt;
The FMR Workbench does not use a database, instead it obtains its configuration settings from a configuration file called fwb_config.json.&lt;br /&gt;
&lt;br /&gt;
An example configuration file is provided with the software.  The configuration file needs to be placed in the following directory (the directory must be created if it does not exist):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;USER HOME&amp;gt;\MetadataTechnology\FusionRegistry&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 C:\Users\Matthew Nelson\MetadataTechnology\FusionRegistry&lt;br /&gt;
&lt;br /&gt;
== Configuration File Properties ==&lt;br /&gt;
[[File:FWB Environment Selection.png|thumb|Showing the switch environment options]]&lt;br /&gt;
&lt;br /&gt;
The configuration file is split into 2 parts:&lt;br /&gt;
 &lt;br /&gt;
# Server Properties&lt;br /&gt;
# Environment Definitions&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;Properties&amp;quot;: { &amp;lt;span style=&amp;quot;color:#C00000&amp;quot;&amp;gt;server properties go here&amp;lt;/span&amp;gt; },&lt;br /&gt;
    &amp;quot;Environments&amp;quot;: [ &amp;lt;span style=&amp;quot;color:#C00000&amp;quot;&amp;gt;environment definitions go here&amp;lt;/span&amp;gt; ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&amp;lt;br/&amp;gt;&lt;br /&gt;
There is only 1 property which is required for the FWB, this is the URL to the FWB application. This property enables the application to know where to find required resources, and how to redirect users to the correct pages. &lt;br /&gt;
&lt;br /&gt;
 &amp;quot;Properties&amp;quot;: {&lt;br /&gt;
    server.url: &amp;quot;http://localhost:8080/fwb&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Localhost can be used for testing purposes when deploying the application to the same computer that the web browser is run from. For a live deployment this URL must be changed accordingly.&lt;br /&gt;
&lt;br /&gt;
'''Environments'''&amp;lt;br/&amp;gt;&lt;br /&gt;
The Environment property has an array of JSON Objects. Each JSON Object in this array defines a distinct Environment which the FWB can switch to in order to browse and optionally create/maintain the SDMX Structures of that Environment. &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
An Environment consists of an id and a name and defines the web service entry points to retrieve, save, and delete structures. The retrieve web service is required, the save and delete entry points are optional.  &lt;br /&gt;
&lt;br /&gt;
The Environment definition also contains details on the authentication mechanism used to access the contents of the web services.&lt;br /&gt;
&lt;br /&gt;
An example of an Environment definition is given below:&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;DOT_STAT&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot; : &amp;quot;Dot Stat Test&amp;quot;,&lt;br /&gt;
    &amp;quot;api&amp;quot;: {&lt;br /&gt;
        &amp;quot;query&amp;quot;: &amp;quot;https://nsi-demo-reset.siscc.org/rest&amp;quot;,&lt;br /&gt;
        &amp;quot;persist&amp;quot;: &amp;quot;https://nsi-demo-reset.siscc.org/rest/structure&amp;quot;,&lt;br /&gt;
        &amp;quot;delete&amp;quot;: &amp;quot;https://nsi-demo-stable.siscc.org/rest/structure&amp;quot;,&lt;br /&gt;
        &amp;quot;version&amp;quot;: &amp;quot;1.5.0&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;agencies&amp;quot;: [&amp;quot;SDMX&amp;quot;, &amp;quot;METATECH&amp;quot;],&lt;br /&gt;
    &amp;quot;auth&amp;quot;: &amp;quot;OIDC_PKCE&amp;quot;,&lt;br /&gt;
    &amp;quot;locale&amp;quot;: [&amp;quot;en&amp;quot;, &amp;quot;fr&amp;quot;],&lt;br /&gt;
    &amp;quot;oidc&amp;quot;: {&lt;br /&gt;
        &amp;quot;config&amp;quot;: &amp;quot;https://keycloak.siscc.org/auth/realms/OECD/.well-known/openid-configuration&amp;quot;,&lt;br /&gt;
        &amp;quot;clientId&amp;quot;: &amp;quot;app&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;format&amp;quot;: &amp;quot;mlv2.1&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following table describes the properties for an Environment definition based on the above example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Property !! Description&lt;br /&gt;
|-&lt;br /&gt;
| '''id''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; This is the ID of the Environment.  It is used in the REST API to switch environments&lt;br /&gt;
|-&lt;br /&gt;
| '''name''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; The name of the Environment as presented to the user&lt;br /&gt;
|-&lt;br /&gt;
| '''api''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; contains the base SDMX REST URL for each web service of the Environment&lt;br /&gt;
|-&lt;br /&gt;
| '''api.query''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; structure query web service&lt;br /&gt;
|-&lt;br /&gt;
| '''api.persist''' || &amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''Optional'''&amp;lt;/span&amp;gt; to support add/edit functionality.  HTTP POST messages will be sent to this URL&lt;br /&gt;
|-&lt;br /&gt;
| '''api.delete''' || &amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''Optional'''&amp;lt;/span&amp;gt; to support delete functionality, HTTP DELETE messages will be sent to this URL&lt;br /&gt;
|-&lt;br /&gt;
| '''api.version''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; the Version of the SDMX REST API.  Supported values are 1.5.0 and 2.0.0&lt;br /&gt;
|-&lt;br /&gt;
| '''api.timeout''' || &amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''Optional'''&amp;lt;/span&amp;gt; maximum number of seconds to wait for response from API before timing out. Defaults to120 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| '''format''' || The SDMX structure format used when POSTing structures to web service (for the use case of structure persistence).  &amp;lt;br/&amp;gt;&lt;br /&gt;
Options include:&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''mlv2.1'''&amp;lt;/span&amp;gt; – XML format SDMX-ML v.2.1 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''mlv3.0'''&amp;lt;/span&amp;gt; – XML format SDMX-ML v.3.0 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''jsonv1'''&amp;lt;/span&amp;gt; – JSON format SDMX-JSON v.1.0 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''jsonv2'''&amp;lt;/span&amp;gt; – JSON format SDMX-JSON v.2.0 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''fusion'''&amp;lt;/span&amp;gt; – the FMR specific format. This format should be used if connected to another FMR instance as it covers both SDMX structures and non-SDMX structures such as Publication Tables and Reporting Templates &amp;lt;br/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Apache Tomcat Example ==&lt;br /&gt;
[[File:FMR Workbench Home.png|thumb|Showing the home page of the Fusion Workbench]]&lt;br /&gt;
&lt;br /&gt;
If using Apache Tomcat, the war file would be placed under the ‘&amp;lt;tomcat&amp;gt;\webapps’ folder.  &lt;br /&gt;
&lt;br /&gt;
The name of the war file will be the name of the Web Application when accessed in the web browser, for example if the war file is called fwb.war, the application would be accessed using the following URL syntax:&lt;br /&gt;
&lt;br /&gt;
 http(s)://[server]:[port]/'''fwb'''&lt;br /&gt;
&lt;br /&gt;
Apache Tomcat can be started using the '''bin\startup.bat''' or on unix '''bin\startup.sh script'''.  An alternative is to start Tomcat as a windows service.&lt;br /&gt;
&lt;br /&gt;
On Tomcat startup the war file will be unpacked, creating a folder of the same name in the &amp;lt;tomcat&amp;gt;\webapps folder.&lt;br /&gt;
&lt;br /&gt;
After Tomcat has started the Fusion Workbench would be accessed from the following URL.&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/fwb&lt;br /&gt;
&lt;br /&gt;
This URL assumes the following conditions are true:&lt;br /&gt;
# The web browser is running on the same machine as the Tomcat server ('''localhost''' refers to the local machine).&lt;br /&gt;
# No configuration changes have been made to the official distribution of Apache Tomcat (default port is '''8080''').&lt;br /&gt;
# The FWB distribution has the file name fwb.war (fwb.war resolves to '''/fwb''' in the URL path)&lt;br /&gt;
&lt;br /&gt;
Assuming the configuration files are in the correct folder and are valid JSON with no missing required properties, the URL will resolve to the UI of the FWB.&lt;br /&gt;
&lt;br /&gt;
== Error Resolution ==&lt;br /&gt;
If the home page of the FWB fails to load, please check the log files from Apache Tomcat. Other than the Apache Tomcat log files, the FWB will create 2 application specific log files:&lt;br /&gt;
# FMRWorkbench.log – this file contains all logging output from the FWB.   Logs are output if they have a level of INFO or higher.&lt;br /&gt;
# FMRWorkbenchErrors.log – this file contains a subset of the logs from FMRWorkbench.log.  It only contains logs that were written with a severity of WARN or higher.&lt;br /&gt;
&lt;br /&gt;
To change the logging level, edit the '''logback.xml''' file which is found under the following location in Tomcat&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tomcat home&amp;gt;\webapps\fwb\WEB-INF\classes\logback.xml&lt;br /&gt;
&lt;br /&gt;
= Switching Services =&lt;br /&gt;
[[File:Fmr wb service.png|thumb]]&lt;br /&gt;
The header bar of the FMR-Workbench contains a button showing the currently connected service, clicking on this button will open a window to allow a different service to be connected.  By default the service is connected to anonymously, meaning only browser functionality will be supported.&lt;br /&gt;
&lt;br /&gt;
To authenticate, click on the Login button after connecting to the service.  &lt;br /&gt;
&lt;br /&gt;
= Authentication =&lt;br /&gt;
The FMR Workbench supports 2 forms of authentication with the connected service: Basic Authentication and OpenID Connect. The type of authentication is set up in the Config file of the FMR-Workbench.  &lt;br /&gt;
&lt;br /&gt;
== Basic Authentication ==&lt;br /&gt;
Clicking Login will take the user to the FMR-Workbench login page where the user is invited to enter a username and password.  These details are stored in the FMR-Workbench against the user's session, and they are used whenever the user interacts with the target service.  An initial check is performed against the target server to ensure the credentials can be used to obtain some structures, if the check fails then the details are deemed to be invalid and will be discarded.&lt;br /&gt;
&lt;br /&gt;
== Open ID Connect ==&lt;br /&gt;
Clicking Login will take the user to the OpenID Connect login page (defined in the configuration file of the FMR-Workbench).  The user authenticates with the chosen OpenID Connect authentication provider, on success the user is redirected back to the FMR-Workbench with a token.  The token is stored against the user's session, and used to authenticate with the target service. &lt;br /&gt;
&lt;br /&gt;
= Structure Navigation and Export =&lt;br /&gt;
The FMR-Workbench front end will display structures in the same way the FMR provides - clicking on a sidebar item (example Codelists) will display the Codelist page and all the Codelists in the connected service.  This is achieved by the front end issuing a SDMX web service query to the FMR Workbench for all Codelists as stubs.  This query is then forwarded to the connected service, and the response is written back to the client.  The FMR-Workbench can receive the query response from the connected service in any SDMX format.  The response will be parsed by the FMR-Workbench before being written out in the requested format.  This means the FMR-Workbench is able to write the response out in ANY format that the FMR Workbench supports, including Excel, SDMX, and JSON.  The user is therefore able to click on a Codelist and export it as Excel, even if the connected service does not support Excel as an output format.&lt;br /&gt;
&lt;br /&gt;
It is possible to automatically link to a page in the Fusion Registry against a specific service by providing the '''env''' argument in the URL, for example:&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/FMR-WB/items/conceptscheme.html?urn=urn:sdmx:org.sdmx.infomodel.conceptscheme.ConceptScheme=OECD:CS_TOURISM(1.0)&amp;amp;env=DOT_STAT&lt;br /&gt;
&lt;br /&gt;
The above link will take the user to a specific Concept Scheme in the User Interface, from the DOT_STAT environment.&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/FMR-WB/items/conceptscheme-wizard.html?urn=urn:sdmx:org.sdmx.infomodel.conceptscheme.ConceptScheme=OECD:CS_TOURISM(1.0)&amp;amp;env=DOT_STAT&lt;br /&gt;
&lt;br /&gt;
The above link will take the user to the Concept Scheme Wizard (the edit pages for a Concept Scheme).  The Concept Scheme wizard will be editing the CS_TOURISM concept in the DOT_STAT Environment.  As this page is a secure resource, the user will be automatically redirected to the login page if they are not already logged into the service.&lt;br /&gt;
&lt;br /&gt;
= SDMX Web Service =&lt;br /&gt;
It is important to note that the FMR-Workbench has the same web service entry points as the FMR, and whilst these web services work, they are not guaranteed to be fully compliant.  The web services of the FMR-Workbench forwards queries onto the connected service.  The queries may be modify to reduce the possibility of the target service not supporting the query. If the connected service reports any error in the query, the FMR-Workbench will report 'no structures' for the query.  &lt;br /&gt;
&lt;br /&gt;
The recommendation is therefore to not rely on the web services of the FMR-Workbench, instead use the web services provided by the target service directly. &lt;br /&gt;
&lt;br /&gt;
= Structure Creation/Modification =&lt;br /&gt;
If the user has logged into the connected service, they will be able to upload structures from the home page of the FMR-Workbench, or create/edit structures using the standard Wizards in the User Interface.  &lt;br /&gt;
&lt;br /&gt;
It is important to note that the FMR-Workbench contains the same User Interface as the FMR, and as such does not provision for the fact that the connected service may not support all the features of the FMR.  For example it may be possible in the FMR-Workbench to create a SDMX 3.0 DSD with multiple measures, but the target service may reject the save request.&lt;br /&gt;
&lt;br /&gt;
It is possible to load structures in any format supported by the FMR-Workbench, including Excel - these structures will be converted into a format supported by the connected service on the save request.&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=FMR_Workbench&amp;diff=6946</id>
		<title>FMR Workbench</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=FMR_Workbench&amp;diff=6946"/>
		<updated>2023-07-13T12:50:28Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Apache Tomcat Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
[[File:Fmr wb overview.png|thumb]]&lt;br /&gt;
The '''F'''MR '''W'''ork'''B'''ench (FWB) is a User Interface (UI) for browsing and maintaining SDMX Structures obtained from SDMX compliant Structure Web Services.  The UI of the FWB is a stripped-down version of the Fusion Metadata Registry (FMR) User Interface; it is stripped down because the UI of the FWB supports the use case of viewing and maintaining structural metadata, whilst the FMR supports additional use cases including [[Validate_data|data validation]], [[Convert_data_between_SDMX_formats_V11|data conversion]], and has administrative UI pages.  Whilst the FMR uses a database to store its configuration settings, the FWB configuration is stored in a file.  '''The FWB has no database requirements'''.&lt;br /&gt;
&lt;br /&gt;
The FWB UI browses and displays the SDMX structures of the '''Environment''' it is connected to. An Environment is a connection to a collection of related SDMX web services for a single SDMX service offering. Related web services include the web service entry point to retrieve the structures, the entry point to save structures, and the entry point to delete structures.&lt;br /&gt;
&lt;br /&gt;
The UI of the FWB enables the user to switch their connection to an alternative Environment; the list of available Environments is defined in the configuration file for the FWB.  The connected Environment is associated with the current user; this enables multiple users of the FWB to be connected to different Environments simultaneously.&lt;br /&gt;
&lt;br /&gt;
= Getting Started = &lt;br /&gt;
The FMR Workbench (FWB) is deployed as a Web Application Archive (war) file.  The war file must be deployed to a Java Servlet container such as Apache Tomcat.  The Servlet container will host the application so that it can be accessed over HTTP as a web application.&lt;br /&gt;
&lt;br /&gt;
== Configuration File Location == &lt;br /&gt;
The FMR Workbench does not use a database, instead it obtains its configuration settings from a configuration file called fwb_config.json.&lt;br /&gt;
&lt;br /&gt;
An example configuration file is provided with the software.  The configuration file needs to be placed in the following directory (the directory must be created if it does not exist):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;USER HOME&amp;gt;\MetadataTechnology\FusionRegistry&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 C:\Users\Matthew Nelson\MetadataTechnology\FusionRegistry&lt;br /&gt;
&lt;br /&gt;
== Configuration File Properties ==&lt;br /&gt;
[[File:FWB Environment Selection.png|thumb|Showing the switch environment options]]&lt;br /&gt;
&lt;br /&gt;
The configuration file is split into 2 parts:&lt;br /&gt;
 &lt;br /&gt;
# Server Properties&lt;br /&gt;
# Environment Definitions&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;Properties&amp;quot;: { &amp;lt;span style=&amp;quot;color:#C00000&amp;quot;&amp;gt;server properties go here&amp;lt;/span&amp;gt; },&lt;br /&gt;
    &amp;quot;Environments&amp;quot;: [ &amp;lt;span style=&amp;quot;color:#C00000&amp;quot;&amp;gt;environment definitions go here&amp;lt;/span&amp;gt; ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&amp;lt;br/&amp;gt;&lt;br /&gt;
There is only 1 property which is required for the FWB, this is the URL to the FWB application. This property enables the application to know where to find required resources, and how to redirect users to the correct pages. &lt;br /&gt;
&lt;br /&gt;
 &amp;quot;Properties&amp;quot;: {&lt;br /&gt;
    server.url: &amp;quot;http://localhost:8080/fwb&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Localhost can be used for testing purposes when deploying the application to the same computer that the web browser is run from. For a live deployment this URL must be changed accordingly.&lt;br /&gt;
&lt;br /&gt;
'''Environments'''&amp;lt;br/&amp;gt;&lt;br /&gt;
The Environment property has an array of JSON Objects. Each JSON Object in this array defines a distinct Environment which the FWB can switch to in order to browse and optionally create/maintain the SDMX Structures of that Environment. &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
An Environment consists of an id and a name and defines the web service entry points to retrieve, save, and delete structures. The retrieve web service is required, the save and delete entry points are optional.  &lt;br /&gt;
&lt;br /&gt;
The Environment definition also contains details on the authentication mechanism used to access the contents of the web services.&lt;br /&gt;
&lt;br /&gt;
An example of an Environment definition is given below:&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;DOT_STAT&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot; : &amp;quot;Dot Stat Test&amp;quot;,&lt;br /&gt;
    &amp;quot;api&amp;quot;: {&lt;br /&gt;
        &amp;quot;query&amp;quot;: &amp;quot;https://nsi-demo-reset.siscc.org/rest&amp;quot;,&lt;br /&gt;
        &amp;quot;persist&amp;quot;: &amp;quot;https://nsi-demo-reset.siscc.org/rest/structure&amp;quot;,&lt;br /&gt;
        &amp;quot;delete&amp;quot;: &amp;quot;https://nsi-demo-stable.siscc.org/rest/structure&amp;quot;,&lt;br /&gt;
        &amp;quot;version&amp;quot;: &amp;quot;1.5.0&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;agencies&amp;quot;: [&amp;quot;SDMX&amp;quot;, &amp;quot;METATECH&amp;quot;],&lt;br /&gt;
    &amp;quot;auth&amp;quot;: &amp;quot;OIDC_PKCE&amp;quot;,&lt;br /&gt;
    &amp;quot;locale&amp;quot;: [&amp;quot;en&amp;quot;, &amp;quot;fr&amp;quot;],&lt;br /&gt;
    &amp;quot;oidc&amp;quot;: {&lt;br /&gt;
        &amp;quot;config&amp;quot;: &amp;quot;https://keycloak.siscc.org/auth/realms/OECD/.well-known/openid-configuration&amp;quot;,&lt;br /&gt;
        &amp;quot;clientId&amp;quot;: &amp;quot;app&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;format&amp;quot;: &amp;quot;mlv2.1&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following table describes the properties for an Environment definition based on the above example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Property !! Description&lt;br /&gt;
|-&lt;br /&gt;
| '''id''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; This is the ID of the Environment.  It is used in the REST API to switch environments&lt;br /&gt;
|-&lt;br /&gt;
| '''name''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; The name of the Environment as presented to the user&lt;br /&gt;
|-&lt;br /&gt;
| '''api''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; contains the base SDMX REST URL for each web service of the Environment&lt;br /&gt;
|-&lt;br /&gt;
| '''api.query''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; structure query web service&lt;br /&gt;
|-&lt;br /&gt;
| '''api.persist''' || &amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''Optional'''&amp;lt;/span&amp;gt; to support add/edit functionality.  HTTP POST messages will be sent to this URL&lt;br /&gt;
|-&lt;br /&gt;
| '''api.delete''' || &amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''Optional'''&amp;lt;/span&amp;gt; to support delete functionality, HTTP DELETE messages will be sent to this URL&lt;br /&gt;
|-&lt;br /&gt;
| '''api.version''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; the Version of the SDMX REST API.  Supported values are 1.5.0 and 2.0.0&lt;br /&gt;
|-&lt;br /&gt;
| '''api.timeout''' || &amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''Optional'''&amp;lt;/span&amp;gt; maximum number of seconds to wait for response from API before timing out. Defaults to120 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| '''format''' || The SDMX structure format used when POSTing structures to web service (for the use case of structure persistence).  &amp;lt;br/&amp;gt;&lt;br /&gt;
Options include:&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''mlv2.1'''&amp;lt;/span&amp;gt; – XML format SDMX-ML v.2.1 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''mlv3.0'''&amp;lt;/span&amp;gt; – XML format SDMX-ML v.3.0 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''jsonv1'''&amp;lt;/span&amp;gt; – JSON format SDMX-JSON v.1.0 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''jsonv2'''&amp;lt;/span&amp;gt; – JSON format SDMX-JSON v.2.0 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''fusion'''&amp;lt;/span&amp;gt; – the FMR specific format. This format should be used if connected to another FMR instance as it covers both SDMX structures and non-SDMX structures such as Publication Tables and Reporting Templates &amp;lt;br/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Apache Tomcat Example ==&lt;br /&gt;
[[File:FMR Workbench Home.png|thumb|Showing the home page of the Fusion Workbench]]&lt;br /&gt;
&lt;br /&gt;
If using Apache Tomcat, the war file would be placed under the ‘&amp;lt;tomcat&amp;gt;\webapps’ folder.  &lt;br /&gt;
&lt;br /&gt;
The name of the war file will be the name of the Web Application when accessed in the web browser, for example if the war file is called fwb.war, the application would be accessed using the following URL syntax:&lt;br /&gt;
&lt;br /&gt;
 http(s)://[server]:[port]/'''fwb'''&lt;br /&gt;
&lt;br /&gt;
Apache Tomcat can be started using the '''bin\startup.bat''' or on unix '''bin\startup.sh script'''.  An alternative is to start Tomcat as a windows service.&lt;br /&gt;
&lt;br /&gt;
On Tomcat startup the war file will be unpacked, creating a folder of the same name in the &amp;lt;tomcat&amp;gt;\webapps folder.&lt;br /&gt;
&lt;br /&gt;
After Tomcat has started the Fusion Workbench would be accessed from the following URL.&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/fwb&lt;br /&gt;
&lt;br /&gt;
This URL assumes the following conditions are true:&lt;br /&gt;
# The web browser is running on the same machine as the Tomcat server ('''localhost''' refers to the local machine).&lt;br /&gt;
# No configuration changes have been made to the official distribution of Apache Tomcat (default port is '''8080''').&lt;br /&gt;
# The FWB distribution has the file name fwb.war (fwb.war resolves to '''/fwb''' in the URL path)&lt;br /&gt;
&lt;br /&gt;
Assuming the configuration files are in the correct folder and are valid JSON with no missing required properties, the URL will resolve to the UI of the FWB.&lt;br /&gt;
&lt;br /&gt;
== Error Resolution ==&lt;br /&gt;
If the home page of the FWB fails to load, please check the log files from Apache Tomcat. Other than the Apache Tomcat log files, the FWB will create 2 application specific log files:&lt;br /&gt;
# FMRWorkbench.log – this file contains all logging output from the FWB.   Logs are output if they have a level of INFO or higher.&lt;br /&gt;
# FMRWorkbenchErrors.log – this file contains a subset of the logs from FMRWorkbench.log.  It only contains logs that were written with a severity of WARN or higher.&lt;br /&gt;
&lt;br /&gt;
To change the logging level, edit the '''logback.xml''' file which is found under the following location in Tomcat&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tomcat home&amp;gt;\webapps\fwb\WEB-INF\classes\logback.xml&lt;br /&gt;
&lt;br /&gt;
= Switching Services =&lt;br /&gt;
[[File:Fmr wb service.png|thumb]]&lt;br /&gt;
The header bar of the FMR-Workbench contains a button showing the currently connected service, clicking on this button will open a window to allow a different service to be connected.  By default the service is connected to anonymously, meaning only browser functionality will be supported.&lt;br /&gt;
&lt;br /&gt;
To authenticate, click on the Login button after connecting to the service.  &lt;br /&gt;
&lt;br /&gt;
= Authentication =&lt;br /&gt;
The FMR Workbench supports 2 forms of authentication with the connected service: Basic Authentication and OpenID Connect. The type of authentication is set up in the Config file of the FMR-Workbench.  &lt;br /&gt;
&lt;br /&gt;
== Basic Authentication ==&lt;br /&gt;
Clicking Login will take the user to the FMR-Workbench login page where the user is invited to enter a username and password.  These details are stored in the FMR-Workbench against the user's session, and they are used whenever the user interacts with the target service.  An initial check is performed against the target server to ensure the credentials can be used to obtain some structures, if the check fails then the details are deemed to be invalid and will be discarded.&lt;br /&gt;
&lt;br /&gt;
== Open ID Connect ==&lt;br /&gt;
Clicking Login will take the user to the OpenID Connect login page (defined in the configuration file of the FMR-Workbench).  The user authenticates with the chosen OpenID Connect authentication provider, on success the user is redirected back to the FMR-Workbench with a token.  The token is stored against the user's session, and used to authenticate with the target service. &lt;br /&gt;
&lt;br /&gt;
= Structure Navigation and Export =&lt;br /&gt;
The FMR-Workbench front end will display structures in the same way the FMR provides - clicking on a sidebar item (example Codelists) will display the Codelist page and all the Codelists in the connected service.  This is achieved by the front end issuing a SDMX web service query to the FMR Workbench for all Codelists as stubs.  This query is then forwarded to the connected service, and the response is written back to the client.  The FMR-Workbench can receive the query response from the connected service in any SDMX format.  The response will be parsed by the FMR-Workbench before being written out in the requested format.  This means the FMR-Workbench is able to write the response out in ANY format that the FMR Workbench supports, including Excel, SDMX, and JSON.  The user is therefore able to click on a Codelist and export it as Excel, even if the connected service does not support Excel as an output format.&lt;br /&gt;
&lt;br /&gt;
It is possible to automatically link to a page in the Fusion Registry against a specific service by providing the '''env''' argument in the URL, for example:&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/FMR-WB/items/conceptscheme.html?urn=urn:sdmx:org.sdmx.infomodel.conceptscheme.ConceptScheme=OECD:CS_TOURISM(1.0)&amp;amp;env=DOT_STAT&lt;br /&gt;
&lt;br /&gt;
The above link will take the user to a specific Concept Scheme in the User Interface, from the DOT_STAT environment.&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/FMR-WB/items/conceptscheme-wizard.html?urn=urn:sdmx:org.sdmx.infomodel.conceptscheme.ConceptScheme=OECD:CS_TOURISM(1.0)&amp;amp;env=DOT_STAT&lt;br /&gt;
&lt;br /&gt;
The above link will take the user to the Concept Scheme Wizard (the edit pages for a Concept Scheme).  The Concept Scheme wizard will be editing the CS_TOURISM concept in the DOT_STAT Environment.  As this page is a secure resource, the user will be automatically redirected to the login page if they are not already logged into the service.&lt;br /&gt;
&lt;br /&gt;
= SDMX Web Service =&lt;br /&gt;
It is important to note that the FMR-Workbench has the same web service entry points as the FMR, and whilst these web services work, they are not guaranteed to be fully compliant.  The web services of the FMR-Workbench forwards queries onto the connected service.  The queries may be modify to reduce the possibility of the target service not supporting the query. If the connected service reports any error in the query, the FMR-Workbench will report 'no structures' for the query.  &lt;br /&gt;
&lt;br /&gt;
The recommendation is therefore to not rely on the web services of the FMR-Workbench, instead use the web services provided by the target service directly. &lt;br /&gt;
&lt;br /&gt;
= Structure Creation/Modification =&lt;br /&gt;
If the user has logged into the connected service, they will be able to upload structures from the home page of the FMR-Workbench, or create/edit structures using the standard Wizards in the User Interface.  &lt;br /&gt;
&lt;br /&gt;
It is important to note that the FMR-Workbench contains the same User Interface as the FMR, and as such does not provision for the fact that the connected service may not support all the features of the FMR.  For example it may be possible in the FMR-Workbench to create a SDMX 3.0 DSD with multiple measures, but the target service may reject the save request.&lt;br /&gt;
&lt;br /&gt;
It is possible to load structures in any format supported by the FMR-Workbench, including Excel - these structures will be converted into a format supported by the connected service on the save request.&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=FMR_Workbench&amp;diff=6945</id>
		<title>FMR Workbench</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=FMR_Workbench&amp;diff=6945"/>
		<updated>2023-07-13T12:50:20Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Apache Tomcat Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
[[File:Fmr wb overview.png|thumb]]&lt;br /&gt;
The '''F'''MR '''W'''ork'''B'''ench (FWB) is a User Interface (UI) for browsing and maintaining SDMX Structures obtained from SDMX compliant Structure Web Services.  The UI of the FWB is a stripped-down version of the Fusion Metadata Registry (FMR) User Interface; it is stripped down because the UI of the FWB supports the use case of viewing and maintaining structural metadata, whilst the FMR supports additional use cases including [[Validate_data|data validation]], [[Convert_data_between_SDMX_formats_V11|data conversion]], and has administrative UI pages.  Whilst the FMR uses a database to store its configuration settings, the FWB configuration is stored in a file.  '''The FWB has no database requirements'''.&lt;br /&gt;
&lt;br /&gt;
The FWB UI browses and displays the SDMX structures of the '''Environment''' it is connected to. An Environment is a connection to a collection of related SDMX web services for a single SDMX service offering. Related web services include the web service entry point to retrieve the structures, the entry point to save structures, and the entry point to delete structures.&lt;br /&gt;
&lt;br /&gt;
The UI of the FWB enables the user to switch their connection to an alternative Environment; the list of available Environments is defined in the configuration file for the FWB.  The connected Environment is associated with the current user; this enables multiple users of the FWB to be connected to different Environments simultaneously.&lt;br /&gt;
&lt;br /&gt;
= Getting Started = &lt;br /&gt;
The FMR Workbench (FWB) is deployed as a Web Application Archive (war) file.  The war file must be deployed to a Java Servlet container such as Apache Tomcat.  The Servlet container will host the application so that it can be accessed over HTTP as a web application.&lt;br /&gt;
&lt;br /&gt;
== Configuration File Location == &lt;br /&gt;
The FMR Workbench does not use a database, instead it obtains its configuration settings from a configuration file called fwb_config.json.&lt;br /&gt;
&lt;br /&gt;
An example configuration file is provided with the software.  The configuration file needs to be placed in the following directory (the directory must be created if it does not exist):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;USER HOME&amp;gt;\MetadataTechnology\FusionRegistry&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 C:\Users\Matthew Nelson\MetadataTechnology\FusionRegistry&lt;br /&gt;
&lt;br /&gt;
== Configuration File Properties ==&lt;br /&gt;
[[File:FWB Environment Selection.png|thumb|Showing the switch environment options]]&lt;br /&gt;
&lt;br /&gt;
The configuration file is split into 2 parts:&lt;br /&gt;
 &lt;br /&gt;
# Server Properties&lt;br /&gt;
# Environment Definitions&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;Properties&amp;quot;: { &amp;lt;span style=&amp;quot;color:#C00000&amp;quot;&amp;gt;server properties go here&amp;lt;/span&amp;gt; },&lt;br /&gt;
    &amp;quot;Environments&amp;quot;: [ &amp;lt;span style=&amp;quot;color:#C00000&amp;quot;&amp;gt;environment definitions go here&amp;lt;/span&amp;gt; ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&amp;lt;br/&amp;gt;&lt;br /&gt;
There is only 1 property which is required for the FWB, this is the URL to the FWB application. This property enables the application to know where to find required resources, and how to redirect users to the correct pages. &lt;br /&gt;
&lt;br /&gt;
 &amp;quot;Properties&amp;quot;: {&lt;br /&gt;
    server.url: &amp;quot;http://localhost:8080/fwb&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Localhost can be used for testing purposes when deploying the application to the same computer that the web browser is run from. For a live deployment this URL must be changed accordingly.&lt;br /&gt;
&lt;br /&gt;
'''Environments'''&amp;lt;br/&amp;gt;&lt;br /&gt;
The Environment property has an array of JSON Objects. Each JSON Object in this array defines a distinct Environment which the FWB can switch to in order to browse and optionally create/maintain the SDMX Structures of that Environment. &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
An Environment consists of an id and a name and defines the web service entry points to retrieve, save, and delete structures. The retrieve web service is required, the save and delete entry points are optional.  &lt;br /&gt;
&lt;br /&gt;
The Environment definition also contains details on the authentication mechanism used to access the contents of the web services.&lt;br /&gt;
&lt;br /&gt;
An example of an Environment definition is given below:&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;DOT_STAT&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot; : &amp;quot;Dot Stat Test&amp;quot;,&lt;br /&gt;
    &amp;quot;api&amp;quot;: {&lt;br /&gt;
        &amp;quot;query&amp;quot;: &amp;quot;https://nsi-demo-reset.siscc.org/rest&amp;quot;,&lt;br /&gt;
        &amp;quot;persist&amp;quot;: &amp;quot;https://nsi-demo-reset.siscc.org/rest/structure&amp;quot;,&lt;br /&gt;
        &amp;quot;delete&amp;quot;: &amp;quot;https://nsi-demo-stable.siscc.org/rest/structure&amp;quot;,&lt;br /&gt;
        &amp;quot;version&amp;quot;: &amp;quot;1.5.0&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;agencies&amp;quot;: [&amp;quot;SDMX&amp;quot;, &amp;quot;METATECH&amp;quot;],&lt;br /&gt;
    &amp;quot;auth&amp;quot;: &amp;quot;OIDC_PKCE&amp;quot;,&lt;br /&gt;
    &amp;quot;locale&amp;quot;: [&amp;quot;en&amp;quot;, &amp;quot;fr&amp;quot;],&lt;br /&gt;
    &amp;quot;oidc&amp;quot;: {&lt;br /&gt;
        &amp;quot;config&amp;quot;: &amp;quot;https://keycloak.siscc.org/auth/realms/OECD/.well-known/openid-configuration&amp;quot;,&lt;br /&gt;
        &amp;quot;clientId&amp;quot;: &amp;quot;app&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;format&amp;quot;: &amp;quot;mlv2.1&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following table describes the properties for an Environment definition based on the above example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Property !! Description&lt;br /&gt;
|-&lt;br /&gt;
| '''id''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; This is the ID of the Environment.  It is used in the REST API to switch environments&lt;br /&gt;
|-&lt;br /&gt;
| '''name''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; The name of the Environment as presented to the user&lt;br /&gt;
|-&lt;br /&gt;
| '''api''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; contains the base SDMX REST URL for each web service of the Environment&lt;br /&gt;
|-&lt;br /&gt;
| '''api.query''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; structure query web service&lt;br /&gt;
|-&lt;br /&gt;
| '''api.persist''' || &amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''Optional'''&amp;lt;/span&amp;gt; to support add/edit functionality.  HTTP POST messages will be sent to this URL&lt;br /&gt;
|-&lt;br /&gt;
| '''api.delete''' || &amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''Optional'''&amp;lt;/span&amp;gt; to support delete functionality, HTTP DELETE messages will be sent to this URL&lt;br /&gt;
|-&lt;br /&gt;
| '''api.version''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; the Version of the SDMX REST API.  Supported values are 1.5.0 and 2.0.0&lt;br /&gt;
|-&lt;br /&gt;
| '''api.timeout''' || &amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''Optional'''&amp;lt;/span&amp;gt; maximum number of seconds to wait for response from API before timing out. Defaults to120 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| '''format''' || The SDMX structure format used when POSTing structures to web service (for the use case of structure persistence).  &amp;lt;br/&amp;gt;&lt;br /&gt;
Options include:&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''mlv2.1'''&amp;lt;/span&amp;gt; – XML format SDMX-ML v.2.1 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''mlv3.0'''&amp;lt;/span&amp;gt; – XML format SDMX-ML v.3.0 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''jsonv1'''&amp;lt;/span&amp;gt; – JSON format SDMX-JSON v.1.0 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''jsonv2'''&amp;lt;/span&amp;gt; – JSON format SDMX-JSON v.2.0 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''fusion'''&amp;lt;/span&amp;gt; – the FMR specific format. This format should be used if connected to another FMR instance as it covers both SDMX structures and non-SDMX structures such as Publication Tables and Reporting Templates &amp;lt;br/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Apache Tomcat Example ==&lt;br /&gt;
[[File:FMR Workbench Home.png|center|Showing the home page of the Fusion Workbench]]&lt;br /&gt;
&lt;br /&gt;
If using Apache Tomcat, the war file would be placed under the ‘&amp;lt;tomcat&amp;gt;\webapps’ folder.  &lt;br /&gt;
&lt;br /&gt;
The name of the war file will be the name of the Web Application when accessed in the web browser, for example if the war file is called fwb.war, the application would be accessed using the following URL syntax:&lt;br /&gt;
&lt;br /&gt;
 http(s)://[server]:[port]/'''fwb'''&lt;br /&gt;
&lt;br /&gt;
Apache Tomcat can be started using the '''bin\startup.bat''' or on unix '''bin\startup.sh script'''.  An alternative is to start Tomcat as a windows service.&lt;br /&gt;
&lt;br /&gt;
On Tomcat startup the war file will be unpacked, creating a folder of the same name in the &amp;lt;tomcat&amp;gt;\webapps folder.&lt;br /&gt;
&lt;br /&gt;
After Tomcat has started the Fusion Workbench would be accessed from the following URL.&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/fwb&lt;br /&gt;
&lt;br /&gt;
This URL assumes the following conditions are true:&lt;br /&gt;
# The web browser is running on the same machine as the Tomcat server ('''localhost''' refers to the local machine).&lt;br /&gt;
# No configuration changes have been made to the official distribution of Apache Tomcat (default port is '''8080''').&lt;br /&gt;
# The FWB distribution has the file name fwb.war (fwb.war resolves to '''/fwb''' in the URL path)&lt;br /&gt;
&lt;br /&gt;
Assuming the configuration files are in the correct folder and are valid JSON with no missing required properties, the URL will resolve to the UI of the FWB.&lt;br /&gt;
&lt;br /&gt;
== Error Resolution ==&lt;br /&gt;
If the home page of the FWB fails to load, please check the log files from Apache Tomcat. Other than the Apache Tomcat log files, the FWB will create 2 application specific log files:&lt;br /&gt;
# FMRWorkbench.log – this file contains all logging output from the FWB.   Logs are output if they have a level of INFO or higher.&lt;br /&gt;
# FMRWorkbenchErrors.log – this file contains a subset of the logs from FMRWorkbench.log.  It only contains logs that were written with a severity of WARN or higher.&lt;br /&gt;
&lt;br /&gt;
To change the logging level, edit the '''logback.xml''' file which is found under the following location in Tomcat&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tomcat home&amp;gt;\webapps\fwb\WEB-INF\classes\logback.xml&lt;br /&gt;
&lt;br /&gt;
= Switching Services =&lt;br /&gt;
[[File:Fmr wb service.png|thumb]]&lt;br /&gt;
The header bar of the FMR-Workbench contains a button showing the currently connected service, clicking on this button will open a window to allow a different service to be connected.  By default the service is connected to anonymously, meaning only browser functionality will be supported.&lt;br /&gt;
&lt;br /&gt;
To authenticate, click on the Login button after connecting to the service.  &lt;br /&gt;
&lt;br /&gt;
= Authentication =&lt;br /&gt;
The FMR Workbench supports 2 forms of authentication with the connected service: Basic Authentication and OpenID Connect. The type of authentication is set up in the Config file of the FMR-Workbench.  &lt;br /&gt;
&lt;br /&gt;
== Basic Authentication ==&lt;br /&gt;
Clicking Login will take the user to the FMR-Workbench login page where the user is invited to enter a username and password.  These details are stored in the FMR-Workbench against the user's session, and they are used whenever the user interacts with the target service.  An initial check is performed against the target server to ensure the credentials can be used to obtain some structures, if the check fails then the details are deemed to be invalid and will be discarded.&lt;br /&gt;
&lt;br /&gt;
== Open ID Connect ==&lt;br /&gt;
Clicking Login will take the user to the OpenID Connect login page (defined in the configuration file of the FMR-Workbench).  The user authenticates with the chosen OpenID Connect authentication provider, on success the user is redirected back to the FMR-Workbench with a token.  The token is stored against the user's session, and used to authenticate with the target service. &lt;br /&gt;
&lt;br /&gt;
= Structure Navigation and Export =&lt;br /&gt;
The FMR-Workbench front end will display structures in the same way the FMR provides - clicking on a sidebar item (example Codelists) will display the Codelist page and all the Codelists in the connected service.  This is achieved by the front end issuing a SDMX web service query to the FMR Workbench for all Codelists as stubs.  This query is then forwarded to the connected service, and the response is written back to the client.  The FMR-Workbench can receive the query response from the connected service in any SDMX format.  The response will be parsed by the FMR-Workbench before being written out in the requested format.  This means the FMR-Workbench is able to write the response out in ANY format that the FMR Workbench supports, including Excel, SDMX, and JSON.  The user is therefore able to click on a Codelist and export it as Excel, even if the connected service does not support Excel as an output format.&lt;br /&gt;
&lt;br /&gt;
It is possible to automatically link to a page in the Fusion Registry against a specific service by providing the '''env''' argument in the URL, for example:&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/FMR-WB/items/conceptscheme.html?urn=urn:sdmx:org.sdmx.infomodel.conceptscheme.ConceptScheme=OECD:CS_TOURISM(1.0)&amp;amp;env=DOT_STAT&lt;br /&gt;
&lt;br /&gt;
The above link will take the user to a specific Concept Scheme in the User Interface, from the DOT_STAT environment.&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/FMR-WB/items/conceptscheme-wizard.html?urn=urn:sdmx:org.sdmx.infomodel.conceptscheme.ConceptScheme=OECD:CS_TOURISM(1.0)&amp;amp;env=DOT_STAT&lt;br /&gt;
&lt;br /&gt;
The above link will take the user to the Concept Scheme Wizard (the edit pages for a Concept Scheme).  The Concept Scheme wizard will be editing the CS_TOURISM concept in the DOT_STAT Environment.  As this page is a secure resource, the user will be automatically redirected to the login page if they are not already logged into the service.&lt;br /&gt;
&lt;br /&gt;
= SDMX Web Service =&lt;br /&gt;
It is important to note that the FMR-Workbench has the same web service entry points as the FMR, and whilst these web services work, they are not guaranteed to be fully compliant.  The web services of the FMR-Workbench forwards queries onto the connected service.  The queries may be modify to reduce the possibility of the target service not supporting the query. If the connected service reports any error in the query, the FMR-Workbench will report 'no structures' for the query.  &lt;br /&gt;
&lt;br /&gt;
The recommendation is therefore to not rely on the web services of the FMR-Workbench, instead use the web services provided by the target service directly. &lt;br /&gt;
&lt;br /&gt;
= Structure Creation/Modification =&lt;br /&gt;
If the user has logged into the connected service, they will be able to upload structures from the home page of the FMR-Workbench, or create/edit structures using the standard Wizards in the User Interface.  &lt;br /&gt;
&lt;br /&gt;
It is important to note that the FMR-Workbench contains the same User Interface as the FMR, and as such does not provision for the fact that the connected service may not support all the features of the FMR.  For example it may be possible in the FMR-Workbench to create a SDMX 3.0 DSD with multiple measures, but the target service may reject the save request.&lt;br /&gt;
&lt;br /&gt;
It is possible to load structures in any format supported by the FMR-Workbench, including Excel - these structures will be converted into a format supported by the connected service on the save request.&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=FMR_Workbench&amp;diff=6944</id>
		<title>FMR Workbench</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=FMR_Workbench&amp;diff=6944"/>
		<updated>2023-07-13T12:49:49Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Configuration File Properties */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
[[File:Fmr wb overview.png|thumb]]&lt;br /&gt;
The '''F'''MR '''W'''ork'''B'''ench (FWB) is a User Interface (UI) for browsing and maintaining SDMX Structures obtained from SDMX compliant Structure Web Services.  The UI of the FWB is a stripped-down version of the Fusion Metadata Registry (FMR) User Interface; it is stripped down because the UI of the FWB supports the use case of viewing and maintaining structural metadata, whilst the FMR supports additional use cases including [[Validate_data|data validation]], [[Convert_data_between_SDMX_formats_V11|data conversion]], and has administrative UI pages.  Whilst the FMR uses a database to store its configuration settings, the FWB configuration is stored in a file.  '''The FWB has no database requirements'''.&lt;br /&gt;
&lt;br /&gt;
The FWB UI browses and displays the SDMX structures of the '''Environment''' it is connected to. An Environment is a connection to a collection of related SDMX web services for a single SDMX service offering. Related web services include the web service entry point to retrieve the structures, the entry point to save structures, and the entry point to delete structures.&lt;br /&gt;
&lt;br /&gt;
The UI of the FWB enables the user to switch their connection to an alternative Environment; the list of available Environments is defined in the configuration file for the FWB.  The connected Environment is associated with the current user; this enables multiple users of the FWB to be connected to different Environments simultaneously.&lt;br /&gt;
&lt;br /&gt;
= Getting Started = &lt;br /&gt;
The FMR Workbench (FWB) is deployed as a Web Application Archive (war) file.  The war file must be deployed to a Java Servlet container such as Apache Tomcat.  The Servlet container will host the application so that it can be accessed over HTTP as a web application.&lt;br /&gt;
&lt;br /&gt;
== Configuration File Location == &lt;br /&gt;
The FMR Workbench does not use a database, instead it obtains its configuration settings from a configuration file called fwb_config.json.&lt;br /&gt;
&lt;br /&gt;
An example configuration file is provided with the software.  The configuration file needs to be placed in the following directory (the directory must be created if it does not exist):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;USER HOME&amp;gt;\MetadataTechnology\FusionRegistry&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 C:\Users\Matthew Nelson\MetadataTechnology\FusionRegistry&lt;br /&gt;
&lt;br /&gt;
== Configuration File Properties ==&lt;br /&gt;
[[File:FWB Environment Selection.png|thumb|Showing the switch environment options]]&lt;br /&gt;
&lt;br /&gt;
The configuration file is split into 2 parts:&lt;br /&gt;
 &lt;br /&gt;
# Server Properties&lt;br /&gt;
# Environment Definitions&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;Properties&amp;quot;: { &amp;lt;span style=&amp;quot;color:#C00000&amp;quot;&amp;gt;server properties go here&amp;lt;/span&amp;gt; },&lt;br /&gt;
    &amp;quot;Environments&amp;quot;: [ &amp;lt;span style=&amp;quot;color:#C00000&amp;quot;&amp;gt;environment definitions go here&amp;lt;/span&amp;gt; ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&amp;lt;br/&amp;gt;&lt;br /&gt;
There is only 1 property which is required for the FWB, this is the URL to the FWB application. This property enables the application to know where to find required resources, and how to redirect users to the correct pages. &lt;br /&gt;
&lt;br /&gt;
 &amp;quot;Properties&amp;quot;: {&lt;br /&gt;
    server.url: &amp;quot;http://localhost:8080/fwb&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Localhost can be used for testing purposes when deploying the application to the same computer that the web browser is run from. For a live deployment this URL must be changed accordingly.&lt;br /&gt;
&lt;br /&gt;
'''Environments'''&amp;lt;br/&amp;gt;&lt;br /&gt;
The Environment property has an array of JSON Objects. Each JSON Object in this array defines a distinct Environment which the FWB can switch to in order to browse and optionally create/maintain the SDMX Structures of that Environment. &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
An Environment consists of an id and a name and defines the web service entry points to retrieve, save, and delete structures. The retrieve web service is required, the save and delete entry points are optional.  &lt;br /&gt;
&lt;br /&gt;
The Environment definition also contains details on the authentication mechanism used to access the contents of the web services.&lt;br /&gt;
&lt;br /&gt;
An example of an Environment definition is given below:&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;DOT_STAT&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot; : &amp;quot;Dot Stat Test&amp;quot;,&lt;br /&gt;
    &amp;quot;api&amp;quot;: {&lt;br /&gt;
        &amp;quot;query&amp;quot;: &amp;quot;https://nsi-demo-reset.siscc.org/rest&amp;quot;,&lt;br /&gt;
        &amp;quot;persist&amp;quot;: &amp;quot;https://nsi-demo-reset.siscc.org/rest/structure&amp;quot;,&lt;br /&gt;
        &amp;quot;delete&amp;quot;: &amp;quot;https://nsi-demo-stable.siscc.org/rest/structure&amp;quot;,&lt;br /&gt;
        &amp;quot;version&amp;quot;: &amp;quot;1.5.0&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;agencies&amp;quot;: [&amp;quot;SDMX&amp;quot;, &amp;quot;METATECH&amp;quot;],&lt;br /&gt;
    &amp;quot;auth&amp;quot;: &amp;quot;OIDC_PKCE&amp;quot;,&lt;br /&gt;
    &amp;quot;locale&amp;quot;: [&amp;quot;en&amp;quot;, &amp;quot;fr&amp;quot;],&lt;br /&gt;
    &amp;quot;oidc&amp;quot;: {&lt;br /&gt;
        &amp;quot;config&amp;quot;: &amp;quot;https://keycloak.siscc.org/auth/realms/OECD/.well-known/openid-configuration&amp;quot;,&lt;br /&gt;
        &amp;quot;clientId&amp;quot;: &amp;quot;app&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;format&amp;quot;: &amp;quot;mlv2.1&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following table describes the properties for an Environment definition based on the above example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Property !! Description&lt;br /&gt;
|-&lt;br /&gt;
| '''id''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; This is the ID of the Environment.  It is used in the REST API to switch environments&lt;br /&gt;
|-&lt;br /&gt;
| '''name''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; The name of the Environment as presented to the user&lt;br /&gt;
|-&lt;br /&gt;
| '''api''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; contains the base SDMX REST URL for each web service of the Environment&lt;br /&gt;
|-&lt;br /&gt;
| '''api.query''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; structure query web service&lt;br /&gt;
|-&lt;br /&gt;
| '''api.persist''' || &amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''Optional'''&amp;lt;/span&amp;gt; to support add/edit functionality.  HTTP POST messages will be sent to this URL&lt;br /&gt;
|-&lt;br /&gt;
| '''api.delete''' || &amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''Optional'''&amp;lt;/span&amp;gt; to support delete functionality, HTTP DELETE messages will be sent to this URL&lt;br /&gt;
|-&lt;br /&gt;
| '''api.version''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; the Version of the SDMX REST API.  Supported values are 1.5.0 and 2.0.0&lt;br /&gt;
|-&lt;br /&gt;
| '''api.timeout''' || &amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''Optional'''&amp;lt;/span&amp;gt; maximum number of seconds to wait for response from API before timing out. Defaults to120 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| '''format''' || The SDMX structure format used when POSTing structures to web service (for the use case of structure persistence).  &amp;lt;br/&amp;gt;&lt;br /&gt;
Options include:&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''mlv2.1'''&amp;lt;/span&amp;gt; – XML format SDMX-ML v.2.1 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''mlv3.0'''&amp;lt;/span&amp;gt; – XML format SDMX-ML v.3.0 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''jsonv1'''&amp;lt;/span&amp;gt; – JSON format SDMX-JSON v.1.0 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''jsonv2'''&amp;lt;/span&amp;gt; – JSON format SDMX-JSON v.2.0 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''fusion'''&amp;lt;/span&amp;gt; – the FMR specific format. This format should be used if connected to another FMR instance as it covers both SDMX structures and non-SDMX structures such as Publication Tables and Reporting Templates &amp;lt;br/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Apache Tomcat Example ==&lt;br /&gt;
If using Apache Tomcat, the war file would be placed under the ‘&amp;lt;tomcat&amp;gt;\webapps’ folder.  &lt;br /&gt;
&lt;br /&gt;
The name of the war file will be the name of the Web Application when accessed in the web browser, for example if the war file is called fwb.war, the application would be accessed using the following URL syntax:&lt;br /&gt;
&lt;br /&gt;
 http(s)://[server]:[port]/'''fwb'''&lt;br /&gt;
&lt;br /&gt;
Apache Tomcat can be started using the '''bin\startup.bat''' or on unix '''bin\startup.sh script'''.  An alternative is to start Tomcat as a windows service.&lt;br /&gt;
&lt;br /&gt;
On Tomcat startup the war file will be unpacked, creating a folder of the same name in the &amp;lt;tomcat&amp;gt;\webapps folder.&lt;br /&gt;
&lt;br /&gt;
After Tomcat has started the Fusion Workbench would be accessed from the following URL.&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/fwb&lt;br /&gt;
&lt;br /&gt;
This URL assumes the following conditions are true:&lt;br /&gt;
# The web browser is running on the same machine as the Tomcat server ('''localhost''' refers to the local machine).&lt;br /&gt;
# No configuration changes have been made to the official distribution of Apache Tomcat (default port is '''8080''').&lt;br /&gt;
# The FWB distribution has the file name fwb.war (fwb.war resolves to '''/fwb''' in the URL path)&lt;br /&gt;
&lt;br /&gt;
Assuming the configuration files are in the correct folder and are valid JSON with no missing required properties, the URL will resolve to the UI of the FWB.&lt;br /&gt;
&lt;br /&gt;
[[File:FMR Workbench Home.png|center]]&lt;br /&gt;
&lt;br /&gt;
== Error Resolution ==&lt;br /&gt;
If the home page of the FWB fails to load, please check the log files from Apache Tomcat. Other than the Apache Tomcat log files, the FWB will create 2 application specific log files:&lt;br /&gt;
# FMRWorkbench.log – this file contains all logging output from the FWB.   Logs are output if they have a level of INFO or higher.&lt;br /&gt;
# FMRWorkbenchErrors.log – this file contains a subset of the logs from FMRWorkbench.log.  It only contains logs that were written with a severity of WARN or higher.&lt;br /&gt;
&lt;br /&gt;
To change the logging level, edit the '''logback.xml''' file which is found under the following location in Tomcat&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tomcat home&amp;gt;\webapps\fwb\WEB-INF\classes\logback.xml&lt;br /&gt;
&lt;br /&gt;
= Switching Services =&lt;br /&gt;
[[File:Fmr wb service.png|thumb]]&lt;br /&gt;
The header bar of the FMR-Workbench contains a button showing the currently connected service, clicking on this button will open a window to allow a different service to be connected.  By default the service is connected to anonymously, meaning only browser functionality will be supported.&lt;br /&gt;
&lt;br /&gt;
To authenticate, click on the Login button after connecting to the service.  &lt;br /&gt;
&lt;br /&gt;
= Authentication =&lt;br /&gt;
The FMR Workbench supports 2 forms of authentication with the connected service: Basic Authentication and OpenID Connect. The type of authentication is set up in the Config file of the FMR-Workbench.  &lt;br /&gt;
&lt;br /&gt;
== Basic Authentication ==&lt;br /&gt;
Clicking Login will take the user to the FMR-Workbench login page where the user is invited to enter a username and password.  These details are stored in the FMR-Workbench against the user's session, and they are used whenever the user interacts with the target service.  An initial check is performed against the target server to ensure the credentials can be used to obtain some structures, if the check fails then the details are deemed to be invalid and will be discarded.&lt;br /&gt;
&lt;br /&gt;
== Open ID Connect ==&lt;br /&gt;
Clicking Login will take the user to the OpenID Connect login page (defined in the configuration file of the FMR-Workbench).  The user authenticates with the chosen OpenID Connect authentication provider, on success the user is redirected back to the FMR-Workbench with a token.  The token is stored against the user's session, and used to authenticate with the target service. &lt;br /&gt;
&lt;br /&gt;
= Structure Navigation and Export =&lt;br /&gt;
The FMR-Workbench front end will display structures in the same way the FMR provides - clicking on a sidebar item (example Codelists) will display the Codelist page and all the Codelists in the connected service.  This is achieved by the front end issuing a SDMX web service query to the FMR Workbench for all Codelists as stubs.  This query is then forwarded to the connected service, and the response is written back to the client.  The FMR-Workbench can receive the query response from the connected service in any SDMX format.  The response will be parsed by the FMR-Workbench before being written out in the requested format.  This means the FMR-Workbench is able to write the response out in ANY format that the FMR Workbench supports, including Excel, SDMX, and JSON.  The user is therefore able to click on a Codelist and export it as Excel, even if the connected service does not support Excel as an output format.&lt;br /&gt;
&lt;br /&gt;
It is possible to automatically link to a page in the Fusion Registry against a specific service by providing the '''env''' argument in the URL, for example:&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/FMR-WB/items/conceptscheme.html?urn=urn:sdmx:org.sdmx.infomodel.conceptscheme.ConceptScheme=OECD:CS_TOURISM(1.0)&amp;amp;env=DOT_STAT&lt;br /&gt;
&lt;br /&gt;
The above link will take the user to a specific Concept Scheme in the User Interface, from the DOT_STAT environment.&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/FMR-WB/items/conceptscheme-wizard.html?urn=urn:sdmx:org.sdmx.infomodel.conceptscheme.ConceptScheme=OECD:CS_TOURISM(1.0)&amp;amp;env=DOT_STAT&lt;br /&gt;
&lt;br /&gt;
The above link will take the user to the Concept Scheme Wizard (the edit pages for a Concept Scheme).  The Concept Scheme wizard will be editing the CS_TOURISM concept in the DOT_STAT Environment.  As this page is a secure resource, the user will be automatically redirected to the login page if they are not already logged into the service.&lt;br /&gt;
&lt;br /&gt;
= SDMX Web Service =&lt;br /&gt;
It is important to note that the FMR-Workbench has the same web service entry points as the FMR, and whilst these web services work, they are not guaranteed to be fully compliant.  The web services of the FMR-Workbench forwards queries onto the connected service.  The queries may be modify to reduce the possibility of the target service not supporting the query. If the connected service reports any error in the query, the FMR-Workbench will report 'no structures' for the query.  &lt;br /&gt;
&lt;br /&gt;
The recommendation is therefore to not rely on the web services of the FMR-Workbench, instead use the web services provided by the target service directly. &lt;br /&gt;
&lt;br /&gt;
= Structure Creation/Modification =&lt;br /&gt;
If the user has logged into the connected service, they will be able to upload structures from the home page of the FMR-Workbench, or create/edit structures using the standard Wizards in the User Interface.  &lt;br /&gt;
&lt;br /&gt;
It is important to note that the FMR-Workbench contains the same User Interface as the FMR, and as such does not provision for the fact that the connected service may not support all the features of the FMR.  For example it may be possible in the FMR-Workbench to create a SDMX 3.0 DSD with multiple measures, but the target service may reject the save request.&lt;br /&gt;
&lt;br /&gt;
It is possible to load structures in any format supported by the FMR-Workbench, including Excel - these structures will be converted into a format supported by the connected service on the save request.&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=FMR_Workbench&amp;diff=6943</id>
		<title>FMR Workbench</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=FMR_Workbench&amp;diff=6943"/>
		<updated>2023-07-13T12:49:11Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Apache Tomcat Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
[[File:Fmr wb overview.png|thumb]]&lt;br /&gt;
The '''F'''MR '''W'''ork'''B'''ench (FWB) is a User Interface (UI) for browsing and maintaining SDMX Structures obtained from SDMX compliant Structure Web Services.  The UI of the FWB is a stripped-down version of the Fusion Metadata Registry (FMR) User Interface; it is stripped down because the UI of the FWB supports the use case of viewing and maintaining structural metadata, whilst the FMR supports additional use cases including [[Validate_data|data validation]], [[Convert_data_between_SDMX_formats_V11|data conversion]], and has administrative UI pages.  Whilst the FMR uses a database to store its configuration settings, the FWB configuration is stored in a file.  '''The FWB has no database requirements'''.&lt;br /&gt;
&lt;br /&gt;
The FWB UI browses and displays the SDMX structures of the '''Environment''' it is connected to. An Environment is a connection to a collection of related SDMX web services for a single SDMX service offering. Related web services include the web service entry point to retrieve the structures, the entry point to save structures, and the entry point to delete structures.&lt;br /&gt;
&lt;br /&gt;
The UI of the FWB enables the user to switch their connection to an alternative Environment; the list of available Environments is defined in the configuration file for the FWB.  The connected Environment is associated with the current user; this enables multiple users of the FWB to be connected to different Environments simultaneously.&lt;br /&gt;
&lt;br /&gt;
= Getting Started = &lt;br /&gt;
The FMR Workbench (FWB) is deployed as a Web Application Archive (war) file.  The war file must be deployed to a Java Servlet container such as Apache Tomcat.  The Servlet container will host the application so that it can be accessed over HTTP as a web application.&lt;br /&gt;
&lt;br /&gt;
== Configuration File Location == &lt;br /&gt;
The FMR Workbench does not use a database, instead it obtains its configuration settings from a configuration file called fwb_config.json.&lt;br /&gt;
&lt;br /&gt;
An example configuration file is provided with the software.  The configuration file needs to be placed in the following directory (the directory must be created if it does not exist):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;USER HOME&amp;gt;\MetadataTechnology\FusionRegistry&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 C:\Users\Matthew Nelson\MetadataTechnology\FusionRegistry&lt;br /&gt;
&lt;br /&gt;
== Configuration File Properties ==&lt;br /&gt;
The configuration file is split into 2 parts:&lt;br /&gt;
 &lt;br /&gt;
# Server Properties&lt;br /&gt;
# Environment Definitions&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;Properties&amp;quot;: { &amp;lt;span style=&amp;quot;color:#C00000&amp;quot;&amp;gt;server properties go here&amp;lt;/span&amp;gt; },&lt;br /&gt;
    &amp;quot;Environments&amp;quot;: [ &amp;lt;span style=&amp;quot;color:#C00000&amp;quot;&amp;gt;environment definitions go here&amp;lt;/span&amp;gt; ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&amp;lt;br/&amp;gt;&lt;br /&gt;
There is only 1 property which is required for the FWB, this is the URL to the FWB application. This property enables the application to know where to find required resources, and how to redirect users to the correct pages. &lt;br /&gt;
&lt;br /&gt;
 &amp;quot;Properties&amp;quot;: {&lt;br /&gt;
    server.url: &amp;quot;http://localhost:8080/fwb&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Localhost can be used for testing purposes when deploying the application to the same computer that the web browser is run from. For a live deployment this URL must be changed accordingly.&lt;br /&gt;
&lt;br /&gt;
'''Environments'''&amp;lt;br/&amp;gt;&lt;br /&gt;
The Environment property has an array of JSON Objects. Each JSON Object in this array defines a distinct Environment which the FWB can switch to in order to browse and optionally create/maintain the SDMX Structures of that Environment. &lt;br /&gt;
 &lt;br /&gt;
[[File:FWB Environment Selection.png|center]]&lt;br /&gt;
&lt;br /&gt;
An Environment consists of an id and a name and defines the web service entry points to retrieve, save, and delete structures. The retrieve web service is required, the save and delete entry points are optional.  &lt;br /&gt;
&lt;br /&gt;
The Environment definition also contains details on the authentication mechanism used to access the contents of the web services.&lt;br /&gt;
&lt;br /&gt;
An example of an Environment definition is given below:&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;DOT_STAT&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot; : &amp;quot;Dot Stat Test&amp;quot;,&lt;br /&gt;
    &amp;quot;api&amp;quot;: {&lt;br /&gt;
        &amp;quot;query&amp;quot;: &amp;quot;https://nsi-demo-reset.siscc.org/rest&amp;quot;,&lt;br /&gt;
        &amp;quot;persist&amp;quot;: &amp;quot;https://nsi-demo-reset.siscc.org/rest/structure&amp;quot;,&lt;br /&gt;
        &amp;quot;delete&amp;quot;: &amp;quot;https://nsi-demo-stable.siscc.org/rest/structure&amp;quot;,&lt;br /&gt;
        &amp;quot;version&amp;quot;: &amp;quot;1.5.0&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;agencies&amp;quot;: [&amp;quot;SDMX&amp;quot;, &amp;quot;METATECH&amp;quot;],&lt;br /&gt;
    &amp;quot;auth&amp;quot;: &amp;quot;OIDC_PKCE&amp;quot;,&lt;br /&gt;
    &amp;quot;locale&amp;quot;: [&amp;quot;en&amp;quot;, &amp;quot;fr&amp;quot;],&lt;br /&gt;
    &amp;quot;oidc&amp;quot;: {&lt;br /&gt;
        &amp;quot;config&amp;quot;: &amp;quot;https://keycloak.siscc.org/auth/realms/OECD/.well-known/openid-configuration&amp;quot;,&lt;br /&gt;
        &amp;quot;clientId&amp;quot;: &amp;quot;app&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;format&amp;quot;: &amp;quot;mlv2.1&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following table describes the properties for an Environment definition based on the above example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Property !! Description&lt;br /&gt;
|-&lt;br /&gt;
| '''id''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; This is the ID of the Environment.  It is used in the REST API to switch environments&lt;br /&gt;
|-&lt;br /&gt;
| '''name''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; The name of the Environment as presented to the user&lt;br /&gt;
|-&lt;br /&gt;
| '''api''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; contains the base SDMX REST URL for each web service of the Environment&lt;br /&gt;
|-&lt;br /&gt;
| '''api.query''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; structure query web service&lt;br /&gt;
|-&lt;br /&gt;
| '''api.persist''' || &amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''Optional'''&amp;lt;/span&amp;gt; to support add/edit functionality.  HTTP POST messages will be sent to this URL&lt;br /&gt;
|-&lt;br /&gt;
| '''api.delete''' || &amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''Optional'''&amp;lt;/span&amp;gt; to support delete functionality, HTTP DELETE messages will be sent to this URL&lt;br /&gt;
|-&lt;br /&gt;
| '''api.version''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; the Version of the SDMX REST API.  Supported values are 1.5.0 and 2.0.0&lt;br /&gt;
|-&lt;br /&gt;
| '''api.timeout''' || &amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''Optional'''&amp;lt;/span&amp;gt; maximum number of seconds to wait for response from API before timing out. Defaults to120 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| '''format''' || The SDMX structure format used when POSTing structures to web service (for the use case of structure persistence).  &amp;lt;br/&amp;gt;&lt;br /&gt;
Options include:&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''mlv2.1'''&amp;lt;/span&amp;gt; – XML format SDMX-ML v.2.1 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''mlv3.0'''&amp;lt;/span&amp;gt; – XML format SDMX-ML v.3.0 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''jsonv1'''&amp;lt;/span&amp;gt; – JSON format SDMX-JSON v.1.0 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''jsonv2'''&amp;lt;/span&amp;gt; – JSON format SDMX-JSON v.2.0 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''fusion'''&amp;lt;/span&amp;gt; – the FMR specific format. This format should be used if connected to another FMR instance as it covers both SDMX structures and non-SDMX structures such as Publication Tables and Reporting Templates &amp;lt;br/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Apache Tomcat Example ==&lt;br /&gt;
If using Apache Tomcat, the war file would be placed under the ‘&amp;lt;tomcat&amp;gt;\webapps’ folder.  &lt;br /&gt;
&lt;br /&gt;
The name of the war file will be the name of the Web Application when accessed in the web browser, for example if the war file is called fwb.war, the application would be accessed using the following URL syntax:&lt;br /&gt;
&lt;br /&gt;
 http(s)://[server]:[port]/'''fwb'''&lt;br /&gt;
&lt;br /&gt;
Apache Tomcat can be started using the '''bin\startup.bat''' or on unix '''bin\startup.sh script'''.  An alternative is to start Tomcat as a windows service.&lt;br /&gt;
&lt;br /&gt;
On Tomcat startup the war file will be unpacked, creating a folder of the same name in the &amp;lt;tomcat&amp;gt;\webapps folder.&lt;br /&gt;
&lt;br /&gt;
After Tomcat has started the Fusion Workbench would be accessed from the following URL.&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/fwb&lt;br /&gt;
&lt;br /&gt;
This URL assumes the following conditions are true:&lt;br /&gt;
# The web browser is running on the same machine as the Tomcat server ('''localhost''' refers to the local machine).&lt;br /&gt;
# No configuration changes have been made to the official distribution of Apache Tomcat (default port is '''8080''').&lt;br /&gt;
# The FWB distribution has the file name fwb.war (fwb.war resolves to '''/fwb''' in the URL path)&lt;br /&gt;
&lt;br /&gt;
Assuming the configuration files are in the correct folder and are valid JSON with no missing required properties, the URL will resolve to the UI of the FWB.&lt;br /&gt;
&lt;br /&gt;
[[File:FMR Workbench Home.png|center]]&lt;br /&gt;
&lt;br /&gt;
== Error Resolution ==&lt;br /&gt;
If the home page of the FWB fails to load, please check the log files from Apache Tomcat. Other than the Apache Tomcat log files, the FWB will create 2 application specific log files:&lt;br /&gt;
# FMRWorkbench.log – this file contains all logging output from the FWB.   Logs are output if they have a level of INFO or higher.&lt;br /&gt;
# FMRWorkbenchErrors.log – this file contains a subset of the logs from FMRWorkbench.log.  It only contains logs that were written with a severity of WARN or higher.&lt;br /&gt;
&lt;br /&gt;
To change the logging level, edit the '''logback.xml''' file which is found under the following location in Tomcat&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tomcat home&amp;gt;\webapps\fwb\WEB-INF\classes\logback.xml&lt;br /&gt;
&lt;br /&gt;
= Switching Services =&lt;br /&gt;
[[File:Fmr wb service.png|thumb]]&lt;br /&gt;
The header bar of the FMR-Workbench contains a button showing the currently connected service, clicking on this button will open a window to allow a different service to be connected.  By default the service is connected to anonymously, meaning only browser functionality will be supported.&lt;br /&gt;
&lt;br /&gt;
To authenticate, click on the Login button after connecting to the service.  &lt;br /&gt;
&lt;br /&gt;
= Authentication =&lt;br /&gt;
The FMR Workbench supports 2 forms of authentication with the connected service: Basic Authentication and OpenID Connect. The type of authentication is set up in the Config file of the FMR-Workbench.  &lt;br /&gt;
&lt;br /&gt;
== Basic Authentication ==&lt;br /&gt;
Clicking Login will take the user to the FMR-Workbench login page where the user is invited to enter a username and password.  These details are stored in the FMR-Workbench against the user's session, and they are used whenever the user interacts with the target service.  An initial check is performed against the target server to ensure the credentials can be used to obtain some structures, if the check fails then the details are deemed to be invalid and will be discarded.&lt;br /&gt;
&lt;br /&gt;
== Open ID Connect ==&lt;br /&gt;
Clicking Login will take the user to the OpenID Connect login page (defined in the configuration file of the FMR-Workbench).  The user authenticates with the chosen OpenID Connect authentication provider, on success the user is redirected back to the FMR-Workbench with a token.  The token is stored against the user's session, and used to authenticate with the target service. &lt;br /&gt;
&lt;br /&gt;
= Structure Navigation and Export =&lt;br /&gt;
The FMR-Workbench front end will display structures in the same way the FMR provides - clicking on a sidebar item (example Codelists) will display the Codelist page and all the Codelists in the connected service.  This is achieved by the front end issuing a SDMX web service query to the FMR Workbench for all Codelists as stubs.  This query is then forwarded to the connected service, and the response is written back to the client.  The FMR-Workbench can receive the query response from the connected service in any SDMX format.  The response will be parsed by the FMR-Workbench before being written out in the requested format.  This means the FMR-Workbench is able to write the response out in ANY format that the FMR Workbench supports, including Excel, SDMX, and JSON.  The user is therefore able to click on a Codelist and export it as Excel, even if the connected service does not support Excel as an output format.&lt;br /&gt;
&lt;br /&gt;
It is possible to automatically link to a page in the Fusion Registry against a specific service by providing the '''env''' argument in the URL, for example:&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/FMR-WB/items/conceptscheme.html?urn=urn:sdmx:org.sdmx.infomodel.conceptscheme.ConceptScheme=OECD:CS_TOURISM(1.0)&amp;amp;env=DOT_STAT&lt;br /&gt;
&lt;br /&gt;
The above link will take the user to a specific Concept Scheme in the User Interface, from the DOT_STAT environment.&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/FMR-WB/items/conceptscheme-wizard.html?urn=urn:sdmx:org.sdmx.infomodel.conceptscheme.ConceptScheme=OECD:CS_TOURISM(1.0)&amp;amp;env=DOT_STAT&lt;br /&gt;
&lt;br /&gt;
The above link will take the user to the Concept Scheme Wizard (the edit pages for a Concept Scheme).  The Concept Scheme wizard will be editing the CS_TOURISM concept in the DOT_STAT Environment.  As this page is a secure resource, the user will be automatically redirected to the login page if they are not already logged into the service.&lt;br /&gt;
&lt;br /&gt;
= SDMX Web Service =&lt;br /&gt;
It is important to note that the FMR-Workbench has the same web service entry points as the FMR, and whilst these web services work, they are not guaranteed to be fully compliant.  The web services of the FMR-Workbench forwards queries onto the connected service.  The queries may be modify to reduce the possibility of the target service not supporting the query. If the connected service reports any error in the query, the FMR-Workbench will report 'no structures' for the query.  &lt;br /&gt;
&lt;br /&gt;
The recommendation is therefore to not rely on the web services of the FMR-Workbench, instead use the web services provided by the target service directly. &lt;br /&gt;
&lt;br /&gt;
= Structure Creation/Modification =&lt;br /&gt;
If the user has logged into the connected service, they will be able to upload structures from the home page of the FMR-Workbench, or create/edit structures using the standard Wizards in the User Interface.  &lt;br /&gt;
&lt;br /&gt;
It is important to note that the FMR-Workbench contains the same User Interface as the FMR, and as such does not provision for the fact that the connected service may not support all the features of the FMR.  For example it may be possible in the FMR-Workbench to create a SDMX 3.0 DSD with multiple measures, but the target service may reject the save request.&lt;br /&gt;
&lt;br /&gt;
It is possible to load structures in any format supported by the FMR-Workbench, including Excel - these structures will be converted into a format supported by the connected service on the save request.&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=FMR_Workbench&amp;diff=6942</id>
		<title>FMR Workbench</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=FMR_Workbench&amp;diff=6942"/>
		<updated>2023-07-13T12:48:46Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Apache Tomcat Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
[[File:Fmr wb overview.png|thumb]]&lt;br /&gt;
The '''F'''MR '''W'''ork'''B'''ench (FWB) is a User Interface (UI) for browsing and maintaining SDMX Structures obtained from SDMX compliant Structure Web Services.  The UI of the FWB is a stripped-down version of the Fusion Metadata Registry (FMR) User Interface; it is stripped down because the UI of the FWB supports the use case of viewing and maintaining structural metadata, whilst the FMR supports additional use cases including [[Validate_data|data validation]], [[Convert_data_between_SDMX_formats_V11|data conversion]], and has administrative UI pages.  Whilst the FMR uses a database to store its configuration settings, the FWB configuration is stored in a file.  '''The FWB has no database requirements'''.&lt;br /&gt;
&lt;br /&gt;
The FWB UI browses and displays the SDMX structures of the '''Environment''' it is connected to. An Environment is a connection to a collection of related SDMX web services for a single SDMX service offering. Related web services include the web service entry point to retrieve the structures, the entry point to save structures, and the entry point to delete structures.&lt;br /&gt;
&lt;br /&gt;
The UI of the FWB enables the user to switch their connection to an alternative Environment; the list of available Environments is defined in the configuration file for the FWB.  The connected Environment is associated with the current user; this enables multiple users of the FWB to be connected to different Environments simultaneously.&lt;br /&gt;
&lt;br /&gt;
= Getting Started = &lt;br /&gt;
The FMR Workbench (FWB) is deployed as a Web Application Archive (war) file.  The war file must be deployed to a Java Servlet container such as Apache Tomcat.  The Servlet container will host the application so that it can be accessed over HTTP as a web application.&lt;br /&gt;
&lt;br /&gt;
== Configuration File Location == &lt;br /&gt;
The FMR Workbench does not use a database, instead it obtains its configuration settings from a configuration file called fwb_config.json.&lt;br /&gt;
&lt;br /&gt;
An example configuration file is provided with the software.  The configuration file needs to be placed in the following directory (the directory must be created if it does not exist):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;USER HOME&amp;gt;\MetadataTechnology\FusionRegistry&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 C:\Users\Matthew Nelson\MetadataTechnology\FusionRegistry&lt;br /&gt;
&lt;br /&gt;
== Configuration File Properties ==&lt;br /&gt;
The configuration file is split into 2 parts:&lt;br /&gt;
 &lt;br /&gt;
# Server Properties&lt;br /&gt;
# Environment Definitions&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;Properties&amp;quot;: { &amp;lt;span style=&amp;quot;color:#C00000&amp;quot;&amp;gt;server properties go here&amp;lt;/span&amp;gt; },&lt;br /&gt;
    &amp;quot;Environments&amp;quot;: [ &amp;lt;span style=&amp;quot;color:#C00000&amp;quot;&amp;gt;environment definitions go here&amp;lt;/span&amp;gt; ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&amp;lt;br/&amp;gt;&lt;br /&gt;
There is only 1 property which is required for the FWB, this is the URL to the FWB application. This property enables the application to know where to find required resources, and how to redirect users to the correct pages. &lt;br /&gt;
&lt;br /&gt;
 &amp;quot;Properties&amp;quot;: {&lt;br /&gt;
    server.url: &amp;quot;http://localhost:8080/fwb&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Localhost can be used for testing purposes when deploying the application to the same computer that the web browser is run from. For a live deployment this URL must be changed accordingly.&lt;br /&gt;
&lt;br /&gt;
'''Environments'''&amp;lt;br/&amp;gt;&lt;br /&gt;
The Environment property has an array of JSON Objects. Each JSON Object in this array defines a distinct Environment which the FWB can switch to in order to browse and optionally create/maintain the SDMX Structures of that Environment. &lt;br /&gt;
 &lt;br /&gt;
[[File:FWB Environment Selection.png|center]]&lt;br /&gt;
&lt;br /&gt;
An Environment consists of an id and a name and defines the web service entry points to retrieve, save, and delete structures. The retrieve web service is required, the save and delete entry points are optional.  &lt;br /&gt;
&lt;br /&gt;
The Environment definition also contains details on the authentication mechanism used to access the contents of the web services.&lt;br /&gt;
&lt;br /&gt;
An example of an Environment definition is given below:&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;DOT_STAT&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot; : &amp;quot;Dot Stat Test&amp;quot;,&lt;br /&gt;
    &amp;quot;api&amp;quot;: {&lt;br /&gt;
        &amp;quot;query&amp;quot;: &amp;quot;https://nsi-demo-reset.siscc.org/rest&amp;quot;,&lt;br /&gt;
        &amp;quot;persist&amp;quot;: &amp;quot;https://nsi-demo-reset.siscc.org/rest/structure&amp;quot;,&lt;br /&gt;
        &amp;quot;delete&amp;quot;: &amp;quot;https://nsi-demo-stable.siscc.org/rest/structure&amp;quot;,&lt;br /&gt;
        &amp;quot;version&amp;quot;: &amp;quot;1.5.0&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;agencies&amp;quot;: [&amp;quot;SDMX&amp;quot;, &amp;quot;METATECH&amp;quot;],&lt;br /&gt;
    &amp;quot;auth&amp;quot;: &amp;quot;OIDC_PKCE&amp;quot;,&lt;br /&gt;
    &amp;quot;locale&amp;quot;: [&amp;quot;en&amp;quot;, &amp;quot;fr&amp;quot;],&lt;br /&gt;
    &amp;quot;oidc&amp;quot;: {&lt;br /&gt;
        &amp;quot;config&amp;quot;: &amp;quot;https://keycloak.siscc.org/auth/realms/OECD/.well-known/openid-configuration&amp;quot;,&lt;br /&gt;
        &amp;quot;clientId&amp;quot;: &amp;quot;app&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;format&amp;quot;: &amp;quot;mlv2.1&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following table describes the properties for an Environment definition based on the above example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Property !! Description&lt;br /&gt;
|-&lt;br /&gt;
| '''id''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; This is the ID of the Environment.  It is used in the REST API to switch environments&lt;br /&gt;
|-&lt;br /&gt;
| '''name''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; The name of the Environment as presented to the user&lt;br /&gt;
|-&lt;br /&gt;
| '''api''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; contains the base SDMX REST URL for each web service of the Environment&lt;br /&gt;
|-&lt;br /&gt;
| '''api.query''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; structure query web service&lt;br /&gt;
|-&lt;br /&gt;
| '''api.persist''' || &amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''Optional'''&amp;lt;/span&amp;gt; to support add/edit functionality.  HTTP POST messages will be sent to this URL&lt;br /&gt;
|-&lt;br /&gt;
| '''api.delete''' || &amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''Optional'''&amp;lt;/span&amp;gt; to support delete functionality, HTTP DELETE messages will be sent to this URL&lt;br /&gt;
|-&lt;br /&gt;
| '''api.version''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; the Version of the SDMX REST API.  Supported values are 1.5.0 and 2.0.0&lt;br /&gt;
|-&lt;br /&gt;
| '''api.timeout''' || &amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''Optional'''&amp;lt;/span&amp;gt; maximum number of seconds to wait for response from API before timing out. Defaults to120 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| '''format''' || The SDMX structure format used when POSTing structures to web service (for the use case of structure persistence).  &amp;lt;br/&amp;gt;&lt;br /&gt;
Options include:&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''mlv2.1'''&amp;lt;/span&amp;gt; – XML format SDMX-ML v.2.1 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''mlv3.0'''&amp;lt;/span&amp;gt; – XML format SDMX-ML v.3.0 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''jsonv1'''&amp;lt;/span&amp;gt; – JSON format SDMX-JSON v.1.0 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''jsonv2'''&amp;lt;/span&amp;gt; – JSON format SDMX-JSON v.2.0 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''fusion'''&amp;lt;/span&amp;gt; – the FMR specific format. This format should be used if connected to another FMR instance as it covers both SDMX structures and non-SDMX structures such as Publication Tables and Reporting Templates &amp;lt;br/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Apache Tomcat Example ==&lt;br /&gt;
[[File:FMR Workbench Home.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
If using Apache Tomcat, the war file would be placed under the ‘&amp;lt;tomcat&amp;gt;\webapps’ folder.  &lt;br /&gt;
&lt;br /&gt;
The name of the war file will be the name of the Web Application when accessed in the web browser, for example if the war file is called fwb.war, the application would be accessed using the following URL syntax:&lt;br /&gt;
&lt;br /&gt;
 http(s)://[server]:[port]/'''fwb'''&lt;br /&gt;
&lt;br /&gt;
Apache Tomcat can be started using the '''bin\startup.bat''' or on unix '''bin\startup.sh script'''.  An alternative is to start Tomcat as a windows service.&lt;br /&gt;
&lt;br /&gt;
On Tomcat startup the war file will be unpacked, creating a folder of the same name in the &amp;lt;tomcat&amp;gt;\webapps folder.&lt;br /&gt;
&lt;br /&gt;
After Tomcat has started the Fusion Workbench would be accessed from the following URL.&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/fwb&lt;br /&gt;
&lt;br /&gt;
This URL assumes the following conditions are true:&lt;br /&gt;
# The web browser is running on the same machine as the Tomcat server ('''localhost''' refers to the local machine).&lt;br /&gt;
# No configuration changes have been made to the official distribution of Apache Tomcat (default port is '''8080''').&lt;br /&gt;
# The FWB distribution has the file name fwb.war (fwb.war resolves to '''/fwb''' in the URL path)&lt;br /&gt;
&lt;br /&gt;
Assuming the configuration files are in the correct folder and are valid JSON with no missing required properties, the URL will resolve to the UI of the FWB.&lt;br /&gt;
&lt;br /&gt;
== Error Resolution ==&lt;br /&gt;
If the home page of the FWB fails to load, please check the log files from Apache Tomcat. Other than the Apache Tomcat log files, the FWB will create 2 application specific log files:&lt;br /&gt;
# FMRWorkbench.log – this file contains all logging output from the FWB.   Logs are output if they have a level of INFO or higher.&lt;br /&gt;
# FMRWorkbenchErrors.log – this file contains a subset of the logs from FMRWorkbench.log.  It only contains logs that were written with a severity of WARN or higher.&lt;br /&gt;
&lt;br /&gt;
To change the logging level, edit the '''logback.xml''' file which is found under the following location in Tomcat&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tomcat home&amp;gt;\webapps\fwb\WEB-INF\classes\logback.xml&lt;br /&gt;
&lt;br /&gt;
= Switching Services =&lt;br /&gt;
[[File:Fmr wb service.png|thumb]]&lt;br /&gt;
The header bar of the FMR-Workbench contains a button showing the currently connected service, clicking on this button will open a window to allow a different service to be connected.  By default the service is connected to anonymously, meaning only browser functionality will be supported.&lt;br /&gt;
&lt;br /&gt;
To authenticate, click on the Login button after connecting to the service.  &lt;br /&gt;
&lt;br /&gt;
= Authentication =&lt;br /&gt;
The FMR Workbench supports 2 forms of authentication with the connected service: Basic Authentication and OpenID Connect. The type of authentication is set up in the Config file of the FMR-Workbench.  &lt;br /&gt;
&lt;br /&gt;
== Basic Authentication ==&lt;br /&gt;
Clicking Login will take the user to the FMR-Workbench login page where the user is invited to enter a username and password.  These details are stored in the FMR-Workbench against the user's session, and they are used whenever the user interacts with the target service.  An initial check is performed against the target server to ensure the credentials can be used to obtain some structures, if the check fails then the details are deemed to be invalid and will be discarded.&lt;br /&gt;
&lt;br /&gt;
== Open ID Connect ==&lt;br /&gt;
Clicking Login will take the user to the OpenID Connect login page (defined in the configuration file of the FMR-Workbench).  The user authenticates with the chosen OpenID Connect authentication provider, on success the user is redirected back to the FMR-Workbench with a token.  The token is stored against the user's session, and used to authenticate with the target service. &lt;br /&gt;
&lt;br /&gt;
= Structure Navigation and Export =&lt;br /&gt;
The FMR-Workbench front end will display structures in the same way the FMR provides - clicking on a sidebar item (example Codelists) will display the Codelist page and all the Codelists in the connected service.  This is achieved by the front end issuing a SDMX web service query to the FMR Workbench for all Codelists as stubs.  This query is then forwarded to the connected service, and the response is written back to the client.  The FMR-Workbench can receive the query response from the connected service in any SDMX format.  The response will be parsed by the FMR-Workbench before being written out in the requested format.  This means the FMR-Workbench is able to write the response out in ANY format that the FMR Workbench supports, including Excel, SDMX, and JSON.  The user is therefore able to click on a Codelist and export it as Excel, even if the connected service does not support Excel as an output format.&lt;br /&gt;
&lt;br /&gt;
It is possible to automatically link to a page in the Fusion Registry against a specific service by providing the '''env''' argument in the URL, for example:&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/FMR-WB/items/conceptscheme.html?urn=urn:sdmx:org.sdmx.infomodel.conceptscheme.ConceptScheme=OECD:CS_TOURISM(1.0)&amp;amp;env=DOT_STAT&lt;br /&gt;
&lt;br /&gt;
The above link will take the user to a specific Concept Scheme in the User Interface, from the DOT_STAT environment.&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/FMR-WB/items/conceptscheme-wizard.html?urn=urn:sdmx:org.sdmx.infomodel.conceptscheme.ConceptScheme=OECD:CS_TOURISM(1.0)&amp;amp;env=DOT_STAT&lt;br /&gt;
&lt;br /&gt;
The above link will take the user to the Concept Scheme Wizard (the edit pages for a Concept Scheme).  The Concept Scheme wizard will be editing the CS_TOURISM concept in the DOT_STAT Environment.  As this page is a secure resource, the user will be automatically redirected to the login page if they are not already logged into the service.&lt;br /&gt;
&lt;br /&gt;
= SDMX Web Service =&lt;br /&gt;
It is important to note that the FMR-Workbench has the same web service entry points as the FMR, and whilst these web services work, they are not guaranteed to be fully compliant.  The web services of the FMR-Workbench forwards queries onto the connected service.  The queries may be modify to reduce the possibility of the target service not supporting the query. If the connected service reports any error in the query, the FMR-Workbench will report 'no structures' for the query.  &lt;br /&gt;
&lt;br /&gt;
The recommendation is therefore to not rely on the web services of the FMR-Workbench, instead use the web services provided by the target service directly. &lt;br /&gt;
&lt;br /&gt;
= Structure Creation/Modification =&lt;br /&gt;
If the user has logged into the connected service, they will be able to upload structures from the home page of the FMR-Workbench, or create/edit structures using the standard Wizards in the User Interface.  &lt;br /&gt;
&lt;br /&gt;
It is important to note that the FMR-Workbench contains the same User Interface as the FMR, and as such does not provision for the fact that the connected service may not support all the features of the FMR.  For example it may be possible in the FMR-Workbench to create a SDMX 3.0 DSD with multiple measures, but the target service may reject the save request.&lt;br /&gt;
&lt;br /&gt;
It is possible to load structures in any format supported by the FMR-Workbench, including Excel - these structures will be converted into a format supported by the connected service on the save request.&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=FMR_Workbench&amp;diff=6941</id>
		<title>FMR Workbench</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=FMR_Workbench&amp;diff=6941"/>
		<updated>2023-07-13T12:48:25Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Configuration File Properties */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
[[File:Fmr wb overview.png|thumb]]&lt;br /&gt;
The '''F'''MR '''W'''ork'''B'''ench (FWB) is a User Interface (UI) for browsing and maintaining SDMX Structures obtained from SDMX compliant Structure Web Services.  The UI of the FWB is a stripped-down version of the Fusion Metadata Registry (FMR) User Interface; it is stripped down because the UI of the FWB supports the use case of viewing and maintaining structural metadata, whilst the FMR supports additional use cases including [[Validate_data|data validation]], [[Convert_data_between_SDMX_formats_V11|data conversion]], and has administrative UI pages.  Whilst the FMR uses a database to store its configuration settings, the FWB configuration is stored in a file.  '''The FWB has no database requirements'''.&lt;br /&gt;
&lt;br /&gt;
The FWB UI browses and displays the SDMX structures of the '''Environment''' it is connected to. An Environment is a connection to a collection of related SDMX web services for a single SDMX service offering. Related web services include the web service entry point to retrieve the structures, the entry point to save structures, and the entry point to delete structures.&lt;br /&gt;
&lt;br /&gt;
The UI of the FWB enables the user to switch their connection to an alternative Environment; the list of available Environments is defined in the configuration file for the FWB.  The connected Environment is associated with the current user; this enables multiple users of the FWB to be connected to different Environments simultaneously.&lt;br /&gt;
&lt;br /&gt;
= Getting Started = &lt;br /&gt;
The FMR Workbench (FWB) is deployed as a Web Application Archive (war) file.  The war file must be deployed to a Java Servlet container such as Apache Tomcat.  The Servlet container will host the application so that it can be accessed over HTTP as a web application.&lt;br /&gt;
&lt;br /&gt;
== Configuration File Location == &lt;br /&gt;
The FMR Workbench does not use a database, instead it obtains its configuration settings from a configuration file called fwb_config.json.&lt;br /&gt;
&lt;br /&gt;
An example configuration file is provided with the software.  The configuration file needs to be placed in the following directory (the directory must be created if it does not exist):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;USER HOME&amp;gt;\MetadataTechnology\FusionRegistry&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 C:\Users\Matthew Nelson\MetadataTechnology\FusionRegistry&lt;br /&gt;
&lt;br /&gt;
== Configuration File Properties ==&lt;br /&gt;
The configuration file is split into 2 parts:&lt;br /&gt;
 &lt;br /&gt;
# Server Properties&lt;br /&gt;
# Environment Definitions&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;Properties&amp;quot;: { &amp;lt;span style=&amp;quot;color:#C00000&amp;quot;&amp;gt;server properties go here&amp;lt;/span&amp;gt; },&lt;br /&gt;
    &amp;quot;Environments&amp;quot;: [ &amp;lt;span style=&amp;quot;color:#C00000&amp;quot;&amp;gt;environment definitions go here&amp;lt;/span&amp;gt; ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&amp;lt;br/&amp;gt;&lt;br /&gt;
There is only 1 property which is required for the FWB, this is the URL to the FWB application. This property enables the application to know where to find required resources, and how to redirect users to the correct pages. &lt;br /&gt;
&lt;br /&gt;
 &amp;quot;Properties&amp;quot;: {&lt;br /&gt;
    server.url: &amp;quot;http://localhost:8080/fwb&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Localhost can be used for testing purposes when deploying the application to the same computer that the web browser is run from. For a live deployment this URL must be changed accordingly.&lt;br /&gt;
&lt;br /&gt;
'''Environments'''&amp;lt;br/&amp;gt;&lt;br /&gt;
The Environment property has an array of JSON Objects. Each JSON Object in this array defines a distinct Environment which the FWB can switch to in order to browse and optionally create/maintain the SDMX Structures of that Environment. &lt;br /&gt;
 &lt;br /&gt;
[[File:FWB Environment Selection.png|center]]&lt;br /&gt;
&lt;br /&gt;
An Environment consists of an id and a name and defines the web service entry points to retrieve, save, and delete structures. The retrieve web service is required, the save and delete entry points are optional.  &lt;br /&gt;
&lt;br /&gt;
The Environment definition also contains details on the authentication mechanism used to access the contents of the web services.&lt;br /&gt;
&lt;br /&gt;
An example of an Environment definition is given below:&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;DOT_STAT&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot; : &amp;quot;Dot Stat Test&amp;quot;,&lt;br /&gt;
    &amp;quot;api&amp;quot;: {&lt;br /&gt;
        &amp;quot;query&amp;quot;: &amp;quot;https://nsi-demo-reset.siscc.org/rest&amp;quot;,&lt;br /&gt;
        &amp;quot;persist&amp;quot;: &amp;quot;https://nsi-demo-reset.siscc.org/rest/structure&amp;quot;,&lt;br /&gt;
        &amp;quot;delete&amp;quot;: &amp;quot;https://nsi-demo-stable.siscc.org/rest/structure&amp;quot;,&lt;br /&gt;
        &amp;quot;version&amp;quot;: &amp;quot;1.5.0&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;agencies&amp;quot;: [&amp;quot;SDMX&amp;quot;, &amp;quot;METATECH&amp;quot;],&lt;br /&gt;
    &amp;quot;auth&amp;quot;: &amp;quot;OIDC_PKCE&amp;quot;,&lt;br /&gt;
    &amp;quot;locale&amp;quot;: [&amp;quot;en&amp;quot;, &amp;quot;fr&amp;quot;],&lt;br /&gt;
    &amp;quot;oidc&amp;quot;: {&lt;br /&gt;
        &amp;quot;config&amp;quot;: &amp;quot;https://keycloak.siscc.org/auth/realms/OECD/.well-known/openid-configuration&amp;quot;,&lt;br /&gt;
        &amp;quot;clientId&amp;quot;: &amp;quot;app&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;format&amp;quot;: &amp;quot;mlv2.1&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following table describes the properties for an Environment definition based on the above example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Property !! Description&lt;br /&gt;
|-&lt;br /&gt;
| '''id''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; This is the ID of the Environment.  It is used in the REST API to switch environments&lt;br /&gt;
|-&lt;br /&gt;
| '''name''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; The name of the Environment as presented to the user&lt;br /&gt;
|-&lt;br /&gt;
| '''api''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; contains the base SDMX REST URL for each web service of the Environment&lt;br /&gt;
|-&lt;br /&gt;
| '''api.query''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; structure query web service&lt;br /&gt;
|-&lt;br /&gt;
| '''api.persist''' || &amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''Optional'''&amp;lt;/span&amp;gt; to support add/edit functionality.  HTTP POST messages will be sent to this URL&lt;br /&gt;
|-&lt;br /&gt;
| '''api.delete''' || &amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''Optional'''&amp;lt;/span&amp;gt; to support delete functionality, HTTP DELETE messages will be sent to this URL&lt;br /&gt;
|-&lt;br /&gt;
| '''api.version''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; the Version of the SDMX REST API.  Supported values are 1.5.0 and 2.0.0&lt;br /&gt;
|-&lt;br /&gt;
| '''api.timeout''' || &amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''Optional'''&amp;lt;/span&amp;gt; maximum number of seconds to wait for response from API before timing out. Defaults to120 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| '''format''' || The SDMX structure format used when POSTing structures to web service (for the use case of structure persistence).  &amp;lt;br/&amp;gt;&lt;br /&gt;
Options include:&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''mlv2.1'''&amp;lt;/span&amp;gt; – XML format SDMX-ML v.2.1 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''mlv3.0'''&amp;lt;/span&amp;gt; – XML format SDMX-ML v.3.0 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''jsonv1'''&amp;lt;/span&amp;gt; – JSON format SDMX-JSON v.1.0 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''jsonv2'''&amp;lt;/span&amp;gt; – JSON format SDMX-JSON v.2.0 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''fusion'''&amp;lt;/span&amp;gt; – the FMR specific format. This format should be used if connected to another FMR instance as it covers both SDMX structures and non-SDMX structures such as Publication Tables and Reporting Templates &amp;lt;br/&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Apache Tomcat Example ==&lt;br /&gt;
If using Apache Tomcat, the war file would be placed under the ‘&amp;lt;tomcat&amp;gt;\webapps’ folder.  &lt;br /&gt;
&lt;br /&gt;
The name of the war file will be the name of the Web Application when accessed in the web browser, for example if the war file is called fwb.war, the application would be accessed using the following URL syntax:&lt;br /&gt;
&lt;br /&gt;
 http(s)://[server]:[port]/'''fwb'''&lt;br /&gt;
&lt;br /&gt;
Apache Tomcat can be started using the '''bin\startup.bat''' or on unix '''bin\startup.sh script'''.  An alternative is to start Tomcat as a windows service.&lt;br /&gt;
&lt;br /&gt;
On Tomcat startup the war file will be unpacked, creating a folder of the same name in the &amp;lt;tomcat&amp;gt;\webapps folder.&lt;br /&gt;
&lt;br /&gt;
After Tomcat has started the Fusion Workbench would be accessed from the following URL.&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/fwb&lt;br /&gt;
&lt;br /&gt;
This URL assumes the following conditions are true:&lt;br /&gt;
# The web browser is running on the same machine as the Tomcat server ('''localhost''' refers to the local machine).&lt;br /&gt;
# No configuration changes have been made to the official distribution of Apache Tomcat (default port is '''8080''').&lt;br /&gt;
# The FWB distribution has the file name fwb.war (fwb.war resolves to '''/fwb''' in the URL path)&lt;br /&gt;
&lt;br /&gt;
Assuming the configuration files are in the correct folder and are valid JSON with no missing required properties, the URL will resolve to the UI of the FWB.&lt;br /&gt;
&lt;br /&gt;
[[File:FMR Workbench Home.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
== Error Resolution ==&lt;br /&gt;
If the home page of the FWB fails to load, please check the log files from Apache Tomcat. Other than the Apache Tomcat log files, the FWB will create 2 application specific log files:&lt;br /&gt;
# FMRWorkbench.log – this file contains all logging output from the FWB.   Logs are output if they have a level of INFO or higher.&lt;br /&gt;
# FMRWorkbenchErrors.log – this file contains a subset of the logs from FMRWorkbench.log.  It only contains logs that were written with a severity of WARN or higher.&lt;br /&gt;
&lt;br /&gt;
To change the logging level, edit the '''logback.xml''' file which is found under the following location in Tomcat&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tomcat home&amp;gt;\webapps\fwb\WEB-INF\classes\logback.xml&lt;br /&gt;
&lt;br /&gt;
= Switching Services =&lt;br /&gt;
[[File:Fmr wb service.png|thumb]]&lt;br /&gt;
The header bar of the FMR-Workbench contains a button showing the currently connected service, clicking on this button will open a window to allow a different service to be connected.  By default the service is connected to anonymously, meaning only browser functionality will be supported.&lt;br /&gt;
&lt;br /&gt;
To authenticate, click on the Login button after connecting to the service.  &lt;br /&gt;
&lt;br /&gt;
= Authentication =&lt;br /&gt;
The FMR Workbench supports 2 forms of authentication with the connected service: Basic Authentication and OpenID Connect. The type of authentication is set up in the Config file of the FMR-Workbench.  &lt;br /&gt;
&lt;br /&gt;
== Basic Authentication ==&lt;br /&gt;
Clicking Login will take the user to the FMR-Workbench login page where the user is invited to enter a username and password.  These details are stored in the FMR-Workbench against the user's session, and they are used whenever the user interacts with the target service.  An initial check is performed against the target server to ensure the credentials can be used to obtain some structures, if the check fails then the details are deemed to be invalid and will be discarded.&lt;br /&gt;
&lt;br /&gt;
== Open ID Connect ==&lt;br /&gt;
Clicking Login will take the user to the OpenID Connect login page (defined in the configuration file of the FMR-Workbench).  The user authenticates with the chosen OpenID Connect authentication provider, on success the user is redirected back to the FMR-Workbench with a token.  The token is stored against the user's session, and used to authenticate with the target service. &lt;br /&gt;
&lt;br /&gt;
= Structure Navigation and Export =&lt;br /&gt;
The FMR-Workbench front end will display structures in the same way the FMR provides - clicking on a sidebar item (example Codelists) will display the Codelist page and all the Codelists in the connected service.  This is achieved by the front end issuing a SDMX web service query to the FMR Workbench for all Codelists as stubs.  This query is then forwarded to the connected service, and the response is written back to the client.  The FMR-Workbench can receive the query response from the connected service in any SDMX format.  The response will be parsed by the FMR-Workbench before being written out in the requested format.  This means the FMR-Workbench is able to write the response out in ANY format that the FMR Workbench supports, including Excel, SDMX, and JSON.  The user is therefore able to click on a Codelist and export it as Excel, even if the connected service does not support Excel as an output format.&lt;br /&gt;
&lt;br /&gt;
It is possible to automatically link to a page in the Fusion Registry against a specific service by providing the '''env''' argument in the URL, for example:&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/FMR-WB/items/conceptscheme.html?urn=urn:sdmx:org.sdmx.infomodel.conceptscheme.ConceptScheme=OECD:CS_TOURISM(1.0)&amp;amp;env=DOT_STAT&lt;br /&gt;
&lt;br /&gt;
The above link will take the user to a specific Concept Scheme in the User Interface, from the DOT_STAT environment.&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/FMR-WB/items/conceptscheme-wizard.html?urn=urn:sdmx:org.sdmx.infomodel.conceptscheme.ConceptScheme=OECD:CS_TOURISM(1.0)&amp;amp;env=DOT_STAT&lt;br /&gt;
&lt;br /&gt;
The above link will take the user to the Concept Scheme Wizard (the edit pages for a Concept Scheme).  The Concept Scheme wizard will be editing the CS_TOURISM concept in the DOT_STAT Environment.  As this page is a secure resource, the user will be automatically redirected to the login page if they are not already logged into the service.&lt;br /&gt;
&lt;br /&gt;
= SDMX Web Service =&lt;br /&gt;
It is important to note that the FMR-Workbench has the same web service entry points as the FMR, and whilst these web services work, they are not guaranteed to be fully compliant.  The web services of the FMR-Workbench forwards queries onto the connected service.  The queries may be modify to reduce the possibility of the target service not supporting the query. If the connected service reports any error in the query, the FMR-Workbench will report 'no structures' for the query.  &lt;br /&gt;
&lt;br /&gt;
The recommendation is therefore to not rely on the web services of the FMR-Workbench, instead use the web services provided by the target service directly. &lt;br /&gt;
&lt;br /&gt;
= Structure Creation/Modification =&lt;br /&gt;
If the user has logged into the connected service, they will be able to upload structures from the home page of the FMR-Workbench, or create/edit structures using the standard Wizards in the User Interface.  &lt;br /&gt;
&lt;br /&gt;
It is important to note that the FMR-Workbench contains the same User Interface as the FMR, and as such does not provision for the fact that the connected service may not support all the features of the FMR.  For example it may be possible in the FMR-Workbench to create a SDMX 3.0 DSD with multiple measures, but the target service may reject the save request.&lt;br /&gt;
&lt;br /&gt;
It is possible to load structures in any format supported by the FMR-Workbench, including Excel - these structures will be converted into a format supported by the connected service on the save request.&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=File:FMR_Workbench_Home.png&amp;diff=6940</id>
		<title>File:FMR Workbench Home.png</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=File:FMR_Workbench_Home.png&amp;diff=6940"/>
		<updated>2023-07-13T12:47:37Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;FMR Workbench Home&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=FMR_Workbench&amp;diff=6939</id>
		<title>FMR Workbench</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=FMR_Workbench&amp;diff=6939"/>
		<updated>2023-07-13T12:44:39Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
[[File:Fmr wb overview.png|thumb]]&lt;br /&gt;
The '''F'''MR '''W'''ork'''B'''ench (FWB) is a User Interface (UI) for browsing and maintaining SDMX Structures obtained from SDMX compliant Structure Web Services.  The UI of the FWB is a stripped-down version of the Fusion Metadata Registry (FMR) User Interface; it is stripped down because the UI of the FWB supports the use case of viewing and maintaining structural metadata, whilst the FMR supports additional use cases including [[Validate_data|data validation]], [[Convert_data_between_SDMX_formats_V11|data conversion]], and has administrative UI pages.  Whilst the FMR uses a database to store its configuration settings, the FWB configuration is stored in a file.  '''The FWB has no database requirements'''.&lt;br /&gt;
&lt;br /&gt;
The FWB UI browses and displays the SDMX structures of the '''Environment''' it is connected to. An Environment is a connection to a collection of related SDMX web services for a single SDMX service offering. Related web services include the web service entry point to retrieve the structures, the entry point to save structures, and the entry point to delete structures.&lt;br /&gt;
&lt;br /&gt;
The UI of the FWB enables the user to switch their connection to an alternative Environment; the list of available Environments is defined in the configuration file for the FWB.  The connected Environment is associated with the current user; this enables multiple users of the FWB to be connected to different Environments simultaneously.&lt;br /&gt;
&lt;br /&gt;
= Getting Started = &lt;br /&gt;
The FMR Workbench (FWB) is deployed as a Web Application Archive (war) file.  The war file must be deployed to a Java Servlet container such as Apache Tomcat.  The Servlet container will host the application so that it can be accessed over HTTP as a web application.&lt;br /&gt;
&lt;br /&gt;
== Configuration File Location == &lt;br /&gt;
The FMR Workbench does not use a database, instead it obtains its configuration settings from a configuration file called fwb_config.json.&lt;br /&gt;
&lt;br /&gt;
An example configuration file is provided with the software.  The configuration file needs to be placed in the following directory (the directory must be created if it does not exist):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;USER HOME&amp;gt;\MetadataTechnology\FusionRegistry&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 C:\Users\Matthew Nelson\MetadataTechnology\FusionRegistry&lt;br /&gt;
&lt;br /&gt;
== Configuration File Properties ==&lt;br /&gt;
The configuration file is split into 2 parts:&lt;br /&gt;
 &lt;br /&gt;
# Server Properties&lt;br /&gt;
# Environment Definitions&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;Properties&amp;quot;: { &amp;lt;span style=&amp;quot;color:#C00000&amp;quot;&amp;gt;server properties go here&amp;lt;/span&amp;gt; },&lt;br /&gt;
    &amp;quot;Environments&amp;quot;: [ &amp;lt;span style=&amp;quot;color:#C00000&amp;quot;&amp;gt;environment definitions go here&amp;lt;/span&amp;gt; ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
'''Properties'''&amp;lt;br/&amp;gt;&lt;br /&gt;
There is only 1 property which is required for the FWB, this is the URL to the FWB application. This property enables the application to know where to find required resources, and how to redirect users to the correct pages. &lt;br /&gt;
&lt;br /&gt;
 &amp;quot;Properties&amp;quot;: {&lt;br /&gt;
    server.url: &amp;quot;http://localhost:8080/fwb&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Localhost can be used for testing purposes when deploying the application to the same computer that the web browser is run from. For a live deployment this URL must be changed accordingly.&lt;br /&gt;
&lt;br /&gt;
'''Environments'''&amp;lt;br/&amp;gt;&lt;br /&gt;
The Environment property has an array of JSON Objects. Each JSON Object in this array defines a distinct Environment which the FWB can switch to in order to browse and optionally create/maintain the SDMX Structures of that Environment. &lt;br /&gt;
 &lt;br /&gt;
[[File:FWB Environment Selection.png|center]]&lt;br /&gt;
&lt;br /&gt;
An Environment consists of an id and a name and defines the web service entry points to retrieve, save, and delete structures. The retrieve web service is required, the save and delete entry points are optional.  &lt;br /&gt;
&lt;br /&gt;
The Environment definition also contains details on the authentication mechanism used to access the contents of the web services.&lt;br /&gt;
&lt;br /&gt;
An example of an Environment definition is given below:&lt;br /&gt;
 {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;DOT_STAT&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot; : &amp;quot;Dot Stat Test&amp;quot;,&lt;br /&gt;
    &amp;quot;api&amp;quot;: {&lt;br /&gt;
        &amp;quot;query&amp;quot;: &amp;quot;https://nsi-demo-reset.siscc.org/rest&amp;quot;,&lt;br /&gt;
        &amp;quot;persist&amp;quot;: &amp;quot;https://nsi-demo-reset.siscc.org/rest/structure&amp;quot;,&lt;br /&gt;
        &amp;quot;delete&amp;quot;: &amp;quot;https://nsi-demo-stable.siscc.org/rest/structure&amp;quot;,&lt;br /&gt;
        &amp;quot;version&amp;quot;: &amp;quot;1.5.0&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;agencies&amp;quot;: [&amp;quot;SDMX&amp;quot;, &amp;quot;METATECH&amp;quot;],&lt;br /&gt;
    &amp;quot;auth&amp;quot;: &amp;quot;OIDC_PKCE&amp;quot;,&lt;br /&gt;
    &amp;quot;locale&amp;quot;: [&amp;quot;en&amp;quot;, &amp;quot;fr&amp;quot;],&lt;br /&gt;
    &amp;quot;oidc&amp;quot;: {&lt;br /&gt;
        &amp;quot;config&amp;quot;: &amp;quot;https://keycloak.siscc.org/auth/realms/OECD/.well-known/openid-configuration&amp;quot;,&lt;br /&gt;
        &amp;quot;clientId&amp;quot;: &amp;quot;app&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;format&amp;quot;: &amp;quot;mlv2.1&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following table describes the properties for an Environment definition based on the above example:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Property !! Description&lt;br /&gt;
|-&lt;br /&gt;
| '''id''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; This is the ID of the Environment.  It is used in the REST API to switch environments&lt;br /&gt;
|-&lt;br /&gt;
| '''name''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; The name of the Environment as presented to the user&lt;br /&gt;
|-&lt;br /&gt;
| '''api''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; contains the base SDMX REST URL for each web service of the Environment&lt;br /&gt;
|-&lt;br /&gt;
| '''api.query''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; structure query web service&lt;br /&gt;
|-&lt;br /&gt;
| '''api.persist''' || &amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''Optional'''&amp;lt;/span&amp;gt; to support add/edit functionality.  HTTP POST messages will be sent to this URL&lt;br /&gt;
|-&lt;br /&gt;
| '''api.delete''' || &amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''Optional'''&amp;lt;/span&amp;gt; to support delete functionality, HTTP DELETE messages will be sent to this URL&lt;br /&gt;
|-&lt;br /&gt;
| '''api.version''' ||  &amp;lt;span style=&amp;quot;color:#C00000&amp;gt;'''Required'''&amp;lt;/span&amp;gt; the Version of the SDMX REST API.  Supported values are 1.5.0 and 2.0.0&lt;br /&gt;
|-&lt;br /&gt;
| '''api.timeout''' || &amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''Optional'''&amp;lt;/span&amp;gt; maximum number of seconds to wait for response from API before timing out. Defaults to120 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| '''format''' || The SDMX structure format used when POSTing structures to web service (for the use case of structure persistence).  &lt;br /&gt;
 Options include:&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''mlv2.1'''&amp;lt;/span&amp;gt; – XML format SDMX-ML v.2.1 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''mlv3.0'''&amp;lt;/span&amp;gt; – XML format SDMX-ML v.3.0 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''jsonv1'''&amp;lt;/span&amp;gt; – JSON format SDMX-JSON v.1.0 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''jsonv2'''&amp;lt;/span&amp;gt; – JSON format SDMX-JSON v.2.0 &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#4472C4&amp;gt;'''fusion'''&amp;lt;/span&amp;gt; – the FMR specific format. This format should be used if connected to another FMR instance as it covers both SDMX structures and non-SDMX structures such as Publication Tables and Reporting Templates &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Switching Services =&lt;br /&gt;
[[File:Fmr wb service.png|thumb]]&lt;br /&gt;
The header bar of the FMR-Workbench contains a button showing the currently connected service, clicking on this button will open a window to allow a different service to be connected.  By default the service is connected to anonymously, meaning only browser functionality will be supported.&lt;br /&gt;
&lt;br /&gt;
To authenticate, click on the Login button after connecting to the service.  &lt;br /&gt;
&lt;br /&gt;
= Authentication =&lt;br /&gt;
The FMR Workbench supports 2 forms of authentication with the connected service: Basic Authentication and OpenID Connect. The type of authentication is set up in the Config file of the FMR-Workbench.  &lt;br /&gt;
&lt;br /&gt;
== Basic Authentication ==&lt;br /&gt;
Clicking Login will take the user to the FMR-Workbench login page where the user is invited to enter a username and password.  These details are stored in the FMR-Workbench against the user's session, and they are used whenever the user interacts with the target service.  An initial check is performed against the target server to ensure the credentials can be used to obtain some structures, if the check fails then the details are deemed to be invalid and will be discarded.&lt;br /&gt;
&lt;br /&gt;
== Open ID Connect ==&lt;br /&gt;
Clicking Login will take the user to the OpenID Connect login page (defined in the configuration file of the FMR-Workbench).  The user authenticates with the chosen OpenID Connect authentication provider, on success the user is redirected back to the FMR-Workbench with a token.  The token is stored against the user's session, and used to authenticate with the target service. &lt;br /&gt;
&lt;br /&gt;
= Structure Navigation and Export =&lt;br /&gt;
The FMR-Workbench front end will display structures in the same way the FMR provides - clicking on a sidebar item (example Codelists) will display the Codelist page and all the Codelists in the connected service.  This is achieved by the front end issuing a SDMX web service query to the FMR Workbench for all Codelists as stubs.  This query is then forwarded to the connected service, and the response is written back to the client.  The FMR-Workbench can receive the query response from the connected service in any SDMX format.  The response will be parsed by the FMR-Workbench before being written out in the requested format.  This means the FMR-Workbench is able to write the response out in ANY format that the FMR Workbench supports, including Excel, SDMX, and JSON.  The user is therefore able to click on a Codelist and export it as Excel, even if the connected service does not support Excel as an output format.&lt;br /&gt;
&lt;br /&gt;
It is possible to automatically link to a page in the Fusion Registry against a specific service by providing the '''env''' argument in the URL, for example:&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/FMR-WB/items/conceptscheme.html?urn=urn:sdmx:org.sdmx.infomodel.conceptscheme.ConceptScheme=OECD:CS_TOURISM(1.0)&amp;amp;env=DOT_STAT&lt;br /&gt;
&lt;br /&gt;
The above link will take the user to a specific Concept Scheme in the User Interface, from the DOT_STAT environment.&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/FMR-WB/items/conceptscheme-wizard.html?urn=urn:sdmx:org.sdmx.infomodel.conceptscheme.ConceptScheme=OECD:CS_TOURISM(1.0)&amp;amp;env=DOT_STAT&lt;br /&gt;
&lt;br /&gt;
The above link will take the user to the Concept Scheme Wizard (the edit pages for a Concept Scheme).  The Concept Scheme wizard will be editing the CS_TOURISM concept in the DOT_STAT Environment.  As this page is a secure resource, the user will be automatically redirected to the login page if they are not already logged into the service.&lt;br /&gt;
&lt;br /&gt;
= SDMX Web Service =&lt;br /&gt;
It is important to note that the FMR-Workbench has the same web service entry points as the FMR, and whilst these web services work, they are not guaranteed to be fully compliant.  The web services of the FMR-Workbench forwards queries onto the connected service.  The queries may be modify to reduce the possibility of the target service not supporting the query. If the connected service reports any error in the query, the FMR-Workbench will report 'no structures' for the query.  &lt;br /&gt;
&lt;br /&gt;
The recommendation is therefore to not rely on the web services of the FMR-Workbench, instead use the web services provided by the target service directly. &lt;br /&gt;
&lt;br /&gt;
= Structure Creation/Modification =&lt;br /&gt;
If the user has logged into the connected service, they will be able to upload structures from the home page of the FMR-Workbench, or create/edit structures using the standard Wizards in the User Interface.  &lt;br /&gt;
&lt;br /&gt;
It is important to note that the FMR-Workbench contains the same User Interface as the FMR, and as such does not provision for the fact that the connected service may not support all the features of the FMR.  For example it may be possible in the FMR-Workbench to create a SDMX 3.0 DSD with multiple measures, but the target service may reject the save request.&lt;br /&gt;
&lt;br /&gt;
It is possible to load structures in any format supported by the FMR-Workbench, including Excel - these structures will be converted into a format supported by the connected service on the save request.&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=File:FWB_Environment_Selection.png&amp;diff=6938</id>
		<title>File:FWB Environment Selection.png</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=File:FWB_Environment_Selection.png&amp;diff=6938"/>
		<updated>2023-07-13T12:36:33Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;FWB Environment Selection&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=FMR_Workbench&amp;diff=6937</id>
		<title>FMR Workbench</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=FMR_Workbench&amp;diff=6937"/>
		<updated>2023-07-13T12:30:53Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
[[File:Fmr wb overview.png|thumb]]&lt;br /&gt;
The '''F'''MR '''W'''ork'''B'''ench (FWB) is a User Interface (UI) for browsing and maintaining SDMX Structures obtained from SDMX compliant Structure Web Services.  The UI of the FWB is a stripped-down version of the Fusion Metadata Registry (FMR) User Interface; it is stripped down because the UI of the FWB supports the use case of viewing and maintaining structural metadata, whilst the FMR supports additional use cases including [[Validate_data|data validation]], [[Convert_data_between_SDMX_formats_V11|data conversion]], and has administrative UI pages.  Whilst the FMR uses a database to store its configuration settings, the FWB configuration is stored in a file.  '''The FWB has no database requirements'''.&lt;br /&gt;
&lt;br /&gt;
The FWB UI browses and displays the SDMX structures of the '''Environment''' it is connected to. An Environment is a connection to a collection of related SDMX web services for a single SDMX service offering. Related web services include the web service entry point to retrieve the structures, the entry point to save structures, and the entry point to delete structures.&lt;br /&gt;
&lt;br /&gt;
The UI of the FWB enables the user to switch their connection to an alternative Environment; the list of available Environments is defined in the configuration file for the FWB.  The connected Environment is associated with the current user; this enables multiple users of the FWB to be connected to different Environments simultaneously.&lt;br /&gt;
&lt;br /&gt;
= Switching Services =&lt;br /&gt;
[[File:Fmr wb service.png|thumb]]&lt;br /&gt;
The header bar of the FMR-Workbench contains a button showing the currently connected service, clicking on this button will open a window to allow a different service to be connected.  By default the service is connected to anonymously, meaning only browser functionality will be supported.&lt;br /&gt;
&lt;br /&gt;
To authenticate, click on the Login button after connecting to the service.  &lt;br /&gt;
&lt;br /&gt;
= Authentication =&lt;br /&gt;
The FMR Workbench supports 2 forms of authentication with the connected service: Basic Authentication and OpenID Connect. The type of authentication is set up in the Config file of the FMR-Workbench.  &lt;br /&gt;
&lt;br /&gt;
== Basic Authentication ==&lt;br /&gt;
Clicking Login will take the user to the FMR-Workbench login page where the user is invited to enter a username and password.  These details are stored in the FMR-Workbench against the user's session, and they are used whenever the user interacts with the target service.  An initial check is performed against the target server to ensure the credentials can be used to obtain some structures, if the check fails then the details are deemed to be invalid and will be discarded.&lt;br /&gt;
&lt;br /&gt;
== Open ID Connect ==&lt;br /&gt;
Clicking Login will take the user to the OpenID Connect login page (defined in the configuration file of the FMR-Workbench).  The user authenticates with the chosen OpenID Connect authentication provider, on success the user is redirected back to the FMR-Workbench with a token.  The token is stored against the user's session, and used to authenticate with the target service. &lt;br /&gt;
&lt;br /&gt;
= Structure Navigation and Export =&lt;br /&gt;
The FMR-Workbench front end will display structures in the same way the FMR provides - clicking on a sidebar item (example Codelists) will display the Codelist page and all the Codelists in the connected service.  This is achieved by the front end issuing a SDMX web service query to the FMR Workbench for all Codelists as stubs.  This query is then forwarded to the connected service, and the response is written back to the client.  The FMR-Workbench can receive the query response from the connected service in any SDMX format.  The response will be parsed by the FMR-Workbench before being written out in the requested format.  This means the FMR-Workbench is able to write the response out in ANY format that the FMR Workbench supports, including Excel, SDMX, and JSON.  The user is therefore able to click on a Codelist and export it as Excel, even if the connected service does not support Excel as an output format.&lt;br /&gt;
&lt;br /&gt;
It is possible to automatically link to a page in the Fusion Registry against a specific service by providing the '''env''' argument in the URL, for example:&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/FMR-WB/items/conceptscheme.html?urn=urn:sdmx:org.sdmx.infomodel.conceptscheme.ConceptScheme=OECD:CS_TOURISM(1.0)&amp;amp;env=DOT_STAT&lt;br /&gt;
&lt;br /&gt;
The above link will take the user to a specific Concept Scheme in the User Interface, from the DOT_STAT environment.&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/FMR-WB/items/conceptscheme-wizard.html?urn=urn:sdmx:org.sdmx.infomodel.conceptscheme.ConceptScheme=OECD:CS_TOURISM(1.0)&amp;amp;env=DOT_STAT&lt;br /&gt;
&lt;br /&gt;
The above link will take the user to the Concept Scheme Wizard (the edit pages for a Concept Scheme).  The Concept Scheme wizard will be editing the CS_TOURISM concept in the DOT_STAT Environment.  As this page is a secure resource, the user will be automatically redirected to the login page if they are not already logged into the service.&lt;br /&gt;
&lt;br /&gt;
= SDMX Web Service =&lt;br /&gt;
It is important to note that the FMR-Workbench has the same web service entry points as the FMR, and whilst these web services work, they are not guaranteed to be fully compliant.  The web services of the FMR-Workbench forwards queries onto the connected service.  The queries may be modify to reduce the possibility of the target service not supporting the query. If the connected service reports any error in the query, the FMR-Workbench will report 'no structures' for the query.  &lt;br /&gt;
&lt;br /&gt;
The recommendation is therefore to not rely on the web services of the FMR-Workbench, instead use the web services provided by the target service directly. &lt;br /&gt;
&lt;br /&gt;
= Structure Creation/Modification =&lt;br /&gt;
If the user has logged into the connected service, they will be able to upload structures from the home page of the FMR-Workbench, or create/edit structures using the standard Wizards in the User Interface.  &lt;br /&gt;
&lt;br /&gt;
It is important to note that the FMR-Workbench contains the same User Interface as the FMR, and as such does not provision for the fact that the connected service may not support all the features of the FMR.  For example it may be possible in the FMR-Workbench to create a SDMX 3.0 DSD with multiple measures, but the target service may reject the save request.&lt;br /&gt;
&lt;br /&gt;
It is possible to load structures in any format supported by the FMR-Workbench, including Excel - these structures will be converted into a format supported by the connected service on the save request.&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=FMR_Workbench&amp;diff=6845</id>
		<title>FMR Workbench</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=FMR_Workbench&amp;diff=6845"/>
		<updated>2023-02-14T12:04:27Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Structure Navigation and Export */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
[[File:Fmr wb overview.png|thumb]]&lt;br /&gt;
The FMR Workbench is a web application which provides the web user interface to view and maintain structural metadata, the critical difference between the FMR Workbench and the Fusion Metadata Registry is that the FMR Workbench does not have a database - the structures that it views and maintains come from a separate web service.&lt;br /&gt;
&lt;br /&gt;
The FMR Workbench reads a config file on startup which describes one or more 'services'. Each service is an SDMX endpoint with a query API and an optional persistence API.  The web user interface of the FMR Workbench enables users to switch between services. The user can then browse the SDMX Structures of the service they are connected to.&lt;br /&gt;
&lt;br /&gt;
The connected service is attached to the user's session, therefore it is possible for multiple users to use the same FMR-Workbench, with each user connecting to a different service.&lt;br /&gt;
&lt;br /&gt;
The FMR-Workbench can be used to edit, and save structures back to the service, if the service supports persistence, and the user is logged in.&lt;br /&gt;
&lt;br /&gt;
= Switching Services =&lt;br /&gt;
[[File:Fmr wb service.png|thumb]]&lt;br /&gt;
The header bar of the FMR-Workbench contains a button showing the currently connected service, clicking on this button will open a window to allow a different service to be connected.  By default the service is connected to anonymously, meaning only browser functionality will be supported.&lt;br /&gt;
&lt;br /&gt;
To authenticate, click on the Login button after connecting to the service.  &lt;br /&gt;
&lt;br /&gt;
= Authentication =&lt;br /&gt;
The FMR Workbench supports 2 forms of authentication with the connected service: Basic Authentication and OpenID Connect. The type of authentication is set up in the Config file of the FMR-Workbench.  &lt;br /&gt;
&lt;br /&gt;
== Basic Authentication ==&lt;br /&gt;
Clicking Login will take the user to the FMR-Workbench login page where the user is invited to enter a username and password.  These details are stored in the FMR-Workbench against the user's session, and they are used whenever the user interacts with the target service.  An initial check is performed against the target server to ensure the credentials can be used to obtain some structures, if the check fails then the details are deemed to be invalid and will be discarded.&lt;br /&gt;
&lt;br /&gt;
== Open ID Connect ==&lt;br /&gt;
Clicking Login will take the user to the OpenID Connect login page (defined in the configuration file of the FMR-Workbench).  The user authenticates with the chosen OpenID Connect authentication provider, on success the user is redirected back to the FMR-Workbench with a token.  The token is stored against the user's session, and used to authenticate with the target service. &lt;br /&gt;
&lt;br /&gt;
= Structure Navigation and Export =&lt;br /&gt;
The FMR-Workbench front end will display structures in the same way the FMR provides - clicking on a sidebar item (example Codelists) will display the Codelist page and all the Codelists in the connected service.  This is achieved by the front end issuing a SDMX web service query to the FMR Workbench for all Codelists as stubs.  This query is then forwarded to the connected service, and the response is written back to the client.  The FMR-Workbench can receive the query response from the connected service in any SDMX format.  The response will be parsed by the FMR-Workbench before being written out in the requested format.  This means the FMR-Workbench is able to write the response out in ANY format that the FMR Workbench supports, including Excel, SDMX, and JSON.  The user is therefore able to click on a Codelist and export it as Excel, even if the connected service does not support Excel as an output format.&lt;br /&gt;
&lt;br /&gt;
It is possible to automatically link to a page in the Fusion Registry against a specific service by providing the '''env''' argument in the URL, for example:&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/FMR-WB/items/conceptscheme.html?urn=urn:sdmx:org.sdmx.infomodel.conceptscheme.ConceptScheme=OECD:CS_TOURISM(1.0)&amp;amp;env=DOT_STAT&lt;br /&gt;
&lt;br /&gt;
The above link will take the user to a specific Concept Scheme in the User Interface, from the DOT_STAT environment.&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/FMR-WB/items/conceptscheme-wizard.html?urn=urn:sdmx:org.sdmx.infomodel.conceptscheme.ConceptScheme=OECD:CS_TOURISM(1.0)&amp;amp;env=DOT_STAT&lt;br /&gt;
&lt;br /&gt;
The above link will take the user to the Concept Scheme Wizard (the edit pages for a Concept Scheme).  The Concept Scheme wizard will be editing the CS_TOURISM concept in the DOT_STAT Environment.  As this page is a secure resource, the user will be automatically redirected to the login page if they are not already logged into the service.&lt;br /&gt;
&lt;br /&gt;
= SDMX Web Service =&lt;br /&gt;
It is important to note that the FMR-Workbench has the same web service entry points as the FMR, and whilst these web services work, they are not guaranteed to be fully compliant.  The web services of the FMR-Workbench forwards queries onto the connected service.  The queries may be modify to reduce the possibility of the target service not supporting the query. If the connected service reports any error in the query, the FMR-Workbench will report 'no structures' for the query.  &lt;br /&gt;
&lt;br /&gt;
The recommendation is therefore to not rely on the web services of the FMR-Workbench, instead use the web services provided by the target service directly. &lt;br /&gt;
&lt;br /&gt;
= Structure Creation/Modification =&lt;br /&gt;
If the user has logged into the connected service, they will be able to upload structures from the home page of the FMR-Workbench, or create/edit structures using the standard Wizards in the User Interface.  &lt;br /&gt;
&lt;br /&gt;
It is important to note that the FMR-Workbench contains the same User Interface as the FMR, and as such does not provision for the fact that the connected service may not support all the features of the FMR.  For example it may be possible in the FMR-Workbench to create a SDMX 3.0 DSD with multiple measures, but the target service may reject the save request.&lt;br /&gt;
&lt;br /&gt;
It is possible to load structures in any format supported by the FMR-Workbench, including Excel - these structures will be converted into a format supported by the connected service on the save request.&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=FMR_Workbench&amp;diff=6844</id>
		<title>FMR Workbench</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=FMR_Workbench&amp;diff=6844"/>
		<updated>2023-02-14T12:04:17Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Structure Navigation and Export */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
[[File:Fmr wb overview.png|thumb]]&lt;br /&gt;
The FMR Workbench is a web application which provides the web user interface to view and maintain structural metadata, the critical difference between the FMR Workbench and the Fusion Metadata Registry is that the FMR Workbench does not have a database - the structures that it views and maintains come from a separate web service.&lt;br /&gt;
&lt;br /&gt;
The FMR Workbench reads a config file on startup which describes one or more 'services'. Each service is an SDMX endpoint with a query API and an optional persistence API.  The web user interface of the FMR Workbench enables users to switch between services. The user can then browse the SDMX Structures of the service they are connected to.&lt;br /&gt;
&lt;br /&gt;
The connected service is attached to the user's session, therefore it is possible for multiple users to use the same FMR-Workbench, with each user connecting to a different service.&lt;br /&gt;
&lt;br /&gt;
The FMR-Workbench can be used to edit, and save structures back to the service, if the service supports persistence, and the user is logged in.&lt;br /&gt;
&lt;br /&gt;
= Switching Services =&lt;br /&gt;
[[File:Fmr wb service.png|thumb]]&lt;br /&gt;
The header bar of the FMR-Workbench contains a button showing the currently connected service, clicking on this button will open a window to allow a different service to be connected.  By default the service is connected to anonymously, meaning only browser functionality will be supported.&lt;br /&gt;
&lt;br /&gt;
To authenticate, click on the Login button after connecting to the service.  &lt;br /&gt;
&lt;br /&gt;
= Authentication =&lt;br /&gt;
The FMR Workbench supports 2 forms of authentication with the connected service: Basic Authentication and OpenID Connect. The type of authentication is set up in the Config file of the FMR-Workbench.  &lt;br /&gt;
&lt;br /&gt;
== Basic Authentication ==&lt;br /&gt;
Clicking Login will take the user to the FMR-Workbench login page where the user is invited to enter a username and password.  These details are stored in the FMR-Workbench against the user's session, and they are used whenever the user interacts with the target service.  An initial check is performed against the target server to ensure the credentials can be used to obtain some structures, if the check fails then the details are deemed to be invalid and will be discarded.&lt;br /&gt;
&lt;br /&gt;
== Open ID Connect ==&lt;br /&gt;
Clicking Login will take the user to the OpenID Connect login page (defined in the configuration file of the FMR-Workbench).  The user authenticates with the chosen OpenID Connect authentication provider, on success the user is redirected back to the FMR-Workbench with a token.  The token is stored against the user's session, and used to authenticate with the target service. &lt;br /&gt;
&lt;br /&gt;
= Structure Navigation and Export =&lt;br /&gt;
The FMR-Workbench front end will display structures in the same way the FMR provides - clicking on a sidebar item (example Codelists) will display the Codelist page and all the Codelists in the connected service.  This is achieved by the front end issuing a SDMX web service query to the FMR Workbench for all Codelists as stubs.  This query is then forwarded to the connected service, and the response is written back to the client.  The FMR-Workbench can receive the query response from the connected service in any SDMX format.  The response will be parsed by the FMR-Workbench before being written out in the requested format.  This means the FMR-Workbench is able to write the response out in ANY format that the FMR Workbench supports, including Excel, SDMX, and JSON.  The user is therefore able to click on a Codelist and export it as Excel, even if the connected service does not support Excel as an output format.&lt;br /&gt;
&lt;br /&gt;
It is possible to automatically link to a page in the Fusion Registry against a specific service by providing the '''env''' argument in the URL, for example:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/FMR-WB/items/conceptscheme.html?urn=urn:sdmx:org.sdmx.infomodel.conceptscheme.ConceptScheme=OECD:CS_TOURISM(1.0)&amp;amp;env=DOT_STAT&lt;br /&gt;
&lt;br /&gt;
The above link will take the user to a specific Concept Scheme in the User Interface, from the DOT_STAT environment.&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/FMR-WB/items/conceptscheme-wizard.html?urn=urn:sdmx:org.sdmx.infomodel.conceptscheme.ConceptScheme=OECD:CS_TOURISM(1.0)&amp;amp;env=DOT_STAT&lt;br /&gt;
&lt;br /&gt;
The above link will take the user to the Concept Scheme Wizard (the edit pages for a Concept Scheme).  The Concept Scheme wizard will be editing the CS_TOURISM concept in the DOT_STAT Environment.  As this page is a secure resource, the user will be automatically redirected to the login page if they are not already logged into the service.&lt;br /&gt;
&lt;br /&gt;
= SDMX Web Service =&lt;br /&gt;
It is important to note that the FMR-Workbench has the same web service entry points as the FMR, and whilst these web services work, they are not guaranteed to be fully compliant.  The web services of the FMR-Workbench forwards queries onto the connected service.  The queries may be modify to reduce the possibility of the target service not supporting the query. If the connected service reports any error in the query, the FMR-Workbench will report 'no structures' for the query.  &lt;br /&gt;
&lt;br /&gt;
The recommendation is therefore to not rely on the web services of the FMR-Workbench, instead use the web services provided by the target service directly. &lt;br /&gt;
&lt;br /&gt;
= Structure Creation/Modification =&lt;br /&gt;
If the user has logged into the connected service, they will be able to upload structures from the home page of the FMR-Workbench, or create/edit structures using the standard Wizards in the User Interface.  &lt;br /&gt;
&lt;br /&gt;
It is important to note that the FMR-Workbench contains the same User Interface as the FMR, and as such does not provision for the fact that the connected service may not support all the features of the FMR.  For example it may be possible in the FMR-Workbench to create a SDMX 3.0 DSD with multiple measures, but the target service may reject the save request.&lt;br /&gt;
&lt;br /&gt;
It is possible to load structures in any format supported by the FMR-Workbench, including Excel - these structures will be converted into a format supported by the connected service on the save request.&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=FMR_Workbench&amp;diff=6843</id>
		<title>FMR Workbench</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=FMR_Workbench&amp;diff=6843"/>
		<updated>2023-02-14T12:03:57Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Structure Navigation and Export */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
[[File:Fmr wb overview.png|thumb]]&lt;br /&gt;
The FMR Workbench is a web application which provides the web user interface to view and maintain structural metadata, the critical difference between the FMR Workbench and the Fusion Metadata Registry is that the FMR Workbench does not have a database - the structures that it views and maintains come from a separate web service.&lt;br /&gt;
&lt;br /&gt;
The FMR Workbench reads a config file on startup which describes one or more 'services'. Each service is an SDMX endpoint with a query API and an optional persistence API.  The web user interface of the FMR Workbench enables users to switch between services. The user can then browse the SDMX Structures of the service they are connected to.&lt;br /&gt;
&lt;br /&gt;
The connected service is attached to the user's session, therefore it is possible for multiple users to use the same FMR-Workbench, with each user connecting to a different service.&lt;br /&gt;
&lt;br /&gt;
The FMR-Workbench can be used to edit, and save structures back to the service, if the service supports persistence, and the user is logged in.&lt;br /&gt;
&lt;br /&gt;
= Switching Services =&lt;br /&gt;
[[File:Fmr wb service.png|thumb]]&lt;br /&gt;
The header bar of the FMR-Workbench contains a button showing the currently connected service, clicking on this button will open a window to allow a different service to be connected.  By default the service is connected to anonymously, meaning only browser functionality will be supported.&lt;br /&gt;
&lt;br /&gt;
To authenticate, click on the Login button after connecting to the service.  &lt;br /&gt;
&lt;br /&gt;
= Authentication =&lt;br /&gt;
The FMR Workbench supports 2 forms of authentication with the connected service: Basic Authentication and OpenID Connect. The type of authentication is set up in the Config file of the FMR-Workbench.  &lt;br /&gt;
&lt;br /&gt;
== Basic Authentication ==&lt;br /&gt;
Clicking Login will take the user to the FMR-Workbench login page where the user is invited to enter a username and password.  These details are stored in the FMR-Workbench against the user's session, and they are used whenever the user interacts with the target service.  An initial check is performed against the target server to ensure the credentials can be used to obtain some structures, if the check fails then the details are deemed to be invalid and will be discarded.&lt;br /&gt;
&lt;br /&gt;
== Open ID Connect ==&lt;br /&gt;
Clicking Login will take the user to the OpenID Connect login page (defined in the configuration file of the FMR-Workbench).  The user authenticates with the chosen OpenID Connect authentication provider, on success the user is redirected back to the FMR-Workbench with a token.  The token is stored against the user's session, and used to authenticate with the target service. &lt;br /&gt;
&lt;br /&gt;
= Structure Navigation and Export =&lt;br /&gt;
The FMR-Workbench front end will display structures in the same way the FMR provides - clicking on a sidebar item (example Codelists) will display the Codelist page and all the Codelists in the connected service.  This is achieved by the front end issuing a SDMX web service query to the FMR Workbench for all Codelists as stubs.  This query is then forwarded to the connected service, and the response is written back to the client.  The FMR-Workbench can receive the query response from the connected service in any SDMX format.  The response will be parsed by the FMR-Workbench before being written out in the requested format.  This means the FMR-Workbench is able to write the response out in ANY format that the FMR Workbench supports, including Excel, SDMX, and JSON.  The user is therefore able to click on a Codelist and export it as Excel, even if the connected service does not support Excel as an output format.&lt;br /&gt;
&lt;br /&gt;
It is possible to automatically link to a page in the Fusion Registry against a specific service by providing the '''env''' argument in the URL, for example:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/FMR-WB/items/conceptscheme.html?urn=urn:sdmx:org.sdmx.infomodel.conceptscheme.ConceptScheme=OECD:CS_TOURISM(1.0)&amp;amp;env=DOT_STAT&lt;br /&gt;
&lt;br /&gt;
The above link will take the user to a specific Concept Scheme in the User Interface, from the DOT_STAT environment.&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/items/conceptscheme-wizard.html?urn=urn:sdmx:org.sdmx.infomodel.conceptscheme.ConceptScheme=OECD:CS_TOURISM(1.0)&amp;amp;env=DOT_STAT&lt;br /&gt;
&lt;br /&gt;
The above link will take the user to the Concept Scheme Wizard (the edit pages for a Concept Scheme).  The Concept Scheme wizard will be editing the CS_TOURISM concept in the DOT_STAT Environment.  As this page is a secure resource, the user will be automatically redirected to the login page if they are not already logged into the service.&lt;br /&gt;
&lt;br /&gt;
= SDMX Web Service =&lt;br /&gt;
It is important to note that the FMR-Workbench has the same web service entry points as the FMR, and whilst these web services work, they are not guaranteed to be fully compliant.  The web services of the FMR-Workbench forwards queries onto the connected service.  The queries may be modify to reduce the possibility of the target service not supporting the query. If the connected service reports any error in the query, the FMR-Workbench will report 'no structures' for the query.  &lt;br /&gt;
&lt;br /&gt;
The recommendation is therefore to not rely on the web services of the FMR-Workbench, instead use the web services provided by the target service directly. &lt;br /&gt;
&lt;br /&gt;
= Structure Creation/Modification =&lt;br /&gt;
If the user has logged into the connected service, they will be able to upload structures from the home page of the FMR-Workbench, or create/edit structures using the standard Wizards in the User Interface.  &lt;br /&gt;
&lt;br /&gt;
It is important to note that the FMR-Workbench contains the same User Interface as the FMR, and as such does not provision for the fact that the connected service may not support all the features of the FMR.  For example it may be possible in the FMR-Workbench to create a SDMX 3.0 DSD with multiple measures, but the target service may reject the save request.&lt;br /&gt;
&lt;br /&gt;
It is possible to load structures in any format supported by the FMR-Workbench, including Excel - these structures will be converted into a format supported by the connected service on the save request.&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=FMR_Workbench&amp;diff=6842</id>
		<title>FMR Workbench</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=FMR_Workbench&amp;diff=6842"/>
		<updated>2023-02-14T12:03:50Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Structure Navigation and Export */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
[[File:Fmr wb overview.png|thumb]]&lt;br /&gt;
The FMR Workbench is a web application which provides the web user interface to view and maintain structural metadata, the critical difference between the FMR Workbench and the Fusion Metadata Registry is that the FMR Workbench does not have a database - the structures that it views and maintains come from a separate web service.&lt;br /&gt;
&lt;br /&gt;
The FMR Workbench reads a config file on startup which describes one or more 'services'. Each service is an SDMX endpoint with a query API and an optional persistence API.  The web user interface of the FMR Workbench enables users to switch between services. The user can then browse the SDMX Structures of the service they are connected to.&lt;br /&gt;
&lt;br /&gt;
The connected service is attached to the user's session, therefore it is possible for multiple users to use the same FMR-Workbench, with each user connecting to a different service.&lt;br /&gt;
&lt;br /&gt;
The FMR-Workbench can be used to edit, and save structures back to the service, if the service supports persistence, and the user is logged in.&lt;br /&gt;
&lt;br /&gt;
= Switching Services =&lt;br /&gt;
[[File:Fmr wb service.png|thumb]]&lt;br /&gt;
The header bar of the FMR-Workbench contains a button showing the currently connected service, clicking on this button will open a window to allow a different service to be connected.  By default the service is connected to anonymously, meaning only browser functionality will be supported.&lt;br /&gt;
&lt;br /&gt;
To authenticate, click on the Login button after connecting to the service.  &lt;br /&gt;
&lt;br /&gt;
= Authentication =&lt;br /&gt;
The FMR Workbench supports 2 forms of authentication with the connected service: Basic Authentication and OpenID Connect. The type of authentication is set up in the Config file of the FMR-Workbench.  &lt;br /&gt;
&lt;br /&gt;
== Basic Authentication ==&lt;br /&gt;
Clicking Login will take the user to the FMR-Workbench login page where the user is invited to enter a username and password.  These details are stored in the FMR-Workbench against the user's session, and they are used whenever the user interacts with the target service.  An initial check is performed against the target server to ensure the credentials can be used to obtain some structures, if the check fails then the details are deemed to be invalid and will be discarded.&lt;br /&gt;
&lt;br /&gt;
== Open ID Connect ==&lt;br /&gt;
Clicking Login will take the user to the OpenID Connect login page (defined in the configuration file of the FMR-Workbench).  The user authenticates with the chosen OpenID Connect authentication provider, on success the user is redirected back to the FMR-Workbench with a token.  The token is stored against the user's session, and used to authenticate with the target service. &lt;br /&gt;
&lt;br /&gt;
= Structure Navigation and Export =&lt;br /&gt;
The FMR-Workbench front end will display structures in the same way the FMR provides - clicking on a sidebar item (example Codelists) will display the Codelist page and all the Codelists in the connected service.  This is achieved by the front end issuing a SDMX web service query to the FMR Workbench for all Codelists as stubs.  This query is then forwarded to the connected service, and the response is written back to the client.  The FMR-Workbench can receive the query response from the connected service in any SDMX format.  The response will be parsed by the FMR-Workbench before being written out in the requested format.  This means the FMR-Workbench is able to write the response out in ANY format that the FMR Workbench supports, including Excel, SDMX, and JSON.  The user is therefore able to click on a Codelist and export it as Excel, even if the connected service does not support Excel as an output format.&lt;br /&gt;
&lt;br /&gt;
It is possible to automatically link to a page in the Fusion Registry against a specific service by providing the '''env''' argument in the URL, for example:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080/FMR-WB/items/conceptscheme.html?urn=urn:sdmx:org.sdmx.infomodel.conceptscheme.ConceptScheme=OECD:CS_TOURISM(1.0)&amp;amp;env=DOT_STAT&lt;br /&gt;
&lt;br /&gt;
The above link will take the user to a specific Concept Scheme in the User Interface, from the DOT_STAT environment.&lt;br /&gt;
&lt;br /&gt;
http://localhost:8080/items/conceptscheme-wizard.html?urn=urn:sdmx:org.sdmx.infomodel.conceptscheme.ConceptScheme=OECD:CS_TOURISM(1.0)&amp;amp;env=DOT_STAT&lt;br /&gt;
&lt;br /&gt;
The above link will take the user to the Concept Scheme Wizard (the edit pages for a Concept Scheme).  The Concept Scheme wizard will be editing the CS_TOURISM concept in the DOT_STAT Environment.  As this page is a secure resource, the user will be automatically redirected to the login page if they are not already logged into the service.&lt;br /&gt;
&lt;br /&gt;
= SDMX Web Service =&lt;br /&gt;
It is important to note that the FMR-Workbench has the same web service entry points as the FMR, and whilst these web services work, they are not guaranteed to be fully compliant.  The web services of the FMR-Workbench forwards queries onto the connected service.  The queries may be modify to reduce the possibility of the target service not supporting the query. If the connected service reports any error in the query, the FMR-Workbench will report 'no structures' for the query.  &lt;br /&gt;
&lt;br /&gt;
The recommendation is therefore to not rely on the web services of the FMR-Workbench, instead use the web services provided by the target service directly. &lt;br /&gt;
&lt;br /&gt;
= Structure Creation/Modification =&lt;br /&gt;
If the user has logged into the connected service, they will be able to upload structures from the home page of the FMR-Workbench, or create/edit structures using the standard Wizards in the User Interface.  &lt;br /&gt;
&lt;br /&gt;
It is important to note that the FMR-Workbench contains the same User Interface as the FMR, and as such does not provision for the fact that the connected service may not support all the features of the FMR.  For example it may be possible in the FMR-Workbench to create a SDMX 3.0 DSD with multiple measures, but the target service may reject the save request.&lt;br /&gt;
&lt;br /&gt;
It is possible to load structures in any format supported by the FMR-Workbench, including Excel - these structures will be converted into a format supported by the connected service on the save request.&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=Data_Validation_Web_Service&amp;diff=6800</id>
		<title>Data Validation Web Service</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=Data_Validation_Web_Service&amp;diff=6800"/>
		<updated>2022-12-21T12:49:03Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* HTTP Headers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:FMR REST API Reference]]&lt;br /&gt;
= Overview =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Entry Point&amp;lt;/b&amp;gt;|| &amp;lt;b&amp;gt; /ws/public/data/validate &amp;lt;/b&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Access&amp;lt;/b&amp;gt;|| &amp;lt;span style='color:green'&amp;gt;&amp;lt;b&amp;gt;Public&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt; (default). Configurable to Private&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Http Method&amp;lt;/b&amp;gt;|| POST&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Accepts&amp;lt;/b&amp;gt;|| CSV, XLSX, SDMX-ML, SDMX-EDI (any format for which there is a Data Reader)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Compression&amp;lt;/b&amp;gt; || Zip files supported, if loading from URL gzip responses supported&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Content-Type&amp;lt;/b&amp;gt;|| &amp;lt;p&amp;gt;1.	multipart/form-data (if attaching file) – the attached file must be in field name of uploadFile&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;2.	application/text or application/xml (if submitting data in the body of the POST)&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Response Format&amp;lt;/b&amp;gt;|| application/json&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Response Statuses&amp;lt;/b&amp;gt;|| &amp;lt;p&amp;gt;&amp;lt;b&amp;gt;200&amp;lt;/b&amp;gt; - Validation could be performed&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;400&amp;lt;/b&amp;gt; - Validation could not be performed (either an unreadable dataset, or unresolvable reference to a required structure)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;401&amp;lt;/b&amp;gt; - Unauthorized (if access has been restricted)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;500&amp;lt;/b&amp;gt; - Server Error&amp;lt;/p&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= HTTP Headers =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!|HTTP Header || Purpose || Allowed Values&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Data-Format&amp;lt;/b&amp;gt;|| Used to inform the server when the data is in CSV format. ||csv;delimiter=[delimiter]&lt;br /&gt;
&amp;lt;p&amp;gt;Where [delimiter] is either:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;comma&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;tab&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;semicolon&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;space&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Structure&amp;lt;/b&amp;gt; || &amp;lt;p&amp;gt;(optional) Provides the structure to validate the data against.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;This information may be present in the header of the dataset, if provided this value will override the value in the dataset.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Fusion Metadada Registry v10.4.7 onwards accepts a comma separated list of URNs if multiple datasets exist in the loaded file, however if multiple URNs are provided, URN must be of a Dataflow or Provision Agreement and the datasets must identify at a minimum the Data Structure that is needed to read the file.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|| Valid SDMX URN for Provision Agreement, Dataflow, or Data Structure Definition&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Inc-Metrics&amp;lt;/b&amp;gt;&amp;lt;p style=&amp;quot;font-size:0.85em&amp;quot;&amp;gt;(Since v9.8)&amp;lt;/p&amp;gt;||&lt;br /&gt;
&amp;lt;p&amp;gt;Optional. Includes metrics on the validation.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;This will add extra detail to the validation report.&amp;lt;/p&amp;gt;&lt;br /&gt;
||Boolean (true/false)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Inc-Valid&amp;lt;/b&amp;gt;&amp;lt;p style=&amp;quot;font-size:0.85em&amp;quot;&amp;gt;(Since v9.8)&amp;lt;/p&amp;gt;||&amp;lt;p&amp;gt;Optional. Instructs the service to include a dataset with all the valid series and observations in the response.&amp;lt;/p&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;As the result will contain a separate file for the dataset, the response format will be set to either multipart/mixed message with a boundary per file, or if the Zip header is set to true, the output will be a single zip file.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;The file is called ValidData with the file extension based on the output format.&amp;lt;/p&amp;gt;&lt;br /&gt;
||Boolean (true/false)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Inc-Invalid&amp;lt;/b&amp;gt;&amp;lt;p style=&amp;quot;font-size:0.85em&amp;quot;&amp;gt;(Since v9.8)&amp;lt;/p&amp;gt;||&amp;lt;p&amp;gt;&lt;br /&gt;
Optional. Instructs the service to include a dataset with all the invalid series and observations in the response.  &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;As the result will contain a separate file for the dataset, the response format will be set to either multipart/mixed message with a boundary per file, or if the Zip header is set to true, the output will be a single zip file.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;The file is called InvalidData with the file extension based on the output format.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
||Boolean (true/false)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Accept&amp;lt;/b&amp;gt;&amp;lt;p style=&amp;quot;font-size:0.85em&amp;quot;&amp;gt;(Since v9.8)&amp;lt;/p&amp;gt;||&amp;lt;p&amp;gt;Optional. Instructs the service which data output format to output the valid or invalid datasets in.&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;'''Note''': From FMR 11.5.0 the format (if not specified) defaults to the input format.  Previous versions defaulted to SDMX Structure Specific 2.1&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;'''Note''': This Header is only used if Inc-Valid or Inc-Invalid are set to true.&amp;lt;/p&amp;gt;&lt;br /&gt;
||[[Data_Formats|See Accept Formats]]&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Zip&amp;lt;/b&amp;gt;&amp;lt;p style=&amp;quot;font-size:0.85em&amp;quot;&amp;gt;(Since v9.8)&amp;lt;/p&amp;gt;||Optional. Compresses the output as a zip file.  If used in conjunction with &amp;lt;b&amp;gt;Inc-Valid&amp;lt;/b&amp;gt; or &amp;lt;b&amp;gt;Inc-Invalid&amp;lt;/b&amp;gt; the zip will contain multiple files.&lt;br /&gt;
||Boolean (true/false)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Prior-Data-Dependent&amp;lt;/b&amp;gt;&amp;lt;p style=&amp;quot;font-size:0.85em&amp;quot;&amp;gt;(Since v9.8)&amp;lt;/p&amp;gt;||&amp;lt;p&amp;gt;&lt;br /&gt;
Optional. This allows data to be validated under the assumption that other data will provide missing information.  If this value is set to true, particular data validators will not be used when validating the data. These validators are &amp;quot;Mandatory Observations&amp;quot; and &amp;quot;Valid Calculations&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Default value is false.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
||Boolean (true/false)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Response =&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The validation output contains both human readable error descriptions, as well as machine processible locations of the errors within the dataset.  The location in the dataset is described as a key or observation locator in the format; A:UK:M:2008 – where each component relates to the Dimension value, separated by a colon.  If the error position is observation, the last part of the key is the observation time period.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;There are 3 types of output that can be produced which share a common structure: unable to parse input(returns HTTP 400); able to parse input but references invalid data structure (returns HTTP 200); parsed input and returns output, which may have validation errors (return HTTPS 200). Below are examples of each:&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Valid Dataset ==&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;Meta&amp;quot;: {&lt;br /&gt;
    &amp;quot;RequestTime&amp;quot;: 1564410081711,&lt;br /&gt;
    &amp;quot;Duration&amp;quot;: 43&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;FileFormat&amp;quot;: &amp;quot;Structure Specific (Compact) v2.1&amp;quot;,&lt;br /&gt;
  &amp;quot;Prepared&amp;quot;: &amp;quot;2019-07-29T10:23:01&amp;quot;,&lt;br /&gt;
  &amp;quot;SenderId&amp;quot;: &amp;quot;FR_DEMO&amp;quot;,&lt;br /&gt;
  &amp;quot;DataSetId&amp;quot;: null,&lt;br /&gt;
  &amp;quot;Status&amp;quot;: &amp;quot;Complete&amp;quot;,&lt;br /&gt;
  &amp;quot;Errors&amp;quot;: false,&lt;br /&gt;
  &amp;quot;Datasets&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;DSD&amp;quot;: &amp;quot;urn:sdmx:org.sdmx.infomodel.datastructure.DataStructure=OECD:HIGH_AGLINK_2011(1.0)&amp;quot;,&lt;br /&gt;
      &amp;quot;Dataflow&amp;quot;: &amp;quot;urn:sdmx:org.sdmx.infomodel.datastructure.Dataflow=OECD:AGRIC_OUTLOOK_2011_2020(1.0)&amp;quot;,&lt;br /&gt;
      &amp;quot;DataProvider&amp;quot;: &amp;quot;urn:sdmx:org.sdmx.infomodel.base.DataProvider=METATECH:DATA_PROVIDERS(1.0).METATECH&amp;quot;,&lt;br /&gt;
      &amp;quot;ProvisionAgreement&amp;quot;: &amp;quot;urn:sdmx:org.sdmx.infomodel.registry.ProvisionAgreement=OECD:OECD_AGRIC_OUTLOOK(1.0)&amp;quot;,&lt;br /&gt;
      &amp;quot;KeysCount&amp;quot;: 2,&lt;br /&gt;
      &amp;quot;ObsCount&amp;quot;: 62,&lt;br /&gt;
      &amp;quot;GroupsCount&amp;quot;: 0,&lt;br /&gt;
      &amp;quot;Errors&amp;quot;: false&lt;br /&gt;
      &amp;quot;ReportedPeriods&amp;quot;: {&lt;br /&gt;
      &amp;quot;A&amp;quot;: {&lt;br /&gt;
          &amp;quot;Name&amp;quot;: &amp;quot;Annual&amp;quot;,&lt;br /&gt;
          &amp;quot;StartPeriod&amp;quot;: &amp;quot;1990&amp;quot;,&lt;br /&gt;
          &amp;quot;EndPeriod&amp;quot;: &amp;quot;2020&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      }, &lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;PreventsConversion&amp;quot;: false,&lt;br /&gt;
  &amp;quot;PreventsPublication&amp;quot;: false&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Dataset with Errors ==&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;Meta&amp;quot;: {&lt;br /&gt;
    &amp;quot;RequestTime&amp;quot;: 1564401209760,&lt;br /&gt;
    &amp;quot;Duration&amp;quot;: 34&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;InvalidData&amp;quot;: {&lt;br /&gt;
    &amp;quot;Datasets&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;Structure&amp;quot;: &amp;quot;urn:sdmx:org.sdmx.infomodel.registry.ProvisionAgreement=OECD:OECD_AGRIC_OUTLOOK(1.0)&amp;quot;,&lt;br /&gt;
        &amp;quot;Series&amp;quot;: 2,&lt;br /&gt;
        &amp;quot;Observations&amp;quot;: 61,&lt;br /&gt;
        &amp;quot;Groups&amp;quot;: 0&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;ValidData&amp;quot;: {&lt;br /&gt;
    &amp;quot;Datasets&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;Structure&amp;quot;: &amp;quot;urn:sdmx:org.sdmx.infomodel.registry.ProvisionAgreement=OECD:OECD_AGRIC_OUTLOOK(1.0)&amp;quot;,&lt;br /&gt;
        &amp;quot;Series&amp;quot;: 2,&lt;br /&gt;
        &amp;quot;Observations&amp;quot;: 32,&lt;br /&gt;
        &amp;quot;Groups&amp;quot;: 0&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;FileFormat&amp;quot;: &amp;quot;Structure Specific (Compact) v2.1&amp;quot;,&lt;br /&gt;
  &amp;quot;Prepared&amp;quot;: &amp;quot;2019-07-29T10:23:01&amp;quot;,&lt;br /&gt;
  &amp;quot;SenderId&amp;quot;: &amp;quot;FR_DEMO&amp;quot;,&lt;br /&gt;
  &amp;quot;DataSetId&amp;quot;: null,&lt;br /&gt;
  &amp;quot;Status&amp;quot;: &amp;quot;Complete&amp;quot;,&lt;br /&gt;
  &amp;quot;Errors&amp;quot;: true,&lt;br /&gt;
  &amp;quot;Datasets&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;DSD&amp;quot;: &amp;quot;urn:sdmx:org.sdmx.infomodel.datastructure.DataStructure=OECD:HIGH_AGLINK_2011(1.0)&amp;quot;,&lt;br /&gt;
      &amp;quot;Dataflow&amp;quot;: &amp;quot;urn:sdmx:org.sdmx.infomodel.datastructure.Dataflow=OECD:AGRIC_OUTLOOK_2011_2020(1.0)&amp;quot;,&lt;br /&gt;
      &amp;quot;DataProvider&amp;quot;: &amp;quot;urn:sdmx:org.sdmx.infomodel.base.DataProvider=METATECH:DATA_PROVIDERS(1.0).METATECH&amp;quot;,&lt;br /&gt;
      &amp;quot;ProvisionAgreement&amp;quot;: &amp;quot;urn:sdmx:org.sdmx.infomodel.registry.ProvisionAgreement=OECD:OECD_AGRIC_OUTLOOK(1.0)&amp;quot;,&lt;br /&gt;
      &amp;quot;KeysCount&amp;quot;: 3,&lt;br /&gt;
      &amp;quot;ObsCount&amp;quot;: 93,&lt;br /&gt;
      &amp;quot;GroupsCount&amp;quot;: 0,&lt;br /&gt;
      &amp;quot;ReportedPeriods&amp;quot;: {&lt;br /&gt;
        &amp;quot;A&amp;quot;: {&lt;br /&gt;
               &amp;quot;Name&amp;quot;: &amp;quot;Annual&amp;quot;,&lt;br /&gt;
               &amp;quot;StartPeriod&amp;quot;: &amp;quot;1990&amp;quot;,&lt;br /&gt;
               &amp;quot;EndPeriod&amp;quot;: &amp;quot;2020&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;Errors&amp;quot;: true,&lt;br /&gt;
      &amp;quot;ValidationReport&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
          &amp;quot;Type&amp;quot;: &amp;quot;Constraint&amp;quot;,&lt;br /&gt;
          &amp;quot;Errors&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;Message&amp;quot;: &amp;quot;Disallowed Dimension Value: REF_AREA=AFR&amp;quot;,&lt;br /&gt;
              &amp;quot;Dataset&amp;quot;: 0,&lt;br /&gt;
              &amp;quot;ComponentId&amp;quot;: &amp;quot; REF_AREA &amp;quot;,&lt;br /&gt;
              &amp;quot;ReportedValue&amp;quot;: &amp;quot;AFR&amp;quot;,&lt;br /&gt;
              &amp;quot;Position&amp;quot;: &amp;quot;Series&amp;quot;,&lt;br /&gt;
              &amp;quot;Keys&amp;quot;: [&amp;quot;AFR:BT:AA&amp;quot;]&lt;br /&gt;
            }&lt;br /&gt;
          ]&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;Type&amp;quot;: &amp;quot;Representation&amp;quot;,&lt;br /&gt;
          &amp;quot;Errors&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;Message&amp;quot;: &amp;quot;Dimension 'VARIABLE' is reporting value 'AA' which  is not a valid representation in referenced Codelist 'OECD:CL_HIGH_AGLINK_2011_VARIABLE(1.0)'&amp;quot;,&lt;br /&gt;
            &amp;quot;Dataset&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;Position&amp;quot;: &amp;quot;Series&amp;quot;,              &lt;br /&gt;
            &amp;quot;ComponentId&amp;quot;: &amp;quot;VARIABLE&amp;quot;,&lt;br /&gt;
            &amp;quot;ReportedValue&amp;quot;: &amp;quot;AA&amp;quot;,&lt;br /&gt;
            &amp;quot;Keys&amp;quot;: [&amp;quot;AFR:BT:AA&amp;quot;]&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;Message&amp;quot;: &amp;quot;Error in Primary Measure 'OBS_VALUE': Reported value 'XXX' is not of expected type 'Double'&amp;quot;,&lt;br /&gt;
            &amp;quot;Dataset&amp;quot;: 0,              &lt;br /&gt;
            &amp;quot;ComponentId&amp;quot;: &amp;quot; OBS_VALUE&amp;quot;,&lt;br /&gt;
            &amp;quot;ReportedValue&amp;quot;: &amp;quot;XXX&amp;quot;,&lt;br /&gt;
            &amp;quot;Position&amp;quot;: &amp;quot;Observation&amp;quot;,&lt;br /&gt;
            &amp;quot;Keys&amp;quot;: [&amp;quot;AFR:BT:IM:2010&amp;quot;]&lt;br /&gt;
          }&lt;br /&gt;
          ]&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
          &amp;quot;Type&amp;quot;: &amp;quot;FormatSpecific&amp;quot;,&lt;br /&gt;
          &amp;quot;Errors&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
            &amp;quot;Message&amp;quot;: &amp;quot;Unexpected attribute 'ASD' for element 'StructureSpecificData/DataSet/Series/Obs'&amp;quot;,&lt;br /&gt;
            &amp;quot;Dataset&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;Position&amp;quot;: &amp;quot;Dataset&amp;quot;&lt;br /&gt;
          }&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;PreventsConversion&amp;quot;: false,&lt;br /&gt;
  &amp;quot;PreventsPublication&amp;quot;: true&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Note the first three elements ‘Meta’, ‘InvalidData’, ‘ValidData’, there are present in the report if Inc-Metrics is set to true.  Inc-valid and Inc-Invalid set to true enables the report to know the metrics for the invalid and valid data.&amp;lt;/p&amp;gt;  &lt;br /&gt;
&amp;lt;p&amp;gt;Note also each Error has a Type, this is the category of error which caused the validator to fail.  For a list of all validators see the following section on Validators.&lt;br /&gt;
The Error Position is either set to Dataset, Series, Observation, or Group.  &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;PreventsConversion and PreventsPublication is an indication on the severity of the error.  These settings on which errors prevent conversion and publication can be set in the Fusion Metadata Registry by the administrator of the system.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Dataset with an Unresolvable Datset Reference ==&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;FileFormat&amp;quot;: &amp;quot;Generic v2.1&amp;quot;,&lt;br /&gt;
   &amp;quot;MimeType&amp;quot;: &amp;quot;application/xml&amp;quot;,&lt;br /&gt;
   &amp;quot;Status&amp;quot;: &amp;quot;InvalidRef&amp;quot;,&lt;br /&gt;
   &amp;quot;Errors&amp;quot;: true,&lt;br /&gt;
   &amp;quot;Datasets&amp;quot;: [{&amp;quot;Dataflow&amp;quot;: &amp;quot;urn:sdmx:org.sdmx.infomodel.datastructure.Dataflow=BIS:INVALID_DATAFLOW(1.0)&amp;quot;}]&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;Errors&amp;lt;/b&amp;gt; has a value of true, the &amp;lt;b&amp;gt;Status&amp;lt;/b&amp;gt; states InvalidRef, and the &amp;lt;b&amp;gt;Datasets&amp;lt;/b&amp;gt; provides the reported reference which could not be resolved&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Dataset which could not be read ==&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;Status&amp;quot;: &amp;quot;Error&amp;quot;,&lt;br /&gt;
   &amp;quot;Errors&amp;quot;: true,&lt;br /&gt;
   &amp;quot;Error&amp;quot;: &amp;quot;Unexpected '&amp;lt;' character in element (missing closing '&amp;gt;'?)\r\n at [row,col {unknown-source}]: [17,3]&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;p&amp;gt;This error will be reported when the Fusion Metadata Registry is unable to determine what type of data the dataset is, so is unable to process the dataset for validation&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=Data_Transformation_Web_Service&amp;diff=6799</id>
		<title>Data Transformation Web Service</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=Data_Transformation_Web_Service&amp;diff=6799"/>
		<updated>2022-12-21T12:48:18Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* HTTP Headers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:FMR REST API Reference]]&lt;br /&gt;
= Overview =&lt;br /&gt;
The Data Transformation Web Service converts the dataset submitted in the POST body to the data transmission format specified by the Accept header, optionally transforming it to a different Data Structure Definition if the Registry has a Structure Map defining the mapping.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Entry Point&amp;lt;/b&amp;gt;|| &amp;lt;b&amp;gt; /ws/public/data/transform&amp;lt;/b&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Access&amp;lt;/b&amp;gt;|| &amp;lt;span style='color:green'&amp;gt;&amp;lt;b&amp;gt;Public&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt; (default). Configurable to Private&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Http Method&amp;lt;/b&amp;gt;|| POST&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Accepts&amp;lt;/b&amp;gt;|| CSV, XLSX, SDMX-ML, SDMX-EDI (any format for which there is a Data Reader)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Compression&amp;lt;/b&amp;gt; || Zip files supported, if loading from URL gzip responses supported&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Content-Type&amp;lt;/b&amp;gt;|| &amp;lt;p&amp;gt;1.	multipart/form-data (if attaching file) – the attached file must be in field name of uploadFile&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;2.	application/text or application/xml (if submitting data in the body of the POST)&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Response Format&amp;lt;/b&amp;gt;|| Determined by Accept Header - default SDMX 2.1 Structure Specific&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Response Statuses&amp;lt;/b&amp;gt;|| &amp;lt;p&amp;gt;&amp;lt;b&amp;gt;200&amp;lt;/b&amp;gt; - Transformation performed&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;400&amp;lt;/b&amp;gt; - Transformation could not be performed (either an unreadable datasets, or resolvable reference to a required structure)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;401&amp;lt;/b&amp;gt; - Unauthorized (if access has been restricted)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;500&amp;lt;/b&amp;gt; - Server Error&amp;lt;/p&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= HTTP Headers =&lt;br /&gt;
The Accept Header is used to define the output format, to transform the data to.&lt;br /&gt;
&lt;br /&gt;
In addition, the following optional header parameters can be used to provide further details on the incoming dataset. If these details are not provided, the Fusion Registry will interrogate the dataset header to get the information. If the dataset is a non-SDMX format, or does not contain the required information in the header, then an error response will be returned.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!|HTTP Header || Purpose || Allowed Values&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Accept&amp;lt;/b&amp;gt;|| The data transmission format to convert the dataset to.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Note''': From FMR 11.5.0 the format (if not specified) defaults to the input format.  Previous versions defaulted to SDMX Structure Specific 2.1&lt;br /&gt;
 ||&lt;br /&gt;
&amp;lt;p&amp;gt;SDMX Formats&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul dir=&amp;quot;auto&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;application/vnd.sdmx.data+csv;version=2.0.0;labels=[id|name|both];timeFormat=[original|normalized];keys=[none|obs|series|both]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;application/vnd.sdmx.genericdata+xml;version=2.1&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;application/vnd.sdmx.structurespecificdata+xml;version=2.1&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;application/vnd.sdmx.generictimeseriesdata+xml;version=2.1&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;application/vnd.sdmx.structurespecifictimeseriesdata+xml;version=2.1&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;application/vnd.sdmx.data+json;version=1.0.0&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;application/vnd.sdmx.data+csv;version=1.0.0;labels=[id|both];timeFormat=[original|normalized]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;application/vnd.sdmx.data+edi&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;SDMX Formats to be supported in future FMR releases&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;application/vnd.sdmx.data+json;version=2.0.0&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;application/vnd.sdmx.data+xml;version=3.0.0&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Note that the Fusion Excel data transmission format is supported as the input, but not output of a transformation.&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Data-Format&amp;lt;/b&amp;gt;|| Used to inform the server when the data is in CSV format. ||csv;delimiter=[delimiter]&lt;br /&gt;
&amp;lt;p&amp;gt;Where [delimiter] is either:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;comma&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;tab&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;semicolon&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;space&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Structure&amp;lt;/b&amp;gt; || &amp;lt;p&amp;gt;(optional) Provides the structure to validate the data against.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;This is optional as this information may be present in the header of the DataSet.  If provided this value will override the value in the dataset (if present).&amp;lt;/p&amp;gt;&lt;br /&gt;
|| Valid SDMX URN for Provision Agreement, Dataflow, or Data Structure Definition&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Receiver-Id&amp;lt;/b&amp;gt;&amp;lt;p style=&amp;quot;font-size:0.85em&amp;quot;&amp;gt;(Since v9.8)&amp;lt;/p&amp;gt;||&lt;br /&gt;
&amp;lt;p&amp;gt;The ReceiverId may be included in the validation report.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;If not provided, the ReceiverId will be taken from the header of the dataset if it is present. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;If the dataset does not contain a ReceiverId (for example a non-SDMX format) then the validation report will not contain a ReceiverId in the header.&amp;lt;/p&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
The following characters are allowed: A-z, a-z 0-9 $, _, -, @, \&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Structure&amp;lt;/b&amp;gt;||&amp;lt;p&amp;gt;Provides the structure used to read the data.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;This is optional as this information may be present in the header of the DataSet. If provided this value will override the value in the dataset (if present).&amp;lt;/p&amp;gt;  &lt;br /&gt;
||Valid SDMX URN for Provision Agreement, Dataflow, or Data Structure Definition.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Dataset-Idx&amp;lt;/b&amp;gt;||&amp;lt;p&amp;gt;If the loaded file contains multiple datasets, this argument can be used to indicate which dataset is transformed. If this argument is not present then all datasets will be in the output file (if the file formats permits multiple datasets).&amp;lt;/p&amp;gt;&lt;br /&gt;
||Zero indexed integer, example: 0&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Dataset-Id&amp;lt;/b&amp;gt;&amp;lt;p style=&amp;quot;font-size:0.85em&amp;quot;&amp;gt;(Since v9.8)&amp;lt;/p&amp;gt;||&amp;lt;p&amp;gt;An optional parameter which allows the user to specify the value of the DataSetID generated in the validation.&lt;br /&gt;
||&lt;br /&gt;
The following characters are allowed:&lt;br /&gt;
A-z, a-z&lt;br /&gt;
0-9&lt;br /&gt;
$, _, -, @, \&lt;br /&gt;
Specific variables permit the insertion of Data Structure / Data Flow values. These values are:&lt;br /&gt;
&amp;lt;br/&amp;gt;${DATFLOW_ID}&lt;br /&gt;
&amp;lt;br/&amp;gt;${DATFLOW_ACY}&lt;br /&gt;
&amp;lt;br/&amp;gt;${DATFLOW_VER}&lt;br /&gt;
&amp;lt;br/&amp;gt;${DSD_ID}&lt;br /&gt;
&amp;lt;br/&amp;gt;${DSD_ACY}&lt;br /&gt;
&amp;lt;br/&amp;gt;${DSD_VER}&lt;br /&gt;
&amp;lt;p/&amp;gt;&lt;br /&gt;
Note that dots in the version number will be replaced with the _ character, since dots are not permitted in the ID.&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Dataset-Action&amp;lt;/b&amp;gt;&amp;lt;p style=&amp;quot;font-size:0.85em&amp;quot;&amp;gt;(Since v9.8.1)&amp;lt;/p&amp;gt;&lt;br /&gt;
||An optional parameter which allows the user to specify the value of the DataSetAction generated in the validation report. If this parameter is not specified, the default value will be used.&lt;br /&gt;
||May be one of the following: &lt;br /&gt;
* Append &lt;br /&gt;
* Replace &lt;br /&gt;
* Merge &lt;br /&gt;
* FullReplace &lt;br /&gt;
* Delete &lt;br /&gt;
* Information&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Map-Structure&amp;lt;/b&amp;gt;&amp;lt;p style=&amp;quot;font-size:0.85em&amp;quot;&amp;gt;(Since v9.2.13)&amp;lt;/p&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;p&amp;gt;An optional parameter to inform the Fusion Registry to transform the structure of the dataset to conform to another Data Structure Definition.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;The value provided can be a URN of a Dataflow or Data Structure Definition to map the incoming data to. A Structure Map must exist in the Fusion Registry which maps between the incoming Data Structure/Dataflow and Mapped Data Structure/Dataflow.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Alternatively the URN may be the URN of the Data Structure Map to use for the mapping (since v9.4.4)&amp;lt;/p&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
Valid SDMX URN for Dataflow or Data Structure Definition.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Inc-Unmapped&amp;lt;/b&amp;gt;&amp;lt;p style=&amp;quot;font-size:0.85em&amp;quot;&amp;gt;(Since v9.6.5)&amp;lt;/p&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;p&amp;gt;If the Map-Structure Header is used, then the inclusion of Inc-Unmapped will output a second dataset, if there are unmapped series. The additional dataset contains the data that could not be mapped due to missing mapping rules, or ambiguous outputs.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;The format of the additional dataset is the same format as the output dataset.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;As the result may contain a separate file, the response format is either set to multipart/mixed message with a boundary per file, or if the Zip header is set to true, the output will be a single zip file. The file names are 'out' and 'unmapped' with the file extension based on the output format.&amp;lt;/p&amp;gt;&lt;br /&gt;
||Boolean (true/false)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Inc-UnmappedReport&amp;lt;/b&amp;gt;&amp;lt;p style=&amp;quot;font-size:0.85em&amp;quot;&amp;gt;(Since v11.5.0)&amp;lt;/p&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;p&amp;gt;If the Map-Structure Header is used, then the inclusion of Inc-UnmappedReport may output another file, if there are unmapped series. The additional file contains a report on the information that could not be mapped due to missing mapping rules, or ambiguous outputs.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;The format of this report consists of JSON elements:&amp;lt;/p&amp;gt;&lt;br /&gt;
* The StructureMap used in the mapping&lt;br /&gt;
* The Source Structure URN&lt;br /&gt;
* The Target Structure URN&lt;br /&gt;
* The Result&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The result consists of an Input and an Output which details what the input managed to map to. The output also contains a Array called &amp;quot;MissingDimensions&amp;quot; which lists the ID of the missing dimensions.&lt;br /&gt;
||Boolean (true/false)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Inc-Metrics&amp;lt;/b&amp;gt;&amp;lt;p style=&amp;quot;font-size:0.85em&amp;quot;&amp;gt;(Since v9.6.5)&amp;lt;/p&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;p&amp;gt;Includes metrics on the transformation.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;The result will contain a separate file, either as a multipart/mixed message with a boundary per file, or if the Zip header is set to true, the output will be a single zip file.&amp;lt;/p&amp;gt;&lt;br /&gt;
||Boolean (true/false)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Fail-On-Error&amp;lt;/b&amp;gt;&amp;lt;p style=&amp;quot;font-size:0.85em&amp;quot;&amp;gt;(Since v9.5.0)&amp;lt;/p&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;p&amp;gt;An optional parameter to tell the transformation process to fail if an error is detected in the dataset.&amp;lt;/p&amp;gt;&lt;br /&gt;
||Boolean (true/false)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Zip&amp;lt;/b&amp;gt;&amp;lt;p style=&amp;quot;font-size:0.85em&amp;quot;&amp;gt;(Since v9.6.5)&amp;lt;/p&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;p&amp;gt;Compresses the output as a zip file. This if used in conjunction with Inc-Metrics or Inc-Unmapped the zip will contain multiple files.&amp;lt;/p&amp;gt;&lt;br /&gt;
||Boolean (true/false)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Duplicate-Behaviour&amp;lt;/b&amp;gt;&amp;lt;p style=&amp;quot;font-size:0.85em&amp;quot;&amp;gt;(Since v11.1.6)&amp;lt;/p&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;p&amp;gt;Specify the behaviour to perform when duplicate observations are encountered. Either the duplicates can be preserved or either the first or last value can be used.&amp;lt;/p&amp;gt;&lt;br /&gt;
||May be one of the following: &lt;br /&gt;
* useFirst &lt;br /&gt;
* useLast&lt;br /&gt;
* preserve&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Include Metrics ==&lt;br /&gt;
The following JSON is an example response when Inc-Metrics header is set to true. Request Time is Epoc Time Milliseconds, and Duration is measured in the number of milliseconds taken to complete the transformation.&lt;br /&gt;
&lt;br /&gt;
 { &lt;br /&gt;
   &amp;quot;Meta&amp;quot;: { &lt;br /&gt;
             &amp;quot;RequestTime&amp;quot;: 1559124708568, &lt;br /&gt;
             &amp;quot;Duration&amp;quot;: 220 }, &lt;br /&gt;
   &amp;quot;SourceData&amp;quot;: { &lt;br /&gt;
             &amp;quot;Datasets&amp;quot;: [&lt;br /&gt;
                 { &lt;br /&gt;
                   &amp;quot;Structure&amp;quot;: &amp;quot;urn:sdmx:org.sdmx.infomodel.datastructure.Dataflow=BIS:IN_FLOW(1.0)&amp;quot;, &lt;br /&gt;
                   &amp;quot;Series&amp;quot;: 3118, &lt;br /&gt;
                   &amp;quot;Observations&amp;quot;: 3118, &lt;br /&gt;
                   &amp;quot;Groups&amp;quot;: 0 &lt;br /&gt;
                 }&lt;br /&gt;
               ] &lt;br /&gt;
             }, &lt;br /&gt;
   &amp;quot;OutputData&amp;quot;: { &lt;br /&gt;
              &amp;quot;Datasets&amp;quot;: [&lt;br /&gt;
                 { &lt;br /&gt;
                   &amp;quot;Structure&amp;quot;: &amp;quot;urn:sdmx:org.sdmx.infomodel.datastructure.Dataflow=BIS:OUT_FLOW(1.0)&amp;quot;, &lt;br /&gt;
                   &amp;quot;Series&amp;quot;: 1753, &lt;br /&gt;
                   &amp;quot;Observations&amp;quot;: 1855, &lt;br /&gt;
                   &amp;quot;Groups&amp;quot;: 0 &lt;br /&gt;
                 }&lt;br /&gt;
               ] &lt;br /&gt;
             }, &lt;br /&gt;
   &amp;quot;UnMappedData&amp;quot;: { &lt;br /&gt;
               &amp;quot;Datasets&amp;quot;: [&lt;br /&gt;
                  { &amp;quot;Structure&amp;quot;: &amp;quot;urn:sdmx:org.sdmx.infomodel.datastructure.Dataflow=BIS:IN_FLOW(1.0)&amp;quot;, &lt;br /&gt;
                    &amp;quot;Series&amp;quot;: 1263, &lt;br /&gt;
                    &amp;quot;Observations&amp;quot;: 1263, &lt;br /&gt;
                    &amp;quot;Groups&amp;quot;: 0 &lt;br /&gt;
                  }&lt;br /&gt;
                ] &lt;br /&gt;
              } &lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=Data_Transformation_Web_Service&amp;diff=6798</id>
		<title>Data Transformation Web Service</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=Data_Transformation_Web_Service&amp;diff=6798"/>
		<updated>2022-12-21T12:47:07Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* HTTP Headers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:FMR REST API Reference]]&lt;br /&gt;
= Overview =&lt;br /&gt;
The Data Transformation Web Service converts the dataset submitted in the POST body to the data transmission format specified by the Accept header, optionally transforming it to a different Data Structure Definition if the Registry has a Structure Map defining the mapping.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Entry Point&amp;lt;/b&amp;gt;|| &amp;lt;b&amp;gt; /ws/public/data/transform&amp;lt;/b&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Access&amp;lt;/b&amp;gt;|| &amp;lt;span style='color:green'&amp;gt;&amp;lt;b&amp;gt;Public&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt; (default). Configurable to Private&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Http Method&amp;lt;/b&amp;gt;|| POST&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Accepts&amp;lt;/b&amp;gt;|| CSV, XLSX, SDMX-ML, SDMX-EDI (any format for which there is a Data Reader)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Compression&amp;lt;/b&amp;gt; || Zip files supported, if loading from URL gzip responses supported&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Content-Type&amp;lt;/b&amp;gt;|| &amp;lt;p&amp;gt;1.	multipart/form-data (if attaching file) – the attached file must be in field name of uploadFile&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;2.	application/text or application/xml (if submitting data in the body of the POST)&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Response Format&amp;lt;/b&amp;gt;|| Determined by Accept Header - default SDMX 2.1 Structure Specific&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Response Statuses&amp;lt;/b&amp;gt;|| &amp;lt;p&amp;gt;&amp;lt;b&amp;gt;200&amp;lt;/b&amp;gt; - Transformation performed&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;400&amp;lt;/b&amp;gt; - Transformation could not be performed (either an unreadable datasets, or resolvable reference to a required structure)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;401&amp;lt;/b&amp;gt; - Unauthorized (if access has been restricted)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;b&amp;gt;500&amp;lt;/b&amp;gt; - Server Error&amp;lt;/p&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= HTTP Headers =&lt;br /&gt;
The Accept Header is used to define the output format, to transform the data to.&lt;br /&gt;
&lt;br /&gt;
In addition, the following optional header parameters can be used to provide further details on the incoming dataset. If these details are not provided, the Fusion Registry will interrogate the dataset header to get the information. If the dataset is a non-SDMX format, or does not contain the required information in the header, then an error response will be returned.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!|HTTP Header || Purpose || Allowed Values&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Accept&amp;lt;/b&amp;gt;|| The data transmission format to convert the dataset to.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Note''': From Fusion Registry 11.8.0 the format (if not specified) defaults to the input format.  Previous versions defaulted to SDMX Structure Specific 2.1&lt;br /&gt;
 ||&lt;br /&gt;
&amp;lt;p&amp;gt;SDMX Formats&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul dir=&amp;quot;auto&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;application/vnd.sdmx.data+csv;version=2.0.0;labels=[id|name|both];timeFormat=[original|normalized];keys=[none|obs|series|both]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;application/vnd.sdmx.genericdata+xml;version=2.1&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;application/vnd.sdmx.structurespecificdata+xml;version=2.1&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;application/vnd.sdmx.generictimeseriesdata+xml;version=2.1&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;application/vnd.sdmx.structurespecifictimeseriesdata+xml;version=2.1&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;application/vnd.sdmx.data+json;version=1.0.0&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;application/vnd.sdmx.data+csv;version=1.0.0;labels=[id|both];timeFormat=[original|normalized]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;application/vnd.sdmx.data+edi&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;SDMX Formats to be supported in future FMR releases&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;application/vnd.sdmx.data+json;version=2.0.0&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;application/vnd.sdmx.data+xml;version=3.0.0&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Note that the Fusion Excel data transmission format is supported as the input, but not output of a transformation.&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Data-Format&amp;lt;/b&amp;gt;|| Used to inform the server when the data is in CSV format. ||csv;delimiter=[delimiter]&lt;br /&gt;
&amp;lt;p&amp;gt;Where [delimiter] is either:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;comma&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;tab&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;semicolon&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;space&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Structure&amp;lt;/b&amp;gt; || &amp;lt;p&amp;gt;(optional) Provides the structure to validate the data against.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;This is optional as this information may be present in the header of the DataSet.  If provided this value will override the value in the dataset (if present).&amp;lt;/p&amp;gt;&lt;br /&gt;
|| Valid SDMX URN for Provision Agreement, Dataflow, or Data Structure Definition&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Receiver-Id&amp;lt;/b&amp;gt;&amp;lt;p style=&amp;quot;font-size:0.85em&amp;quot;&amp;gt;(Since v9.8)&amp;lt;/p&amp;gt;||&lt;br /&gt;
&amp;lt;p&amp;gt;The ReceiverId may be included in the validation report.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;If not provided, the ReceiverId will be taken from the header of the dataset if it is present. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;If the dataset does not contain a ReceiverId (for example a non-SDMX format) then the validation report will not contain a ReceiverId in the header.&amp;lt;/p&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
The following characters are allowed: A-z, a-z 0-9 $, _, -, @, \&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Structure&amp;lt;/b&amp;gt;||&amp;lt;p&amp;gt;Provides the structure used to read the data.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;This is optional as this information may be present in the header of the DataSet. If provided this value will override the value in the dataset (if present).&amp;lt;/p&amp;gt;  &lt;br /&gt;
||Valid SDMX URN for Provision Agreement, Dataflow, or Data Structure Definition.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Dataset-Idx&amp;lt;/b&amp;gt;||&amp;lt;p&amp;gt;If the loaded file contains multiple datasets, this argument can be used to indicate which dataset is transformed. If this argument is not present then all datasets will be in the output file (if the file formats permits multiple datasets).&amp;lt;/p&amp;gt;&lt;br /&gt;
||Zero indexed integer, example: 0&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Dataset-Id&amp;lt;/b&amp;gt;&amp;lt;p style=&amp;quot;font-size:0.85em&amp;quot;&amp;gt;(Since v9.8)&amp;lt;/p&amp;gt;||&amp;lt;p&amp;gt;An optional parameter which allows the user to specify the value of the DataSetID generated in the validation.&lt;br /&gt;
||&lt;br /&gt;
The following characters are allowed:&lt;br /&gt;
A-z, a-z&lt;br /&gt;
0-9&lt;br /&gt;
$, _, -, @, \&lt;br /&gt;
Specific variables permit the insertion of Data Structure / Data Flow values. These values are:&lt;br /&gt;
&amp;lt;br/&amp;gt;${DATFLOW_ID}&lt;br /&gt;
&amp;lt;br/&amp;gt;${DATFLOW_ACY}&lt;br /&gt;
&amp;lt;br/&amp;gt;${DATFLOW_VER}&lt;br /&gt;
&amp;lt;br/&amp;gt;${DSD_ID}&lt;br /&gt;
&amp;lt;br/&amp;gt;${DSD_ACY}&lt;br /&gt;
&amp;lt;br/&amp;gt;${DSD_VER}&lt;br /&gt;
&amp;lt;p/&amp;gt;&lt;br /&gt;
Note that dots in the version number will be replaced with the _ character, since dots are not permitted in the ID.&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Dataset-Action&amp;lt;/b&amp;gt;&amp;lt;p style=&amp;quot;font-size:0.85em&amp;quot;&amp;gt;(Since v9.8.1)&amp;lt;/p&amp;gt;&lt;br /&gt;
||An optional parameter which allows the user to specify the value of the DataSetAction generated in the validation report. If this parameter is not specified, the default value will be used.&lt;br /&gt;
||May be one of the following: &lt;br /&gt;
* Append &lt;br /&gt;
* Replace &lt;br /&gt;
* Merge &lt;br /&gt;
* FullReplace &lt;br /&gt;
* Delete &lt;br /&gt;
* Information&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Map-Structure&amp;lt;/b&amp;gt;&amp;lt;p style=&amp;quot;font-size:0.85em&amp;quot;&amp;gt;(Since v9.2.13)&amp;lt;/p&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;p&amp;gt;An optional parameter to inform the Fusion Registry to transform the structure of the dataset to conform to another Data Structure Definition.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;The value provided can be a URN of a Dataflow or Data Structure Definition to map the incoming data to. A Structure Map must exist in the Fusion Registry which maps between the incoming Data Structure/Dataflow and Mapped Data Structure/Dataflow.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Alternatively the URN may be the URN of the Data Structure Map to use for the mapping (since v9.4.4)&amp;lt;/p&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
Valid SDMX URN for Dataflow or Data Structure Definition.&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Inc-Unmapped&amp;lt;/b&amp;gt;&amp;lt;p style=&amp;quot;font-size:0.85em&amp;quot;&amp;gt;(Since v9.6.5)&amp;lt;/p&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;p&amp;gt;If the Map-Structure Header is used, then the inclusion of Inc-Unmapped will output a second dataset, if there are unmapped series. The additional dataset contains the data that could not be mapped due to missing mapping rules, or ambiguous outputs.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;The format of the additional dataset is the same format as the output dataset.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;As the result may contain a separate file, the response format is either set to multipart/mixed message with a boundary per file, or if the Zip header is set to true, the output will be a single zip file. The file names are 'out' and 'unmapped' with the file extension based on the output format.&amp;lt;/p&amp;gt;&lt;br /&gt;
||Boolean (true/false)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Inc-UnmappedReport&amp;lt;/b&amp;gt;&amp;lt;p style=&amp;quot;font-size:0.85em&amp;quot;&amp;gt;(Since v11.5.0)&amp;lt;/p&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;p&amp;gt;If the Map-Structure Header is used, then the inclusion of Inc-UnmappedReport may output another file, if there are unmapped series. The additional file contains a report on the information that could not be mapped due to missing mapping rules, or ambiguous outputs.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;The format of this report consists of JSON elements:&amp;lt;/p&amp;gt;&lt;br /&gt;
* The StructureMap used in the mapping&lt;br /&gt;
* The Source Structure URN&lt;br /&gt;
* The Target Structure URN&lt;br /&gt;
* The Result&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
The result consists of an Input and an Output which details what the input managed to map to. The output also contains a Array called &amp;quot;MissingDimensions&amp;quot; which lists the ID of the missing dimensions.&lt;br /&gt;
||Boolean (true/false)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Inc-Metrics&amp;lt;/b&amp;gt;&amp;lt;p style=&amp;quot;font-size:0.85em&amp;quot;&amp;gt;(Since v9.6.5)&amp;lt;/p&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;p&amp;gt;Includes metrics on the transformation.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;The result will contain a separate file, either as a multipart/mixed message with a boundary per file, or if the Zip header is set to true, the output will be a single zip file.&amp;lt;/p&amp;gt;&lt;br /&gt;
||Boolean (true/false)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Fail-On-Error&amp;lt;/b&amp;gt;&amp;lt;p style=&amp;quot;font-size:0.85em&amp;quot;&amp;gt;(Since v9.5.0)&amp;lt;/p&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;p&amp;gt;An optional parameter to tell the transformation process to fail if an error is detected in the dataset.&amp;lt;/p&amp;gt;&lt;br /&gt;
||Boolean (true/false)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Zip&amp;lt;/b&amp;gt;&amp;lt;p style=&amp;quot;font-size:0.85em&amp;quot;&amp;gt;(Since v9.6.5)&amp;lt;/p&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;p&amp;gt;Compresses the output as a zip file. This if used in conjunction with Inc-Metrics or Inc-Unmapped the zip will contain multiple files.&amp;lt;/p&amp;gt;&lt;br /&gt;
||Boolean (true/false)&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color:#eaecf0&amp;quot;|&amp;lt;b&amp;gt;Duplicate-Behaviour&amp;lt;/b&amp;gt;&amp;lt;p style=&amp;quot;font-size:0.85em&amp;quot;&amp;gt;(Since v11.1.6)&amp;lt;/p&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;p&amp;gt;Specify the behaviour to perform when duplicate observations are encountered. Either the duplicates can be preserved or either the first or last value can be used.&amp;lt;/p&amp;gt;&lt;br /&gt;
||May be one of the following: &lt;br /&gt;
* useFirst &lt;br /&gt;
* useLast&lt;br /&gt;
* preserve&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Include Metrics ==&lt;br /&gt;
The following JSON is an example response when Inc-Metrics header is set to true. Request Time is Epoc Time Milliseconds, and Duration is measured in the number of milliseconds taken to complete the transformation.&lt;br /&gt;
&lt;br /&gt;
 { &lt;br /&gt;
   &amp;quot;Meta&amp;quot;: { &lt;br /&gt;
             &amp;quot;RequestTime&amp;quot;: 1559124708568, &lt;br /&gt;
             &amp;quot;Duration&amp;quot;: 220 }, &lt;br /&gt;
   &amp;quot;SourceData&amp;quot;: { &lt;br /&gt;
             &amp;quot;Datasets&amp;quot;: [&lt;br /&gt;
                 { &lt;br /&gt;
                   &amp;quot;Structure&amp;quot;: &amp;quot;urn:sdmx:org.sdmx.infomodel.datastructure.Dataflow=BIS:IN_FLOW(1.0)&amp;quot;, &lt;br /&gt;
                   &amp;quot;Series&amp;quot;: 3118, &lt;br /&gt;
                   &amp;quot;Observations&amp;quot;: 3118, &lt;br /&gt;
                   &amp;quot;Groups&amp;quot;: 0 &lt;br /&gt;
                 }&lt;br /&gt;
               ] &lt;br /&gt;
             }, &lt;br /&gt;
   &amp;quot;OutputData&amp;quot;: { &lt;br /&gt;
              &amp;quot;Datasets&amp;quot;: [&lt;br /&gt;
                 { &lt;br /&gt;
                   &amp;quot;Structure&amp;quot;: &amp;quot;urn:sdmx:org.sdmx.infomodel.datastructure.Dataflow=BIS:OUT_FLOW(1.0)&amp;quot;, &lt;br /&gt;
                   &amp;quot;Series&amp;quot;: 1753, &lt;br /&gt;
                   &amp;quot;Observations&amp;quot;: 1855, &lt;br /&gt;
                   &amp;quot;Groups&amp;quot;: 0 &lt;br /&gt;
                 }&lt;br /&gt;
               ] &lt;br /&gt;
             }, &lt;br /&gt;
   &amp;quot;UnMappedData&amp;quot;: { &lt;br /&gt;
               &amp;quot;Datasets&amp;quot;: [&lt;br /&gt;
                  { &amp;quot;Structure&amp;quot;: &amp;quot;urn:sdmx:org.sdmx.infomodel.datastructure.Dataflow=BIS:IN_FLOW(1.0)&amp;quot;, &lt;br /&gt;
                    &amp;quot;Series&amp;quot;: 1263, &lt;br /&gt;
                    &amp;quot;Observations&amp;quot;: 1263, &lt;br /&gt;
                    &amp;quot;Groups&amp;quot;: 0 &lt;br /&gt;
                  }&lt;br /&gt;
                ] &lt;br /&gt;
              } &lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
	<entry>
		<id>https://fmrwiki.sdmxcloud.org/index.php?title=FMR_Workbench&amp;diff=6796</id>
		<title>FMR Workbench</title>
		<link rel="alternate" type="text/html" href="https://fmrwiki.sdmxcloud.org/index.php?title=FMR_Workbench&amp;diff=6796"/>
		<updated>2022-12-09T10:37:51Z</updated>

		<summary type="html">&lt;p&gt;Mnelson: /* Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
[[File:Fmr wb overview.png|thumb]]&lt;br /&gt;
The FMR Workbench is a web application which provides the web user interface to view and maintain structural metadata, the critical difference between the FMR Workbench and the Fusion Metadata Registry is that the FMR Workbench does not have a database - the structures that it views and maintains come from a separate web service.&lt;br /&gt;
&lt;br /&gt;
The FMR Workbench reads a config file on startup which describes one or more 'services'. Each service is an SDMX endpoint with a query API and an optional persistence API.  The web user interface of the FMR Workbench enables users to switch between services. The user can then browse the SDMX Structures of the service they are connected to.&lt;br /&gt;
&lt;br /&gt;
The connected service is attached to the user's session, therefore it is possible for multiple users to use the same FMR-Workbench, with each user connecting to a different service.&lt;br /&gt;
&lt;br /&gt;
The FMR-Workbench can be used to edit, and save structures back to the service, if the service supports persistence, and the user is logged in.&lt;br /&gt;
&lt;br /&gt;
= Switching Services =&lt;br /&gt;
[[File:Fmr wb service.png|thumb]]&lt;br /&gt;
The header bar of the FMR-Workbench contains a button showing the currently connected service, clicking on this button will open a window to allow a different service to be connected.  By default the service is connected to anonymously, meaning only browser functionality will be supported.&lt;br /&gt;
&lt;br /&gt;
To authenticate, click on the Login button after connecting to the service.  &lt;br /&gt;
&lt;br /&gt;
= Authentication =&lt;br /&gt;
The FMR Workbench supports 2 forms of authentication with the connected service: Basic Authentication and OpenID Connect. The type of authentication is set up in the Config file of the FMR-Workbench.  &lt;br /&gt;
&lt;br /&gt;
== Basic Authentication ==&lt;br /&gt;
Clicking Login will take the user to the FMR-Workbench login page where the user is invited to enter a username and password.  These details are stored in the FMR-Workbench against the user's session, and they are used whenever the user interacts with the target service.  An initial check is performed against the target server to ensure the credentials can be used to obtain some structures, if the check fails then the details are deemed to be invalid and will be discarded.&lt;br /&gt;
&lt;br /&gt;
== Open ID Connect ==&lt;br /&gt;
Clicking Login will take the user to the OpenID Connect login page (defined in the configuration file of the FMR-Workbench).  The user authenticates with the chosen OpenID Connect authentication provider, on success the user is redirected back to the FMR-Workbench with a token.  The token is stored against the user's session, and used to authenticate with the target service. &lt;br /&gt;
&lt;br /&gt;
= Structure Navigation and Export =&lt;br /&gt;
The FMR-Workbench front end will display structures in the same way the FMR provides - clicking on a sidebar item (example Codelists) will display the Codelist page and all the Codelists in the connected service.  This is achieved by the front end issuing a SDMX web service query to the FMR Workbench for all Codelists as stubs.  This query is then forwarded to the connected service, and the response is written back to the client.  The FMR-Workbench can receive the query response from the connected service in any SDMX format.  The response will be parsed by the FMR-Workbench before being written out in the requested format.  This means the FMR-Workbench is able to write the response out in ANY format that the FMR Workbench supports, including Excel, SDMX, and JSON.  The user is therefore able to click on a Codelist and export it as Excel, even if the connected service does not support Excel as an output format.&lt;br /&gt;
&lt;br /&gt;
= SDMX Web Service =&lt;br /&gt;
It is important to note that the FMR-Workbench has the same web service entry points as the FMR, and whilst these web services work, they are not guaranteed to be fully compliant.  The web services of the FMR-Workbench forwards queries onto the connected service.  The queries may be modify to reduce the possibility of the target service not supporting the query. If the connected service reports any error in the query, the FMR-Workbench will report 'no structures' for the query.  &lt;br /&gt;
&lt;br /&gt;
The recommendation is therefore to not rely on the web services of the FMR-Workbench, instead use the web services provided by the target service directly. &lt;br /&gt;
&lt;br /&gt;
= Structure Creation/Modification =&lt;br /&gt;
If the user has logged into the connected service, they will be able to upload structures from the home page of the FMR-Workbench, or create/edit structures using the standard Wizards in the User Interface.  &lt;br /&gt;
&lt;br /&gt;
It is important to note that the FMR-Workbench contains the same User Interface as the FMR, and as such does not provision for the fact that the connected service may not support all the features of the FMR.  For example it may be possible in the FMR-Workbench to create a SDMX 3.0 DSD with multiple measures, but the target service may reject the save request.&lt;br /&gt;
&lt;br /&gt;
It is possible to load structures in any format supported by the FMR-Workbench, including Excel - these structures will be converted into a format supported by the connected service on the save request.&lt;/div&gt;</summary>
		<author><name>Mnelson</name></author>
		
	</entry>
</feed>