123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486 |
- /*
- * $Id$
- *
- *
- * Copyright 1999-2003 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- *
- *
- * @author <a href="mailto:pbwest@powerup.com.au">Peter B. West</a>
- * @version $Revision$ $Name$
- */
-
- package org.apache.fop.fo;
-
- import java.util.BitSet;
- import java.util.HashMap;
- import java.util.StringTokenizer;
-
- import org.apache.fop.datastructs.ROStringArray;
- import org.apache.fop.datatypes.Ints;
- import org.apache.fop.datatypes.Numeric;
- import org.apache.fop.datatypes.PropertyValue;
- import org.apache.fop.fo.expr.PropertyException;
- import org.apache.fop.fo.properties.Property;
-
- /**
- * This class contains a number of arrays containing values indexed by the
- * property index value, determined from the PropNames class. These arrays
- * provide a means of accessing information about the nature of a property
- * through the property index value.
- * <p>Most of these arrays are initialised piecemeal as information is
- * required about a particular property.
- * There are also <tt>HashMap</tt>s which encode the various sets of
- * properties which are defined to apply to each of the Flow Objects,
- * and a <tt>BitSet</tt> of those properties which are
- * automatically inherited. The <tt>HashMap</tt>s provide a convenient
- * means of specifying the relationship between FOs and properties.
- */
- public class PropertyConsts {
-
- private static final String tag = "$Name$";
- private static final String revision = "$Revision$";
-
- private static final String packageName = "org.apache.fop.fo";
-
- public static final PropertyConsts pconsts;
- static {
- pconsts = new PropertyConsts();
- }
-
- public static final PropertyConsts getPropertyConsts() {
- return pconsts;
- }
-
-
- /**
- * A Property[] array containing Property objects corresponding to each
- * of the property indices in <tt>PropNames</tt>.
- * Initially empty, entries are filled on demand as calls for details
- * about individual properties are made.
- */
- private final Property[] properties
- = new Property[PropNames.LAST_PROPERTY_INDEX + 1];
-
- /**
- * A Class[] array containing Class objects corresponding to each of the
- * class names in the classNames array. Elements are set
- * in parallel to the creation of the class names in
- * the classNames array. It can be indexed by the property name
- * constants defined in this file.
- */
- private final Class[] classes
- = new Class[PropNames.LAST_PROPERTY_INDEX + 1];
-
- /**
- * A String[] array of the property class names. This array is
- * effectively 1-based, with the first element being unused.
- * The elements of this array are set by converting the FO
- * property names from the array PropNames.propertyNames into class
- * names by converting the first character of every component word to
- * upper case, and removing all punctuation characters.
- * It can be indexed by the property name constants defined in
- * the PropNames class.
- */
- private final String[] classNames
- = new String[PropNames.LAST_PROPERTY_INDEX + 1];
-
- /**
- * A HashMap whose elements are an integer index value keyed by the name
- * of a property class. The index value is the index of the property
- * class name in the classNames[] array.
- */
- private final HashMap classToIndex = new HashMap(
- (int)((PropNames.LAST_PROPERTY_INDEX + 1) / 0.75) + 1);
-
- /**
- * An <tt>int[]</tt> containing the <i>inherited</i> values from the
- * <tt>Property</tt> classes.
- */
- private final int[] inherited
- = new int[PropNames.LAST_PROPERTY_INDEX + 1];
-
- /**
- * A <tt>BitSet</tt> of properties which are normally inherited
- * (strictly, not not inherited).
- * It is defined relative to the set of all properties; i.e. the
- * inheritability of any property can be established by testing the
- * bit in this set that corresponds to the queried property's index.
- * <p>The <tt>BitSet</tt> is private and is the basis for
- * <i>inheritedProperties</i>.
- */
- private final BitSet inheritedprops
- = new BitSet(PropNames.LAST_PROPERTY_INDEX + 1);
-
- /**
- * An int[] array of the types of the <i>initialValue</i> field of each
- * property. The array is indexed by the index value constants that are
- * defined in the PropNames class in parallel to the
- * PropNames.propertyNames[] array.
- */
- private final int[] initialValueTypes
- = new int[PropNames.LAST_PROPERTY_INDEX + 1];
-
- /**
- * A <tt>PropertyValue</tt> array containing the initial values of
- * each of the properties.
- */
- private final PropertyValue[] initialValues
- = new PropertyValue[PropNames.LAST_PROPERTY_INDEX + 1];
-
- /**
- * An int[] array of the values of the <i>dataTypes</i> field of each
- * property. The array is indexed by the index value constants that are
- * defined in the PropNames class in parallel to the
- * PropNames.propertyNames[] array.
- * The array elements are set from the values of the
- * <i>dataTypes</i> field in each property class.
- */
- private final int[] datatypes
- = new int[PropNames.LAST_PROPERTY_INDEX + 1];
-
- /**
- * An int[] array of the values of the <i>traitMapping</i> field of each
- * property. The array is indexed by the index value constants that are
- * defined in the PropNames class in parallel to the
- * PropNames.propertyNames[] array.
- * The array elements are set from the values of the
- * <i>traitMapping</i> field in each property class.
- */
- private final int[] traitMappings
- = new int[PropNames.LAST_PROPERTY_INDEX + 1];
-
- /**
- * Get the initial value type for a property name.
- * @param property String name of the FO property
- * @return int enumerated initialValueType. These constants are defined
- * as static final ints in this class. Note that an undefined property
- * name will return the constant defined as NOTYPE_IT
- */
- public int getInitialValueType(String property)
- throws PropertyException
- {
- // Get the property index then index into the initialvaluetypes array
- return getInitialValueType(PropNames.getPropertyIndex(property));
- }
-
- /**
- * get the initial value type for a property index.
- * @param propindex int index of the FO property
- * @return int enumerated initialValueType. These constants are defined
- * as static final ints in the Property class.
- * @throws PropertyException
- */
- public int getInitialValueType(int propindex)
- throws PropertyException
- {
- setupProperty(propindex);
- //System.out.println("getInitialValueType: " + propindex + " "
- //+ initialValueTypes[propindex]);
- return initialValueTypes[propindex];
- }
-
- /**
- * Get the initial value <tt>PropertyValue</tt> for a given property.
- * Note that this is a <b>raw</b> value; if it is
- * an unresolved percentage that value will be returned.
- * @param propindex - the property index.
- * @return a <tt>PropertyValue</tt> containing the initial property
- * value element for the indexed property.
- * @exception PropertyException
- */
- public PropertyValue getInitialValue(int propindex)
- throws PropertyException
- {
- if (initialValues[propindex] != null)
- return initialValues[propindex];
- //System.out.println("PropertyConts.getInitialValue(" + propindex
- //+ ") " + PropNames.getPropertyName(propindex));
- return
- (initialValues[propindex] =
- setupProperty(propindex).getInitialValue(propindex));
- }
-
- /**
- * @param propindex <tt>int</tt> index of the property
- * @param foNode the node whose properties are being constructed.
- * @param value the <tt>PropertyValue</tt> being refined.
- * @return <tt>PropertyValue</tt> constructed by the property's
- * <i>refineParsing</i> method
- * @exception PropertyException
- */
- public PropertyValue refineParsing
- (int propindex, FONode foNode, PropertyValue value)
- throws PropertyException
- {
- Property property = setupProperty(propindex);
- return property.refineParsing(propindex, foNode, value);
- }
-
- /**
- * @param propindex <tt>int</tt> index of the property
- * @param foNode the node whose properties are being constructed.
- * @param value the <tt>PropertyValue</tt> being refined.
- * @param isNested indicates whether this method is
- * called normally (false), or as part of another <i>refineParsing</i>
- * method
- * @return <tt>PropertyValue</tt> constructed by the property's
- * <i>refineParsing</i> method
- * @exception PropertyException
- */
- public PropertyValue refineParsing
- (int propindex, FONode foNode, PropertyValue value, boolean isNested)
- throws PropertyException
- {
- Property property = setupProperty(propindex);
- return property.refineParsing(propindex, foNode, value, isNested);
- }
-
- /**
- * Get the <tt>Numeric</tt> value corresponding to an enumerated value.
- * @param foNode the <tt>FONode</tt> being built
- * @param propindex int index of the FO property
- * @param enum - the integer equivalent of the enumeration keyword.
- * @return the <tt>Numeric</tt> result.
- * @throws PropertyException
- */
- public Numeric getMappedNumeric(FONode foNode, int propindex, int enum)
- throws PropertyException
- {
- Property property = setupProperty(propindex);
- if ((datatypes[propindex] & Property.MAPPED_LENGTH) != 0)
- return property.getMappedLength(foNode, enum);
- else
- throw new PropertyException
- ("MAPPED_LENGTH not valid in "
- + PropNames.getPropertyName(propindex));
- }
-
- /**
- * @param property name of the FO property
- * @return int type of inheritance for this property
- * (See constants defined in Properties.)
- * @throws PropertyException
- */
- public int inheritance(String property) throws PropertyException {
- return inheritance(PropNames.getPropertyIndex(property));
- }
-
- /**
- * @param propindex int index of the FO property
- * @return int type of inheritance for this property
- * (See constants defined in Property.)
- * @throws PropertyException
- */
- public int inheritance(int propindex) throws PropertyException {
- setupProperty(propindex);
- return inherited[propindex];
- }
-
- /**
- * @param propindex int index of the FO property
- * @return <tt>boolean</tt> is property inherited?
- * @throws PropertyException
- */
- public boolean isInherited(int propindex) throws PropertyException {
- Property property = setupProperty(propindex);
- return inherited[propindex] != Property.NO;
- }
-
- /**
- * @param property String name of the FO property
- * @return <tt>boolean</tt> is property inherited?
- * @throws PropertyException
- */
- public boolean isInherited(String property) throws PropertyException {
- return isInherited(PropNames.getPropertyIndex(property));
- }
-
- /**
- * @param propindex int index of the FO property
- * @return <tt>boolean</tt> is property a shorthand?
- * @throws PropertyException
- */
- public boolean isShorthand(int propindex) throws PropertyException {
- Property property = setupProperty(propindex);
- return (datatypes[propindex] & Property.SHORTHAND) != 0;
- }
-
- /**
- * @param property String name of the FO property
- * @return <tt>boolean</tt> is property a shorthand?
- * @throws PropertyException
- */
- public boolean isShorthand(String property) throws PropertyException {
- return isShorthand(PropNames.getPropertyIndex(property));
- }
-
- /**
- * @param propertyIndex int index of the FO property
- * @return <tt>boolean</tt> is property a compound?
- * @throws PropertyException
- */
- public boolean isCompound(int propertyIndex) throws PropertyException {
- Property property = setupProperty(propertyIndex);
- return (datatypes[propertyIndex] & Property.COMPOUND) != 0;
- }
-
- /**
- * @param property String name of the FO property
- * @return <tt>boolean</tt> is property a compound?
- * @throws PropertyException
- */
- public boolean isCompound(String property) throws PropertyException {
- return isCompound(PropNames.getPropertyIndex(property));
- }
-
- /**
- * @param propertyIndex int index of the FO property
- * @return <tt>int</tt> dataTypes value.
- * @throws PropertyException
- */
- public int getDataTypes(int propertyIndex) throws PropertyException {
- Property property = setupProperty(propertyIndex);
- return datatypes[propertyIndex];
- }
-
- /**
- * @param property String name of the FO property
- * @return <tt>int</tt> dataTypes value.
- * @throws PropertyException
- */
- public int getDataTypes(String property) throws PropertyException {
- return getDataTypes(PropNames.getPropertyIndex(property));
- }
-
- /**
- * Map the integer value of an enum into its mapped value.
- * Only valid when the datatype of the property includes MAPPED_ENUM.
- * <p>Generally, the path will be enumText->enumIndex->mappedEnumText.
- * @param index <tt>int</tt> containing the enumeration index.
- * @param enumMap an <tt>ROStringArray</tt> of the <tt>String</tt>s
- * with the mapped enumeration values.
- * @return a <tt>String</tt> with the mapped enumeration text.
- */
- public String enumIndexToMapping(int index, ROStringArray enumMap)
- {
- return enumMap.get(index);
- }
-
- /**
- * @param propindex <tt>int</tt> property index.
- * @param enum <tt>String</tt> containing the enumeration text.
- * @return <tt>int</tt> constant representing the enumeration value.
- * @exception PropertyException
- */
- public int getEnumIndex(int propindex, String enum)
- throws PropertyException
- {
- Property property = setupProperty(propindex);
- return property.getEnumIndex(enum);
- }
-
- /**
- * @param propindex <tt>int</tt> property index.
- * @param enumIndex <tt>int</tt> containing the enumeration index.
- * @return <tt>String</tt> containing the enumeration text.
- * @exception PropertyException
- */
- public String getEnumText(int propindex, int enumIndex)
- throws PropertyException
- {
- Property property = setupProperty(propindex);
- return property.getEnumText(enumIndex);
- }
-
- /**
- * Set up the details of a single property and return the
- * <tt>Property</tt> object. If the <tt>Property</tt> object
- * corresponding to the property index has not been resolved before,
- * derive the Class and Property objects, and extract certain field
- * values from the Property.
- * @param propindex - the <tt>int</tt> index.
- * @return - the <tt>Property</tt> corresponding to the index.
- * @throws PropertyException
- */
- public Property setupProperty(int propindex)
- throws PropertyException
- {
- String cname = "";
- Class pclass;
- Property property;
-
- if ((property = properties[propindex]) != null) return property;
-
- // Get the property class name
- StringTokenizer stoke;
- stoke = new StringTokenizer
- (PropNames.getPropertyName(propindex), "-.:");
- while (stoke.hasMoreTokens()) {
- String token = stoke.nextToken();
- String pname = new Character(
- Character.toUpperCase(token.charAt(0))
- ).toString() + token.substring(1);
- cname = cname + pname;
- }
- classNames[propindex] = cname;
-
- // Set up the classToIndex Hashmap with the name of the
- // property class as a key, and the integer index as a value
- if (classToIndex.put(cname, Ints.consts.get(propindex)) != null)
- throw new PropertyException
- ("Duplicate values in classToIndex for key " + cname);
-
- // Get the class for this property name
- String name = packageName + ".properties." + cname;
- try {
- pclass = Class.forName(name);
- classes[propindex] = pclass;
-
- // Instantiate the class
- property = (Property)(pclass.newInstance());
- properties[propindex] = property;
-
- // Set inheritance value
- if ((inherited[propindex]
- = property.getInherited())
- != Property.NO)
- inheritedprops.set(propindex);
- // Set datatypes
- datatypes[propindex] = property.getDataTypes();
-
- // Set initialValueTypes
- initialValueTypes[propindex] = property.getInitialValueType();
-
- traitMappings[propindex] = property.getTraitMapping();
-
- } catch (ClassNotFoundException e) {
- throw new PropertyException
- ("ClassNotFoundException" + e.getMessage());
- } catch (IllegalAccessException e) {
- throw new PropertyException
- ("IllegalAccessException" + e.getMessage());
- } catch (InstantiationException e) {
- throw new PropertyException
- ("InstantiationException" + e.getMessage());
- }
-
- return property;
- }
-
-
- private PropertyConsts () {}
-
- }
|