protected void configureCommon()

in tapestry-framework/src/org/apache/tapestry/parse/SpecificationParser.java [1082:1289]


    protected void configureCommon(SpecificationDigester digester, String rootElementName)
    {
        // <bean>

        String pattern = rootElementName + "/bean";

        digester.addRule(pattern, new CreateBeanSpecificationRule());
        digester.addValidate(
            pattern,
            "name",
            BEAN_NAME_PATTERN,
            "SpecificationParser.invalid-bean-name");
        digester.addSetConvertedProperty(pattern, CONVERSION_MAP, "lifecycle", "lifecycle");
        digester.addSetLimitedProperties(pattern, "class", "className");
        digester.addConnectChild(pattern, "addBeanSpecification", "name");

        // <set-property> inside <bean>

        pattern = rootElementName + "/bean/set-property";

        digester.addRule(pattern, new CreateExpressionBeanInitializerRule());
        digester.addSetLimitedProperties(pattern, "name", "propertyName");
        digester.addSetExtendedProperty(pattern, "expression", "expression", true);
        digester.addSetNext(pattern, "addInitializer");

        // <set-string-property> inside <bean>
        // This is for compatibility with the 1.3 DTD

        pattern = rootElementName + "/bean/set-string-property";

        digester.addRule(pattern, new CreateStringBeanInitializerRule());
        digester.addSetLimitedProperties(
            pattern,
            new String[] { "name", "key" },
            new String[] { "propertyName", "key" });

        digester.addSetNext(pattern, "addInitializer");

        // It's now set-message-property in the 3.0 DTD

        pattern = rootElementName + "/bean/set-message-property";

        digester.addRule(pattern, new CreateStringBeanInitializerRule());
        digester.addSetLimitedProperties(
            pattern,
            new String[] { "name", "key" },
            new String[] { "propertyName", "key" });

        digester.addSetNext(pattern, "addInitializer");

        // <component>

        pattern = rootElementName + "/component";

        digester.addRule(pattern, new CreateContainedComponentRule());
        digester.addValidate(
            pattern,
            "id",
            COMPONENT_ID_PATTERN,
            "SpecificationParser.invalid-component-id");
        digester.addValidate(
            pattern,
            "type",
            COMPONENT_TYPE_PATTERN,
            "SpecificationParser.invalid-component-type");
        digester.addSetLimitedProperties(pattern, "type", "type");
        digester.addRule(pattern, new ComponentCopyOfRule());
        digester.addConnectChild(pattern, "addComponent", "id");
        digester.addSetBooleanProperty(
            pattern,
            "inherit-informal-parameters",
            "inheritInformalParameters");

        // <binding> inside <component>

        pattern = rootElementName + "/component/binding";

        Rule createBindingSpecificationRule = new CreateBindingSpecificationRule();

        digester.addRule(pattern, createBindingSpecificationRule);
        digester.addInitializeProperty(pattern, "type", BindingType.DYNAMIC);
        digester.addSetExtendedProperty(pattern, "expression", "value", true);
        digester.addConnectChild(pattern, "setBinding", "name");

        // <field-binding> inside <component>
        // For compatibility with 1.3 DTD only, removed in 3.0 DTD

        pattern = rootElementName + "/component/field-binding";

        digester.addRule(pattern, createBindingSpecificationRule);
        digester.addInitializeProperty(pattern, "type", BindingType.FIELD);
        digester.addSetExtendedProperty(pattern, "field-name", "value", true);
        digester.addConnectChild(pattern, "setBinding", "name");

        // <inherited-binding> inside <component>

        pattern = rootElementName + "/component/inherited-binding";

        digester.addRule(pattern, createBindingSpecificationRule);
        digester.addInitializeProperty(pattern, "type", BindingType.INHERITED);
        digester.addSetLimitedProperties(pattern, "parameter-name", "value");
        digester.addConnectChild(pattern, "setBinding", "name");

        // <static-binding> inside <component>

        pattern = rootElementName + "/component/static-binding";

        digester.addRule(pattern, createBindingSpecificationRule);
        digester.addInitializeProperty(pattern, "type", BindingType.STATIC);
        digester.addSetExtendedProperty(pattern, "value", "value", true);
        digester.addConnectChild(pattern, "setBinding", "name");

        // <string-binding> inside <component>
        // Maintained just for 1.3 DTD compatibility

        pattern = rootElementName + "/component/string-binding";

        digester.addRule(pattern, createBindingSpecificationRule);
        digester.addInitializeProperty(pattern, "type", BindingType.STRING);
        digester.addSetLimitedProperties(pattern, "key", "value");
        digester.addConnectChild(pattern, "setBinding", "name");

        // Renamed to <message-binding> in the 3.0 DTD

        pattern = rootElementName + "/component/message-binding";

        digester.addRule(pattern, createBindingSpecificationRule);
        digester.addInitializeProperty(pattern, "type", BindingType.STRING);
        digester.addSetLimitedProperties(pattern, "key", "value");
        digester.addConnectChild(pattern, "setBinding", "name");

        // <listener-binding> inside <component>

        pattern = rootElementName + "/component/listener-binding";

        digester.addRule(pattern, new CreateListenerBindingSpecificationRule());
        digester.addSetLimitedProperties(pattern, "language", "language");
        digester.addBody(pattern, "value");
        digester.addConnectChild(pattern, "setBinding", "name");

        // <external-asset>

        pattern = rootElementName + "/external-asset";

        Rule createAssetSpecificationRule = new CreateAssetSpecificationRule();

        digester.addRule(pattern, createAssetSpecificationRule);
        digester.addInitializeProperty(pattern, "type", AssetType.EXTERNAL);
        digester.addValidate(
            pattern,
            "name",
            ASSET_NAME_PATTERN,
            "SpecificationParser.invalid-asset-name");
        digester.addSetLimitedProperties(pattern, "URL", "path");
        digester.addConnectChild(pattern, "addAsset", "name");

        // <context-asset>

        pattern = rootElementName + "/context-asset";

        digester.addRule(pattern, createAssetSpecificationRule);
        digester.addInitializeProperty(pattern, "type", AssetType.CONTEXT);
        digester.addValidate(
            pattern,
            "name",
            ASSET_NAME_PATTERN,
            "SpecificationParser.invalid-asset-name");

        // TODO: $template$

        digester.addSetLimitedProperties(pattern, "path", "path");
        digester.addConnectChild(pattern, "addAsset", "name");

        // <private-asset>

        pattern = rootElementName + "/private-asset";

        digester.addRule(pattern, createAssetSpecificationRule);
        digester.addInitializeProperty(pattern, "type", AssetType.PRIVATE);
        digester.addValidate(
            pattern,
            "name",
            ASSET_NAME_PATTERN,
            "SpecificationParser.invalid-asset-name");

        // TODO: $template$

        digester.addSetLimitedProperties(pattern, "resource-path", "path");
        digester.addConnectChild(pattern, "addAsset", "name");

        // <property-specification>

        pattern = rootElementName + "/property-specification";

        digester.addRule(pattern, new CreatePropertySpecificationRule());
        digester.addValidate(
            pattern,
            "name",
            PROPERTY_NAME_PATTERN,
            "SpecificationParser.invalid-property-name");
        digester.addSetLimitedProperties(
            pattern,
            new String[] { "name", "type" },
            new String[] { "name", "type" });
        digester.addSetBooleanProperty(pattern, "persistent", "persistent");
        digester.addSetExtendedProperty(pattern, "initial-value", "initialValue", false);
        digester.addSetNext(pattern, "addPropertySpecification");
    }