001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.wicket.util.parse.metapattern;
018
019import java.util.regex.Matcher;
020
021/**
022 * A Group that captures integer values (positive and negative whole numbers, not Java ints).
023 * 
024 * @author Jonathan Locke
025 */
026public final class IntegerGroup extends Group
027{
028        private static final long serialVersionUID = 1L;
029
030        /** The radix to use when converting Strings captured by this group. */
031        private final int radix;
032
033        /**
034         * Constructs an IntegerGroup that parses Strings that match the INTEGER pattern in base 10.
035         * 
036         * @see MetaPattern#INTEGER
037         */
038        public IntegerGroup()
039        {
040                this(INTEGER);
041        }
042
043        /**
044         * Constructs an IntegerGroup that parses Strings that match the given pattern in base 10.
045         * 
046         * @param pattern
047         *            The capturing pattern
048         */
049        public IntegerGroup(final MetaPattern pattern)
050        {
051                this(pattern, 10);
052        }
053
054        /**
055         * Constructs an IntegerGroup that parses Strings that match the given pattern in the given
056         * radix.
057         * 
058         * @param pattern
059         *            The capturing pattern
060         * @param radix
061         *            The radix to use when parsing captured Strings
062         */
063        public IntegerGroup(final MetaPattern pattern, final int radix)
064        {
065                super(pattern);
066                this.radix = radix;
067        }
068
069        /**
070         * @param matcher
071         *            The matcher
072         * @return The value
073         * @see IntegerGroup#getInt(Matcher, int)
074         */
075        public int getInt(final Matcher matcher)
076        {
077                return getInt(matcher, -1);
078        }
079
080        /**
081         * Gets an int by parsing the String matched by this capturing group. The IntegerGroup's radix
082         * is used in the conversion.
083         * 
084         * @param matcher
085         *            The matcher
086         * @param defaultValue
087         *            The default value to use if this group is omitted because it is optional
088         * @return The parsed int value
089         */
090        public int getInt(final Matcher matcher, final int defaultValue)
091        {
092                final String value = get(matcher);
093                return value == null ? defaultValue : Integer.parseInt(value, radix);
094        }
095
096        /**
097         * @param matcher
098         *            The matcher
099         * @return The value
100         * @see IntegerGroup#getLong(Matcher)
101         */
102        public long getLong(final Matcher matcher)
103        {
104                return getLong(matcher, -1L);
105        }
106
107        /**
108         * Gets a long by parsing the String matched by this capturing group. The IntegerGroup's radix
109         * is used in the conversion. parsing radix.
110         * 
111         * @param defaultValue
112         *            The default value to use if this group is omitted because it is optional
113         * @param matcher
114         *            The matcher
115         * @return The parsed long value
116         */
117        public long getLong(final Matcher matcher, final long defaultValue)
118        {
119                final String value = get(matcher);
120                return value == null ? defaultValue : Long.parseLong(value, radix);
121        }
122}