/*
* Olap_1.java
*
* Copyright 2004-2006 by SAP AG. All Rights Reserved.
* SAP, R/3, mySAP, mySAP.com, xApps, xApp, SAP NetWeaver, and other SAP
* products and services mentioned herein as well as their respective logos
* are trademarks or registered trademarks of SAP AG in Germany and in several
* other countries all over the world. All other product and service names
* mentioned are the trademarks of their respective companies. Data contained
* in this document serves informational purposes only. National product
* specifications may vary.
*
* These materials are subject to change without notice. These materials are
* provided by SAP AG and its affiliated companies ("SAP Group") for
* informational purposes only, without representation or warranty of any kind,
* and SAP Group shall not be liable for errors or omissions with respect to
* the materials. The only warranties for SAP Group products and services are
* those that are set forth in the express warranty statements accompanying
* such products and services, if any. Nothing herein should be construed as
* constituting an additional warranty.
*/
package com.sap.ip.bi.sdk.samples;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Locale;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.omg.cwm.analysis.olap.Cube;
import org.omg.cwm.analysis.olap.CubeDimensionAssociation;
import org.omg.cwm.analysis.olap.Dimension;
import org.omg.cwm.analysis.olap.HierarchyLevelAssociation;
import org.omg.cwm.analysis.olap.Level;
import org.omg.cwm.analysis.olap.LevelBasedHierarchy;
import org.omg.cwm.analysis.olap.Measure;
import org.omg.cwm.analysis.olap.Schema;
import org.omg.cwm.objectmodel.core.Attribute;
import org.omg.cwm.objectmodel.core.ModelElement;
import org.omg.cwm.objectmodel.core.TaggedValue;
import com.sap.exception.IBaseException;
import com.sap.ip.bi.sdk.dac.connector.IBIConnection;
import com.sap.ip.bi.sdk.dac.connector.IBIOlap;
import com.sap.ip.bi.sdk.dac.connector.IBIOlapObjectFinder;
import com.sap.ip.bi.sdk.dac.result.IBIResultSet;
import com.sap.ip.bi.sdk.exception.BIException;
import com.sap.ip.bi.sdk.exception.BIResourceException;
import com.sap.ip.bi.sdk.localization.sdk.samples.Samples;
import com.sap.ip.bi.sdk.samples.servlet.MinimalServletContainer;
/**
* Accessing metadata -
*
* This sample demonstrates four different ways to retrieve OLAP
* metadata:
*
* 1. via connection-level methods
* 2. via ObjectFinder methods
* 3. via JMI methods
* 4. via member data access methods
*
* View the HTML rendered by this servlet in the following file:
* [SDK archive]/docs/examples/olap_1.result.html
*
* @author SAP
* @version 3.50
* @since 3.50
*/
public class Olap_1 extends HttpServlet {
private final static String CONTENT_TYPE = "text/html";
private IBIOlap olap = null;
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public void doGet(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
out.println(Helpers.getDocTypeDefinition());
out.println("<html>");
out.println("<head><title>Olap_1</title>");
out.println(Helpers.getStyleSheetDefinition());
out.println("</head><body>");
try {
// ********************************************************
// Connect to a data source.
// ********************************************************
IBIConnection connection = Helpers.connectToXMLADatasource(out);
olap = connection.getOlap();
//*********************************************************
// Retrieve metadata via
// connection-level methods: getSchema(), getCube(),
// getMemberData(), getTaggedValue().
// These methods allow you to browse top-level metadata
// objects such as cubes and schema.
// Typically, the objects retrieved are used then as an
// entry point to further "navigate" to objects that are
// contained in these name-space-like objects.
//*********************************************************
out.println("<br/><hr/>");
out.println("<h3>Accessing metadata via connection-level methods</h3>");
{
// the list of schemas contained in the connected resource
out.println("<h4>Schemas retrieved with olap.getSchema()</h4>");
out.println("<table><tr><td class=\"single\">");
int k = 0;
for (Iterator i = olap.getSchema().iterator(); i.hasNext(); k++) {
Schema schema = (Schema) i.next();
if (k > 0) {
out.println(", ");
}
out.println(
(schema.getName() == null || schema.getName().equals("")) ?
"<null>" : schema.getName());
}
out.println("</td></tr></table>");
}
{
// the list of cubes contained in the connected resource
out.println("<h4>Cubes retrieved with olap.getCube()</h4>");
out.println("<table><tr><td class=\"single\">");
int k = 0;
for (Iterator i = olap.getCube().iterator(); i.hasNext(); k++) {
if (k > 0) {
int left = olap.getCube().size() - k + 1;
out.println(", ...and " + left + " other Cube(s).");
break;
}
Cube cube = (Cube) i.next();
if (k > 0) {
out.println(", ");
}
out.println(cube.getName());
// only display for the first cube. otherwise,
// the results could be too lengthy if there are
// many cubes.
if (k == 0) {
// get measures of a cube.
getMeasure(cube, out);
// get CubeDimensionAssociations from cube.
out.println("<h4>Dimensions retrieved with " +
"cube.getCubeDimensionAssociation() and getDimension()</h4>");
out.println("<table><tr><td class=\"single\">");
int l = 0;
for (Iterator j = cube.getCubeDimensionAssociation().iterator();
j.hasNext(); l++) {
Dimension dimension = ((CubeDimensionAssociation) j.next()).
getDimension();
// display the dimension TaggedValues -
// the fixed properties of a dimension.
if (l > 0) {
out.println(", ");
}
out.println(dimension.getName());
if (l == 0) {
out.println("<h4>First Dimension's TaggedValues</h4>");
getTaggedValue(dimension, out);
// get dynamic dimension properties
out.println("<h4>First Dimension's Attributes</h4>");
getProperty(dimension, out);
// get hierarchies for the dimension.
out.println("<h4>Hierarchies from Dimension</h4>");
getHierarchy(dimension, out);
}
}
out.println("</td></tr></table>");
}
}
out.println("</td></tr></table>");
}
//*********************************************************
// Retrieve metadata via ObjectFinder methods -
// these methods provide the ability to retrieve a specific
// object or set of objects.
// Note that there are for each object type (such as Cube,
// Dimension, and Hierarchy) always four find methods that
// differ in their signatures:
// 1. finder.findDimension
// (Cube cube,String dimensionName)
// 2. finder.findDimensionFirst
// (Cube cube,String dimensionName)
// 3. finder.findDimension
// (String schemaName, String cubeName,String dimensionName)
// 4. finder.findDimensionFirst
// (String schemaName,String cubeName,String dimensionName)
// The first two methods use a cube object and a
// dimensionName to identify the dimension(s) to be found.
// The findDimensionFirst() methods are simply for convenience;
// it is equivalent to
// (Dimension)finder.findDimension(cube,dimensionName)
// .get(0)
Cube cube = null;
Dimension dimension = null;
{
out.println("<br/><hr/>");
out.println("<h3>Accessing metadata via object finder methods</h3>");
IBIOlapObjectFinder finder = olap.getObjectFinder();
// retrieve a specific cube
cube = finder.findCubeFirst((String)null, "$0D_SD_C03");
// This is just a sanity check to verify that the
// cube on which this example relies was retrieved
if (cube==null){
throw new BIException(Locale.getDefault(),
Samples.SDK_SAMPLES_1000,
new Object[] {"$0D_SD_C03"});
}
out.println("<h4>Find method findCube("+
"String schemaname,String CubeName)</h4>");
out.println("<h4>Found cube: </h4>");
out.println("<table><tr><td class=\"single\">" + cube.getName() +
"</td></tr></table>");
// retrieve a specific dimension within this cube
dimension = finder.findDimensionFirst(cube, "0D_COUNTRY");
out.println("<h4>Find method findDimensionFirst(Cube cube," +
"String dimensionName)</h4>");
out.println("<h4>Found dimension: </h4>");
out.println("<table><tr><td class=\"single\">" + dimension.getName() +
"</td></tr></table>");
// retrieve all hierarchies of a specific dimension
out.println("<h4>Find method findHierarchy(Dimension dimension," +
"String hierarchyName)</h4>");
out.println("<h4>Found hierarchies</h4>");
out.println("<table><tr><td class=\"single\">");
LevelBasedHierarchy hierarchy = null;
int k = 0;
for (Iterator i = finder.findHierarchy(dimension, null).iterator();
i.hasNext(); k++) {
LevelBasedHierarchy levelBasedHierarchy =
(LevelBasedHierarchy) i.next();
if (k > 0) {
out.println(", ");
}
out.println(levelBasedHierarchy.getName());
if (levelBasedHierarchy.getName().equalsIgnoreCase("0D_COUNTRY")) {
hierarchy = levelBasedHierarchy;
}
}
out.println("</td></tr></table>");
}
//*********************************************************
// Retrieve metadata via CWM-based JMI interfaces -
// starting from the top level objects of the
// OLAP Metadata Model, such as Cube, you can the use
// the JMI interfaces provides by each object to "navigate"
// to associated objects. The code passage below shows how
// to retrieve from a cube its associated dimensions, the
// hierarchies of a given dimension, and the levels of a
// given hierarchy. Note that in the OLAP package of the
// CWM Metamodel, members are not directly associated with
// levels. This is rooted in the considerably different
// nature of members compared to other objects such as
// cubes, dimensions, hierarchies and levels. Members
// somehow straddle the line between data and metadata,
// and in particular, members can potentially occur in
// very large cardinalities. For example, a customer
// dimension of a large retail
// data warehouse may have millions of entries.
// Heavy weight metadata objects are thus not suitable to
// represent members.
//*********************************************************
Dimension countryDimension = null;
{
out.println("<br/><hr/>");
out.println("<h3>Accessing metadata via JMI methods</h3>");
// retrieve from a given cube its
// CubeDimensionAssociations
out.println("<h4>Iterating the Dimensions of a Cube via " +
"Cube Dimension Associations</h4>");
out.println("<table><tr><td class=\"single\">");
int k = 0;
for (Iterator i = cube.getCubeDimensionAssociation().iterator();
i.hasNext(); k++) {
dimension = ((CubeDimensionAssociation) i.next()).getDimension();
if (k > 0) {
out.println(", ");
}
out.println(dimension.getName());
if (dimension.getName().equalsIgnoreCase("0D_COUNTRY")) {
countryDimension = dimension;
}
}
out.println("</td></tr></table>");
}
LevelBasedHierarchy countryHierarchy = null;
{
out.println("<h4>Iterating the Hierarchies of a Dimension</h4>");
// retrieve from a dimension its hierarchies
out.println("<table><tr><td class=\"single\">");
int k = 0;
for (Iterator i = countryDimension.getHierarchy().iterator();
i.hasNext(); k++) {
LevelBasedHierarchy levelBasedHierarchy =
(LevelBasedHierarchy) i.next();
if (k > 0) {
out.println(", ");
}
out.println(levelBasedHierarchy.getName());
if (levelBasedHierarchy.getName().equalsIgnoreCase("0D_COUNTRY")) {
countryHierarchy = levelBasedHierarchy;
}
}
out.println("</td></tr></table>");
}
Level level = null;
{
// retrieve from a hierarchy its levels
out.println("<h4>Iterating the Levels of a Hierarchy via " +
"Hierarchy Level Associations</h4>");
out.println("<table><tr><td class=\"single\">");
int k = 0;
for (Iterator i = countryHierarchy.getHierarchyLevelAssociation().
iterator(); i.hasNext(); k++) {
level = ((HierarchyLevelAssociation) i.next()).getCurrentLevel();
if (k > 0) {
out.println(", ");
}
out.println(level.getName());
}
out.println("</td></tr></table>");
}
{
// get the member data for a level
out.println("<br/><hr/>");
out.println("<h3>Accessing member data for a Level</h3>");
IBIResultSet members = olap.getObjectFinder().findMemberData(
Arrays.asList(new Object[] {level}), null);
out.println("<table width=700 border=1 cellpadding=0 cellspacing=0>");
out.println("<tr>");
for (int i = 1; i <= members.getMetaData().getColumnCount(); i++) {
out.println("<td class=\"headCenter\">");
out.println(members.getMetaData().getColumnName(i));
out.println("</td>");
}
out.println("</tr>");
int k = 0;
while (members.next()) {
String style = (k & 1) == 0 ? "even" : "odd";
out.println("<tr>");
for (int i = 1; i <= members.getMetaData().getColumnCount(); i++) {
out.println("<td class=\"" + style + "\">");
out.println(members.getString(i));
out.println("</td>");
}
out.println("</tr>");
k++;
}
out.println("</table>");
}
} catch (Exception e) {
// $JL-EXC$
e.printStackTrace();
if (e instanceof IBaseException)
out.println("<p>Error: " +
((IBaseException)e).getNestedLocalizedMessage() + "</p>");
else
out.println("<p>Error: " + e.getMessage() + "</p>");
}
out.println("</body>");
out.println("</html>");
}
public void destroy() {
}
private void getTaggedValue(ModelElement modelElement, PrintWriter out)
throws BIResourceException {
out.println("<table width=700 border=1 cellpadding=0 cellspacing=0>");
int k = 0;
for (Iterator i = olap.getTaggedValue(modelElement).iterator();
i.hasNext(); k++) {
String style = (k & 1) == 0 ? "even" : "odd";
TaggedValue taggedValue = (TaggedValue) i.next();
if (taggedValue != null) {
out.println("<tr><td class=\"" + style + "\">" +
taggedValue.getTag() + "</td>");
out.println("<td class=\"" + style + "\">" +
taggedValue.getValue() + "</td></tr>");
}
}
out.println("</table>");
}
private void getHierarchy(Dimension dimension, PrintWriter out)
throws BIResourceException {
out.println("<table><tr><td class=\"single\">");
int k = 0;
for (Iterator i = dimension.getHierarchy().iterator(); i.hasNext(); k++) {
LevelBasedHierarchy levelBasedHierarchy = (LevelBasedHierarchy) i.next();
if (k > 0) {
out.println(", ");
}
out.println(levelBasedHierarchy.getName());
out.println("<h4>TaggedValue from Hierarchy</h4>");
getTaggedValue(levelBasedHierarchy, out);
getHla(levelBasedHierarchy, out);
}
out.println("</td></tr></table>");
}
private void getHla(LevelBasedHierarchy hierarchy, PrintWriter out) {
out.println("<h4>Level retrieved with " +
"hierarchy.getHierarchyLevelAssociation() and getCurrentLevel()</h4>");
out.println("<table cellpadding=2 cellspacing=2><tr><td class=\"single\">");
int k = 0;
for (Iterator i = hierarchy.getHierarchyLevelAssociation().iterator();
i.hasNext(); k++) {
Level level = ((HierarchyLevelAssociation) i.next()).getCurrentLevel();
if (k > 0) {
out.println(", ");
}
out.println(level.getName());
}
out.println("</td></tr></table>");
}
private void getLevel(Dimension dimension, PrintWriter out)
throws BIResourceException {
out.println("<h4>Level from Dimension using " +
"dimension.getMemberSelection</h4>");
for (Iterator i = dimension.getMemberSelection().iterator(); i.hasNext();) {
Level level = (Level) i.next();
out.println("<h4>TaggedValues of Level " + level.getName() + "</h4>");
getTaggedValue(level, out);
}
}
//Dimension properties are getting from method getFeature().
private void getProperty(Dimension dimension, PrintWriter out)
throws BIResourceException {
out.println("<h4>Dimension Attributes from dimension.getFeature()</h4>");
out.println("<table cellpadding=2 cellspacing=2><tr><td class=\"single\">");
int k = 0;
for (Iterator i = dimension.getFeature().iterator(); i.hasNext(); k++) {
Attribute attribute = (Attribute) i.next();
if (k > 0) {
out.println(", ");
}
out.println(attribute.getName());
if (k == 0) {
out.println("<h4>TaggedValues of Dimension Attribute</h4>");
getTaggedValue(attribute, out);
}
}
out.println("</td></tr></table>");
}
// Measure get from cube.
private void getMeasure(Cube cube, PrintWriter out)
throws BIResourceException {
out.println("<h4>Measures of the Cube using cube.getFeature()</h4>");
int k = 0;
out.println("<table cellpadding=2 cellspacing=2><tr><td class=\"single\">");
for (Iterator i = cube.getFeature().iterator(); i.hasNext(); k++) {
Measure measure = (Measure) i.next();
out.println(measure.getName() + ", ");
if (k == 0) {
out.println("<h4>TaggedValues of first Measure</h4>");
getTaggedValue(measure, out);
}
}
out.println("</td></tr></table>");
}
public static void main(String[] args) {
if (args.length == 1) {
MinimalServletContainer.executeServlet(new Olap_1(), args[0]);
} else {
MinimalServletContainer.executeServlet(new Olap_1(), System.out);
}
}
}