001 // Copyright 2004, 2005 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.hivemind.impl;
016
017 import org.apache.hivemind.Location;
018 import org.apache.hivemind.Resource;
019
020 /**
021 * Implementation of the {@link org.apache.hivemind.Location} interface.
022 * Uses a line and column based position.
023 *
024 * @author Howard Lewis Ship
025 */
026 public final class LocationImpl implements Location
027 {
028 private Resource _resource;
029 private int _lineNumber = -1;
030 private int _columnNumber = -1;
031
032 public LocationImpl(Resource resource)
033 {
034 _resource = resource;
035 }
036
037 public LocationImpl(Resource resource, int lineNumber)
038 {
039 this(resource);
040
041 _lineNumber = lineNumber;
042 }
043
044 public LocationImpl(Resource resource, int lineNumber, int columnNumber)
045 {
046 this(resource);
047
048 _lineNumber = lineNumber;
049 _columnNumber = columnNumber;
050 }
051
052 public Resource getResource()
053 {
054 return _resource;
055 }
056
057 public int getLineNumber()
058 {
059 return _lineNumber;
060 }
061
062 public int getColumnNumber()
063 {
064 return _columnNumber;
065 }
066
067 public int hashCode()
068 {
069 return ((237 + _resource.hashCode()) << 3 + _lineNumber) << 3 + _columnNumber;
070 }
071
072 public boolean equals(Object other)
073 {
074 if (!(other instanceof LocationImpl))
075 return false;
076
077 LocationImpl l = (LocationImpl) other;
078
079 if (_lineNumber != l.getLineNumber())
080 return false;
081
082 if (_columnNumber != l.getColumnNumber())
083 return false;
084
085 return _resource.equals(l.getResource());
086 }
087
088 /**
089 * Returns the position in format "line x, column y"
090 *
091 * @see org.apache.hivemind.Location#getPosition()
092 */
093 public String getPosition()
094 {
095 String result = "";
096
097 if (_lineNumber > 0)
098 {
099 result += "line " + _lineNumber;
100 }
101
102 if (_columnNumber > 0)
103 {
104 if (result.length() > 0) {
105 result += ", ";
106 }
107 result += "column " + _columnNumber;
108 }
109
110 return result;
111 }
112
113 public String toString()
114 {
115 StringBuffer buffer = new StringBuffer(_resource.toString());
116 String position = getPosition();
117 if (position.length() > 0) {
118 buffer.append(", ");
119 buffer.append(position);
120 }
121
122 return buffer.toString();
123 }
124
125 }