/*
 * 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.
 */

/* $Id$ */

package org.apache.fop.render.afp.extensions;

import org.apache.xmlgraphics.util.QName;

import org.apache.fop.fo.ElementMapping;
import org.apache.fop.fo.FONode;


/**
 * AFPElementMapping object provides the ability to extract information
 * from the formatted object that reside in the afp namespace. This is used
 * for custom AFP extensions not supported by the FO schema. Examples include
 * adding overlays or indexing a document using the tag logical element
 * structured field.
 * <p>
 */
public class AFPElementMapping extends ElementMapping {

    /** tag logical element */
    public static final String TAG_LOGICAL_ELEMENT = "tag-logical-element";

    /** include page overlay element */
    public static final String INCLUDE_PAGE_OVERLAY = "include-page-overlay";

    /** include page segment element */
    public static final String INCLUDE_PAGE_SEGMENT = "include-page-segment";

    /** include form map element */
    public static final String INCLUDE_FORM_MAP = "include-form-map";

    /** NOP */
    public static final String NO_OPERATION = "no-operation";

    /** IMM: Invoke Medium Map (on fo:page-sequence) */
    public static final String INVOKE_MEDIUM_MAP = "invoke-medium-map";

    /**
     * The namespace used for AFP extensions
     */
    public static final String NAMESPACE = "http://xmlgraphics.apache.org/fop/extensions/afp";

    public static final QName PAGE_GROUP = new QName(NAMESPACE, null, "page-group");

    /**
     * The usual namespace prefix used for AFP extensions
     */
    public static final String NAMESPACE_PREFIX = "afp";

    /** Main constructor */
    public AFPElementMapping() {
        this.namespaceURI = NAMESPACE;
    }

    /**
     * Private static synchronized method to set up the element and attribute
     * HashMaps, this defines what elements and attributes are extracted.
     */
    protected void initialize() {

        if (foObjs == null) {
            super.foObjs = new java.util.HashMap<String, Maker>();
            foObjs.put(
                TAG_LOGICAL_ELEMENT,
                new AFPTagLogicalElementMaker());
            foObjs.put(
                INCLUDE_PAGE_SEGMENT,
                new AFPIncludePageSegmentMaker());
            foObjs.put(
                INCLUDE_PAGE_OVERLAY,
                new AFPIncludePageOverlayMaker());
            foObjs.put(
                INCLUDE_FORM_MAP,
                new AFPIncludeFormMapMaker());
            foObjs.put(
                NO_OPERATION,
                new AFPNoOperationMaker());
            foObjs.put(
                INVOKE_MEDIUM_MAP,
                new AFPInvokeMediumMapMaker());
        }
    }

    static class AFPIncludePageOverlayMaker extends ElementMapping.Maker {
        public FONode make(FONode parent) {
            return new AFPPageOverlayElement(parent, INCLUDE_PAGE_OVERLAY);
        }
    }

    static class AFPIncludePageSegmentMaker extends ElementMapping.Maker {
        public FONode make(FONode parent) {
            return new AFPPageSegmentElement(parent, INCLUDE_PAGE_SEGMENT);
        }
    }

    static class AFPIncludeFormMapMaker extends ElementMapping.Maker {
        public FONode make(FONode parent) {
            return new AFPIncludeFormMapElement(parent, INCLUDE_FORM_MAP);
        }
    }

    static class AFPTagLogicalElementMaker extends ElementMapping.Maker {
        public FONode make(FONode parent) {
            return new AFPPageSetupElement(parent, TAG_LOGICAL_ELEMENT);
        }
    }

    static class AFPNoOperationMaker extends ElementMapping.Maker {
        public FONode make(FONode parent) {
            return new AFPPageSetupElement(parent, NO_OPERATION);
        }
    }

    static class AFPInvokeMediumMapMaker extends ElementMapping.Maker {
        public FONode make(FONode parent) {
            return new AFPInvokeMediumMapElement(parent);
        }
    }

}
