Download - Embedding BI

Transcript
Page 1: Embedding BI

Advanced administration and development

guidelines & reference Niklas Derouche

Page 2: Embedding BI

P a g e | 2 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

About DSPanel Decision Support Panel Intl AB is a Swedish company based out of Stockholm. It celebrated its 10th anniversary in 2009 and have been supplying business intelligence software throughout its existence. There are customers on every continent and virtually in every kind of business and even though the company started out focusing on the intersection of SharePoint(tm) and SQL Server Analysis Services(tm) the current toolset is certified for use with solutions from SAP and IBM as well.

About Performance Canvas Performance Canvas is the market leading software for web based, web focused business intelligence. With abilities from visual analytics to mash-ups, from simple, clear charts to complex pivoting and everything in between in a highly customizable package it is certainly at the top of the class and then we haven't even mentioned the fact that almost all of the core functionality (object configurations, rendering, query parsing and transformations) are available as web services.

Page 3: Embedding BI

P a g e | 3 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

Contents About Decision Support Panel .................................................................................................................. 2

About Performance Canvas 2009 ............................................................................................................. 2

Who is this document for ......................................................................................................................... 5

Introduction .............................................................................................................................................. 6

On administration ..................................................................................................................................... 7

On caches ................................................................................................................................................ 14

The Metadata cache ........................................................................................................................... 14

The Query cache ................................................................................................................................. 14

Client side caching .............................................................................................................................. 15

Related subjects .................................................................................................................................. 16

On query based security ......................................................................................................................... 17

On secure socket layer (SSL) and its implications ................................................................................... 19

On loose clusters ..................................................................................................................................... 21

On locales and languages ........................................................................................................................ 22

On Kerberos ................................................................................................................................................ 23

Prerequisites ....................................................................................................................................... 23

Step 1: Creating the account ............................................................................................................... 23

Step 2: Ensuring that the account can handle delegation .................................................................. 25

Step 3: Adding a host name ................................................................................................................ 26

Step 4: Generating the keytab ............................................................................................................ 27

Step 5: Installing the keytab file .......................................................................................................... 29

Step 6: Access Performance Canvas by using the new DNS record as URL ........................................ 29

Do's and Don’ts while installing the Kerberos setup .......................................................................... 29

Troubleshooting .................................................................................................................................. 30

On development ......................................................................................................................................... 31

On direct API usage ................................................................................................................................. 31

On web services .......................................................................................................................................... 31

On ConfigurationService ......................................................................................................................... 31

On methods ........................................................................................................................................ 32

Task: Retrieving an existing object ...................................................................................................... 39

Task: Finding a list of objects .............................................................................................................. 40

Page 4: Embedding BI

P a g e | 4 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

Task: Finding a list of objects that match a certain filter .................................................................... 41

Task: Creating an object ...................................................................................................................... 42

Task: Exporting a canvas ..................................................................................................................... 43

Task: Importing a canvas ..................................................................................................................... 44

On RenderingService ........................................................................................................................... 45

On methods ........................................................................................................................................ 45

On XMLAService .................................................................................................................................. 50

On object definitions............................................................................................................................... 56

On building new applications .................................................................................................................. 57

On .NET and PC ....................................................................................................................................... 69

Appendix A .................................................................................................................................................. 70

Configuring Performance Canvas using zenith.properties ..................................................................... 70

Appendix E .................................................................................................................................................. 74

ConfigurationService WSDL .................................................................................................................... 74

Appendix F .................................................................................................................................................. 89

RenderingService WSDL .......................................................................................................................... 89

Appendix G .................................................................................................................................................. 93

XMLAService WSDL ................................................................................................................................. 93

Index.......................................................................................................................................................... 106

Page 5: Embedding BI

P a g e | 5 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

Who is this document for

This document assumes you have a working knowledge of a lot of things. However, even someone without that knowledge should be able to glean bits of relevant information from the parts they are interested in. For example, you do not need to be an MDX wizard to configure the caches, nor do you need to understand the intricacies of networking to able to fathom how to use web services to render a simple chart. However, if you expect to understand everything covered in here you should have a passable knowledge about HTTP1.1 SSL Windows Security Active Directory WS-SOAP MDX Analysis Services IIS

Page 6: Embedding BI

P a g e | 6 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

Introduction So you managed to get past the part about who you are. This either means you will understand everything in this document or that you know exactly what you are looking for. Either way, it is our sincere hope that the information found in these chapters will help you get the most out of your Performance Canvas (TM) (or PC). Let us start off with the basics; what is PC? At the core it is a set of service pipelines served up by a Tomcat instance. The fact that it happens to be Tomcat is purely circumstantial. It could just as easily have been Resin, Jetty, Glassfish or any number of other, equally qualified, application servers out there. Tomcat happened to be easier to work with and easy to embed. These pipelines are exposed as servlets to the web client. These servlets however are not of much use to someone else as they use a very specific RPC model specific to GWT (Google Web Toolkit) which is used to develop the front end/client(s). The same services do however have a different access point which is web services. If you have a look at the chapter on web services you will find all the information you need to write a complete client solution on top of the capabilities in PC. You could potentially - if you were so inclined, although it is this author's sincere hope that you aren't - make your own PC web client. Please don't. There are much more interesting applications for this technology.

Page 7: Embedding BI

P a g e | 7 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

On administration Administration in PC generally means opening /app/admin and setting up data sources, adding users to roles and approving objects. There are however a number of things that can be done but require you to edit text files. Don't worry, it's not very dangerous. OK, Maybe a little.

As in any large server application there are configuration options that really shouldn't be exposed to the light of day as they have the potential for serious repercussions. Some of these are related to the data sources (like the caching options) and can, for a large scale installation, easily turn your data layer into a very slow mowing slug indeed. Others are related to things like protocol level security (SSL) or advanced deployment (see On scaling out). We will try to go through these different subjects - and some of the purely miscellaneous configuration options in this sections.

But let us start off with the basics. Below you will find a list of all the places you find configuration files, what they are and what they contain. There are more of these than you would think. Note that all paths are relative to the installation directory (hence /bin means C:\Program Files\Performance Canvas\bin if you installed in the default location).

Location: Installation directory

File zenith.properties Format Key value pairs in key=value format

Description The main configuration file. Here you will add most of the configuration switches you find within this document. Note that you can also use any java configuration switches here as well as anything that is not PC-related will get stored in System.properties. Yes, that means that you could do X, Y and Z. Yes, it's done that way for a reason (see On proxies). This is not something everyone will use but it certainly is useful.

Refer to Appendix A, section 1 for a complete description of all available configuration options

Location: /bin

File service.properties Format Key value pairs in key=value format

Description Used to configure the service. Some people will want to use a custom service name or, perhaps more frequently, change the memory space settings. This is where to go for that. In order to make the changes happen you need to

1: Stop the current service if it is running

Page 8: Embedding BI

P a g e | 8 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

2: Run uninstallservice.bat located in the same directory as this file

3: Make the changes you want and save them

4: Run installservice.bat

5: Start the service

Refer to Appendix A, section 2 for a complete description of all available configuration options

Location: /store/settings

File app.properties Format Key value pairs in key=value format

Description Used to guide the automated page generation. Don't change this. If you change it, things will break. If you absolutely have to change a title for a page, make absolutely SURE you have a backup of the original file and can replace your modified version with it if it doesn't work. But generally. Don't touch.

Refer to Appendix A, section 3 for a complete description of all the things you shouldn't be changing.

File colors.xml Format XML Description Configuration of color schemes for the installation. You can add as many as you

of these. In Appendix B, section 1 you can find out more on how to do this if you are so inclined. Note that schemes you don't like can be hidden. Look in the section just mentioned.

File cubes.xml Format XML Description Cubes.xml defines which datasources are currently setup. The file is

autogenerated by the application and it would be very rare that you need to modify this by hand. If you do then refer to Appendix B, section 2 for information. If you just want to clear it out and don't feel like unchecking seventyleven checkboxes in the web UI then just delete everything but <DB></DB> and you are all set. Once PC is restarted you have no mapped datasources.

File krb5.conf

Page 9: Embedding BI

P a g e | 9 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

Format Configuration file specific Description In most cases the krb5.conf file is autogenerated and never touched. Unless

you need to join realms together you should never, ever touch this file. Most of the options can be accessed through the zenith.properties file and you are better off changing those rather than editing this file. If you need to however - and there are certain cases where you do - you will find the information you need in Appendix C, section 1

File login.conf Format Configuration file specific Description Internal. Do NOT change.

File Userlocales.properties Format Key value pairs in key=value format

Description Placeholder file for planned functionality

File Viewport.properties Format Key value pairs in key=value format

Description Viewport.properties contains information about which properties are visible for which chart (and table) types. For example, only gauge-related properties are visible when you are editing a Gauge. If you would like to restrict your users/designers to using only a subset of the properties, perhaps because you have set up defaults that shouldn't be changed, then you can edit this file. Before doing that, please refer to Appendix A, section 4.

Location: /store/settings/locale/<dirname>

