001: /*
002: Copyright (c) 2003-2005, Dennis M. Sosnoski
003: All rights reserved.
004:
005: Redistribution and use in source and binary forms, with or without modification,
006: are permitted provided that the following conditions are met:
007:
008: * Redistributions of source code must retain the above copyright notice, this
009: list of conditions and the following disclaimer.
010: * Redistributions in binary form must reproduce the above copyright notice,
011: this list of conditions and the following disclaimer in the documentation
012: and/or other materials provided with the distribution.
013: * Neither the name of JiBX nor the names of its contributors may be used
014: to endorse or promote products derived from this software without specific
015: prior written permission.
016:
017: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
018: ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
019: WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
020: DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
021: ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
022: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
023: LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
024: ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
025: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
026: SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
027: */
028:
029: package org.jibx.binding.classes;
030:
031: import org.apache.bcel.classfile.Method;
032: import org.jibx.runtime.JiBXException;
033:
034: /**
035: * Information for an existing binding method. It supplies hash code and
036: * equality checking based on the method signature and actual byte code of the
037: * generated method, ignoring the method name.
038: *
039: * @author Dennis M. Sosnoski
040: * @version 1.0
041: */
042:
043: public class ExistingMethod extends BindingMethod {
044: /** Class item information. */
045: private ClassItem m_item;
046:
047: /** Actual method information. */
048: private Method m_method;
049:
050: /** Accumulated hash code from adding instructions. */
051: private int m_hashCode;
052:
053: /** Flag for method used in code. */
054: private boolean m_used;
055:
056: /**
057: * Constructor.
058: *
059: * @param method actual method information
060: * @param item class item information for method
061: * @param file class file information
062: */
063:
064: public ExistingMethod(Method method, ClassItem item, ClassFile file) {
065: super (file);
066: m_item = item;
067: m_method = method;
068: m_hashCode = computeMethodHash(method);
069: // System.out.println("Computed hash for existing method " +
070: // m_classFile.getName() + '.' + method.getName() + " as " + m_hashCode);
071: }
072:
073: /**
074: * Get name of method.
075: *
076: * @return method name
077: */
078:
079: public String getName() {
080: return m_item.getName();
081: }
082:
083: /**
084: * Get signature.
085: *
086: * @return signature for method
087: */
088:
089: public String getSignature() {
090: return m_item.getSignature();
091: }
092:
093: /**
094: * Get access flags.
095: *
096: * @return flags for access type of method
097: */
098:
099: public int getAccessFlags() {
100: return m_item.getAccessFlags();
101: }
102:
103: /**
104: * Set access flags.
105: *
106: * @param flags access type to be set
107: */
108:
109: public void setAccessFlags(int flags) {
110: m_item.setAccessFlags(flags);
111: }
112:
113: /**
114: * Check method used status.
115: *
116: * @return method used status
117: */
118:
119: public boolean isUsed() {
120: return m_used;
121: }
122:
123: /**
124: * Set method used status.
125: */
126:
127: public void setUsed() {
128: m_used = true;
129: }
130:
131: /**
132: * Get the actual method.
133: *
134: * @return method information
135: */
136:
137: public Method getMethod() {
138: return m_method;
139: }
140:
141: /**
142: * Get the method item.
143: *
144: * @return method item information
145: */
146:
147: public ClassItem getItem() {
148: return m_item;
149: }
150:
151: /**
152: * Delete method from class.
153: *
154: * @throws JiBXException if unable to delete method
155: */
156:
157: public void delete() throws JiBXException {
158: getClassFile().removeMethod(m_method);
159: }
160:
161: /**
162: * Get hash code.
163: *
164: * @return hash code for this method
165: */
166:
167: public int hashCode() {
168: return m_hashCode;
169: }
170: }
|