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.commons.compress.harmony.unpack200.bytecode; 018 019import java.io.DataOutputStream; 020import java.io.IOException; 021 022/** 023 * UTF8 constant pool entry, used for storing long Strings. 024 */ 025public class CPUTF8 extends ConstantPoolEntry { 026 027 private final String utf8; 028 029 /** 030 * Creates a new CPUTF8 instance 031 * 032 * @param utf8 TODO 033 * @param globalIndex - index in CpBands 034 * @throws NullPointerException if utf8 is null 035 */ 036 public CPUTF8(final String utf8, final int globalIndex) { 037 super(ConstantPoolEntry.CP_UTF8, globalIndex); 038 this.utf8 = utf8; 039 if (utf8 == null) { 040 throw new NullPointerException("Null arguments are not allowed"); 041 } 042 } 043 044 public CPUTF8(final String string) { 045 this(string, -1); 046 } 047 048 @Override 049 public boolean equals(final Object obj) { 050 if (this == obj) { 051 return true; 052 } 053 if (obj == null) { 054 return false; 055 } 056 if (this.getClass() != obj.getClass()) { 057 return false; 058 } 059 final CPUTF8 other = (CPUTF8) obj; 060 return utf8.equals(other.utf8); 061 } 062 063 private boolean hashcodeComputed; 064 private int cachedHashCode; 065 066 private void generateHashCode() { 067 hashcodeComputed = true; 068 final int PRIME = 31; 069 cachedHashCode = PRIME + utf8.hashCode(); 070 } 071 072 @Override 073 public int hashCode() { 074 if (!hashcodeComputed) { 075 generateHashCode(); 076 } 077 return cachedHashCode; 078 } 079 080 @Override 081 public String toString() { 082 return "UTF8: " + utf8; 083 } 084 085 @Override 086 protected void writeBody(final DataOutputStream dos) throws IOException { 087 dos.writeUTF(utf8); 088 } 089 090 public String underlyingString() { 091 return utf8; 092 } 093 094 public void setGlobalIndex(final int index) { 095 globalIndex = index; 096 } 097}