(note, this is a special case. Here is where the locale specific language files are stored.

File keyed.properties Format Key value pairs in key = value format

Description The main language file. If there are messages in the application that you want to change this is where to do that. This file isn't described extensively since it contains far too many properties to be usefully documented. It is sufficient to say that <key>=<value> and that removing a required key will result in MISSING RESOURCE errors in the client side UI. If you want to implement a new

Page 10: Embedding BI

P a g e | 10 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

language then

1: translate the contents of the file

2: create a subdirectory in /store/settings/locale where dirname is <language code>_<variant code>. For example, if you have a translation for Canadian French and one for regular French then the directory names would be fr_CA and fr_FR respectively. Adding a default one with the name fr containing the fr_FR is usually a good idea since there are territories where french is spoken but that don't have a specific locale or that you would not want to make a specific implementation for.

3: restart the service and set the server locale using the /app/admin UI or by editing the zenith.properties file.

File Messages.properties Format Key value pairs in key = value format

Description A support language file containing a specific subset of language constants - the dynamic ones. Here we specify snippets that, combined with information from the application, form complete statements.

For example the property

Example=My {0} example {1}

Used with the parameters 'simple' and 'string' will result in the message 'My simple example string'.

Refer to the previous section on keyed.properties to find out how to use this for creating support for new languages.

Location: /store/properties

File analysis.p Format DSP custom Description Property file describing an Analysis.

Refer to Appendix D for complete information.

File annotation.p

Page 11: Embedding BI

P a g e | 11 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

Format DSP custom Description Property file describing an Annotation.

Refer to Appendix D for complete information.

File canvas.p Format DSP custom Description Property file describing a Canvas.

Refer to Appendix D for complete information.

File chart.p Format DSP custom Description Property file describing a Chart.

Refer to Appendix D for complete information.

File classification.p Format DSP custom Description Property file describing a Classification.

Refer to Appendix D for complete information.

File filter.p Format DSP custom Description Property file describing a Filter.

Refer to Appendix D for complete information.

File gem.p Format DSP custom Description Property file describing a Gem.

Refer to Appendix D for complete information.

File kpi.p Format DSP custom

Page 12: Embedding BI

P a g e | 12 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

Description Property file describing a KPI. (placeholder for future functionality)

Refer to Appendix D for complete information.

File measure.p Format DSP custom Description Property file describing a Measure. (A virtual object that looks as if it existed in

the cube to the end user)

Refer to Appendix D for complete information.

File report.p Format DSP custom Description Property file describing a Report.

Refer to Appendix D for complete information.

File role.p Format DSP custom Description Property file describing a Role.

Refer to Appendix D for complete information.

File slicer.p Format DSP custom Description Property file describing a Slicer.

Refer to Appendix D for complete information.

File table.p Format DSP custom Description Property file describing a Table.

Refer to Appendix D for complete information.

File tag.p

Page 13: Embedding BI

P a g e | 13 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

Format DSP custom Description Property file describing a Tag.

Refer to Appendix D for complete information.

File viewpoint.p Format DSP custom Description Property file describing a Viewpoint.

Refer to Appendix D for complete information.

Page 14: Embedding BI

P a g e | 14 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

On caches The various caches are at the core of what makes PC such a fast and responsive solution. It also serves as protection to ensure that cubes in the data layer aren't unnecessarily accessed. Even though they, for the most part, are highly efficient at answering queries, in many cases it makes a lot of sense to ensure that they get as little traffic as possible. There are multiple levels and forms of caching so let's go through them one by one:

The Metadata cache A lot of the time we need to know things about the entities that reside in the cube we are working with. It may be to be able to expand members in a filter on a Canvas. It may be to be able to find a specific KPI. It may be to be able to do all sorts of other more or less interesting things that need doing while we are transforming queries. To be able to do this, without drowning the cube in metadata queries, all this data needs to be cached. It also needs to be cached on a per-user (from the cube's point of view) basis. That means that for every account accessing the cube there needs to be a cache. One quickly realizes that this means that Anonymous, Basic and NTLM are superior here in terms of performance from a cube point of view and this is correct. However they do have shortcomings in terms of the granularity of security that they provide. And it is of course possible to create n roles for n users using account mapping so that n olap accounts are also created. Which basically creates the same kind of scenario as a delegatable credentials (i.e. Kerberos) one. This is however unlikely and beyond the scope of the discussion here. The point is that as much information as possible is cached on retrieval to ensure that we don't ask the same question twice for a particular user unless the cube has been processed in which case all caches are instantly invalidated. This cache is largely uninteresting from a performance point of view. There are however some implications that need to be considered. Most, if not all, of the data contained therein is String based and to reduce the amount of memory used we use intern() to load and store these String instances in the non-heap memory. This means that for very large cubes you will need to consider adding -XX:PermSize=256M (where 256M basically means that 256 MB is used to store this data). Huge is a relative term here. But if you are looking at caching tens of thousands of members then consider that you can cost each member as 6KB approximately. Basically for each thousand you need 6 MB set up, the default size is 64 MB so unless you are running into the absolute tens of thousands you should be ok. However, if you know you have one or more very large cubes, consider using PermSize to ensure that your users don't suddenly face error messages due to out of memory conditions. Configuration options

There is discussion above about how to setup -XX:PermSize, this is really the only configuration option that we allow - so far. There has been discussions about allowing the administrator to restrict caching for certain hierarchies to reduce the memory footprint (this would then be a trade off against cube metadata queries) but nothing conclusively has come out of that yet. If you feel that this would be valuable functionality for you then please get in touch with us and let us know and we will consider it.

The Query cache

Page 15: Embedding BI

P a g e | 15 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

All queries create a result set in the form of a TableModel. This is cached and along with it we also cache the renderings made with that particular result set. Note that these are user specific (again, talking about cube users rather than PC users) so there is no risk of information leakage. This cache is important in various ways. If you are running heavy queries then it becomes very important as it offloads the cube by ensuring that groups of users share result sets between them. Note that the cache is access ordered and when booting out anything over dsp.cache.maxqueries it will remove the LEAST used result set. You probably understand that if you can deal with the memory overhead of the result set caching you are going to over time ensure that the most frequent queries stay cached and highly responsive - just the way you want it. Intrepid explorers that dive into the more advanced features of PC and do their own analysis will find that their queries take slightly longer but at the same time their performance will improve dramatically over a scenario where no caching is done at all since they are basically getting access to a lot more of the processing capacity of the data layer than they would normally have. Configuration options

dsp.cache.maxqueries (default value: 500) This is the number of result sets that are stored. 500 is a decent size for a small installation with a constrained memory footprint. If you run the service with dsp.log=3 (zenith.properties) you will be able to see the current hit rate for the cache updated - if you want to see this live you can always run /bin/PC.bat to see the log scroll by live in a command line window. Just make sure you stop the "Performance Canvas" service first. dsp.cache.expire (default value: 6000000) This is the time until expiration of the cache. Here your knowledge about your local cube becomes important. If it changes on a daily basis you may want to set this to some value that reflects that. Not that if you have more than one cube you can set individual expirations by using dsp.cache.expire.<cubename> (i.e dsp.cache.expire.DspSalesDemo=10000000000). Don't use short values. It's pointless and it's better in that case to set the dsp.cache.maxqueries property to 0 or some very low value (if you think that would be appropriate) to reduce the amount of caching going on for resultsets. Note - values are given in milliseconds

Client side caching For the sake of completeness one should also note that there are client side caches as well. Two are especially noteworthy, the render cache and the entity cache. Basically these are - in a way - client side versions of the server side caches. The render cache is per page component and ensures that we don't request renderings that we already have. This is only available in /app/client as chart settings are constantly in potential flux in /app/designer. The entity cache is however even more important in /app/designer as it ensures that any queries for cube entities (hierarchies, members, measures etc) are stored client side. Basically the queries are of the form "Give me all the children of entity X in cube Y" or "Give me all entities of type X for cube Y". These are stored and reused. Note that the measures are invalidated when a new Calculated member is created and stored for reuse. This ensures that this member is reusable on the next gem design/drag and drop excursion.

Page 16: Embedding BI

P a g e | 16 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

There are some minor differences in how different browser retrieve information as well which affect the overall traffic profile of the PC server. If you are using IE clients only you will note that there is less information sent "up front" to people using the /app/designer application. This is because Internet Explorer, though surely a commendable piece of technology in other ways, is perhaps a tiny bit deficient in terms of JavaScript performance compared to the market leaders in that space (i.e. everyone else). This won't have a huge effect but it's worth knowing that the load on the network becomes differently distributed when people are using IE. Enough said. Configuration options

None. We are considering adding some persistance handling a la HTML5 but it is very dependent on customer feedback. If people have primarily static cubes (i.e. cubes processed weekly or less) then this might be a good idea to give even better performance. But it remains to be seen.

Related subjects Sometimes people can (inadvertently) create trivial queries that result in huge datasets, when crossjoining two attribute hierarchies together it's easy to end up datasets that can easily eat up every single scrap of processing capability that the browser has to offer. This is not strictly related to caching but it is tangential so we cover it here. To get around this issue you can define a maximum resultset size in number of cells. Configuration options

dsp.memory.resultsetmax (default: 50 000) This is the number of cells that a TableModel can contain. The process will stop once the dimensions of the table exceeds this number and the end user will get a message informing him or her that the result set is too large to be handled

Page 17: Embedding BI

P a g e | 17 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

On query based security PC introduces the capacity to constrain result sets in situations where your security setup doesn't include Kerberos. There are a multitude of reasons why this might be the case. Kerberos is notoriously complex and some organizations simply are not willing to take the step. Another reason might be that this might not be an internal solution. For an extranet, a mobile solution or something else where delegated credentials simply aren't applicable query based security becomes a very powerful tool. It should also be noted that some users claim that delegated credentials and granular dimension based security is a very computationally expensive proposition. Decision Support Panel has no opinion in this matter but simply allows people of differing opinions to setup security as best fits their intended audience and infrastructure. So. There are two ways of doing query based security. One is by narrowing only specific queries. This can be done by using a placeholder in the queries which gets automatically replaced before sent to the cube. Here is an example. We design a gem that shows actual for a specific set. The base query looks like this: SELECT {[Geography].[Geography].[Country].MEMBERS} ON COLUMNS, {[Measures].[Actual]} ON ROWS FROM [DspSalesDemo] Now, if we happened to have a hierarchy in the cube where we have our login names as user defined properties we can in fact do: SELECT {[Geography].[Geography].[Country].MEMBERS} ON COLUMNS, {[Measures].[Actual]} ON ROWS FROM [DspSalesDemo] WHERE ( { FILTER({ [User].[User].MEMBERS},[User].[User].CURRENTMEMBER.PROPERTIES("Login") = "$PC09_USER")} ) Note the usage of $PC09_USER. It is a placeholder that will get replaced with the username of the current Principal (i.e. the current logged on user). In this case, let's say Alan logs on to PC and opens his favorite canvas with the gem using this query on it. The query will then be modified to read SELECT {[Geography].[Geography].[Country].MEMBERS} ON COLUMNS, {[Measures].[Actual]} ON ROWS FROM [DspSalesDemo] WHERE ( { FILTER({ [User].[User].MEMBERS},[User].[User].CURRENTMEMBER.PROPERTIES("Login") = "Alan")} )

Note: there are slightly more efficient ways of doing this where the login name is actually used as part of the MEMBER_UNIQUE_NAME (like [User].[User].[$PC09_USER] but this is simply not always the case, hence the above explanation). Now, this would require you to modify all your queries. However, if you do have a way of filtering these queries through a user based hierarchy you can do this automatically for all queries.

Page 18: Embedding BI

P a g e | 18 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

In zenith.properties add two lines. dsp.filter.user=true dsp.filter.user.definition=[User].[User].[$PC09_USER] Note: if you have a hierarchy which stores the login name in a property then you can use dsp.filter.user.definition=FILTER({[User].[User].MEMBERS},[User].[User].CURRENTMEMBER.PROPERTIES("Login") = "$PC09_USER") This will modify every single query going through the system (no exceptions) and will provide a pretty decent level of security - although it won't protect your data if someone for example downloads a Microsoft Excel(tm) pivot file as they will then have access to all data. IMPORTANT: If you use this you will want to use filters that are dependency filtered as that will allow you to ensure that the contents of the individual slicers are only the members that a specific user should be allowed to see.

Page 19: Embedding BI

P a g e | 19 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

On secure socket layer (SSL) and its implications IMPORTANT NOTE: In order to use SSL you NEED to run the 32-bit JRE. If your copy of PC is installed on a 64-bit machine you have to download the 32-bit JRE from Oracle (for Windows x86) and replace the contents of the <INSTALL_DIR>/runtime folder with the contents of the JRE. The reason is that the required sunmscapi.dll is not shipped with the 64-bit JRE. The most important thing to remember about SSL is that even though it adds to the overall security of an installation it does come with a cost. And that if you are using SSL towards PC you really should consider using SSL between the Performance Canvas server and the IIS instance. Note: if you are putting up a outwardly accessible instance, for example on your extranet or even as part of your public site then SSL may in certain cases be preferable. However, the cost is pretty straight forward, SSL costs CPU cycles and those CPU cycles increase as the number of users increase. There are tons of resources on the internet on how to figure out what kind of hardware to throw at the problem but it requires some understanding of the traffic profile and the usage model. Your mileage will vary. Setting up SSL is slightly less straight forward than one might wish but hang in there, you will get there. First of all, here are the configuration options: dsp.security.ssl =true dsp.security.ssl.protocol=TLS dsp.security.ssl.keystoretype=JKS dsp.security.ssl.keystorepass=ChangeThisPassword dsp.security.ssl.keyalias=performancecanvas Now. In order to be able to get a certificate from a CA (Certificate Authority) you have to create a CSR, or a Certificate Signing Request. Once you send this to the CA they can create a Certificate which will let clients know that the website is secure. Here's how you create a CSR. Start a command line window and navigate to the installation directory where Performance Canvas resides. Then run the following command runtime\bin\keytool -genkey -alias performancecanvas -keyalg RSA This will generate a key and you will be prompted to supply a password. This is the password you will supply as the value for dsp.security.ssl.keystorepass so make sure you remember it. You will also be asked to supply various information about the company and so on and this is the information that clients accessing the server will see in the certificate so be sure to fill it out appropriately. Finally you will be asked to give a password for the key itself (not the keystore), you HAVE TO use the same password as you did before. Just pressing the ENTER key will ensure that this happens automatically.

Page 20: Embedding BI

P a g e | 20 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

In order to get a true Certificate from a Certificate Authority (like Thawthe or Verisign), you should now create what is called a CSR. This Certificate Signing Request is used by the CA to create the Certificate that will later identify your server as secure to the end users. Here's how you do that. Open a command line window and again navigate to the installation directory of performance canvas. Create the CSR by running runtime\bin\keytool - certreg -keyalg RSA -alias performancecanvas -file certreq.csr -keystore .keystore This will create a file named certreq.csr that you send to the Certificate Authority of your choice, they have ample documentation on their websites on how to make certificates. Within a short time frame you will get a Certificate back. This has to be imported into your keystore. However, you have to start by imported the Root or Chain Certificate first.

Go to the Certificate Authority you got your certificate from and download their Chain or Root Certificate. Consult their documentation if you can't find it. Once you have downloaded that, start a command line window and navigate to the installation directory of Performance Canvas and import it with the following command

runtime\bin\keytool -import -alias root -keystore .keystore -trustcacerts -file <the filename of the root certificate> Once that is done you can proceed with importing your own Certificate by running

runtime\bin\keytool -import -alias performancecanvas -keystore .keystore -trustcacerts -file <your certificate>

And you are all set. Once you update the zenith.properties file in the Performance Canvas installation directory with the configuration options described above you will be all set and a quick restart will make your Performance Canvas instance highly secure. (Note: if you want to use an internal certificate then you have to use PKCS11 or PKCS12, refer to the OpenSSL documentation on how to turn a Microsoft Key Manager certificate into a valid SSL certificate. This will require changing the keystoretype value as well.)

Page 21: Embedding BI

P a g e | 21 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

On loose clusters There are situations where traffic warrants the use of several machines (or perhaps you simply want to ensure better availability/response times). Moving to enterprise class licenses with support for distributed caches is expensive and a better solution on the way there may be to consider doing loose clustering. This centers around the fact that instances can share a single store location. This may be on a networked disc somewhere where the /store folder is located. It contains all the definition files and as long as you expect most of the traffic to be reads this really shouldn't be problematic at all. But it is your network. Making predictions on the effects on it would be presumptuous. If you have good bandwidth and hardware then by all means try it - it is a very viable solution. If you have a shaky network with loads of timeouts and congestion then perhaps this isn't for you. Basically the simplest scenario is that you have nodes A through Z and they all share a single store folder. Their core configuration is unique, that means that they can be running on different ports if that's what you want. However in the vast majority of the cases you will be running this with some form of load balancing (DNS Round robin perhaps?) in which case they will all be identical. What you need to do is make sure that they all have dsp.store.path=<path to the store folder> in their zenith.properties file. That's it. Let's say you have your networked disk on \\Server01\D$\rsc\store then simply add dsp.store.path=\\Server01\D$\rsc\store to the zenith.properties files and you are all set. All your instances will now be running using the settings and object definitions there. They will all have their own metadata caches however (be aware of this, it will increase metadata traffic towards your cubes so you will have to keep an eye out for 503 errors in the logs, signifying that you have contention issues in the IIS and need to increase the number of workers/threads in order to keep up with demand).

Page 22: Embedding BI

P a g e | 22 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

On locales and languages We understand the need for supporting multiple languages and Performance Canvas is built from the ground up to support multiple locales both on the client and the server side. However, for performance purposes you use a dedicated server per locale. This is on order to be able to effectively utilize the naming cache, a cross-locale server would not be efficient as the number of values needing caching would increase dramatically. So, how do you set this up? In the simplest case there is already an existing locale/translation of the client side. In this case the only thing you have to do is set the server locale accordingly. You do this either by using the administrative console at /app/admin or by changing the dsp.locale property in zenith.properties. NOTE: PC uses the <ISO-language>_<ISO-country> code. This means that using numerical codes will NOT work. Here is an example. The default configuration is dsp.locale=en This means that english is used. Not en_US (which is US English) or en_UK (which is UK english) but en which is a common english translation suitable for all english speaking regions but which does not take into account locale specific spelling. If you for example want to use french instead there are several types of french. dsp.locale=fr dsp.locale=fr_CA dsp.locale=fr_FR are different in that they refer to different locale files. You can find the translations in /store/settings/locale. The default (i.e. "en" files are in the /store/settings/locale/default directory and these are the files that should be used as the basis for translation should you opt to implement a new language for yourself or your customers)

Page 23: Embedding BI

P a g e | 23 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

On Kerberos Kerberos is a notoriously complex protocol. It is highly secure and solves a lot of the typical issues with a modern heterogenous IT environment but at the same time it can be problematic to set up and even more problematic to troubleshoot. This document will explain how to setup Kerberos to work with Performance Canvas. It is assumed that the reader has a basic knowledge of Active Directory administration and knows one or two things about configuring a DNS as well. But if you don’t we have tried to give as much information as possible to ensure that you are successful.

IMPORTANT

It is easy to assume that the hostname and username in the description below are different. They are not. You will want to setup a user and a host with the EXACT same name. So if you create a user named pc07 then the host will have to be called pc07 as well. This is easily overlooked and a common source of error.

Prerequisites

1. To be able to use Active Directory, the Performance Canvas service must run by an AD account and not by Local System.

2. That user account must have write permission in the Performance Canvas installation folder. 3. That user account must also have full rights to all cubes that are accessed by Performance

Canvas.

Step 1: Creating the account

The first thing you need to do is to create a new account that will act as the service (not the same account as running the Performance Canvas service described above). In this particular example we will call this user pc07krb5. Note that this name will also be the server name used to access the Performance Canvas so choose something that is a good and descriptive hostname if people are going to be accessing it directly in their browsers. Note that Kerberos as a protocol is notoriously case sensitive and even if much of that is a non issue in a pure Microsoft environment it is considered best practice to stick with lower case names.

In this example we are creating a new user in the Microsoft Active Directory™ with username pc07krb5 and the password pc07k5#123. Note that the username and password can be anything you want them to be.

Page 24: Embedding BI

P a g e | 24 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

(Figure 1: setting up the username)

(Figure 2: setting up the password for the user – note the “password never expires” setting)

Page 25: Embedding BI

P a g e | 25 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

(Figure 3: Finalizing the user creation, just verify your settings and click finish)

Step 2: Ensuring that the account can handle delegation

Now you want to make sure that the account you created is trusted to do delegation. Delegation is the Kerberos mechanism that allows a server to impersonate a user without having access to his or hers actual credentials, instead it receives a forwardable ticket from the Kerberos server. To do this you need to locate the newly created account under Users in your Active Directory. Now right click on it to open the properties window. Select the tab named “Account” and make sure that the checkbox marked “Account is trusted for delegation” is checked.

Page 26: Embedding BI

P a g e | 26 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

(Figure 4: setting the delegation flag on the user account is done on this tab in the user account properties)

Note that certain Active Directory setups will NOT have this checkbox, in this case perform steps 3 and 4 and go back. Now there should be a tab called Delegation showing. This will include a radio button that allows you enable the same option.

Step 3: Adding a host name

Kerberos uses what is known as SPN (Service Principal Names) as a way to locate services. In order for that to work there needs to be an entry in the DNS called an A record that the Kerberos server can find. Open your DNS management console (logged on to the domain controller server you can find this under Administrative tools). Locate the domain you want. Note that if you are working on the domain DOMAIN the zone you are looking for is called domain.local from a DNS perspective. Locate that under Forward Lookup Zones, right click the folder and add a new A record. To be able to do this you will need the IP address of the machine that Performance Canvas will be running on. If you don’t have it you can locate the NETBIOS name in the DNS. If the machine is for example called server4 you can just locate that name in the list. Neither of the checkboxes need to be checked for Kerberos to work. Note that the

Page 27: Embedding BI

P a g e | 27 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

hostname you want to use is exactly the same as the username you just created, in this case pc07krb5. You don’t have to add the domain part itself, it will be taken care of automatically.

(Figure 5: the username has been entered as the hostname and we can now click Add Host)

Step 4: Generating the keytab

A keytab file is a shared secret that allows the service to communicate with the Kerberos service as a service. This is the most complex part of the setup. You have to open a DOS window and navigate to some directory where you can create files. First write: “ktpass” (without the quotes) on the command line and press enter. If you get an error saying that the file can’t be found then you have to install ktpass. It can be found on Microsoft’s website at http://support.microsoft.com/kb/892777. Once you have downloaded this and installed it you can run the ktpass after exiting the DOS window and starting it again.

Now write

ktpass -princ “HTTP/[email protected]” -mapUser pc07krb5 -pass pc07k5#123 -crypto RC4-HMAC-NT -out pc07.keytab This will generate a file called pc07.keytab. Note that you need to replace the username, password and domain parts with your particular information. If you are in the domain MYDOMAIN and just create a username called pc07 with the password pwd123 then you would write

Page 28: Embedding BI

P a g e | 28 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

ktpass –princ “HTTP/[email protected]” –mapUser pc07 –pass pwd123 –crypto RC4-HMAC-NT –out pc07.keytab Not only will this generate a keytab, it will also associate the user with the SPN (HTTP/[email protected]).

(Figure 6: This is what it looks like when you have created your keytab, note that the warning about non-matching ptypes can be safely ignored)

You may get an error message saying that RC4-HMAC-NT is not supported. In this case you need to use DES-CBC-MD5 instead. This also means you have to change the values in the zenith.properties file (found in the Performance Canvas installation directory) from

dsp.security.krb5.conf.default_tgs_enctypes=rc4-hmac dsp.security.krb5.conf.default_tkt_enctypes= rc4-hmac to

dsp.security.krb5.conf.default_tgs_enctypes=des-cbc-md5 rc4-hmac dsp.security.krb5.conf.default_tkt_enctypes=des-cbc-md5 rc4-hmac This will enable the use of des-cbc-md5 as an encryption type for Performance Canvas.

To verify the SPN mapping you can run the command

setspn –L mydomain\pc07 Or in our example

setspn –L dspDevDomain\pc07krb5 This will list the associated SPN:s so you can verify that everything is correct. If there is a problem you can delete the SPN by writing

setspn –D HTTP/[email protected] mydomain\pc07 And then you can do the ktpass keytab generation over again.

Page 29: Embedding BI

P a g e | 29 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

Step 5: Installing the keytab file

Now that you have a keytab file you have to move it so that Performance Canvas can find it. The best way to put it is in the Performance Canvas installation directory. Copy the file and transfer it there. Now you have to make sure to tell Performance Canvas where it is. If it is running then stop the service. Now open the zenith.properties file that you can find in the installation directory. Locate the property called

dsp.security.krb5.conf.default_keytab_name Now you want to give the complete path of the keytab file, like this

dsp.security.krb5.conf.default_keytab_name=c:\program files\pc07\pc07.keytab Once that is done you can start the Performance Canvas service again. Congratulations, the hard part is now done. If you now navigate to the security tab in the Administrative interface you can select the “Windows Integrated Security” mode.

Step 6: Access Performance Canvas by using the new DNS record as URL

Once you have selected Windows Integrated Security and clicked save you can restart the service and try it. In this example the URL will be http://pc07krb5

Make sure you do not use a browser on the same machine as Performance Canvas is running on. In many situations Active Directory forces that browser to use NTLM to access local machines and this will not work as the Performance Canvas server is now in Kerberos only mode.

Do's and Don’ts while installing the Kerberos setup

DO

• While creating the account (Step No.1) – Always create a new user account.

• While writing the ktpass command as given below – (Step No. 4)

ktpass – princ “HTTP/[email protected]” –mapUser pc07 –pass pwd123 –crypto RC4-HMAC-NT –out pc07.keytab • Write domain name before the username entered.

Example for User – PC

mydomain\PC

Page 30: Embedding BI

P a g e | 30 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

DON’T

• While creating the account (Step No.1) – Do not use an already existing account.

Troubleshooting • First of all, make sure that you have an entry called dsp.security.useNativeGssApi in your zenith.properties file (see Step 5 above). If you don’t then add it to the file like this dsp.security.useNativeGssApi=false. If the value is true then change it to false. Using true will make it fail.

• Make sure that the host is trusted by the browser, if the browser is showing that the host is part of the internet zone then you have to add the hostname to trusted sites. You can find the icon in the bottom bar of your Internet Explorer. If it shows an icon looking like a very small earth then you are in the wrong zone and the browser will attempt to use NTLM. Doubleclick the icon and add the host to trusted sites in your local intranet zone

• Check that the host you are accessing has the exact same name as the user you created. This is extremely important. The easiest way to test this is to open a DOS window (Run CMD) and write ping <username> (if you created the user pc07 you would write “ping pc07” without quotes). If that fails with an error message, you haven’t created the right user.

• If you can access PC but not the cubes you may have inadvertently setup an SPN at some point which is interfering with the HTTP on the host machine. Use setspn –L MYDOMAIN\username to check that you don’t have any SPNs other thanHTTP/[email protected].

• If you can’t access the Active Directory to setup users for your role, make sure that the username you are using is just the username, don’t use MYDOMAIN\username. Just username. The domain name is specified elsewhere

Page 31: Embedding BI

P a g e | 31 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

On development We have worked pretty hard on making sure that PC is more than just a design tool. It is a pretty powerful development tool as well, regardless of whether you want to design mash ups, complex dashboards or pretty much whatever you want from the web client side or if you want to do deep integration into existing enterprise applications, delivering analytics functionality to places where people actually see it in context. In this section we will try to describe how to go about these things by describing a number of well defined basic tasks that are common and that would form the basis of a solution. This will make your life easier and coupled with the information in appendices E through G you should find enough (hopefully) to let you go about your work without having to scratch your head too much. We know as well as you do that good documentation is essential to a developer and we have tried to put everything as clearly as possible but if there is something you are still wondering about then don't hesitate to let us know so we can make this documentation better. Since developers will work in different environments any code will be referred to as pseudo code and will be sort of a bastard child of Java and C# since those two languages are the most commonly used for building enterprise applications today. If you are working in a different environment completely then hopefully at least you will be able to glean sufficient information from the examples that you can still understand what should be going on and translate that to your own work situation. Mileages may vary. As usual.

On direct API usage This will be a mercifully short chapter. Is it possible to use the API directly. Yes. Are you allowed to? No, not without licensing the PC technology in an appropriate manner. Not doing that will put you in breach of the EULA and all sorts of bad things will happen. Fire. Brimstone. Wrath of least favorite deity. That kind of thing. So don't. We know it's cool and neat and all. But be a cool person. License it. Then you will get the appropriate documentation. The web services are just as useful. Promise.

On web services

On ConfigurationService

First of all. You will find the wsdl by accessing

http://yourserver:yourport/services/ConfigurationService?wsdl Or you can just look in Appendix E if you have the stomach for reading WSDL files with the naked eye.

Page 32: Embedding BI

P a g e | 32 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

On methods

Below the methods in ConfigurationService are described along with parameters and return types. For more in depth information, read the task sections to find out how they are used in various scenarios.

addCube addCube(string url, string sqlServerName, string olapDBName, string cubeName, string cubeDisplayname) PARAMETER DESCRIPTION url A valid URL pointing to an OLAP pump running on an IIS instance

(or in the case of other XMLA providers, the appropriate host).

Typical example: http://localhost:81/olap/msmdpump.dll

sqlServerName The SQL Server name olapDBName The name of the OLAP database (or Catalog) where the cube

resides

cubeName The Name of the cube

cubeDisplayName The displayed name of the cube, becomes highly interesting if you have autogenerated cube names

The method returns a boolean indicating whether the cube was added or not.

appendCubes appendCube(string[] urls, string[] sqlServerNames, string[] olapDBNames, string[] cubeNames, string[] cubeDisplaynames) Note: all the parameters are arrays, the method expects one (1) value per added cube, meaning that all of the arrays should have the same length. The parameters are exactly the same as in addCube above.

PARAMETER DESCRIPTION url A valid URL pointing to an OLAP pump running on an IIS instance

(or in the case of other XMLA providers, the appropriate host).

Typical example: http://localhost:81/olap/msmdpump.dll

sqlServerName The SQL Server name

Page 33: Embedding BI

P a g e | 33 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

olapDBName The name of the OLAP database (or Catalog) where the cube resides

cubeName The Name of the cube

cubeDisplayName The displayed name of the cube, becomes highly interesting if you have autogenerated cube names

The method returns a boolean indicating whether the cube was added or not.

constructCanvas This method requires a bit of explanation perhaps, it will automatically construct a canvas given a set of slicers and a set of gems. constructCanvas(string canvasSettings, string[] slicers, string[] gems) PARAMETER DESCRIPTION canvasSettings The base settings for the new canvas, is it mobile or not, what's the

current status and so on

slicers An array containing the slicer uids for inclusion in the canvas filter block

gems An array containing the gem uids for gems that should be displayed on the canvas

The method returns a string containing the UID of the newly constructed canvas.

deleteCanvas deleteCanvas(string canvasUid, boolean deepDelete) PARAMETER DESCRIPTION canvasUid The UID of the canvas you want to delete

deepDelete A boolean signifying whether all objects used on the canvas should be deleted as well (basically a recursive delete). True deletes everything, false deletes the canvas only.

Page 34: Embedding BI

P a g e | 34 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

The method returns a boolean signifying whether the delete was successful or not.

exportCanvas exportCanvas(string canvasUid) PARAMETER DESCRIPTION canvasUid The Uid of the Canvas to be exported

The method returns an array of strings, each string containing one object that is used on the Canvas. This structure can be used directly with the importCanvas method.

flushCache flushCache() PARAMETER DESCRIPTION

The method has a void return type. The only thing it does is attempts to flush the cache. Note that this is synchronous so it may take a while for the method to return.

getConfigurations This method retrieves a list of entities that match the supplied filters, if no filters are supplied then all objects are returned. Filters are supplied in standard NVP format (i.e '<name>=<value>' - so, if you wanted to get all published enterprise canvases you call this method with the arguments "canvas" and {"canvas.basic.scope=ENTERPRISE", "canvas.basic.status"=PUBLISHED} getConfigurations(string type, string[] filter) PARAMETER DESCRIPTION type The object type you want to look for. Valid values are for example

- canvas

- gem

- chart

- table

Page 35: Embedding BI

P a g e | 35 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

- measure

- slicer

- filter

Etc.. filter An array containing the filters to be used for selecting a subset of

the total number of objects of the supplied type

The method returns a string array containing the objects that matched the query

getUniqueConfiguration This method retrieves a unique (single) configuration for a specific object type. Note that sending "null" for the ID will send the default base configuration for specified object type. IMPORTANT: if you just want to check whether the server is responding, you can actually call this method likes this getUniqueConfiguration("canvas","ping"); which will give you an empty string as a return value. getUniqueConfiguration(string type, string uid) PARAMETER DESCRIPTION Type The object type you want to look for. Valid values are for example

- canvas

- gem

- chart

- table

- measure

- slicer

- filter

Etc.. uid The specific UID to load. A null or empty string will return the

default configuration. Sending "ping" will send an empty string back.

Page 36: Embedding BI

P a g e | 36 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

The method returns a string containing the configuration represented as key-value pairs.

importCanvas This method is the import version of exportCanvas. It takes an array of object definitions and stores them locally. importCanvas(string[] components) PARAMETER DESCRIPTION components An array containing all the objects used on the canvas as well as

the canvas itself. Each object has it's own string in the array. This is primarily used as a complement method to exportCanvas.

The method returns a string containing the uid of the newly saved Canvas.

saveConfiguration This method saves the settings for a requested object type. Note that we don't do any type checking or validation here so use all the save methods with appropriate care saveConfiguration(string type, string settings) PARAMETER DESCRIPTION type The object type you want to save. Valid values are for example

- canvas

- gem

- chart

- table

- measure

- slicer

- filter

Etc.. settings A string containing the KVP settings of the object

Page 37: Embedding BI

P a g e | 37 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

The method has a void return type

saveConfigurationAsNew This method saves the settings for a requested object type as a guaranteed new object. This can be used to clone objects or save minor variations in a an easy way. Note that we don't do any type checking or validation here so use all the save methods with appropriate care saveConfiguration(string type, string settings) PARAMETER DESCRIPTION type The object type you want to save. Valid values are for example

- canvas

- gem

- chart

- table

- measure

- slicer

- filter

Etc.. settings A string containing the KVP settings of the object

The method returns a string containing the UID of the newly created object

simpleConstructCanvas This method is an even simpler front for constructCanvas(). In this method you simply supply a list of uids for the objects you want to add, without keeping track of the object types. simpleConstructCanvas(string canvasSettings, string[] uids) PARAMETER DESCRIPTION canvasSettings The base settings for the canvas you want to create

uids The uids for all the objects you want to use on the canvas, note

Page 38: Embedding BI

P a g e | 38 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

that anything which doesn't point to a gem or a slicer will be discarded.

The method returns a string containing the uid of the newly constructed canvas.

Page 39: Embedding BI

P a g e | 39 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

Task: Retrieving an existing object Retrieving an existing object requires you to have two distinct pieces of information. One of them is the object type (is it a canvas, a gem et cetera), the other is the unique identifier. Now, the uniqueness of these identifiers is local. They are not guaranteed to be globally unique. However, if a UID is generated that matches an existing one in the system it WILL be discarded so there is no risk of accidentally overwriting existing information.

Once you have this information you use the web services to retrieve the object. The method you want is:

getUniqueConfiguration(type, uid) This method returns a string containing the properties of the object as key value pairs in the usual PC fashion. Let's say we retrieve a tag with the uid 1234.

pseudo code below

string result = getUniqueConfiguration("tag","1234"); string[] properties = result.split("\n"); Map<string,string> propertyMap = new HashMap<string,string>(); foreach(string property;properties) { string[] keyValue = property.split("="); // note this is error prone, a value can contain = signs propertyCollection.put(keyValue[0],keyValue[1]); }

Now you can retrieve and edit the properties before using or saving the object.

Page 40: Embedding BI

P a g e | 40 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

Task: Finding a list of objects

It's not uncommon to have a need to retrieve a list of objects from the server. In the simplest case you want to discover all the canvases (for example) on a specific PC server. Use the method

getConfigurations(string type, string[] filters) In this example task we won't be using filters. You can pass null for this argument. Note that this method returns an array of strings, meaning that each object will be contained in it's own string representation of key value pairs (see Task: Retrieving an existing object for more information about this)

That means that to retrieve a string array containing all the objects you are looking for (and that you have access to) you do

getConfigurations("canvas", null); And that's it. (Note: depending on your WS framework this can be more or less work and the way to accomplish this can be quite different but this will give you the general idea at least. Don't be afraid to play around with this stuff. If you don't want to use the production server for development then either download a trial version or use the development license that should come with all licenses of non-embedded PC.

Page 41: Embedding BI

P a g e | 41 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

Task: Finding a list of objects that match a certain filter

Now that you know how to retrieve a list of objects it's time to start filtering your results. A filter is represented as a key value pair. Let's say you want to find all gems that are in a PUBLISHED state. The property name is gem.basic.status and the appropriate value is PUBLISHED (if you want to find out more about properties, please have a look at Appendix C where all of the object types are described in mind numbing detail).

You populate your string array used for filters with one string containing

string[] filters = new string[]{'gem.basic.status=PUBLISHED' }; and use the getConfigurations-method again.

getConfigurations("gem", filters); to retrieve your array of objects as string representations. You can use more complex combinations of filters obviously, here is an example which retrieves all published gems that are charts and use the DspDemoSales cube.

string[] filters = new string[]{"gem.basic.status=PUBLISHED", "gem.basic.viewtype=CHART","gem.basic.datasource=DspDemoSales"}; string[] result = getConfigurations("gem",filters);

Page 42: Embedding BI

P a g e | 42 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

Task: Creating an object Creating a new object requires you to first fetch the settings, second modify them and third sending the whole thing back to the server. In this example we will construct something simple without relationships to other things, normally - for example in the case of a gem - object creation will require keeping track of multiple Performance Canvas objects of different types.

In this case we will create a tag. The method you want to use is:

getUniqueConfiguration(type, uid) This method returns a string containing the properties of the object as key value pairs in the usual PC fashion. This time however we will send in null as the uid argument.

pseudo code below

string result = getUniqueConfiguration("tag",null); string[] properties = result.split("\n"); Map<string,string> propertyMap = new HashMap<string,string>(); foreach(string property;properties) { string[] keyValue = property.split("="); // note this is error prone, a value can contain = signs propertyCollection.put(keyValue[0],keyValue[1]); }

Now you can retrieve and edit the properties before using or saving the object. When you are ready to save the tag in question you use the following method:

saveConfiguration(type, settings) Note that settings is a string containing all the key value pairs that would look like this

value.a=a value.b=b value.c=c pseudo code below

string uid = saveConfiguration("tag",settingsString); //now we have the uid and can actually access the object directly in case we need //to do some further modification, in this case we might just want to change the name string tagData = getUniqueConfiguration("tag",uid); //this will fetch us the object we just created tagData = tagData.replace("name","newName"); saveConfiguration("tag",tagData); //note what we just did is not a recommended way of doing things, just an example

Page 43: Embedding BI

P a g e | 43 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

Task: Exporting a canvas

Sometimes you will end up in a situation where you have a set of canvases on one PC instance that you would like to deploy on another one. Finding it in the store and resolving all the relationships may be extremely tricky however. We supply a simple and straight forward method for retrieving (or "exporting") one or more canvases programmatically through the web services interface.

The method to use is:

exportCanvas(uid) This method returns an array of strings, one string for each associated object (including gems, charts, tables, filters, slicers and so on). In order to get the appropriate canvas you can always use the filtered search capabilities (see "Finding a list of objects that match a certain filter").

pseudo code below

string uid = "1234"; string[] objects = exportCanvas(uid); Now that you have your canvas represented as an array of strings you can import that into another Performance Canvas server instance.

Page 44: Embedding BI

P a g e | 44 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

Task: Importing a canvas So now you have successfully exported a canvas from a Performance Canvas Server and you want to install it on another one. The method you would want to use is:

importCanvas(objects) In fact this is so simple that a pseudo code example would be completely unnecessary. Once you have done that the canvas and it's parts are available for the users on the import server. Well done.

Page 45: Embedding BI

P a g e | 45 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

On RenderingService

First of all. You will find the wsdl by accessing

http://yourserver:yourport/services/RenderingService?wsdl Or you can just look in Appendix E if you have the stomach for reading WSDL files with the naked eye.

On methods Here are all the methods of the RenderingService described with parameters and return types. For more information on how to use them, check out the task section following the method definitions.

getChart

getChart(string mdxQuery, string settings, string format) PARAMETER DESCRIPTION mdxQuery A valid query towards a cube which is mapped and installed in the

Performance Canvas instance. If the cube is not mapped then an error will be thrown

settings Valid chart settings, these can be retrieved and modified using the methods in ConfigurationService (see previous section)

format A string having one of the following values:

- html - pdf - image - ppt

The method returns a string containing a a partial url, using the ContentService you can instantly download the file which has already been generated.

getChartTypes

getChartTypes()

Page 46: Embedding BI

P a g e | 46 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

PARAMETER DESCRIPTION None

The method returns an array of strings containing all the available chart types on this Performance Canvas instance

getColorSchemes

getColorSchemes() PARAMETER DESCRIPTION None

The method returns an array of strings containing all the available color schemes on this Performance Canvas Server

getTable

getTable(string mdxQuery, string settings, string format)

PARAMETER DESCRIPTION mdxQuery A valid MDX Query pointing to a cube which is mapped and

initialized in this Performance Canvas server

settings Valid settings for a Performance Canvas table. These can be retrieved and modified using the ConfigurationService. Note - this doesn't have to point to an exisiting object.

format A string describing what format you want the table in, valid values are:

- html

- xls

- pdf

Page 47: Embedding BI

P a g e | 47 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

- image

- scaledimage

The method returns a string containing a a partial url, using the ContentService you can instantly download the file which has already been generated.

Page 48: Embedding BI

P a g e | 48 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

Task: rendering a chart as an image First of all you need to use the ConfigurationService to retrieve the correct base settings. Once you have that you can modify the values, if you want to make sure you know what chart types and color schemes are available you request them from the RenderingService and update the chart settings accordingly. Once you are done and you have a valid query you can call the getChart() method and construct a URL from the end result.

Pseudo code below

//see section on ConfigurationService for retrieving default settings, we will assume //that the variable settings is a hashmap/hashtable containing our key value pairs string[] chartTypes = getChartTypes(); string[] colorSchemes = getColorSchemes(); settings.put("chart.basic.type", chartTypes[0]); settings.put("chart.basic.colorscheme", colorSchemes[0]); //ok, now let's create a query string query = "SELECT {[Geography].[Geography].[State].MEMBERS} ON COLUMNS,{[Measures].[Actual],[Measures].[Plan]} ON ROWS FROM [DspDemoSales]"; string format = "IMG"; string file = getChart(query,toString(settings),format); string url = "http://performancecanvashost:" + portValue + "/content/" + file; //and you can retrieve your data from the URL

Page 49: Embedding BI

P a g e | 49 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

Task: rendering a table as Excel pivot

First of all you need to use the ConfigurationService to retrieve the correct base settings. Once you have that you can modify the values, in this case we won't do anything at all since any changes would be pointless as we are requesting an EXCEL_PIVOT. Once you are done and you have a valid query you can call the getChart() method and construct a URL from the end result.

Pseudo code below

//see section on ConfigurationService for retrieving default settings, we will assume //that the variable settings is a hashmap/hashtable containing our key value pairs //ok, now let's create a query string query = "SELECT {[Geography].[Geography].[State].MEMBERS} ON COLUMNS,{[Measures].[Actual],[Measures].[Plan]} ON ROWS FROM [DspDemoSales]"; string format = "xls"; settings.set("table.basic.pivot","true"); //defines that we want a pivot and not a //static excel file string file = getTable(query,toString(settings),format); string url = "http://performancecanvashost:" + portValue + "/content/" + file; //and you can retrieve your data from the URL

Page 50: Embedding BI

P a g e | 50 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

On XMLAService

First of all. You will find the wsdl by accessing

http://yourserver:yourport/services/XMLAService?wsdl Or you can just look in Appendix E if you have the stomach for reading WSDL files with the naked eye.

On methods

combine This method combines two MDX queries. Note that they have to point to the same cube. combine(string mdxA, string mdxB) PARAMETER DESCRIPTION mdxA A valid MDX Query mdxB A valid MDX Query

The method returns the combined query statement

filterByUser This method injects a query based security part that is dependent on the query based security settings of the server filterByUser(string mdx, string userName) PARAMETER DESCRIPTION mdx A valid MDX Query userName The username to be filtered on

The method returns a filtered query statement or null if an error occured

getActions This method retrieves all the actions available for the given entity. getActions(string cube, string entity)

Page 51: Embedding BI

P a g e | 51 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

PARAMETER DESCRIPTION cube A valid cube name entity A valid member in the cube

The method returns a string array containing the information about the actions available (one string per action, data is in key=value format)

getChildren This method retrieves the children of the specified type for a given member getChildren(string cube,string parentName, int childType) PARAMETER DESCRIPTION cube The name of the cube

parentName The unique name of the parent (if you want top level objects in the cube, supply null)

childType Valid values are: Dimension (0) (supply cube only) Measure(1) (supply cube only) Hierarchy(2) (supply cube and dimension) Level (3) (supply cube and hierarchy)

Member(4) (supply cube and Level or Member

The method returns a string array, each string instance contains one child, data is in key=value format as usual.

getCubeForMDX Parses the MDX and gives you the appropriate cubename getCubeForMDX(string mdx) PARAMETER DESCRIPTION mdx A valid MDX Query

Page 52: Embedding BI

P a g e | 52 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

The method returns a string containing the cube name or null if an exception occured.

getCubes This method retrieves data about all the installed and configured cubes in the Performance Canvas service instance getCubes() PARAMETER DESCRIPTION

This method returns a string array containing one string for each cube with data in key=value format.

getDrillthroughStatement This method constructs a drillthrough statement for the given entity and the given mdx. getDrillthroughStatement(string entity, string mdx) PARAMETER DESCRIPTION entity A valid unique member name

mdx A valid MDX Query

The method returns a valid DRILLTHROUGH query for the entity or null if an exception occured.

getDynamicSet This method supplies resolving of dynamic sets (or named sets) in the cube (or of any valid MDX statement). What happens is that the snippet is used to create a query and that query is used to resolve the set into distinct members. getDynamicSet(string cube, string mdxSnippet) PARAMETER DESCRIPTION cube A valid cube name for the PerformanceCanvas server instance

mdxSnippet The name of named set, a definition of some other kind (like [Member].CHILDREN or ParallelPeriod or similar).

Page 53: Embedding BI

P a g e | 53 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

The method returns an array of strings, each strings containing the data for one of the members in the resulting set. Data is in key=value format.

split This method splits the MDX query into multiple sub queries based on the supplied hierarchy, it will return one query for each member of the hierarchy used in the current query. split(string hierarchy, string mdxQuery) PARAMETER DESCRIPTION hierarchy The unique name of the hierarchy you want to split on

mdxQuery A valid MDX Query

The method returns an array of string arrays (string[][]), each string array contains two items, the first is the member display name and the second is the MDX Query.

transform This method transforms an MDX query . Note that names and treeOps have to have the same length. Names also should refer to a single hierarchy. See below for valid values for treeOps. transform(string cube, string[] names, int[] treeOps, string mdxQuery) PARAMETER DESCRIPTION cube A valid cube name for the Performance Canvas server instance

names An array containing the unique names of the members you want to transform.

treeOps The tree operands to be used (one for each name in names above). Valid tree operand values are:

Children (1) Siblings (2)

Parent (4)

Self (8)

Descendants (16)

Page 54: Embedding BI

P a g e | 54 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

Ancestors(32) mdxQuery A valid MDX query

The method returns a transformed MDX query or null if the operation failed/an exception occured.

transformSingleMode This method allows transformation for inline expansion (see inline drilldown in tables in Performance Canvas to see what this means). transformSingleMode(string cube, string[] names, string mdxQuery, int mode) PARAMETER DESCRIPTION cube A valid cube name names An array of unique names that should be expanded or closed

mdxQuery A valid MDX query mode Mode signifies whether we should expand or close the members

supplied in names. Valid values are: Expand (0) Close(1)

The method returns a string containing the resulting query or null if an exception occured.

transformWithFilter This method performs a transform based on the Performance Canvas filters. There are multiple kinds of filters and many things you can do. Please refer to the section on filters for more on how to use this to do complex modifications. Note: you can also build your own filters by subclassing com.dsp.mdx.filter.TransformFilter. For more on this, see "On developing". transformWithFilter(string filterProperties, string mdxQuery) PARAMETER DESCRIPTION filterProperties A string containing the properties of the filter you want to use (see

ConfigurationService for descriptions on how to retrieve the settings for Performance Canvas objects)

mdxQuery A valid MDX query

The method returns a modified/filtered MDX Query or null if an exception occured.

Page 55: Embedding BI

P a g e | 55 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

Page 56: Embedding BI

P a g e | 56 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

On object definitions

Performance Canvas is built around object definitions. These vary from complex ones like Canvas, Gem, Chart and Table to more simple ones like Annotation and Measure. Some of them are even transient, like the Filter definitions. The thing they have in common is the format. The first time you look at it you may wonder why we didn't use XML for this, the reason is simple. We have a limited amount of time to our disposal and we opted for a domain specific configuration language in order to be able to read a very large number of configuration files in a very short time. The format itself is simple enough. The basic idea is that each object is defined by a set of Properties. These properties are grouped into PropertyGroups and they come in different types. The types are

DefaultProperty: Basic string and numerical property

BooleanProperty: Self explanatory, true/false

ListProperty: A property which holds a list and (but not always) a selected value

TableProperty: A property which holds a table, you can look at this as a two dimensional jagged array if you like

These are used to define all the different types of objects that exist in Performance Canvas and there are base definitions for all of them in /store/settings. In appendix D you can find the current version at the time of this document writing (build 2.1.138). Note that these objects are occasionally updated with new properties in order to support new functionality - an update function in the PC PropertyManager will update all existing objects to include the new properties, effectively future proofing your designs.

If you want to change the base definitions you can just edit (or rather replace) the existing base definitions with a new version. For example, if you want all your canvases to look a specific way you can simply replace the canvas.p file with a template that you have create, perhaps one including a company logo, a standard header and so on. Note that a developer can still change and remove those elements if they want or need to. This also goes for charts and tables. If you want a specific look and feel as the default then feel free to change the existing base definition.

Page 57: Embedding BI

P a g e | 57 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

On building new applications and developing on top of Performance Canvas

On working with TransformFilters

TransformFilters are used to modify queries in complex ways. There are several available out of the box:

Name Used for AddHierarchyFilter Adds a hierarchy to the supplied query

Classname: com.dsp.mdx.filter.AddHierarchyFilter

AddMeasureFilter Adds a measure to the supplied query

Classname: com.dsp.mdx.filter.AddMeasureFilter

AddMemberFilter Adds a specific member to the supplied query

BottomCountFilter Inserts a BottomCount method in the supplied query

Classname: com.dsp.mdx.filter.BottomCountFilter

BottomPercentFilter Inserts a BottomPercent method in the supplied query

Classname: com.dsp.mdx.filter.BottomPercentFilter

BottomSumFilter Inserts a BottomSum method in the supplied query

Classname: com.dsp.mdx.filter.BottomSumFilter

BreakdownMeasureFilter DEPRECATED CalcFilter Adds a calculated measure to the query

Classname:com.dsp.mdx.filter.CalcFilter

ChildrenFilter Expands a specific member in the specified query

Classname: com.dsp.mdx.filter.ChildrenFilter

CrossdrillFilter Drills down on a specific hierarchy and moves the current column contents to the where-clause

Classname: com.dsp.mdx.filter.CrossdrillFilter

DrillupFilter Drills up the specific member

Classname: com.dsp.mdx.filter.DrillupFilter

Page 58: Embedding BI

P a g e | 58 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

FilterFilter Adds a Filter method to the supplied query

Classname: com.dsp.mdx.filter.FilterFilter FlipFilter Switches COLUMNS for ROWS, basically flipping the query around

Classname: com.dsp.mdx.filter.FlipFilter

HideMemberFilter Hides the specified member (EXCEPT)

Classname: com.dsp.mdx.filter.HideMemberFilter

MoveToLastFilter Moves the hierarchy to last in the crossjoin

Classname: com.dsp.mdx.filter.MoveToLastFilter

OrderFilter Injects an Order statement in the supplied query

Classname: com.dsp.mdx.filter.OrderFilter OrderMeasuresFilter Reorders measures in the supplied query

Classname: com.dsp.mdx.filter.OrderMeasuresFilter

RemoveHierarchyFilter Removes a hierarchy from the supplied query

Classname: com.dsp.mdx.filter.RemoveHierarchyFilter

RemoveMeasureFilter Removes a measure from the supplied query

Classname: com.dsp.mdx.filter.RemoveMeasureFilter

RemoveSlicerFilter Removes a hierarchy from the WHERE clause of the supplied query

Classname: com.dsp.mdx.filter.RemoveSlicerFilter

SlicerFilter Add a hierarchy to the where clause of the suppleid query

Classname: com.dsp.mdx.filter.SlicerFilter SwitchAxisFilter Move the specified hierarchy from one axis to another

Classname: com.dsp.mdx.filter.SwitchAxisFilter

ToFromSlicerFilter Move the specified hierarchy to or from the WHERE clause of the supplied query

Classname: com.dsp.mdx.filter.ToFromSlicerFilter

TopCountFilter Adds a TOPCOUNT method to the supplied query

Classname: com.dsp.mdx.filter.TopCountFilter

Page 59: Embedding BI

P a g e | 59 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

TopPercentFilter Adds a TOPPERCENT method to the supplied query

Classname: com.dsp.mdx.filter.TopPercentFilter

TopSumFilter Adds a TOPSUM method to the supplied query

Classname: com.dsp.mdx.filter.TopSumFilter

Each of these filters are described in the following section. However this requires an introduction. The simple way to use this is through the web service interface (see XMLAService). Either you can try to retrieve the definition (if it exists) through the methods intended for that purpose, or you just construct the settings on the fly.

Page 60: Embedding BI

P a g e | 60 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

AddHierarchyFilter

Adds a hierarchy to a supplied query.

filter.basic.class=com.dsp.mdx.filter.AddHierarchyFilter filter.basic.hierarchy=<the unique name of the hierarchy> filter.basic.axis=COLUMNS|ROWS filter.basic.members=[Member],[Member],[Member] Note that you can - if you want - leave filter.basic.members empty which will add the ALL or DEFAULT member.

AddMeasureFilter

Adds a measure to the supplied query. Note that the [Measures] hierarchy need to exist first so if you have a query without measures, start by using the AddHierarchyFilter.

filter.basic.class=com.dsp.mdx.filter.AddMeasureFilter filter.basic.unusedmeasure=<The UniqueName of the Measure to add> filter.basic.keep=true|false

AddMemberFilter

Adds a member to the query as part of the set for the supplied hierarchy. As with AddMeasureFilter - if the hierarchy doesn't exist in the query, use AddHierarchyFilter instead.

filter.basic.class=com.dsp.mdx.filter.AddMemberFilter filter.basic.hierarchy=<The Unique Name of the hierarchy> filter.basic.member=<The Unique Name of the member>

BottomCountFilter

Adds the BOTTOMCOUNT method to the supplied query. If filter.basic.others is set to true then a custom set will be added which will show the total of the members of the set that don't match.

filter.basic.class=com.dsp.mdx.filter.BottomCountFilter filter.basic.count=<the number of members to show> filter.basic.measure=<The Unique name of the Measure> filter.basic.ascending=true|false filter.basic.others=true|false

BottomPercentFilter

Page 61: Embedding BI

P a g e | 61 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

Adds the BOTTOMPERCENT method to the supplied query. If filter.basic.others is set to true then a custom set will be added which will show the total of the members of the set that don't match.

filter.basic.class=com.dsp.mdx.filter.BottomPercentFilter filter.basic.percent=<the bottom percentage to show> filter.basic.measure=<The Unique name of the Measure> filter.basic.ascending=true|false filter.basic.others=true|false

BottomSumFilter

Adds the BOTTOMSUM method to the supplied query. If filter.basic.others is set to true then a custom set will be added which will show the total of the members of the set that don't match.

filter.basic.class=com.dsp.mdx.filter.BottomSumFilter filter.basic.sum=<the number of members to show> filter.basic.measure=<The Unique name of the Measure> filter.basic.ascending=true|false filter.basic.others=true|false

BreakdownMeasureFilter

Creates a breakdown for the specific measure

filter.basic.class=com.dsp.mdx.filter.BreakdownMeasureFilter filter.basic.measure=<The Unique name of the Measure> filter.basic.hierarchy=<The hierarchy to use for the breakdown> filter.basic.entity=<The Unique name of the entity>

CalcFilter

Adds a calculated measure to the supplied query. Keep defines whether other measures should be removed. If there are no measures in the query, use the AddHierarchyFilter and then CalcFilter with filter.basic.keep set to false.

filter.basic.class=com.dsp.mdx.filter.CalcFilter filter.basic.label=<the displayname of the calculated measure> filter.basic.format=<the FORMAT_STRING for the measure> filter.basic.expression=<the expression defining the calculated measure> filter.basic.keep=true|false

CrossdrillFilter

Page 62: Embedding BI

P a g e | 62 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

Performs a Crossdrill, i.e. replacing the statement on COLUMNS with the supplied hierarchy on the query.

filter.basic.class=com.dsp.mdx.filter.CrossdrillFilter filter.basic.unusedhierarchy=<The Unique Name of the Hierarchy>

FilterFilter

Adds the FILTER method to the supplied query. The method will be added to the non-measure axis.

filter.basic.class=com.dsp.mdx.filter.FilterFilter filter.basic.expression=<The expression to use> filter.basic.measure=<The Unique name of the Measure>

FlipFilter

Flips the query, i.e. switches COLUMNS for ROWS in the query.

filter.basic.class=com.dsp.mdx.filter.FlipFilter

HideMemberFilter

Hides the specific member by adding an EXCEPT method.

filter.basic.class=com.dsp.mdx.filter.HideMemberFilter filter.basic.member=<The Unique Name of the Member to hide>

MoveToLastFilter

Moves the specific entity to last. The entity can be either a Measure or a Hierarchy.

filter.basic.class=com.dsp.mdx.filter.MoveToLastFilter filter.basic.item=<The Unique Name of the Entity to move>

OrderFilter

Adds an ORDER statement on the axis without [Measures].

filter.basic.class=com.dsp.mdx.filter.OrderFilter filter.basic.measure=<The Unique Name of the Measure to order by>

Page 63: Embedding BI

P a g e | 63 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

filter.basic.order=ASC|DESC|BASC|BDESC

OrderMeasuresFilter

Reorder the measures according to a supplied list

filter.basic.class=com.dsp.mdx.filter.OrderMeasuresFilter filter.basic.measure=[a],[b],[c]

RemoveHierarchyFilter

Removes the specified hierarchy from the supplied query.

filter.basic.class=com.dsp.mdx.filter.RemoveHierarchyFilter filter.basic.hierarchy=<The Unique Name of the Hierarchy> filter.basic.axis=COLUMNS|AXIS

RemoveMeasureFilter

Removes the specific Measure from the query.

filter.basic.class=com.dsp.mdx.filter.RemoveMeasureFilter filter.basic.usedmeasure=<The Unique Name of the Measure to remove>

RemoveSlicerFilter

Removes a specific Hierarchy from the WHERE clause of the supplied query.

filter.basic.class=com.dsp.mdx.filter.RemoveSlicerFilter filter.basic.usedslicer=<The Unique Name of the Hierarchy to remove>

ResetHierarchyFilter

Resets the defined Hierarchy to its ALL or DEFAULT member.

filter.basic.class=com.dsp.mdx.filter.ResetHierarchyFilter filter.basic.item=<The Unique Name of the Hierarchy to reset>

SlicerFilter

Page 64: Embedding BI

P a g e | 64 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

Adds a hierarchy to the WHERE clause of the query.

filter.basic.class=com.dsp.mdx.filter.SlicerFilter filter.basic.unusedhiearchy=<The Unique Name of the Hierarchy to add to the WHERE clause>

SwitchAxisFilter

Switches axes for the hierarchy the member belongs to. (Or you can supply a hierarchy name directly)

filter.basic.class=com.dsp.mdx.filter.SwitchAxisFilter filter.basic.member=<The Unique Name of the Member/Hierarchy to move>

ToFromSlicerFilter

Moves the Hierarchy to or from the slicer. Highly specific to the way the Analysis client works withing Performance Canvas but may still be useful

filter.basic.class=com.dsp.mdx.filter.ToFromSlicerFilter filter.basic.hierarchy=<The Unique Name of the Hierarchy to move> filter.basic.toslicer=true|false filter.basic.axis=COLUMNS|ROWS

TopCountFilter

Adds the TOPCOUNT method to the supplied query. If filter.basic.others is set to true then a custom set will be added which will show the total of the members of the set that don't match.

filter.basic.class=com.dsp.mdx.filter.TopCountFilter filter.basic.count=<the number of members to show> filter.basic.measure=<The Unique name of the Measure> filter.basic.ascending=true|false filter.basic.others=true|false

TopPercentFilter

Adds the TOPPERCENT method to the supplied query. If filter.basic.others is set to true then a custom set will be added which will show the total of the members of the set that don't match.

filter.basic.class=com.dsp.mdx.filter.TopPercentFilter filter.basic.percent=<the bottom percentage to show> filter.basic.measure=<The Unique name of the Measure> filter.basic.ascending=true|false

Page 65: Embedding BI

P a g e | 65 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

filter.basic.others=true|false

TopSumFilter

Adds the TOPSUM method to the supplied query. If filter.basic.others is set to true then a custom set will be added which will show the total of the members of the set that don't match.

filter.basic.class=com.dsp.mdx.filter.TopSumFilter filter.basic.sum=<the number of members to show> filter.basic.measure=<The Unique name of the Measure> filter.basic.ascending=true|false filter.basic.others=true|false

Page 66: Embedding BI

P a g e | 66 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

Building your own TransformFilters

Start by subclassing com.dsp.mdx.filter.TransformFilter. This class resides in the ZenithServer.jar in the <InstallDirectory>\bin\lib\rsc directory.

TransformFilter is an abstract class and you are going to need to implement the transform method.

public void transform(ControllerProperty config, MDXExpression expression) { // your code goes here }

A couple of quick pointers.

- Retrieve data from the ControllerProperty object by using the following method

String value = config.getValueFor("filter.basic.class");

Retrieve an axis from the MDXExpression object

Axis columns = expression.getAxisByName("COLUMNS");

Retrieve the XMLARegister by using the following method. Note: filter.basic.user is populated by the Performance Canvas server.

XMLARegister reg = XMLARegisterManager.getRegister(config.getValueFor("filter.basic.user");

For more on this, consult your developer documentation (if you are not a registered developer, contact [email protected]).

Page 67: Embedding BI

P a g e | 67 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

On javascript integration

It's possible to integrate javascript with the Performance Canvas event model in the browser. This is (deceptively) simple but requires some care to get right. Let's say for example that you want to drive the canvas not from a filter but from a set of text links. (This is shown in the demo as in the Geography Focus canvas).

Here's an example lifted verbatim from that canvas

<table style="width:100%;"> <tr> <td style="width:25%;" ALIGN="CENTER"> <a style="text-decoration:none;color:#000000; " href="javascript:parametersChanged('dspDemoSales','[Geography].[Geography].[All]','1')"> <p style="font-weight:bolder;font-size:20px;width:100%;text-decoration:none; font-family:'trebuchet ms',Arial,sans-serif;"> All countries </p> </a> </td> <td style="width:25%;" ALIGN="CENTER"> <a style="text-decoration:none;color:#000000; " href="javascript:parametersChanged('dspDemoSales','[Geography].[Geography].[Country].&[1]','1')"> <p style="font-weight:bolder;font-size:20px;width:100%;text-decoration:none; font-family:'trebuchet ms',Arial,sans-serif;"> Canada </p> </a> </td> <td style="width:25%;" ALIGN="CENTER"> <a style="text-decoration:none;color:#000000; " href="javascript:parametersChanged('dspDemoSales','[Geography].[Geography].[Country].&[2]','1')"> <p style="font-weight:bolder;font-size:20px;width:100%;text-decoration:none; font-family:'trebuchet ms',Arial,sans-serif;"> Mexico </p> </a> </td> <td style="width:25%;" ALIGN="CENTER"> <a style="text-decoration:none;color:#000000; " href="javascript:parametersChanged('dspDemoSales','[Geography].[Geography].[Country].&[3]','1')"> <p style="font-weight:bolder;font-size:20px;width:100%;font-family:'trebuchet ms',Arial,sans-serif;"> USA </p>

Page 68: Embedding BI

P a g e | 68 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

</a> </td> </tr> </table>

The interesting part is of course the contents of the <a> element. <a style="text-decoration:none;color:#000000; " href="javascript:parametersChanged('dspDemoSales','[Geography].[Geography].[All]','1')"> The href property contains the link to the important method. parametersChanged(cube, uniqueMemberName, treeOperand) This makes it possible to drive the gems as if you were a filter. Refer to the documentation on XMLAService for more on possible Tree Operand values.

Page 69: Embedding BI

P a g e | 69 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

On .NET and PC PC comes with a .NET assembly called PC09Client.dll which allows you build all sorts of applications that either use PC as a rendering farm and olap front end or to build administrative tools to include in your general administrative UI if you are embedding the product into your existing product suite (Note: in order to do this you need to be a registered OEM partner, contact [email protected] for more on this if you are currently a solution partner only). The PC09Client.dll is deceptively simple but it still allows you build complex applications like an ad hoc analysis environment in a VERY short time frame, allowing you full control over what to display. If you want to - for example - embed interactive charts and tables into your existing .NET applications there is simply no easier way of doing this. By just pointing out a PC host, defining a query and setting up an area to render on you have a complete analytical environment right there in your application. If you want to delve deeper into it and build even more complex applications the PCClient.dll exposes all of the relevant pipelines of the PC server (Rendering, Configuration and XMLA) making it possible to do everything from displaying a simple bar chart to doing realtime query transformations based on selections made in your application being displayed right within the current working context. In order to get the documentation on the PC09Client.dll you need to becomed a licensed PC developer partner. Contact [email protected] for more information on this. There is no cost associated with this and when you sign up you will get access to a wide variety of information, screencasts and a developer support contact in order to help you get your solutions to market as quickly and smoothly as possible.

Page 70: Embedding BI

P a g e | 70 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

Appendix A

Configuring Performance Canvas using zenith.properties

CONFIGURATION OPTION NEEDED dsp.allow The number of allowed datasources (default: 3). This

value is controlled by the server, changing it will not make a difference as it will be overwritten on startup to the appropriate value depending on the license.

dsp.key The license key for the installation, note that the key isn't registered until the value dsp.n is set by the server.

dsp.locale The locale value determines which language is the default one for the server. If you make custom translations for a customer then change this value to something appropriate and place the keyed and messages language file in the correct subfolder under /store/settings/locale, note that en_US is different from en_GB.

dsp.log The current log level. This value is - during runtime - best changed in the admin console. But when the service has been shut down it's perfectly possible to change it manually.

0 = FATAL (only severe errors or important status messages) 1 = ERROR (Errors are reported with stack traces) 2 = WARNINGS (Warnings are reported) 3 = INFO (If you're going to send a log to support, please use 3) 4 = DEBUG (tons of information, don't use this unless you've been explicitly asked to do so by DSP support staff)

(default value: 0) dsp.log.dumpsoap True/false. Allows the dumping to the console of

outgoing (not incoming) SOAP messages over the XMLA interface. Primarily used for debugging purposes in complex situations. (default value: false)

DEPRECATED

Page 71: Embedding BI

P a g e | 71 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

dsp.security.autoRedirectOnKrb5Fail DO NOT CHANGE dsp.security.dc DEPRECATED dsp.security.domain DEPRECATED dsp.security.domain.credentials DEPRECATED dsp.security.kdc DEPRECATED dsp.security.krb5.conf.ccache_type DO NOT CHANGE

dsp.security.krb5.conf.check_delegate DO NOT CHANGE

dsp.security.krb5.conf.clockskew This value handles the clockskew setting for kerberos, change this only if you know you have a timing issue between the host and the KDC. (Default value: 300)

dsp.security.krb5.conf.default_checksum Manages the checksum algorithm used for Kerberos. (default value: rsa-md5)

dsp.security.krb5.conf.default_keytab_name The name of the keytab file stored in the Performance Canvas installation directory. NOTE: you HAVE to store the keytab in the installation directory. (default value: webserver.keytab)

dsp.security.krb5.conf.default_realm Used for handling multi tree domains (default value: TEST.NET)

dsp.security.krb5.conf.default_tgs_enctypes Supported encoding types. Refer to the section on setting up Kerberos for more on this subject.

dsp.security.krb5.conf.default_tkt_enctypes Supported encoding types. Refer to the section on setting up Kerberos for more on this subject.

dsp.security.krb5.conf.forwardable True/false. Defines whether the host should allow delegation. If you set up a server that does Kerberos authentication towards the Performance Canvas server but uses mapped accounts per role to access the datasources you can set this to false. (default value: true)

dsp.security.krb5.conf.kdc_default_options DO NOT CHANGE

dsp.security.krb5.conf.kdc_timeout The number of milliseconds to wait for a response from the Key Distribution Center. (Default value: 60 000)

dsp.security.krb5.conf.kdc_timesync Works in cooperation with clockskew. (default value: 0)

dsp.security.krb5.conf.trace True/false. If the debug log level is set then debug tracing is turned on if this value is set to true. (default value: true)

dsp.security.license DO NOT CHANGE dsp.security.ntlm.domain DEPRECATED dsp.security.ntlm lmlevel DEPRECATED dsp.security.ntlm.loglevel DEPRECATED dsp.security.ntlm.wins DEPRECATED

Page 72: Embedding BI

P a g e | 72 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

dsp.security.olap.useaccount 0/1. 0 = false, 1 = true. Determines whether olap account mapping is turned on. (default value: 0) This value is best managed through the security tab in the admin console

dsp.security.provider Determines which security provider is used in Performance Canvas.

ANON = Anonymous BASIC = Basic authentication NTLM = NTLM authentication KRB5 = Windows integrated authentication with support for delegation (default value: ANON)

dsp.security.realms DEPRECATED dsp.security.ssl True/false. Determines whether SSL is used.

For more on this see the section on SSL in this document

dsp.security.ssl.protocol The protocol used. This should in almost every case be TLS. (Default value: TLS)

dsp.security.ssl.keystorepass The password for your keystore (See the section on setting up SSL for more on this)

dsp.security.ssl.keystoretype JKS, PKCS11 or PKCS12.

(default value: JKS)

dsp.security.ssl.keyalias If you have more than one key in your keystore (unlikely since we suggest creating a custom keystore with a single key), supply the alias of the key you want to use. Otherwise the server will default to the first key found in the keystore

dsp.security.striprealm DEPRECATED dsp.security.useBasicAuth DEPRECATED dsp.security.useCanonicalNames DEPRECATED dsp.security.useGssApi DO NOT CHANGE dsp.security.useKrb5 DEPRECATED dsp.security.usedomain DEPRECATED dsp.security.wins DEPRECATED dsp.ad.maxusers The maximum amount of users that can get returned in

the roles tab. (default value: 1000). NOTE: turning this

Page 73: Embedding BI

P a g e | 73 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

to a high value MAY lead to instability in older/poor browsers (i.e. IE6/7/8)

dsp.ad.maxgroups See dsp.ad.maxusers dsp.olap.prefetch The name of the cube(s) to prefetch properties for,

primary use is to ensure that ragged hierarchies have their custom member properties loaded. Note: this does add an overhead to service startup.

Page 74: Embedding BI

P a g e | 74 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

Appendix E

ConfigurationService WSDL

<wsdl:definitions xmlns:axis2="http://services.dsp.com" xmlns:ns1="http://org.apache.axis2/xsd" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:ns0="http://services.dsp.com/xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://services.dsp.com"> <wsdl:documentation> Performance Canvas 2009 Configuration Service </wsdl:documentation> <wsdl:types> <xs:schema xmlns:ns="http://services.dsp.com/xsd" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://services.dsp.com/xsd"> <xs:element name="addCube"> <xs:complexType> <xs:sequence> <xs:element name="url" nillable="true" type="xs:string"/> <xs:element name="sqlServerName" nillable="true" type="xs:string"/> <xs:element name="olapDBName" nillable="true" type="xs:string"/> <xs:element name="cubeName" nillable="true" type="xs:string"/> <xs:element name="cubeDisplayname" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="addCubeResponse"> <xs:complexType> <xs:sequence> <xs:element name="return" nillable="true" type="xs:boolean"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="appendCubes"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="urls" nillable="true" type="xs:string"/> <xs:element maxOccurs="unbounded" name="sqlServerNames" nillable="true" type="xs:string"/> <xs:element maxOccurs="unbounded" name="olapDBNames" nillable="true" type="xs:string"/>

Page 75: Embedding BI

P a g e | 75 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

<xs:element maxOccurs="unbounded" name="cubeNames" nillable="true" type="xs:string"/> <xs:element maxOccurs="unbounded" name="cubeDisplaynames" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="appendCubesResponse"> <xs:complexType> <xs:sequence> <xs:element name="return" nillable="true" type="xs:boolean"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="deleteCanvas"> <xs:complexType> <xs:sequence> <xs:element name="uid" nillable="true" type="xs:string"/> <xs:element name="deepDelete" nillable="true" type="xs:boolean"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="deleteCanvasResponse"> <xs:complexType> <xs:sequence> <xs:element name="return" nillable="true" type="xs:boolean"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="storeCubes"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="urls" nillable="true" type="xs:string"/> <xs:element maxOccurs="unbounded" name="sqlServerNames" nillable="true" type="xs:string"/> <xs:element maxOccurs="unbounded" name="olapDBNames" nillable="true" type="xs:string"/> <xs:element maxOccurs="unbounded" name="cubeNames" nillable="true" type="xs:string"/> <xs:element maxOccurs="unbounded" name="cubeDisplaynames" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="storeCubesResponse"> <xs:complexType> <xs:sequence> <xs:element name="return" nillable="true" type="xs:boolean"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="constructCanvas"> <xs:complexType>

Page 76: Embedding BI

P a g e | 76 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

<xs:sequence> <xs:element name="canvasSettings" nillable="true" type="xs:string"/> <xs:element maxOccurs="unbounded" name="slicers" nillable="true" type="xs:string"/> <xs:element maxOccurs="unbounded" name="gems" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="constructCanvasResponse"> <xs:complexType> <xs:sequence> <xs:element name="return" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="getUniqueConfiguration"> <xs:complexType> <xs:sequence> <xs:element name="type" nillable="true" type="xs:string"/> <xs:element name="uid" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="getUniqueConfigurationResponse"> <xs:complexType> <xs:sequence> <xs:element name="return" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="importCanvas"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="components" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="importCanvasResponse"> <xs:complexType> <xs:sequence> <xs:element name="return" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="saveConfigurationAsNew"> <xs:complexType> <xs:sequence> <xs:element name="type" nillable="true" type="xs:string"/> <xs:element name="settings" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType>

Page 77: Embedding BI

P a g e | 77 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

</xs:element> <xs:element name="saveConfigurationAsNewResponse"> <xs:complexType> <xs:sequence> <xs:element name="return" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="simpleConstructCanvas"> <xs:complexType> <xs:sequence> <xs:element name="canvasSettings" nillable="true" type="xs:string"/> <xs:element maxOccurs="unbounded" name="uids" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="simpleConstructCanvasResponse"> <xs:complexType> <xs:sequence> <xs:element name="return" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="exportCanvas"> <xs:complexType> <xs:sequence> <xs:element name="uid" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="exportCanvasResponse"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="return" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="getConfigurations"> <xs:complexType> <xs:sequence> <xs:element name="type" nillable="true" type="xs:string"/> <xs:element maxOccurs="unbounded" name="filter" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="getConfigurationsResponse"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="return" nillable="true" type="xs:string"/> </xs:sequence>

Page 78: Embedding BI

P a g e | 78 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

</xs:complexType> </xs:element> <xs:element name="main"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="args" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="getFilterComponents"> <xs:complexType> <xs:sequence> <xs:element name="objects" nillable="true" type="xs:anyType"/> <xs:element name="uid" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="saveConfiguration"> <xs:complexType> <xs:sequence> <xs:element name="type" nillable="true" type="xs:string"/> <xs:element name="settings" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> </wsdl:types> <wsdl:message name="addCubeMessage"> <wsdl:part name="part1" element="ns0:addCube"/> </wsdl:message> <wsdl:message name="addCubeResponse"> <wsdl:part name="part1" element="ns0:addCubeResponse"/> </wsdl:message> <wsdl:message name="importCanvasMessage"> <wsdl:part name="part1" element="ns0:importCanvas"/> </wsdl:message> <wsdl:message name="importCanvasResponse"> <wsdl:part name="part1" element="ns0:importCanvasResponse"/> </wsdl:message> <wsdl:message name="constructCanvasMessage"> <wsdl:part name="part1" element="ns0:constructCanvas"/> </wsdl:message> <wsdl:message name="constructCanvasResponse"> <wsdl:part name="part1" element="ns0:constructCanvasResponse"/> </wsdl:message> <wsdl:message name="getConfigurationsMessage"> <wsdl:part name="part1" element="ns0:getConfigurations"/> </wsdl:message> <wsdl:message name="getConfigurationsResponse"> <wsdl:part name="part1" element="ns0:getConfigurationsResponse"/> </wsdl:message> <wsdl:message name="simpleConstructCanvasMessage">

Page 79: Embedding BI

P a g e | 79 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

<wsdl:part name="part1" element="ns0:simpleConstructCanvas"/> </wsdl:message> <wsdl:message name="simpleConstructCanvasResponse"> <wsdl:part name="part1" element="ns0:simpleConstructCanvasResponse"/> </wsdl:message> <wsdl:message name="mainMessage"> <wsdl:part name="part1" element="ns0:main"/> </wsdl:message> <wsdl:message name="saveConfigurationMessage"> <wsdl:part name="part1" element="ns0:saveConfiguration"/> </wsdl:message> <wsdl:message name="getFilterComponentsMessage"> <wsdl:part name="part1" element="ns0:getFilterComponents"/> </wsdl:message> <wsdl:message name="storeCubesMessage"> <wsdl:part name="part1" element="ns0:storeCubes"/> </wsdl:message> <wsdl:message name="storeCubesResponse"> <wsdl:part name="part1" element="ns0:storeCubesResponse"/> </wsdl:message> <wsdl:message name="flushCacheMessage"/> <wsdl:message name="saveConfigurationAsNewMessage"> <wsdl:part name="part1" element="ns0:saveConfigurationAsNew"/> </wsdl:message> <wsdl:message name="saveConfigurationAsNewResponse"> <wsdl:part name="part1" element="ns0:saveConfigurationAsNewResponse"/> </wsdl:message> <wsdl:message name="deleteCanvasMessage"> <wsdl:part name="part1" element="ns0:deleteCanvas"/> </wsdl:message> <wsdl:message name="deleteCanvasResponse"> <wsdl:part name="part1" element="ns0:deleteCanvasResponse"/> </wsdl:message> <wsdl:message name="appendCubesMessage"> <wsdl:part name="part1" element="ns0:appendCubes"/> </wsdl:message> <wsdl:message name="appendCubesResponse"> <wsdl:part name="part1" element="ns0:appendCubesResponse"/> </wsdl:message> <wsdl:message name="getUniqueConfigurationMessage"> <wsdl:part name="part1" element="ns0:getUniqueConfiguration"/> </wsdl:message> <wsdl:message name="getUniqueConfigurationResponse"> <wsdl:part name="part1" element="ns0:getUniqueConfigurationResponse"/> </wsdl:message> <wsdl:message name="exportCanvasMessage"> <wsdl:part name="part1" element="ns0:exportCanvas"/> </wsdl:message> <wsdl:message name="exportCanvasResponse"> <wsdl:part name="part1" element="ns0:exportCanvasResponse"/> </wsdl:message> <wsdl:portType name="ConfigurationServicePortType"> <wsdl:operation name="addCube"> <wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" message="axis2:addCubeMessage"

Page 80: Embedding BI

P a g e | 80 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

wsaw:Action="urn:addCube"/> <wsdl:output message="axis2:addCubeResponse"/> </wsdl:operation> <wsdl:operation name="importCanvas"> <wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" message="axis2:importCanvasMessage" wsaw:Action="urn:importCanvas"/> <wsdl:output message="axis2:importCanvasResponse"/> </wsdl:operation> <wsdl:operation name="constructCanvas"> <wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" message="axis2:constructCanvasMessage" wsaw:Action="urn:constructCanvas"/> <wsdl:output message="axis2:constructCanvasResponse"/> </wsdl:operation> <wsdl:operation name="getConfigurations"> <wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" message="axis2:getConfigurationsMessage" wsaw:Action="urn:getConfigurations"/> <wsdl:output message="axis2:getConfigurationsResponse"/> </wsdl:operation> <wsdl:operation name="simpleConstructCanvas"> <wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" message="axis2:simpleConstructCanvasMessage" wsaw:Action="urn:simpleConstructCanvas"/> <wsdl:output message="axis2:simpleConstructCanvasResponse"/> </wsdl:operation> <wsdl:operation name="main"> <wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" message="axis2:mainMessage" wsaw:Action="urn:main"/> </wsdl:operation> <wsdl:operation name="saveConfiguration"> <wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" message="axis2:saveConfigurationMessage" wsaw:Action="urn:saveConfiguration"/> </wsdl:operation> <wsdl:operation name="getFilterComponents"> <wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" message="axis2:getFilterComponentsMessage" wsaw:Action="urn:getFilterComponents"/> </wsdl:operation> <wsdl:operation name="storeCubes"> <wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" message="axis2:storeCubesMessage" wsaw:Action="urn:storeCubes"/> <wsdl:output message="axis2:storeCubesResponse"/> </wsdl:operation> <wsdl:operation name="flushCache"> <wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" message="axis2:flushCacheMessage" wsaw:Action="urn:flushCache"/> </wsdl:operation> <wsdl:operation name="saveConfigurationAsNew"> <wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"

Page 81: Embedding BI

P a g e | 81 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

message="axis2:saveConfigurationAsNewMessage" wsaw:Action="urn:saveConfigurationAsNew"/> <wsdl:output message="axis2:saveConfigurationAsNewResponse"/> </wsdl:operation> <wsdl:operation name="deleteCanvas"> <wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" message="axis2:deleteCanvasMessage" wsaw:Action="urn:deleteCanvas"/> <wsdl:output message="axis2:deleteCanvasResponse"/> </wsdl:operation> <wsdl:operation name="appendCubes"> <wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" message="axis2:appendCubesMessage" wsaw:Action="urn:appendCubes"/> <wsdl:output message="axis2:appendCubesResponse"/> </wsdl:operation> <wsdl:operation name="getUniqueConfiguration"> <wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" message="axis2:getUniqueConfigurationMessage" wsaw:Action="urn:getUniqueConfiguration"/> <wsdl:output message="axis2:getUniqueConfigurationResponse"/> </wsdl:operation> <wsdl:operation name="exportCanvas"> <wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" message="axis2:exportCanvasMessage" wsaw:Action="urn:exportCanvas"/> <wsdl:output message="axis2:exportCanvasResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="ConfigurationServiceSOAP11Binding" type="axis2:ConfigurationServicePortType"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> <wsdl:operation name="addCube"> <soap:operation soapAction="urn:addCube" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="importCanvas"> <soap:operation soapAction="urn:importCanvas" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="constructCanvas"> <soap:operation soapAction="urn:constructCanvas" style="document"/> <wsdl:input> <soap:body use="literal"/>

Page 82: Embedding BI

P a g e | 82 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

</wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="getConfigurations"> <soap:operation soapAction="urn:getConfigurations" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="simpleConstructCanvas"> <soap:operation soapAction="urn:simpleConstructCanvas" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="main"> <soap:operation soapAction="urn:main" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> </wsdl:operation> <wsdl:operation name="saveConfiguration"> <soap:operation soapAction="urn:saveConfiguration" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> </wsdl:operation> <wsdl:operation name="getFilterComponents"> <soap:operation soapAction="urn:getFilterComponents" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> </wsdl:operation> <wsdl:operation name="storeCubes"> <soap:operation soapAction="urn:storeCubes" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="flushCache"> <soap:operation soapAction="urn:flushCache" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input>

Page 83: Embedding BI

P a g e | 83 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

</wsdl:operation> <wsdl:operation name="saveConfigurationAsNew"> <soap:operation soapAction="urn:saveConfigurationAsNew" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="deleteCanvas"> <soap:operation soapAction="urn:deleteCanvas" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="appendCubes"> <soap:operation soapAction="urn:appendCubes" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="getUniqueConfiguration"> <soap:operation soapAction="urn:getUniqueConfiguration" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="exportCanvas"> <soap:operation soapAction="urn:exportCanvas" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:binding name="ConfigurationServiceSOAP12Binding" type="axis2:ConfigurationServicePortType"> <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> <wsdl:operation name="addCube"> <soap12:operation soapAction="urn:addCube" style="document"/>

Page 84: Embedding BI

P a g e | 84 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

<wsdl:input> <soap12:body use="literal"/> </wsdl:input> <wsdl:output> <soap12:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="importCanvas"> <soap12:operation soapAction="urn:importCanvas" style="document"/> <wsdl:input> <soap12:body use="literal"/> </wsdl:input> <wsdl:output> <soap12:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="constructCanvas"> <soap12:operation soapAction="urn:constructCanvas" style="document"/> <wsdl:input> <soap12:body use="literal"/> </wsdl:input> <wsdl:output> <soap12:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="getConfigurations"> <soap12:operation soapAction="urn:getConfigurations" style="document"/> <wsdl:input> <soap12:body use="literal"/> </wsdl:input> <wsdl:output> <soap12:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="simpleConstructCanvas"> <soap12:operation soapAction="urn:simpleConstructCanvas" style="document"/> <wsdl:input> <soap12:body use="literal"/> </wsdl:input> <wsdl:output> <soap12:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="main"> <soap12:operation soapAction="urn:main" style="document"/> <wsdl:input> <soap12:body use="literal"/> </wsdl:input> </wsdl:operation> <wsdl:operation name="saveConfiguration"> <soap12:operation soapAction="urn:saveConfiguration" style="document"/> <wsdl:input> <soap12:body use="literal"/> </wsdl:input>

Page 85: Embedding BI

P a g e | 85 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

</wsdl:operation> <wsdl:operation name="getFilterComponents"> <soap12:operation soapAction="urn:getFilterComponents" style="document"/> <wsdl:input> <soap12:body use="literal"/> </wsdl:input> </wsdl:operation> <wsdl:operation name="storeCubes"> <soap12:operation soapAction="urn:storeCubes" style="document"/> <wsdl:input> <soap12:body use="literal"/> </wsdl:input> <wsdl:output> <soap12:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="flushCache"> <soap12:operation soapAction="urn:flushCache" style="document"/> <wsdl:input> <soap12:body use="literal"/> </wsdl:input> </wsdl:operation> <wsdl:operation name="saveConfigurationAsNew"> <soap12:operation soapAction="urn:saveConfigurationAsNew" style="document"/> <wsdl:input> <soap12:body use="literal"/> </wsdl:input> <wsdl:output> <soap12:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="deleteCanvas"> <soap12:operation soapAction="urn:deleteCanvas" style="document"/> <wsdl:input> <soap12:body use="literal"/> </wsdl:input> <wsdl:output> <soap12:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="appendCubes"> <soap12:operation soapAction="urn:appendCubes" style="document"/> <wsdl:input> <soap12:body use="literal"/> </wsdl:input> <wsdl:output> <soap12:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="getUniqueConfiguration"> <soap12:operation soapAction="urn:getUniqueConfiguration" style="document"/> <wsdl:input> <soap12:body use="literal"/>

Page 86: Embedding BI

P a g e | 86 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

</wsdl:input> <wsdl:output> <soap12:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="exportCanvas"> <soap12:operation soapAction="urn:exportCanvas" style="document"/> <wsdl:input> <soap12:body use="literal"/> </wsdl:input> <wsdl:output> <soap12:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:binding name="ConfigurationServiceHttpBinding" type="axis2:ConfigurationServicePortType"> <http:binding verb="POST"/> <wsdl:operation name="addCube"> <http:operation location="addCube"/> <wsdl:input> <mime:content type="text/xml"/> </wsdl:input> <wsdl:output> <mime:content type="text/xml"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="importCanvas"> <http:operation location="importCanvas"/> <wsdl:input> <mime:content type="text/xml"/> </wsdl:input> <wsdl:output> <mime:content type="text/xml"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="constructCanvas"> <http:operation location="constructCanvas"/> <wsdl:input> <mime:content type="text/xml"/> </wsdl:input> <wsdl:output> <mime:content type="text/xml"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="getConfigurations"> <http:operation location="getConfigurations"/> <wsdl:input> <mime:content type="text/xml"/> </wsdl:input> <wsdl:output> <mime:content type="text/xml"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="simpleConstructCanvas">

Page 87: Embedding BI

P a g e | 87 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

<http:operation location="simpleConstructCanvas"/> <wsdl:input> <mime:content type="text/xml"/> </wsdl:input> <wsdl:output> <mime:content type="text/xml"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="main"> <http:operation location="main"/> <wsdl:input> <mime:content type="text/xml"/> </wsdl:input> </wsdl:operation> <wsdl:operation name="saveConfiguration"> <http:operation location="saveConfiguration"/> <wsdl:input> <mime:content type="text/xml"/> </wsdl:input> </wsdl:operation> <wsdl:operation name="getFilterComponents"> <http:operation location="getFilterComponents"/> <wsdl:input> <mime:content type="text/xml"/> </wsdl:input> </wsdl:operation> <wsdl:operation name="storeCubes"> <http:operation location="storeCubes"/> <wsdl:input> <mime:content type="text/xml"/> </wsdl:input> <wsdl:output> <mime:content type="text/xml"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="flushCache"> <http:operation location="flushCache"/> <wsdl:input> <mime:content type="text/xml"/> </wsdl:input> </wsdl:operation> <wsdl:operation name="saveConfigurationAsNew"> <http:operation location="saveConfigurationAsNew"/> <wsdl:input> <mime:content type="text/xml"/> </wsdl:input> <wsdl:output> <mime:content type="text/xml"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="deleteCanvas"> <http:operation location="deleteCanvas"/> <wsdl:input> <mime:content type="text/xml"/> </wsdl:input>

Page 88: Embedding BI

P a g e | 88 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

<wsdl:output> <mime:content type="text/xml"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="appendCubes"> <http:operation location="appendCubes"/> <wsdl:input> <mime:content type="text/xml"/> </wsdl:input> <wsdl:output> <mime:content type="text/xml"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="getUniqueConfiguration"> <http:operation location="getUniqueConfiguration"/> <wsdl:input> <mime:content type="text/xml"/> </wsdl:input> <wsdl:output> <mime:content type="text/xml"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="exportCanvas"> <http:operation location="exportCanvas"/> <wsdl:input> <mime:content type="text/xml"/> </wsdl:input> <wsdl:output> <mime:content type="text/xml"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="ConfigurationService"> <wsdl:port name="ConfigurationServiceSOAP11port_http" binding="axis2:ConfigurationServiceSOAP11Binding"> <soap:address location="http://localhost:80//services/ConfigurationService"/> </wsdl:port> <wsdl:port name="ConfigurationServiceSOAP12port_http" binding="axis2:ConfigurationServiceSOAP12Binding"> <soap12:address location="http://localhost:80//services/ConfigurationService"/> </wsdl:port> <wsdl:port name="ConfigurationServiceHttpport1" binding="axis2:ConfigurationServiceHttpBinding"> <http:address location="http://localhost:80//rest/ConfigurationService"/> </wsdl:port> </wsdl:service> </wsdl:definitions>

Page 89: Embedding BI

P a g e | 89 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

Appendix F

RenderingService WSDL <wsdl:definitions xmlns:axis2="http://services.dsp.com" xmlns:ns1="http://org.apache.axis2/xsd" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:ns0="http://services.dsp.com/xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://services.dsp.com"> <wsdl:documentation> Performance Canvas 2009 Rendering Service </wsdl:documentation> <wsdl:types> <xs:schema xmlns:ns="http://services.dsp.com/xsd" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://services.dsp.com/xsd"> <xs:element name="getChart"> <xs:complexType> <xs:sequence> <xs:element name="mdx" nillable="true" type="xs:string"/> <xs:element name="settings" nillable="true" type="xs:string"/> <xs:element name="format" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="getChartResponse"> <xs:complexType> <xs:sequence> <xs:element name="return" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="getTable"> <xs:complexType> <xs:sequence> <xs:element name="mdx" nillable="true" type="xs:string"/> <xs:element name="settings" nillable="true" type="xs:string"/> <xs:element name="format" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="getTableResponse"> <xs:complexType> <xs:sequence> <xs:element name="return" nillable="true" type="xs:string"/>

Page 90: Embedding BI

P a g e | 90 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

</xs:sequence> </xs:complexType> </xs:element> </xs:schema> </wsdl:types> <wsdl:message name="getTableMessage"> <wsdl:part name="part1" element="ns0:getTable"/> </wsdl:message> <wsdl:message name="getTableResponse"> <wsdl:part name="part1" element="ns0:getTableResponse"/> </wsdl:message> <wsdl:message name="getChartMessage"> <wsdl:part name="part1" element="ns0:getChart"/> </wsdl:message> <wsdl:message name="getChartResponse"> <wsdl:part name="part1" element="ns0:getChartResponse"/> </wsdl:message> <wsdl:portType name="RenderingServicePortType"> <wsdl:operation name="getTable"> <wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" message="axis2:getTableMessage" wsaw:Action="urn:getTable"/> <wsdl:output message="axis2:getTableResponse"/> </wsdl:operation> <wsdl:operation name="getChart"> <wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" message="axis2:getChartMessage" wsaw:Action="urn:getChart"/> <wsdl:output message="axis2:getChartResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="RenderingServiceSOAP11Binding" type="axis2:RenderingServicePortType"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> <wsdl:operation name="getTable"> <soap:operation soapAction="urn:getTable" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="getChart"> <soap:operation soapAction="urn:getChart" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding>

Page 91: Embedding BI

P a g e | 91 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

<wsdl:binding name="RenderingServiceSOAP12Binding" type="axis2:RenderingServicePortType"> <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> <wsdl:operation name="getTable"> <soap12:operation soapAction="urn:getTable" style="document"/> <wsdl:input> <soap12:body use="literal"/> </wsdl:input> <wsdl:output> <soap12:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="getChart"> <soap12:operation soapAction="urn:getChart" style="document"/> <wsdl:input> <soap12:body use="literal"/> </wsdl:input> <wsdl:output> <soap12:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:binding name="RenderingServiceHttpBinding" type="axis2:RenderingServicePortType"> <http:binding verb="POST"/> <wsdl:operation name="getTable"> <http:operation location="getTable"/> <wsdl:input> <mime:content type="text/xml"/> </wsdl:input> <wsdl:output> <mime:content type="text/xml"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="getChart"> <http:operation location="getChart"/> <wsdl:input> <mime:content type="text/xml"/> </wsdl:input> <wsdl:output> <mime:content type="text/xml"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="RenderingService"> <wsdl:port name="RenderingServiceSOAP11port_http" binding="axis2:RenderingServiceSOAP11Binding"> <soap:address location="http://localhost:80//services/RenderingService"/> </wsdl:port> <wsdl:port name="RenderingServiceSOAP12port_http" binding="axis2:RenderingServiceSOAP12Binding"> <soap12:address location="http://localhost:80//services/RenderingService"/> </wsdl:port>

Page 92: Embedding BI

P a g e | 92 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

<wsdl:port name="RenderingServiceHttpport1" binding="axis2:RenderingServiceHttpBinding"> <http:address location="http://localhost:80//rest/RenderingService"/> </wsdl:port> </wsdl:service> </wsdl:definitions>

Page 93: Embedding BI

P a g e | 93 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

Appendix G

XMLAService WSDL <wsdl:definitions xmlns:axis2="http://services.dsp.com" xmlns:ns1="http://org.apache.axis2/xsd" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:ns0="http://services.dsp.com/xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://services.dsp.com"> <wsdl:documentation> Performance Canvas 2009 XMLA Service </wsdl:documentation> <wsdl:types> <xs:schema xmlns:ns="http://services.dsp.com/xsd" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://services.dsp.com/xsd"> <xs:element name="combine"> <xs:complexType> <xs:sequence> <xs:element name="mdxA" nillable="true" type="xs:string"/> <xs:element name="mdxB" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="combineResponse"> <xs:complexType> <xs:sequence> <xs:element name="return" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="filterByUser"> <xs:complexType> <xs:sequence> <xs:element name="mdx" nillable="true" type="xs:string"/> <xs:element name="user" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="filterByUserResponse"> <xs:complexType> <xs:sequence> <xs:element name="return" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="getCubeForMDX">

Page 94: Embedding BI

P a g e | 94 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

<xs:complexType> <xs:sequence> <xs:element name="mdx" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="getCubeForMDXResponse"> <xs:complexType> <xs:sequence> <xs:element name="return" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="getDrillthroughStatement"> <xs:complexType> <xs:sequence> <xs:element name="entity" nillable="true" type="xs:string"/> <xs:element name="mdx" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="getDrillthroughStatementResponse"> <xs:complexType> <xs:sequence> <xs:element name="return" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="transform"> <xs:complexType> <xs:sequence> <xs:element name="cube" nillable="true" type="xs:string"/> <xs:element maxOccurs="unbounded" name="names" nillable="true" type="xs:string"/> <xs:element maxOccurs="unbounded" name="treeOps" nillable="true" type="xs:int"/> <xs:element name="mdx" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="transformResponse"> <xs:complexType> <xs:sequence> <xs:element name="return" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="transformSingleMode"> <xs:complexType> <xs:sequence> <xs:element name="cube" nillable="true" type="xs:string"/> <xs:element maxOccurs="unbounded" name="names" nillable="true" type="xs:string"/> <xs:element name="mdx" nillable="true" type="xs:string"/> <xs:element name="mode" nillable="true" type="xs:int"/>

Page 95: Embedding BI

P a g e | 95 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

</xs:sequence> </xs:complexType> </xs:element> <xs:element name="transformSingleModeResponse"> <xs:complexType> <xs:sequence> <xs:element name="return" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="transformWithFilters"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="filterProperties" nillable="true" type="xs:string"/> <xs:element name="mdx" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="transformWithFiltersResponse"> <xs:complexType> <xs:sequence> <xs:element name="return" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="getActions"> <xs:complexType> <xs:sequence> <xs:element name="cube" nillable="true" type="xs:string"/> <xs:element name="entity" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="getActionsResponse"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="return" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="getChildren"> <xs:complexType> <xs:sequence> <xs:element name="parentName" nillable="true" type="xs:string"/> <xs:element name="childType" nillable="true" type="xs:int"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="getChildrenResponse"> <xs:complexType> <xs:sequence>

Page 96: Embedding BI

P a g e | 96 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

<xs:element maxOccurs="unbounded" name="return" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="getDynamicSet"> <xs:complexType> <xs:sequence> <xs:element name="cube" nillable="true" type="xs:string"/> <xs:element name="name" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="getDynamicSetResponse"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="return" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="split"> <xs:complexType> <xs:sequence> <xs:element name="hierarchy" nillable="true" type="xs:string"/> <xs:element name="mdx" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="splitResponse"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="return" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> </wsdl:types> <wsdl:message name="transformMessage"> <wsdl:part name="part1" element="ns0:transform"/> </wsdl:message> <wsdl:message name="transformResponse"> <wsdl:part name="part1" element="ns0:transformResponse"/> </wsdl:message> <wsdl:message name="getDynamicSetMessage"> <wsdl:part name="part1" element="ns0:getDynamicSet"/> </wsdl:message> <wsdl:message name="getDynamicSetResponse"> <wsdl:part name="part1" element="ns0:getDynamicSetResponse"/> </wsdl:message> <wsdl:message name="transformWithFiltersMessage"> <wsdl:part name="part1" element="ns0:transformWithFilters"/> </wsdl:message>

Page 97: Embedding BI

P a g e | 97 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

<wsdl:message name="transformWithFiltersResponse"> <wsdl:part name="part1" element="ns0:transformWithFiltersResponse"/> </wsdl:message> <wsdl:message name="transformSingleModeMessage"> <wsdl:part name="part1" element="ns0:transformSingleMode"/> </wsdl:message> <wsdl:message name="transformSingleModeResponse"> <wsdl:part name="part1" element="ns0:transformSingleModeResponse"/> </wsdl:message> <wsdl:message name="getChildrenMessage"> <wsdl:part name="part1" element="ns0:getChildren"/> </wsdl:message> <wsdl:message name="getChildrenResponse"> <wsdl:part name="part1" element="ns0:getChildrenResponse"/> </wsdl:message> <wsdl:message name="getDrillthroughStatementMessage"> <wsdl:part name="part1" element="ns0:getDrillthroughStatement"/> </wsdl:message> <wsdl:message name="getDrillthroughStatementResponse"> <wsdl:part name="part1" element="ns0:getDrillthroughStatementResponse"/> </wsdl:message> <wsdl:message name="getCubeForMDXMessage"> <wsdl:part name="part1" element="ns0:getCubeForMDX"/> </wsdl:message> <wsdl:message name="getCubeForMDXResponse"> <wsdl:part name="part1" element="ns0:getCubeForMDXResponse"/> </wsdl:message> <wsdl:message name="combineMessage"> <wsdl:part name="part1" element="ns0:combine"/> </wsdl:message> <wsdl:message name="combineResponse"> <wsdl:part name="part1" element="ns0:combineResponse"/> </wsdl:message> <wsdl:message name="getActionsMessage"> <wsdl:part name="part1" element="ns0:getActions"/> </wsdl:message> <wsdl:message name="getActionsResponse"> <wsdl:part name="part1" element="ns0:getActionsResponse"/> </wsdl:message> <wsdl:message name="splitMessage"> <wsdl:part name="part1" element="ns0:split"/> </wsdl:message> <wsdl:message name="splitResponse"> <wsdl:part name="part1" element="ns0:splitResponse"/> </wsdl:message> <wsdl:message name="filterByUserMessage"> <wsdl:part name="part1" element="ns0:filterByUser"/> </wsdl:message> <wsdl:message name="filterByUserResponse"> <wsdl:part name="part1" element="ns0:filterByUserResponse"/> </wsdl:message> <wsdl:portType name="XMLAServicePortType"> <wsdl:operation name="transform"> <wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" message="axis2:transformMessage"

Page 98: Embedding BI

P a g e | 98 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

wsaw:Action="urn:transform"/> <wsdl:output message="axis2:transformResponse"/> </wsdl:operation> <wsdl:operation name="getDynamicSet"> <wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" message="axis2:getDynamicSetMessage" wsaw:Action="urn:getDynamicSet"/> <wsdl:output message="axis2:getDynamicSetResponse"/> </wsdl:operation> <wsdl:operation name="transformWithFilters"> <wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" message="axis2:transformWithFiltersMessage" wsaw:Action="urn:transformWithFilters"/> <wsdl:output message="axis2:transformWithFiltersResponse"/> </wsdl:operation> <wsdl:operation name="transformSingleMode"> <wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" message="axis2:transformSingleModeMessage" wsaw:Action="urn:transformSingleMode"/> <wsdl:output message="axis2:transformSingleModeResponse"/> </wsdl:operation> <wsdl:operation name="getChildren"> <wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" message="axis2:getChildrenMessage" wsaw:Action="urn:getChildren"/> <wsdl:output message="axis2:getChildrenResponse"/> </wsdl:operation> <wsdl:operation name="getDrillthroughStatement"> <wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" message="axis2:getDrillthroughStatementMessage" wsaw:Action="urn:getDrillthroughStatement"/> <wsdl:output message="axis2:getDrillthroughStatementResponse"/> </wsdl:operation> <wsdl:operation name="getCubeForMDX"> <wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" message="axis2:getCubeForMDXMessage" wsaw:Action="urn:getCubeForMDX"/> <wsdl:output message="axis2:getCubeForMDXResponse"/> </wsdl:operation> <wsdl:operation name="combine"> <wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" message="axis2:combineMessage" wsaw:Action="urn:combine"/> <wsdl:output message="axis2:combineResponse"/> </wsdl:operation> <wsdl:operation name="getActions"> <wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" message="axis2:getActionsMessage" wsaw:Action="urn:getActions"/> <wsdl:output message="axis2:getActionsResponse"/> </wsdl:operation> <wsdl:operation name="split"> <wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" message="axis2:splitMessage" wsaw:Action="urn:split"/>

Page 99: Embedding BI

P a g e | 99 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

<wsdl:output message="axis2:splitResponse"/> </wsdl:operation> <wsdl:operation name="filterByUser"> <wsdl:input xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" message="axis2:filterByUserMessage" wsaw:Action="urn:filterByUser"/> <wsdl:output message="axis2:filterByUserResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="XMLAServiceSOAP11Binding" type="axis2:XMLAServicePortType"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> <wsdl:operation name="transform"> <soap:operation soapAction="urn:transform" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="getDynamicSet"> <soap:operation soapAction="urn:getDynamicSet" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="transformWithFilters"> <soap:operation soapAction="urn:transformWithFilters" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="transformSingleMode"> <soap:operation soapAction="urn:transformSingleMode" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="getChildren"> <soap:operation soapAction="urn:getChildren" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/>

Page 100: Embedding BI

P a g e | 100 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

</wsdl:output> </wsdl:operation> <wsdl:operation name="getDrillthroughStatement"> <soap:operation soapAction="urn:getDrillthroughStatement" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="getCubeForMDX"> <soap:operation soapAction="urn:getCubeForMDX" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="combine"> <soap:operation soapAction="urn:combine" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="getActions"> <soap:operation soapAction="urn:getActions" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="split"> <soap:operation soapAction="urn:split" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="filterByUser"> <soap:operation soapAction="urn:filterByUser" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/>

Page 101: Embedding BI

P a g e | 101 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

</wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:binding name="XMLAServiceSOAP12Binding" type="axis2:XMLAServicePortType"> <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> <wsdl:operation name="transform"> <soap12:operation soapAction="urn:transform" style="document"/> <wsdl:input> <soap12:body use="literal"/> </wsdl:input> <wsdl:output> <soap12:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="getDynamicSet"> <soap12:operation soapAction="urn:getDynamicSet" style="document"/> <wsdl:input> <soap12:body use="literal"/> </wsdl:input> <wsdl:output> <soap12:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="transformWithFilters"> <soap12:operation soapAction="urn:transformWithFilters" style="document"/> <wsdl:input> <soap12:body use="literal"/> </wsdl:input> <wsdl:output> <soap12:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="transformSingleMode"> <soap12:operation soapAction="urn:transformSingleMode" style="document"/> <wsdl:input> <soap12:body use="literal"/> </wsdl:input> <wsdl:output> <soap12:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="getChildren"> <soap12:operation soapAction="urn:getChildren" style="document"/> <wsdl:input> <soap12:body use="literal"/> </wsdl:input> <wsdl:output> <soap12:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="getDrillthroughStatement"> <soap12:operation soapAction="urn:getDrillthroughStatement" style="document"/>

Page 102: Embedding BI

P a g e | 102 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

<wsdl:input> <soap12:body use="literal"/> </wsdl:input> <wsdl:output> <soap12:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="getCubeForMDX"> <soap12:operation soapAction="urn:getCubeForMDX" style="document"/> <wsdl:input> <soap12:body use="literal"/> </wsdl:input> <wsdl:output> <soap12:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="combine"> <soap12:operation soapAction="urn:combine" style="document"/> <wsdl:input> <soap12:body use="literal"/> </wsdl:input> <wsdl:output> <soap12:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="getActions"> <soap12:operation soapAction="urn:getActions" style="document"/> <wsdl:input> <soap12:body use="literal"/> </wsdl:input> <wsdl:output> <soap12:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="split"> <soap12:operation soapAction="urn:split" style="document"/> <wsdl:input> <soap12:body use="literal"/> </wsdl:input> <wsdl:output> <soap12:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="filterByUser"> <soap12:operation soapAction="urn:filterByUser" style="document"/> <wsdl:input> <soap12:body use="literal"/> </wsdl:input> <wsdl:output> <soap12:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:binding name="XMLAServiceHttpBinding" type="axis2:XMLAServicePortType"> <http:binding verb="POST"/>

Page 103: Embedding BI

P a g e | 103 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

<wsdl:operation name="transform"> <http:operation location="transform"/> <wsdl:input> <mime:content type="text/xml"/> </wsdl:input> <wsdl:output> <mime:content type="text/xml"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="getDynamicSet"> <http:operation location="getDynamicSet"/> <wsdl:input> <mime:content type="text/xml"/> </wsdl:input> <wsdl:output> <mime:content type="text/xml"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="transformWithFilters"> <http:operation location="transformWithFilters"/> <wsdl:input> <mime:content type="text/xml"/> </wsdl:input> <wsdl:output> <mime:content type="text/xml"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="transformSingleMode"> <http:operation location="transformSingleMode"/> <wsdl:input> <mime:content type="text/xml"/> </wsdl:input> <wsdl:output> <mime:content type="text/xml"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="getChildren"> <http:operation location="getChildren"/> <wsdl:input> <mime:content type="text/xml"/> </wsdl:input> <wsdl:output> <mime:content type="text/xml"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="getDrillthroughStatement"> <http:operation location="getDrillthroughStatement"/> <wsdl:input> <mime:content type="text/xml"/> </wsdl:input> <wsdl:output> <mime:content type="text/xml"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="getCubeForMDX">

Page 104: Embedding BI

P a g e | 104 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

<http:operation location="getCubeForMDX"/> <wsdl:input> <mime:content type="text/xml"/> </wsdl:input> <wsdl:output> <mime:content type="text/xml"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="combine"> <http:operation location="combine"/> <wsdl:input> <mime:content type="text/xml"/> </wsdl:input> <wsdl:output> <mime:content type="text/xml"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="getActions"> <http:operation location="getActions"/> <wsdl:input> <mime:content type="text/xml"/> </wsdl:input> <wsdl:output> <mime:content type="text/xml"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="split"> <http:operation location="split"/> <wsdl:input> <mime:content type="text/xml"/> </wsdl:input> <wsdl:output> <mime:content type="text/xml"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="filterByUser"> <http:operation location="filterByUser"/> <wsdl:input> <mime:content type="text/xml"/> </wsdl:input> <wsdl:output> <mime:content type="text/xml"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="XMLAService"> <wsdl:port name="XMLAServiceSOAP11port_http" binding="axis2:XMLAServiceSOAP11Binding"> <soap:address location="http://localhost:80//services/XMLAService"/> </wsdl:port> <wsdl:port name="XMLAServiceSOAP12port_http" binding="axis2:XMLAServiceSOAP12Binding"> <soap12:address location="http://localhost:80//services/XMLAService"/> </wsdl:port>

Page 105: Embedding BI

P a g e | 105 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

<wsdl:port name="XMLAServiceHttpport1" binding="axis2:XMLAServiceHttpBinding"> <http:address location="http://localhost:80//rest/XMLAService"/> </wsdl:port> </wsdl:service> </wsdl:definitions>

Page 106: Embedding BI

P a g e | 106 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

Index

A

AddHierarchyFilter 57 AddMeasureFilter 57 AddMemberFilter 57 analysis.p 11 annotation.p 11 app.properties 9

B

BooleanProperty 54 BottomCountFilter 57 BottomPercentFilter 57 BottomSumFilter 58 BreakdownMeasureFilter 58

C

CalcFilter 58 canvas.p 11 chart.p 11 classification.p 11 colors.xml 9 ConfigurationService 31 Creating an object 41 CrossdrillFilter 58 cubes.xml 9

D

DefaultProperty 54 delegation 25 dsp.cache.expire 15 dsp.cache.maxqueries 15 dsp.memory.resultsetmax 16 dsp.security.ssl 19 dsp.security.ssl.keyalias 19, 68 dsp.security.ssl.keystorepass 19 dsp.security.ssl.keystoretype 19 dsp.security.ssl.protocol 19

Page 107: Embedding BI

P a g e | 107 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

E

Exporting a canvas 42

F

filter.p 11 FilterFilter 59 Finding a list of objects 39 Finding a list of objects that match a certain filter 40 FlipFilter 59

G

gem.p 11 getChart 44 getChartTypes 44 getColorSchemes 45 getTable 45

H

HideMemberFilter 59

I

Importing a canvas 43

J

JKS 19

K

Kerberos 23 keyed.properties 10 keytab 27 kpi.p 12 krb5.conf 9

L

ListProperty 54 login.conf 9

Page 108: Embedding BI

P a g e | 108 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

M

measure.p 12 Messages.properties 10 MoveToLastFilter 59

O

OrderFilter 59 OrderMeasuresFilter 60

P

PKCS11 20 PKCS12 20

Q

query based security 17

R

RemoveHierarchyFilter 60 RemoveMeasureFilter 60 RemoveSlicerFilter 60 report.p 12 ResetHierarchyFilter 60 Retrieving an existing object 38 role.p 12

S

service.properties 8 slicer.p 12 SlicerFilter 60 SwitchAxisFilter 61

T

table.p 12 TableProperty 54 tag.p 12 ToFromSlicerFilter 61 TopCountFilter 61 TopPercentFilter 61

Page 109: Embedding BI

P a g e | 109 Advanced administration and development - guidelines and reference

(c) Decision Support Panel AB 2009

TopSumFilter 62

U

Userlocales.properties 9

V

viewpoint.p 12 Viewport.properties 10

Z

zenith.properties 8


Top Related