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