Java tutorial
/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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. */ package org.apache.myfaces.config.impl.digester; import org.apache.commons.digester.Digester; import org.apache.myfaces.config.FacesConfigUnmarshaller; import org.apache.myfaces.config.impl.FacesConfigEntityResolver; import org.apache.myfaces.config.impl.digester.elements.*; import org.apache.myfaces.shared.util.ClassUtils; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import javax.faces.context.ExternalContext; import java.io.IOException; import java.io.InputStream; import java.io.Reader; import org.apache.myfaces.config.element.FacesFlowDefinition; /** * @author <a href="mailto:oliver@rossmueller.com">Oliver Rossmueller</a> */ public class DigesterFacesConfigUnmarshallerImpl implements FacesConfigUnmarshaller<FacesConfigImpl> { private Digester digester; public DigesterFacesConfigUnmarshallerImpl(ExternalContext externalContext) { digester = new Digester(); // TODO: validation set to false during implementation of 1.2 digester.setValidating(false); digester.setNamespaceAware(true); digester.setEntityResolver(new FacesConfigEntityResolver(externalContext)); //digester.setUseContextClassLoader(true); digester.setClassLoader(ClassUtils.getContextClassLoader()); digester.addObjectCreate("faces-config", FacesConfigImpl.class); // 2.0 specific start digester.addSetProperties("faces-config", "metadata-complete", "metadataComplete"); digester.addSetProperties("faces-config", "version", "version"); // 2.0 specific end // 2.0 config ordering name start digester.addCallMethod("faces-config/protected-views/url-pattern", "addProtectedViewUrlPattern", 0); digester.addCallMethod("faces-config/name", "setName", 0); digester.addObjectCreate("faces-config/ordering", OrderingImpl.class); digester.addSetNext("faces-config/ordering", "setOrdering"); digester.addObjectCreate("faces-config/ordering/before/name", FacesConfigNameSlotImpl.class); digester.addSetNext("faces-config/ordering/before/name", "addBeforeSlot"); digester.addCallMethod("faces-config/ordering/before/name", "setName", 0); digester.addObjectCreate("faces-config/ordering/before/others", ConfigOthersSlotImpl.class); digester.addSetNext("faces-config/ordering/before/others", "addBeforeSlot"); digester.addObjectCreate("faces-config/ordering/after/name", FacesConfigNameSlotImpl.class); digester.addSetNext("faces-config/ordering/after/name", "addAfterSlot"); digester.addCallMethod("faces-config/ordering/after/name", "setName", 0); digester.addObjectCreate("faces-config/ordering/after/others", ConfigOthersSlotImpl.class); digester.addSetNext("faces-config/ordering/after/others", "addAfterSlot"); digester.addObjectCreate("faces-config/absolute-ordering", AbsoluteOrderingImpl.class); digester.addSetNext("faces-config/absolute-ordering", "setAbsoluteOrdering"); digester.addObjectCreate("faces-config/absolute-ordering/name", FacesConfigNameSlotImpl.class); digester.addSetNext("faces-config/absolute-ordering/name", "addOrderSlot"); digester.addCallMethod("faces-config/absolute-ordering/name", "setName", 0); digester.addObjectCreate("faces-config/absolute-ordering/others", ConfigOthersSlotImpl.class); digester.addSetNext("faces-config/absolute-ordering/others", "addOrderSlot"); // 2.0 config ordering name end digester.addObjectCreate("faces-config/application", ApplicationImpl.class); digester.addSetNext("faces-config/application", "addApplication"); digester.addCallMethod("faces-config/application/action-listener", "addActionListener", 0); digester.addCallMethod("faces-config/application/default-render-kit-id", "addDefaultRenderkitId", 0); digester.addCallMethod("faces-config/application/default-validators", "setDefaultValidatorsPresent"); digester.addCallMethod("faces-config/application/default-validators/validator-id", "addDefaultValidatorId", 0); digester.addCallMethod("faces-config/application/message-bundle", "addMessageBundle", 0); digester.addCallMethod("faces-config/application/navigation-handler", "addNavigationHandler", 0); digester.addCallMethod("faces-config/application/partial-traversal", "addPartialTraversal", 0); digester.addCallMethod("faces-config/application/view-handler", "addViewHandler", 0); digester.addCallMethod("faces-config/application/state-manager", "addStateManager", 0); digester.addCallMethod("faces-config/application/property-resolver", "addPropertyResolver", 0); digester.addCallMethod("faces-config/application/variable-resolver", "addVariableResolver", 0); digester.addObjectCreate("faces-config/application/locale-config", LocaleConfigImpl.class); digester.addSetNext("faces-config/application/locale-config", "addLocaleConfig"); digester.addCallMethod("faces-config/application/locale-config/default-locale", "setDefaultLocale", 0); digester.addCallMethod("faces-config/application/locale-config/supported-locale", "addSupportedLocale", 0); // 1.2 specific start digester.addCallMethod("faces-config/application/el-resolver", "addElResolver", 0); digester.addObjectCreate("faces-config/application/resource-bundle", ResourceBundleImpl.class); digester.addSetNext("faces-config/application/resource-bundle", "addResourceBundle"); digester.addCallMethod("faces-config/application/resource-bundle/base-name", "setBaseName", 0); digester.addCallMethod("faces-config/application/resource-bundle/var", "setVar", 0); digester.addCallMethod("faces-config/application/resource-bundle/display-name", "setDisplayName", 0); // 1.2 specific end // 2.0 specific start digester.addObjectCreate("faces-config/application/system-event-listener", SystemEventListenerImpl.class); digester.addSetNext("faces-config/application/system-event-listener", "addSystemEventListener"); digester.addCallMethod("faces-config/application/system-event-listener/system-event-listener-class", "setSystemEventListenerClass", 0); digester.addCallMethod("faces-config/application/system-event-listener/system-event-class", "setSystemEventClass", 0); digester.addCallMethod("faces-config/application/system-event-listener/source-class", "setSourceClass", 0); digester.addCallMethod("faces-config/application/resource-handler", "addResourceHandler", 0); digester.addCallMethod("faces-config/factory/exception-handler-factory", "addExceptionHandlerFactory", 0); digester.addCallMethod("faces-config/factory/external-context-factory", "addExternalContextFactory", 0); digester.addCallMethod("faces-config/factory/view-declaration-language-factory", "addViewDeclarationLanguageFactory", 0); digester.addCallMethod("faces-config/factory/partial-view-context-factory", "addPartialViewContextFactory", 0); digester.addCallMethod("faces-config/factory/tag-handler-delegate-factory", "addTagHandlerDelegateFactory", 0); digester.addCallMethod("faces-config/factory/visit-context-factory", "addVisitContextFactory", 0); // 2.0 specific end digester.addObjectCreate("faces-config/application/resource-library-contracts/contract-mapping", ContractMappingImpl.class); digester.addSetNext("faces-config/application/resource-library-contracts/contract-mapping", "addResourceLibraryContractMapping"); digester.addCallMethod("faces-config/application/resource-library-contracts/contract-mapping/url-pattern", "setUrlPattern", 0); digester.addCallMethod("faces-config/application/resource-library-contracts/contract-mapping/contracts", "setContracts", 0); // 2.1 specific start digester.addCallMethod("faces-config/factory/facelet-cache-factory", "addFaceletCacheFactory", 0); // 2.1 specific end // 2.2 specific start digester.addCallMethod("faces-config/factory/flash-factory", "addFlashFactory", 0); // Note there is no client-window-factory, this factory can be set only using SPI. digester.addCallMethod("faces-config/factory/flow-handler-factory", "addFlowHandlerFactory", 0); // 2.2 specific end digester.addObjectCreate("faces-config/factory", FactoryImpl.class); digester.addSetNext("faces-config/factory", "addFactory"); digester.addCallMethod("faces-config/factory/application-factory", "addApplicationFactory", 0); digester.addCallMethod("faces-config/factory/faces-context-factory", "addFacesContextFactory", 0); digester.addCallMethod("faces-config/factory/lifecycle-factory", "addLifecycleFactory", 0); digester.addCallMethod("faces-config/factory/render-kit-factory", "addRenderkitFactory", 0); digester.addCallMethod("faces-config/component", "addComponent", 2); digester.addCallParam("faces-config/component/component-type", 0); digester.addCallParam("faces-config/component/component-class", 1); digester.addObjectCreate("faces-config/converter", ConverterImpl.class); digester.addSetNext("faces-config/converter", "addConverter"); digester.addCallMethod("faces-config/converter/converter-id", "setConverterId", 0); digester.addCallMethod("faces-config/converter/converter-for-class", "setForClass", 0); digester.addCallMethod("faces-config/converter/converter-class", "setConverterClass", 0); digester.addObjectCreate("faces-config/converter/attribute", AttributeImpl.class); digester.addSetNext("faces-config/converter/attribute", "addAttribute"); digester.addCallMethod("faces-config/converter/attribute/description", "addDescription", 0); digester.addCallMethod("faces-config/converter/attribute/display-name", "addDisplayName", 0); digester.addCallMethod("faces-config/converter/attribute/icon", "addIcon", 0); digester.addCallMethod("faces-config/converter/attribute/attribute-name", "setAttributeName", 0); digester.addCallMethod("faces-config/converter/attribute/attribute-class", "setAttributeClass", 0); digester.addCallMethod("faces-config/converter/attribute/default-value", "setDefaultValue", 0); digester.addCallMethod("faces-config/converter/attribute/suggested-value", "setSuggestedValue", 0); digester.addCallMethod("faces-config/converter/attribute/attribute-extension", "addAttributeExtension", 0); digester.addObjectCreate("faces-config/converter/property", PropertyImpl.class); digester.addSetNext("faces-config/converter/property", "addProperty"); digester.addCallMethod("faces-config/converter/property/description", "addDescription", 0); digester.addCallMethod("faces-config/converter/property/display-name", "addDisplayName", 0); digester.addCallMethod("faces-config/converter/property/icon", "addIcon", 0); digester.addCallMethod("faces-config/converter/property/property-name", "setPropertyName", 0); digester.addCallMethod("faces-config/converter/property/property-class", "setPropertyClass", 0); digester.addCallMethod("faces-config/converter/property/default-value", "setDefaultValue", 0); digester.addCallMethod("faces-config/converter/property/suggested-value", "setSuggestedValue", 0); digester.addCallMethod("faces-config/converter/property/property-extension", "addPropertyExtension", 0); digester.addObjectCreate("faces-config/managed-bean", ManagedBeanImpl.class); digester.addSetProperties("faces-config/managed-bean", "eager", "eager"); digester.addSetNext("faces-config/managed-bean", "addManagedBean"); digester.addCallMethod("faces-config/managed-bean/description", "setDescription", 0); digester.addCallMethod("faces-config/managed-bean/managed-bean-name", "setName", 0); digester.addCallMethod("faces-config/managed-bean/managed-bean-class", "setBeanClass", 0); digester.addCallMethod("faces-config/managed-bean/managed-bean-scope", "setScope", 0); digester.addObjectCreate("faces-config/managed-bean/managed-property", ManagedPropertyImpl.class); digester.addSetNext("faces-config/managed-bean/managed-property", "addProperty"); digester.addCallMethod("faces-config/managed-bean/managed-property/property-name", "setPropertyName", 0); digester.addCallMethod("faces-config/managed-bean/managed-property/property-class", "setPropertyClass", 0); digester.addCallMethod("faces-config/managed-bean/managed-property/null-value", "setNullValue"); digester.addCallMethod("faces-config/managed-bean/managed-property/value", "setValue", 0); digester.addObjectCreate("faces-config/managed-bean/managed-property/map-entries", MapEntriesImpl.class); digester.addSetNext("faces-config/managed-bean/managed-property/map-entries", "setMapEntries"); digester.addCallMethod("faces-config/managed-bean/managed-property/map-entries/key-class", "setKeyClass", 0); digester.addCallMethod("faces-config/managed-bean/managed-property/map-entries/value-class", "setValueClass", 0); digester.addObjectCreate("faces-config/managed-bean/managed-property/map-entries/map-entry", MapEntriesImpl.Entry.class); digester.addSetNext("faces-config/managed-bean/managed-property/map-entries/map-entry", "addEntry"); digester.addCallMethod("faces-config/managed-bean/managed-property/map-entries/map-entry/key", "setKey", 0); digester.addCallMethod("faces-config/managed-bean/managed-property/map-entries/map-entry/null-value", "setNullValue"); digester.addCallMethod("faces-config/managed-bean/managed-property/map-entries/map-entry/value", "setValue", 0); digester.addObjectCreate("faces-config/managed-bean/managed-property/list-entries", ListEntriesImpl.class); digester.addSetNext("faces-config/managed-bean/managed-property/list-entries", "setListEntries"); digester.addCallMethod("faces-config/managed-bean/managed-property/list-entries/value-class", "setValueClass", 0); digester.addObjectCreate("faces-config/managed-bean/managed-property/list-entries/null-value", ListEntriesImpl.Entry.class); digester.addSetNext("faces-config/managed-bean/managed-property/list-entries/null-value", "addEntry"); digester.addCallMethod("faces-config/managed-bean/managed-property/list-entries/null-value", "setNullValue"); digester.addObjectCreate("faces-config/managed-bean/managed-property/list-entries/value", ListEntriesImpl.Entry.class); digester.addSetNext("faces-config/managed-bean/managed-property/list-entries/value", "addEntry"); digester.addCallMethod("faces-config/managed-bean/managed-property/list-entries/value", "setValue", 0); digester.addObjectCreate("faces-config/managed-bean/map-entries", MapEntriesImpl.class); digester.addSetNext("faces-config/managed-bean/map-entries", "setMapEntries"); digester.addCallMethod("faces-config/managed-bean/map-entries/key-class", "setKeyClass", 0); digester.addCallMethod("faces-config/managed-bean/map-entries/value-class", "setValueClass", 0); digester.addObjectCreate("faces-config/managed-bean/map-entries/map-entry", MapEntriesImpl.Entry.class); digester.addSetNext("faces-config/managed-bean/map-entries/map-entry", "addEntry"); digester.addCallMethod("faces-config/managed-bean/map-entries/map-entry/key", "setKey", 0); digester.addCallMethod("faces-config/managed-bean/map-entries/map-entry/null-value", "setNullValue"); digester.addCallMethod("faces-config/managed-bean/map-entries/map-entry/value", "setValue", 0); digester.addObjectCreate("faces-config/managed-bean/list-entries", ListEntriesImpl.class); digester.addSetNext("faces-config/managed-bean/list-entries", "setListEntries"); digester.addCallMethod("faces-config/managed-bean/list-entries/value-class", "setValueClass", 0); digester.addObjectCreate("faces-config/managed-bean/list-entries/null-value", ListEntriesImpl.Entry.class); digester.addSetNext("faces-config/managed-bean/list-entries/null-value", "addEntry"); digester.addCallMethod("faces-config/managed-bean/list-entries/null-value", "setNullValue"); digester.addObjectCreate("faces-config/managed-bean/list-entries/value", ListEntriesImpl.Entry.class); digester.addSetNext("faces-config/managed-bean/list-entries/value", "addEntry"); digester.addCallMethod("faces-config/managed-bean/list-entries/value", "setValue", 0); digester.addObjectCreate("faces-config/navigation-rule", NavigationRuleImpl.class); digester.addSetNext("faces-config/navigation-rule", "addNavigationRule"); digester.addCallMethod("faces-config/navigation-rule/from-view-id", "setFromViewId", 0); digester.addObjectCreate("faces-config/navigation-rule/navigation-case", NavigationCaseImpl.class); digester.addSetNext("faces-config/navigation-rule/navigation-case", "addNavigationCase"); digester.addCallMethod("faces-config/navigation-rule/navigation-case/from-action", "setFromAction", 0); digester.addCallMethod("faces-config/navigation-rule/navigation-case/from-outcome", "setFromOutcome", 0); digester.addCallMethod("faces-config/navigation-rule/navigation-case/if", "setIf", 0); digester.addCallMethod("faces-config/navigation-rule/navigation-case/to-view-id", "setToViewId", 0); digester.addObjectCreate("faces-config/navigation-rule/navigation-case/redirect", RedirectImpl.class); digester.addSetProperties("faces-config/navigation-rule/navigation-case/redirect", "include-view-params", "includeViewParams"); digester.addSetNext("faces-config/navigation-rule/navigation-case/redirect", "setRedirect"); digester.addObjectCreate("faces-config/navigation-rule/navigation-case/redirect/view-param", ViewParamImpl.class); digester.addSetNext("faces-config/navigation-rule/navigation-case/redirect/view-param", "addViewParam"); digester.addCallMethod("faces-config/navigation-rule/navigation-case/redirect/view-param/name", "setName", 0); digester.addCallMethod("faces-config/navigation-rule/navigation-case/redirect/view-param/value", "setValue", 0); digester.addObjectCreate("faces-config/navigation-rule/navigation-case/redirect/redirect-param", ViewParamImpl.class); digester.addSetNext("faces-config/navigation-rule/navigation-case/redirect/redirect-param", "addViewParam"); digester.addCallMethod("faces-config/navigation-rule/navigation-case/redirect/redirect-param/name", "setName", 0); digester.addCallMethod("faces-config/navigation-rule/navigation-case/redirect/redirect-param/value", "setValue", 0); digester.addObjectCreate("faces-config/render-kit", RenderKitImpl.class); digester.addSetNext("faces-config/render-kit", "addRenderKit"); digester.addCallMethod("faces-config/render-kit/render-kit-id", "setId", 0); //digester.addCallMethod("faces-config/render-kit/render-kit-class", "setRenderKitClass", 0); digester.addCallMethod("faces-config/render-kit/render-kit-class", "addRenderKitClass", 0); digester.addObjectCreate("faces-config/render-kit/renderer", RendererImpl.class); digester.addSetNext("faces-config/render-kit/renderer", "addRenderer"); digester.addCallMethod("faces-config/render-kit/renderer/component-family", "setComponentFamily", 0); digester.addCallMethod("faces-config/render-kit/renderer/renderer-type", "setRendererType", 0); digester.addCallMethod("faces-config/render-kit/renderer/renderer-class", "setRendererClass", 0); digester.addObjectCreate("faces-config/render-kit/client-behavior-renderer", ClientBehaviorRendererImpl.class); digester.addSetNext("faces-config/render-kit/client-behavior-renderer", "addClientBehaviorRenderer"); digester.addCallMethod("faces-config/render-kit/client-behavior-renderer/client-behavior-renderer-type", "setRendererType", 0); digester.addCallMethod("faces-config/render-kit/client-behavior-renderer/client-behavior-renderer-class", "setRendererClass", 0); // 2.0 behavior start digester.addObjectCreate("faces-config/behavior", BehaviorImpl.class); digester.addSetNext("faces-config/behavior", "addBehavior"); digester.addCallMethod("faces-config/behavior/behavior-id", "setBehaviorId", 0); digester.addCallMethod("faces-config/behavior/behavior-class", "setBehaviorClass", 0); digester.addObjectCreate("faces-config/behavior/attribute", AttributeImpl.class); digester.addSetNext("faces-config/behavior/attribute", "addAttribute"); digester.addCallMethod("faces-config/behavior/attribute/description", "addDescription", 0); digester.addCallMethod("faces-config/behavior/attribute/display-name", "addDisplayName", 0); digester.addCallMethod("faces-config/behavior/attribute/icon", "addIcon", 0); digester.addCallMethod("faces-config/behavior/attribute/attribute-name", "setAttributeName", 0); digester.addCallMethod("faces-config/behavior/attribute/attribute-class", "setAttributeClass", 0); digester.addCallMethod("faces-config/behavior/attribute/default-value", "setDefaultValue", 0); digester.addCallMethod("faces-config/behavior/attribute/suggested-value", "setSuggestedValue", 0); digester.addCallMethod("faces-config/behavior/attribute/attribute-extension", "addAttributeExtension", 0); digester.addObjectCreate("faces-config/behavior/property", PropertyImpl.class); digester.addSetNext("faces-config/behavior/property", "addProperty"); digester.addCallMethod("faces-config/behavior/property/description", "addDescription", 0); digester.addCallMethod("faces-config/behavior/property/display-name", "addDisplayName", 0); digester.addCallMethod("faces-config/behavior/property/icon", "addIcon", 0); digester.addCallMethod("faces-config/behavior/property/property-name", "setPropertyName", 0); digester.addCallMethod("faces-config/behavior/property/property-class", "setPropertyClass", 0); digester.addCallMethod("faces-config/behavior/property/default-value", "setDefaultValue", 0); digester.addCallMethod("faces-config/behavior/property/suggested-value", "setSuggestedValue", 0); digester.addCallMethod("faces-config/behavior/property/property-extension", "addPropertyExtension", 0); // 2.0 behavior end digester.addCallMethod("faces-config/lifecycle/phase-listener", "addLifecyclePhaseListener", 0); digester.addCallMethod("faces-config/validator", "addValidator", 2); digester.addCallParam("faces-config/validator/validator-id", 0); digester.addCallParam("faces-config/validator/validator-class", 1); // 2.1 facelets-processing start digester.addObjectCreate("faces-config/faces-config-extension", FacesConfigExtensionImpl.class); digester.addSetNext("faces-config/faces-config-extension", "addFacesConfigExtension"); digester.addObjectCreate("faces-config/faces-config-extension/facelets-processing", FaceletsProcessingImpl.class); digester.addSetNext("faces-config/faces-config-extension/facelets-processing", "addFaceletsProcessing"); digester.addCallMethod("faces-config/faces-config-extension/facelets-processing/file-extension", "setFileExtension", 0); digester.addCallMethod("faces-config/faces-config-extension/facelets-processing/process-as", "setProcessAs", 0); // 2.1 facelets-processing end //MyFaces specific facelets-processing instruction. digester.addCallMethod("faces-config/faces-config-extension/facelets-processing/oam-compress-spaces", "setOamCompressSpaces", 0); addFacesFlowRules(externalContext); } private void addNavigationRules(ExternalContext externalContext, String prefix, String method) { digester.addObjectCreate(prefix, NavigationRuleImpl.class); digester.addSetNext(prefix, method); digester.addCallMethod(prefix + "/from-view-id", "setFromViewId", 0); addNavigationCases(externalContext, prefix + "/navigation-case", "addNavigationCase"); } private void addNavigationCases(ExternalContext externalContext, String prefix, String method) { digester.addObjectCreate(prefix, NavigationCaseImpl.class); digester.addSetNext(prefix, method); digester.addCallMethod(prefix + "/from-action", "setFromAction", 0); digester.addCallMethod(prefix + "/from-outcome", "setFromOutcome", 0); digester.addCallMethod(prefix + "/if", "setIf", 0); digester.addCallMethod(prefix + "/to-view-id", "setToViewId", 0); digester.addObjectCreate(prefix + "/redirect", RedirectImpl.class); digester.addSetProperties(prefix + "/redirect", "include-view-params", "includeViewParams"); digester.addSetNext(prefix + "/redirect", "setRedirect"); digester.addObjectCreate(prefix + "/redirect/view-param", ViewParamImpl.class); digester.addSetNext(prefix + "/redirect/view-param", "addViewParam"); digester.addCallMethod(prefix + "/redirect/view-param/name", "setName", 0); digester.addCallMethod(prefix + "/redirect/view-param/value", "setValue", 0); digester.addObjectCreate(prefix + "/redirect/redirect-param", ViewParamImpl.class); digester.addSetNext(prefix + "/redirect/redirect-param", "addViewParam"); digester.addCallMethod(prefix + "/redirect/redirect-param/name", "setName", 0); digester.addCallMethod(prefix + "/redirect/redirect-param/value", "setValue", 0); } private void addFacesFlowRules(ExternalContext externalContext) { digester.addObjectCreate("faces-config/flow-definition", FacesFlowDefinitionImpl.class); digester.addSetNext("faces-config/flow-definition", "addFacesFlowDefinition"); digester.addSetProperties("faces-config/flow-definition", "id", "id"); digester.addCallMethod("faces-config/flow-definition/start-node", "setStartNode", 0); digester.addCallMethod("faces-config/flow-definition/initializer", "setInitializer", 0); digester.addCallMethod("faces-config/flow-definition/finalizer", "setFinalizer", 0); digester.addObjectCreate("faces-config/flow-definition/view", FacesFlowViewImpl.class); digester.addSetNext("faces-config/flow-definition/view", "addView"); digester.addSetProperties("faces-config/flow-definition/view", "id", "id"); digester.addCallMethod("faces-config/flow-definition/view/vdl-document", "setVdlDocument", 0); digester.addObjectCreate("faces-config/flow-definition/switch", FacesFlowSwitchImpl.class); digester.addSetNext("faces-config/flow-definition/switch", "addSwitch"); digester.addSetProperties("faces-config/flow-definition/switch", "id", "id"); digester.addObjectCreate("faces-config/flow-definition/switch/default-outcome", NavigationCaseImpl.class); digester.addSetNext("faces-config/flow-definition/switch/default-outcome", "setDefaultOutcome"); digester.addCallMethod("faces-config/flow-definition/switch/default-outcome", "setFromOutcome", 0); addNavigationCases(externalContext, "faces-config/flow-definition/switch/case", "addNavigationCase"); digester.addObjectCreate("faces-config/flow-definition/flow-return", FacesFlowReturnImpl.class); digester.addSetNext("faces-config/flow-definition/flow-return", "addReturn"); digester.addSetProperties("faces-config/flow-definition/flow-return", "id", "id"); digester.addObjectCreate("faces-config/flow-definition/flow-return/from-outcome", NavigationCaseImpl.class); digester.addSetNext("faces-config/flow-definition/flow-return/from-outcome", "setNavigationCase"); digester.addCallMethod("faces-config/flow-definition/flow-return/from-outcome", "setFromOutcome", 0); addNavigationRules(externalContext, "faces-config/flow-definition/navigation-rule", "addNavigationRule"); digester.addObjectCreate("faces-config/flow-definition/flow-call", FacesFlowCallImpl.class); digester.addSetNext("faces-config/flow-definition/flow-call", "addFlowCall"); digester.addSetProperties("faces-config/flow-definition/flow-call", "id", "id"); digester.addObjectCreate("faces-config/flow-definition/flow-call/flow-reference", FacesFlowReferenceImpl.class); digester.addSetNext("faces-config/flow-definition/flow-call/flow-reference", "setFlowReference"); digester.addCallMethod("faces-config/flow-definition/flow-call/flow-reference/flow-document-id", "setFlowDocumentId", 0); digester.addCallMethod("faces-config/flow-definition/flow-call/flow-reference/flow-id", "setFlowId", 0); digester.addObjectCreate("faces-config/flow-definition/flow-call/outbound-parameter", FacesFlowParameterImpl.class); digester.addSetNext("faces-config/flow-definition/flow-call/outbound-parameter", "addOutboundParameter"); digester.addCallMethod("faces-config/flow-definition/flow-call/outbound-parameter/name", "setName", 0); digester.addCallMethod("faces-config/flow-definition/flow-call/outbound-parameter/value", "setValue", 0); digester.addObjectCreate("faces-config/flow-definition/method-call", FacesFlowMethodCallImpl.class); digester.addSetNext("faces-config/flow-definition/method-call", "addMethodCall"); digester.addSetProperties("faces-config/flow-definition/method-call", "id", "id"); digester.addCallMethod("faces-config/flow-definition/method-call/method", "setMethod", 0); digester.addCallMethod("faces-config/flow-definition/method-call/default-outcome", "setDefaultOutcome", 0); digester.addObjectCreate("faces-config/flow-definition/method-call/parameter", FacesFlowMethodParameterImpl.class); digester.addSetNext("faces-config/flow-definition/method-call/parameter", "addParameter"); digester.addCallMethod("faces-config/flow-definition/method-call/parameter/class", "setClassName", 0); digester.addCallMethod("faces-config/flow-definition/method-call/parameter/value", "setValue", 0); digester.addObjectCreate("faces-config/flow-definition/inbound-parameter", FacesFlowParameterImpl.class); digester.addSetNext("faces-config/flow-definition/inbound-parameter", "addInboundParameter"); digester.addCallMethod("faces-config/flow-definition/inbound-parameter/name", "setName", 0); digester.addCallMethod("faces-config/flow-definition/inbound-parameter/value", "setValue", 0); //View Pool config digester.addObjectCreate("faces-config/faces-config-extension/view-pool-mapping", ViewPoolMappingImpl.class); digester.addSetNext("faces-config/faces-config-extension/view-pool-mapping", "addViewPoolMapping"); digester.addCallMethod("faces-config/faces-config-extension/view-pool-mapping/url-pattern", "setUrlPattern", 0); digester.addObjectCreate("faces-config/faces-config-extension/view-pool-mapping/parameter", ViewPoolParameterImpl.class); digester.addSetNext("faces-config/faces-config-extension/view-pool-mapping/parameter", "addParameter"); digester.addCallMethod("faces-config/faces-config-extension/view-pool-mapping/parameter/name", "setName", 0); digester.addCallMethod("faces-config/faces-config-extension/view-pool-mapping/parameter/value", "setValue", 0); } private void postProcessFacesConfig(String systemId, FacesConfigImpl config) { for (org.apache.myfaces.config.element.Application application : config.getApplications()) { for (org.apache.myfaces.config.element.LocaleConfig localeConfig : application.getLocaleConfig()) { if (!localeConfig.getSupportedLocales().contains(localeConfig.getDefaultLocale())) { localeConfig.getSupportedLocales().add(localeConfig.getDefaultLocale()); } } } for (FacesFlowDefinition facesFlowDefinition : config.getFacesFlowDefinitions()) { // JSF 2.2 section 11.4.3.1 says this: "... Flows are defined using the // <flow-definition> element. This element must have an id attribute which uniquely // identifies the flow within the scope of the Application Configuration Resource // file in which the element appears. To enable multiple flows with the same id to // exist in an application, the <faces-config><name> element is taken to // be the definingDocumentId of the flow. If no <name> element is specified, // the empty string is taken as the value for definingDocumentId. ..." if (config.getName() != null) { ((FacesFlowDefinitionImpl) facesFlowDefinition).setDefiningDocumentId(config.getName()); } else { ((FacesFlowDefinitionImpl) facesFlowDefinition).setDefiningDocumentId(""); } } } public FacesConfigImpl getFacesConfig(InputStream in, String systemId) throws IOException, SAXException { InputSource is = new InputSource(in); is.setSystemId(systemId); // Fix for http://issues.apache.org/jira/browse/MYFACES-236 FacesConfigImpl config = (FacesConfigImpl) digester.parse(is); postProcessFacesConfig(systemId, config); return config; } public FacesConfigImpl getFacesConfig(Reader r) throws IOException, SAXException { //InputSource is = new InputSource(in); //is.setSystemId(systemId); // Fix for http://issues.apache.org/jira/browse/MYFACES-236 FacesConfigImpl config = (FacesConfigImpl) digester.parse(r); postProcessFacesConfig(null, config); return config; } }