001 /*
002 // $Id: Property.java 253 2009-06-30 03:06:10Z jhyde $
003 // This software is subject to the terms of the Eclipse Public License v1.0
004 // Agreement, available at the following URL:
005 // http://www.eclipse.org/legal/epl-v10.html.
006 // Copyright (C) 2006-2008 Julian Hyde
007 // All Rights Reserved.
008 // You must accept the terms of that agreement to use this software.
009 */
010 package org.olap4j.metadata;
011
012 import java.util.*;
013
014 /**
015 * Definition of a property of a {@link Member} or
016 * {@link org.olap4j.Cell}.
017 *
018 * @author jhyde
019 * @version $Id: Property.java 253 2009-06-30 03:06:10Z jhyde $
020 * @since Aug 23, 2006
021 */
022 public interface Property extends MetadataElement {
023 /**
024 * Returns the datatype of this Property.
025 *
026 * @return datatype of this Property
027 */
028 Datatype getDatatype();
029
030 /**
031 * Returns a set of flags which describe the type of this Property.
032 *
033 * @return type of this Property
034 */
035 Set<TypeFlag> getType();
036
037 /**
038 * Returns the content type of this Property.
039 *
040 * @return content type
041 */
042 ContentType getContentType();
043
044 /**
045 * Enumeration of aspects of the type of a Property. In particular, whether
046 * it belongs to a member or a cell.
047 *
048 * <p>The values are as specified by XMLA for the PROPERTY_TYPE attribute
049 * of the MDSCHEMA_PROPERTIES data set.
050 * For example, XMLA specifies that the value 9 (0x1 | 0x8) means that a
051 * property belongs to a member and is a binary large object (BLOB).
052 * In this case, {@link Property#getType} will return the {@link Set}
053 * {{@link #MEMBER}, {@link #BLOB}}.
054 */
055 enum TypeFlag {
056 /**
057 * Identifies a property of a member. This property can be used in the
058 * DIMENSION PROPERTIES clause of the SELECT statement.
059 */
060 MEMBER(1),
061
062 /**
063 * Identifies a property of a cell. This property can be used in the
064 * CELL PROPERTIES clause that occurs at the end of the SELECT
065 * statement.
066 */
067 CELL(2),
068
069 /**
070 * Identifies an internal property.
071 */
072 SYSTEM(4),
073
074 /**
075 * Identifies a property which contains a binary large object (blob).
076 */
077 BLOB(8);
078
079 public final int xmlaOrdinal;
080 private static final Map<Integer, TypeFlag> xmlaMap =
081 new HashMap<Integer, TypeFlag>();
082
083 static {
084 for (TypeFlag typeFlag : values()) {
085 xmlaMap.put(typeFlag.xmlaOrdinal, typeFlag);
086 }
087 }
088
089 private static final Set<TypeFlag> CELL_TYPE_FLAG =
090 Collections.unmodifiableSet(EnumSet.of(TypeFlag.CELL));
091 private static final Set<TypeFlag> MEMBER_TYPE_FLAG =
092 Collections.unmodifiableSet(EnumSet.of(TypeFlag.MEMBER));
093
094 private TypeFlag(int xmlaOrdinal) {
095 this.xmlaOrdinal = xmlaOrdinal;
096 }
097
098 /**
099 * Looks up a TypeFlag by its XMLA ordinal.
100 *
101 * @param xmlaOrdinal Ordinal of a TypeFlag according to the XMLA
102 * specification.
103 *
104 * @return TypeFlag with the given ordinal, or null if there is no
105 * such TypeFlag
106 */
107 public static TypeFlag forXmlaOrdinal(int xmlaOrdinal) {
108 return xmlaMap.get(xmlaOrdinal);
109 }
110
111 /**
112 * Creates a set of TypeFlag values by parsing a mask.
113 *
114 * <p>For example, <code>forMask(9)</code> returns the set
115 * {{@link #MEMBER}, {@link #BLOB}} because 9 = MEMBER (1) | BLOB (8).
116 *
117 * @param xmlaOrdinalMask Bit mask
118 * @return Set of TypeFlag values
119 */
120 public static Set<TypeFlag> forMask(int xmlaOrdinalMask) {
121 switch (xmlaOrdinalMask) {
122 // Optimize common cases {MEMBER} and {CELL}.
123 case 1:
124 return MEMBER_TYPE_FLAG;
125 case 2:
126 return CELL_TYPE_FLAG;
127 default:
128 Set<TypeFlag> type =
129 EnumSet.noneOf(TypeFlag.class);
130 for (TypeFlag typeFlag : values()) {
131 if ((xmlaOrdinalMask & typeFlag.xmlaOrdinal) != 0) {
132 type.add(typeFlag);
133 }
134 }
135 return type;
136 }
137 }
138 }
139
140 /**
141 * Enumeration of the system properties available for every {@link Member}.
142 *
143 * <p>The following properties are mandatory for members:<ul>
144 * <li>{@link #CATALOG_NAME}</li>
145 * <li>{@link #SCHEMA_NAME}</li>
146 * <li>{@link #CUBE_NAME}</li>
147 * <li>{@link #DIMENSION_UNIQUE_NAME}</li>
148 * <li>{@link #HIERARCHY_UNIQUE_NAME}</li>
149 * <li>{@link #LEVEL_UNIQUE_NAME}</li>
150 * <li>{@link #LEVEL_NUMBER}</li>
151 * <li>{@link #MEMBER_UNIQUE_NAME}</li>
152 * <li>{@link #MEMBER_NAME}</li>
153 * <li>{@link #MEMBER_TYPE}</li>
154 * <li>{@link #MEMBER_GUID}</li>
155 * <li>{@link #MEMBER_CAPTION}</li>
156 * <li>{@link #MEMBER_ORDINAL}</li>
157 * <li>{@link #CHILDREN_CARDINALITY}</li>
158 * <li>{@link #PARENT_LEVEL}</li>
159 * <li>{@link #PARENT_UNIQUE_NAME}</li>
160 * <li>{@link #PARENT_COUNT}</li>
161 * <li>{@link #DESCRIPTION}</li>
162 * </ul>
163 */
164 enum StandardMemberProperty implements Property {
165
166 /**
167 * Definition of the property which
168 * holds the name of the current catalog.
169 */
170 CATALOG_NAME(
171 Datatype.STRING,
172 10,
173 false,
174 "Optional. The name of the catalog to which this member belongs. NULL if the provider does not support catalogs."),
175
176 /**
177 * Definition of the property which
178 * holds the name of the current schema.
179 */
180 SCHEMA_NAME(
181 Datatype.STRING,
182 11,
183 false,
184 "Optional. The name of the schema to which this member belongs. NULL if the provider does not support schemas."),
185
186 /**
187 * Definition of the property which
188 * holds the name of the current cube.
189 */
190 CUBE_NAME(
191 Datatype.STRING,
192 12,
193 false,
194 "Required. Name of the cube to which this member belongs."),
195
196 /**
197 * Definition of the property which
198 * holds the unique name of the current dimension.
199 */
200 DIMENSION_UNIQUE_NAME(
201 Datatype.STRING,
202 13,
203 false,
204 "Required. Unique name of the dimension to which this member belongs. For providers that generate unique names by qualification, each component of this name is delimited."),
205
206 /**
207 * Definition of the property which
208 * holds the unique name of the current hierarchy.
209 */
210 HIERARCHY_UNIQUE_NAME(
211 Datatype.STRING,
212 14,
213 false,
214 "Required. Unique name of the hierarchy. If the member belongs to more than one hierarchy, there is one row for each hierarchy to which it belongs. For providers that generate unique names by qualification, each component of this name is delimited."),
215
216 /**
217 * Definition of the property which
218 * holds the unique name of the current level.
219 */
220 LEVEL_UNIQUE_NAME(
221 Datatype.STRING,
222 15,
223 false,
224 "Required. Unique name of the level to which the member belongs. For providers that generate unique names by qualification, each component of this name is delimited."),
225
226 /**
227 * Definition of the property which
228 * holds the ordinal of the current level.
229 */
230 LEVEL_NUMBER(
231 Datatype.UNSIGNED_INTEGER,
232 16,
233 false,
234 "Required. The distance of the member from the root of the hierarchy. The root level is zero."),
235
236 /**
237 * Definition of the property which
238 * holds the ordinal of the current member.
239 */
240 MEMBER_ORDINAL(
241 Datatype.UNSIGNED_INTEGER,
242 17,
243 false,
244 "Required. Ordinal number of the member. Sort rank of the member when members of this dimension are sorted in their natural sort order. If providers do not have the concept of natural ordering, this should be the rank when sorted by MEMBER_NAME."),
245
246 /**
247 * Definition of the property which
248 * holds the name of the current member.
249 */
250 MEMBER_NAME(
251 Datatype.STRING,
252 18,
253 false,
254 "Required. Name of the member."),
255
256 /**
257 * Definition of the property which
258 * holds the unique name of the current member.
259 */
260 MEMBER_UNIQUE_NAME(
261 Datatype.STRING,
262 19,
263 false,
264 "Required. Unique name of the member. For providers that generate unique names by qualification, each component of this name is delimited."),
265
266 /**
267 * Definition of the property which
268 * holds the type of the member.
269 */
270 MEMBER_TYPE(
271 Datatype.STRING,
272 20,
273 false,
274 "Required. Type of the member. Can be one of the following values: MDMEMBER_Datatype.TYPE_REGULAR, MDMEMBER_Datatype.TYPE_ALL, MDMEMBER_Datatype.TYPE_FORMULA, MDMEMBER_Datatype.TYPE_MEASURE, MDMEMBER_Datatype.TYPE_UNKNOWN. MDMEMBER_Datatype.TYPE_FORMULA takes precedence over MDMEMBER_Datatype.TYPE_MEASURE. Therefore, if there is a formula (calculated) member on the Measures dimension, it is listed as MDMEMBER_Datatype.TYPE_FORMULA."),
275
276 /**
277 * Definition of the property which
278 * holds the GUID of the member
279 */
280 MEMBER_GUID(
281 Datatype.STRING,
282 21,
283 false,
284 "Optional. Member GUID. NULL if no GUID exists."),
285
286 /**
287 * Definition of the property which
288 * holds the label or caption associated with the member, or the
289 * member's name if no caption is defined.
290 */
291 MEMBER_CAPTION(
292 Datatype.STRING,
293 22,
294 false,
295 "Required. A label or caption associated with the member. Used primarily for display purposes. If a caption does not exist, MEMBER_NAME is returned."),
296
297 /**
298 * Definition of the property which holds the
299 * number of children this member has.
300 */
301 CHILDREN_CARDINALITY(
302 Datatype.UNSIGNED_INTEGER,
303 23,
304 false,
305 "Required. Number of children that the member has. This can be an estimate, so consumers should not rely on this to be the exact count. Providers should return the best estimate possible."),
306
307 /**
308 * Definition of the property which holds the
309 * distance from the root of the hierarchy of this member's parent.
310 */
311 PARENT_LEVEL(
312 Datatype.UNSIGNED_INTEGER,
313 24,
314 false,
315 "Required. The distance of the member's parent from the root level of the hierarchy. The root level is zero."),
316
317 /**
318 * Definition of the property which holds the
319 * Name of the current catalog.
320 */
321 PARENT_UNIQUE_NAME(
322 Datatype.STRING,
323 25,
324 false,
325 "Required. Unique name of the member's parent. NULL is returned for any members at the root level. For providers that generate unique names by qualification, each component of this name is delimited."),
326
327 /**
328 * Definition of the property which holds the
329 * number of parents that this member has. Generally 1, or 0
330 * for root members.
331 */
332 PARENT_COUNT(
333 Datatype.UNSIGNED_INTEGER,
334 26,
335 false,
336 "Required. Number of parents that this member has."),
337
338 /**
339 * Definition of the property which holds the
340 * description of this member.
341 */
342 DESCRIPTION(
343 Datatype.STRING,
344 27,
345 false,
346 "Optional. A human-readable description of the member."),
347
348 /**
349 * Definition of the internal property which holds the
350 * name of the system property which determines whether to show a member
351 * (especially a measure or calculated member) in a user interface such
352 * as JPivot.
353 */
354 $visible(
355 Datatype.BOOLEAN,
356 28,
357 true,
358 null),
359
360 /**
361 * Definition of the internal property which holds the
362 * value of the member key in the original data type. MEMBER_KEY is for
363 * backward-compatibility. MEMBER_KEY has the same value as KEY0 for
364 * non-composite keys, and MEMBER_KEY property is null for composite
365 * keys.
366 */
367 MEMBER_KEY(
368 Datatype.VARIANT,
369 29,
370 true,
371 "Optional. The value of the member key. Null for composite keys."),
372
373 /**
374 * Definition of the boolean property that indicates whether
375 * a member is a placeholder member for an empty position in a
376 * dimension hierarchy.
377 */
378 IS_PLACEHOLDERMEMBER(
379 Datatype.BOOLEAN,
380 30,
381 false,
382 "Required. Whether the member is a placeholder member for an empty position in a dimension hierarchy."),
383
384 /**
385 * Definition of the property that indicates whether the member is a
386 * data member.
387 */
388 IS_DATAMEMBER(
389 Datatype.BOOLEAN,
390 31,
391 false,
392 "Required. whether the member is a data member"),
393
394 /**
395 * Definition of the property which
396 * holds the level depth of a member.
397 *
398 * <p>Caution: Level depth of members in parent-child hierarchy isn't
399 * from their levels. It's calculated from the underlying data
400 * dynamically.
401 */
402 DEPTH(
403 Datatype.UNSIGNED_INTEGER,
404 43,
405 true,
406 "The level depth of a member"),
407
408 /**
409 * Definition of the property which
410 * holds the DISPLAY_INFO required by XML/A.
411 *
412 * <p>Caution: This property's value is calculated based on a specified
413 * MDX query, so its value is dynamic at runtime.
414 */
415 DISPLAY_INFO(
416 Datatype.UNSIGNED_INTEGER,
417 44,
418 false,
419 "Display instruction of a member for XML/A"),
420
421 /**
422 * Definition of the property which
423 * holds the value of a cell. Is usually numeric (since most measures
424 * are numeric) but is occasionally another type.
425 */
426 VALUE(
427 Datatype.VARIANT,
428 41,
429 false,
430 "The unformatted value of the cell.");
431
432 private final Datatype type;
433 private final String description;
434 private final boolean internal;
435
436 private StandardMemberProperty(
437 Datatype type,
438 int ordinal,
439 boolean internal,
440 String description)
441 {
442 // assert ordinal == ordinal();
443 this.internal = internal;
444 this.type = type;
445 this.description = description;
446 }
447
448 public String getName() {
449 return name();
450 }
451
452 public String getUniqueName() {
453 return name();
454 }
455
456 public String getDescription(Locale locale) {
457 return description;
458 }
459
460 public String getCaption(Locale locale) {
461 return name();
462 }
463
464 public Datatype getDatatype() {
465 return type;
466 }
467
468 public Set<TypeFlag> getType() {
469 return TypeFlag.forMask(TypeFlag.MEMBER.xmlaOrdinal);
470 }
471
472 public ContentType getContentType() {
473 return ContentType.REGULAR;
474 }
475
476 public boolean isInternal() {
477 return internal;
478 }
479 }
480
481 /**
482 * Enumeration of the system properties available for every
483 * {@link org.olap4j.Cell}.
484 *
485 * <p>The following propertiess are mandatory for cells:<ul>
486 * <li>{@link #BACK_COLOR}</li>
487 * <li>{@link #CELL_EVALUATION_LIST}</li>
488 * <li>{@link #CELL_ORDINAL}</li>
489 * <li>{@link #FORE_COLOR}</li>
490 * <li>{@link #FONT_NAME}</li>
491 * <li>{@link #FONT_SIZE}</li>
492 * <li>{@link #FONT_FLAGS}</li>
493 * <li>{@link #FORMAT_STRING}</li>
494 * <li>{@link #FORMATTED_VALUE}</li>
495 * <li>{@link #NON_EMPTY_BEHAVIOR}</li>
496 * <li>{@link #SOLVE_ORDER}</li>
497 * <li>{@link #VALUE}</li>
498 * </ul>
499 */
500 enum StandardCellProperty implements Property {
501 BACK_COLOR(
502 Datatype.STRING,
503 30,
504 false,
505 "The background color for displaying the VALUE or FORMATTED_VALUE property. For more information, see FORE_COLOR and BACK_COLOR Contents."),
506
507 CELL_EVALUATION_LIST(
508 Datatype.STRING,
509 31,
510 false,
511 "The semicolon-delimited list of evaluated formulas applicable to the cell, in order from lowest to highest solve order. For more information about solve order, see Understanding Pass Order and Solve Order"),
512
513 CELL_ORDINAL(
514 Datatype.UNSIGNED_INTEGER,
515 32,
516 false,
517 "The ordinal number of the cell in the dataset."),
518
519 FORE_COLOR(
520 Datatype.STRING,
521 33,
522 false,
523 "The foreground color for displaying the VALUE or FORMATTED_VALUE property. For more information, see FORE_COLOR and BACK_COLOR Contents."),
524
525 FONT_NAME(
526 Datatype.STRING,
527 34,
528 false,
529 "The font to be used to display the VALUE or FORMATTED_VALUE property."),
530
531 FONT_SIZE(
532 Datatype.STRING,
533 35,
534 false,
535 "Font size to be used to display the VALUE or FORMATTED_VALUE property."),
536
537 FONT_FLAGS(
538 Datatype.UNSIGNED_INTEGER,
539 36,
540 false,
541 "The bitmask detailing effects on the font. The value is the result of a bitwise OR operation of one or more of the following constants: MDFF_BOLD = 1, MDFF_ITALIC = 2, MDFF_UNDERLINE = 4, MDFF_STRIKEOUT = 8. For example, the value 5 represents the combination of bold (MDFF_BOLD) and underline (MDFF_UNDERLINE) font effects."),
542
543 /**
544 * Definition of the property which
545 * holds the formatted value of a cell.
546 */
547 FORMATTED_VALUE(
548 Datatype.STRING,
549 37,
550 false,
551 "The character string that represents a formatted display of the VALUE property."),
552
553 /**
554 * Definition of the property which
555 * holds the format string used to format cell values.
556 */
557 FORMAT_STRING(
558 Datatype.STRING,
559 38,
560 false,
561 "The format string used to create the FORMATTED_VALUE property value. For more information, see FORMAT_STRING Contents."),
562
563 NON_EMPTY_BEHAVIOR(
564 Datatype.STRING,
565 39,
566 false,
567 "The measure used to determine the behavior of calculated members when resolving empty cells."),
568
569 /**
570 * Definition of the property which
571 * determines the solve order of a calculated member with respect to
572 * other calculated members.
573 */
574 SOLVE_ORDER(
575 Datatype.INTEGER,
576 40,
577 false,
578 "The solve order of the cell."),
579
580 /**
581 * Definition of the property which
582 * holds the value of a cell. Is usually numeric (since most measures
583 * are numeric) but is occasionally another type.
584 */
585 VALUE(
586 Datatype.VARIANT,
587 41,
588 false,
589 "The unformatted value of the cell."),
590
591 /**
592 * Definition of the property which
593 * holds the datatype of a cell. Valid values are "String",
594 * "Numeric", "Integer". The property's value derives from the
595 * "datatype" attribute of the "Measure" element; if the
596 * datatype attribute is not specified, the datatype is
597 * "Numeric" by default, except measures whose aggregator is
598 * "Count", whose datatype is "Integer".
599 */
600 DATATYPE(
601 Datatype.STRING,
602 42,
603 false,
604 "The datatype of the cell.");
605
606 /**
607 * The datatype of the property.
608 */
609 private final Datatype type;
610 private final String description;
611 private final boolean internal;
612
613 private StandardCellProperty(
614 Datatype type,
615 int ordinal,
616 boolean internal,
617 String description)
618 {
619 this.type = type;
620 this.internal = internal;
621 this.description = description;
622 }
623
624 public Datatype getDatatype() {
625 return type;
626 }
627
628 public Set<TypeFlag> getType() {
629 return TypeFlag.forMask(TypeFlag.CELL.xmlaOrdinal);
630 }
631
632 public String getName() {
633 return name();
634 }
635
636 public String getUniqueName() {
637 return name();
638 }
639
640 public String getCaption(Locale locale) {
641 return name();
642 }
643
644 public String getDescription(Locale locale) {
645 return description;
646 }
647
648 public boolean isInternal() {
649 return internal;
650 }
651
652 public ContentType getContentType() {
653 return ContentType.REGULAR;
654 }
655 }
656
657 /**
658 * Enumeration of the types of a <code>Property</code>.
659 *
660 * <p>The values are as specified by XMLA.
661 * For example, XMLA specifies MD_PROPTYPE_CAPTION with ordinal 0x21,
662 * which corresponds to the value {@link #CAPTION},
663 * whose {@link #xmlaOrdinal} is 0x21.
664 */
665 enum ContentType {
666 REGULAR(0x00),
667 ID(0x01),
668 RELATION_TO_PARENT(0x02),
669 ROLLUP_OPERATOR(0x03),
670 ORG_TITLE(0x11),
671 CAPTION(0x21),
672 CAPTION_SHORT(0x22),
673 CAPTION_DESCRIPTION(0x23),
674 CAPTION_ABREVIATION(0x24),
675 WEB_URL(0x31),
676 WEB_HTML(0x32),
677 WEB_XML_OR_XSL(0x33),
678 WEB_MAIL_ALIAS(0x34),
679 ADDRESS(0x41),
680 ADDRESS_STREET(0x42),
681 ADDRESS_HOUSE(0x43),
682 ADDRESS_CITY(0x44),
683 ADDRESS_STATE_OR_PROVINCE(0x45),
684 ADDRESS_ZIP(0x46),
685 ADDRESS_QUARTER(0x47),
686 ADDRESS_COUNTRY(0x48),
687 ADDRESS_BUILDING(0x49),
688 ADDRESS_ROOM(0x4A),
689 ADDRESS_FLOOR(0x4B),
690 ADDRESS_FAX(0x4C),
691 ADDRESS_PHONE(0x4D),
692 GEO_CENTROID_X(0x61),
693 GEO_CENTROID_Y(0x62),
694 GEO_CENTROID_Z(0x63),
695 GEO_BOUNDARY_TOP(0x64),
696 GEO_BOUNDARY_LEFT(0x65),
697 GEO_BOUNDARY_BOTTOM(0x66),
698 GEO_BOUNDARY_RIGHT(0x67),
699 GEO_BOUNDARY_FRONT(0x68),
700 GEO_BOUNDARY_REAR(0x69),
701 GEO_BOUNDARY_POLYGON(0x6A),
702 PHYSICAL_SIZE(0x71),
703 PHYSICAL_COLOR(0x72),
704 PHYSICAL_WEIGHT(0x73),
705 PHYSICAL_HEIGHT(0x74),
706 PHYSICAL_WIDTH(0x75),
707 PHYSICAL_DEPTH(0x76),
708 PHYSICAL_VOLUME(0x77),
709 PHYSICAL_DENSITY(0x78),
710 PERSON_FULL_NAME(0x82),
711 PERSON_FIRST_NAME(0x83),
712 PERSON_LAST_NAME(0x84),
713 PERSON_MIDDLE_NAME(0x85),
714 PERSON_DEMOGRAPHIC(0x86),
715 PERSON_CONTACT(0x87),
716 QTY_RANGE_LOW(0x91),
717 QTY_RANGE_HIGH(0x92),
718 FORMATTING_COLOR(0xA1),
719 FORMATTING_ORDER(0xA2),
720 FORMATTING_FONT(0xA3),
721 FORMATTING_FONT_EFFECTS(0xA4),
722 FORMATTING_FONT_SIZE(0xA5),
723 FORMATTING_SUB_TOTAL(0xA6),
724 DATE(0xB1),
725 DATE_START(0xB2),
726 DATE_ENDED(0xB3),
727 DATE_CANCELED(0xB4),
728 DATE_MODIFIED(0xB5),
729 DATE_DURATION(0xB6),
730 VERSION(0xC1);
731
732 private final int xmlaOrdinal;
733
734 private static final Map<Integer, ContentType> xmlaMap =
735 new HashMap<Integer, ContentType>();
736
737 static {
738 for (ContentType contentType : values()) {
739 xmlaMap.put(contentType.xmlaOrdinal, contentType);
740 }
741 }
742
743 /**
744 * Returns the ordinal code as specified by XMLA.
745 *
746 * <p>For example, the XMLA specification says that the ordinal of
747 * {@link #FORMATTING_FONT_EFFECTS} is 0xA4.
748 *
749 * @return ordinal code as specified by XMLA.
750 */
751 public int xmlaOrdinal() {
752 return xmlaOrdinal;
753 }
754
755 private ContentType(int xmlaOrdinal) {
756 this.xmlaOrdinal = xmlaOrdinal;
757 }
758
759 /**
760 * Looks up a ContentType by its XMLA ordinal.
761 *
762 * @param xmlaOrdinal Ordinal of a ContentType according to the XMLA
763 * specification.
764 *
765 * @return ContentType with the given ordinal, or null if there is no
766 * such ContentType
767 */
768 public static ContentType forXmlaOrdinal(int xmlaOrdinal) {
769 return xmlaMap.get(xmlaOrdinal);
770 }
771 }
772 }
773
774 // End Property.java