package org.apache.turbine.services.urlmapper.model;

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

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;

/**
 * The url map model class
 *
 * @author <a href="mailto:tv@apache.org">Thomas Vandahl</a>
 */
@XmlType(name="map")
@XmlAccessorType(XmlAccessType.NONE)
@JsonIgnoreProperties(ignoreUnknown = true)
public class URLMapEntry
{
    private Pattern urlPattern;
    private Map<String, String> implicit = new LinkedHashMap<>();
    private Map<String, String> ignore = new LinkedHashMap<>();
    private Map<String, String> override = new LinkedHashMap<>();

    private Map<String, Integer> groupNamesMap;
    private Set<String> relevantKeys = null;

    /**
     * @return the urlPattern
     */
    @XmlElement(name="pattern")
    @XmlJavaTypeAdapter(XmlPatternAdapter.class)
    @JsonProperty("pattern")
    public Pattern getUrlPattern()
    {
        return urlPattern;
    }

    /**
     * @param urlPattern the urlPattern to set
     */
    protected void setUrlPattern(Pattern urlPattern)
    {
        this.urlPattern = urlPattern;
    }

    /**
     * @return the implicit parameters
     */
    @XmlElement(name="implicit-parameters")
    @XmlJavaTypeAdapter(XmlParameterAdapter.class)
    @JsonProperty("implicit-parameters")
    public Map<String, String> getImplicitParameters()
    {
        return implicit;
    }

    /**
     * @param implicit the implicit parameters to set
     */
    protected void setImplicitParameters(Map<String, String> implicit)
    {
        this.implicit = implicit;
    }

    /**
     * @return the ignored parameters
     */
    @XmlElement(name="ignore-parameters")
    @XmlJavaTypeAdapter(XmlParameterAdapter.class)
    @JsonProperty("ignore-parameters")
    public Map<String, String> getIgnoreParameters()
    {
        return ignore;
    }

    /**
     * @param ignore the ignored parameters to set
     */
    protected void setIgnoreParameters(Map<String, String> ignore)
    {
        this.ignore = ignore;
    }

    /**
     * @return the override parameters
     */
    @XmlElement(name="override-parameters")
    @XmlJavaTypeAdapter(XmlParameterAdapter.class)
    @JsonProperty("override-parameters")
    public Map<String, String> getOverrideParameters()
    {
        return override;
    }

    /**
     * @param override the override parameters to set
     */
    protected void setOverrideParameters(Map<String, String> override)
    {
        this.override = override;
    }

    /**
     * Get the map of group names to group indices for the stored Pattern
     *
     * @return the groupNamesMap
     */
    public Map<String, Integer> getGroupNamesMap()
    {
        return groupNamesMap;
    }

    /**
     * Set the map of group names to group indices for the stored Pattern
     *
     * @param groupNamesMap the groupNamesMap to set
     */
    public void setGroupNamesMap(Map<String, Integer> groupNamesMap)
    {
        this.groupNamesMap = groupNamesMap;
    }

    /**
     * Get the set of relevant keys for comparison (cached for performance)
     *
     * @return the relevantKeys
     */
    public Set<String> getRelevantKeys()
    {
        return relevantKeys;
    }

    /**
     * Set the set of relevant keys for comparison (cached for performance)
     *
     * @param relevantKeys the relevantKeys to set
     */
    public void setRelevantKeys(Set<String> relevantKeys)
    {
        this.relevantKeys = relevantKeys;
    }

    @Override
    public String toString()
    {
    	return "URLMapEntry: [ pattern: " + urlPattern + ", implicit-parameters: " + implicit + ", override-parameters: " + override + ", ignore-parameters:" + ignore + " ]";
    }
}
