    001    // Copyright 2006, 2007 The Apache Software Foundation
    002    //
    003    // Licensed under the Apache License, Version 2.0 (the "License");
    004    // you may not use this file except in compliance with the License.
    005    // You may obtain a copy of the License at
    006    //
    007    //     http://www.apache.org/licenses/LICENSE-2.0
    008    //
    009    // Unless required by applicable law or agreed to in writing, software
    010    // distributed under the License is distributed on an "AS IS" BASIS,
    011    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    012    // See the License for the specific language governing permissions and
    013    // limitations under the License.
    014
    015    package org.apache.tapestry5.ioc.internal.util;
    016
    017    import org.apache.tapestry5.ioc.Location;
    018    import org.apache.tapestry5.ioc.Resource;
    019
    020    import java.util.Formatter;
    021
    022    /**
    023     * Implementation class for {@link org.apache.tapestry5.ioc.Location}.
    024     */
    025    public final class LocationImpl implements Location
    026    {
    027        private final Resource resource;
    028
    029        private final int line;
    030
    031        private final int column;
    032
    033        private static final int UNKNOWN = -1;
    034
    035        public LocationImpl(Resource resource)
    036        {
    037            this(resource, UNKNOWN);
    038        }
    039
    040        public LocationImpl(Resource resource, int line)
    041        {
    042            this(resource, line, UNKNOWN);
    043        }
    044
    045        public LocationImpl(Resource resource, int line, int column)
    046        {
    047            this.resource = resource;
    048            this.line = line;
    049            this.column = column;
    050        }
    051
    052        public Resource getResource()
    053        {
    054            return resource;
    055        }
    056
    057        public int getLine()
    058        {
    059            return line;
    060        }
    061
    062        public int getColumn()
    063        {
    064            return column;
    065        }
    066
    067        @Override
    068        public String toString()
    069        {
    070            StringBuilder buffer = new StringBuilder(resource.toString());
    071            Formatter formatter = new Formatter(buffer);
    072
    073            if (line != UNKNOWN) formatter.format(", line %d", line);
    074
    075            if (column != UNKNOWN) formatter.format(", column %d", column);
    076
    077            return buffer.toString();
    078        }
    079
    080        @Override
    081        public int hashCode()
    082        {
    083            final int PRIME = 31;
    084            int result = 1;
    085            result = PRIME * result + column;
    086            result = PRIME * result + line;
    087            result = PRIME * result + ((resource == null) ? 0 : resource.hashCode());
    088            return result;
    089        }
    090
    091        @Override
    092        public boolean equals(Object obj)
    093        {
    094            if (this == obj) return true;
    095            if (obj == null) return false;
    096            if (getClass() != obj.getClass()) return false;
    097            final LocationImpl other = (LocationImpl) obj;
    098            if (column != other.column) return false;
    099            if (line != other.line) return false;
    100            if (resource == null)
    101            {
    102                if (other.resource != null) return false;
    103            }
    104            else if (!resource.equals(other.resource)) return false;
    105            return true;
    106        }
    107
    108    }