CPClass.java

  1. /*
  2.  *  Licensed to the Apache Software Foundation (ASF) under one or more
  3.  *  contributor license agreements.  See the NOTICE file distributed with
  4.  *  this work for additional information regarding copyright ownership.
  5.  *  The ASF licenses this file to You under the Apache License, Version 2.0
  6.  *  (the "License"); you may not use this file except in compliance with
  7.  *  the License.  You may obtain a copy of the License at
  8.  *
  9.  *     http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  *  Unless required by applicable law or agreed to in writing, software
  12.  *  distributed under the License is distributed on an "AS IS" BASIS,
  13.  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  *  See the License for the specific language governing permissions and
  15.  *  limitations under the License.
  16.  */
  17. package org.apache.commons.compress.harmony.unpack200.bytecode;

  18. import java.io.DataOutputStream;
  19. import java.io.IOException;
  20. import java.util.Objects;

  21. /**
  22.  * Constant pool entry for a class
  23.  */
  24. public class CPClass extends ConstantPoolEntry {

  25.     private int index;

  26.     public String name;

  27.     private final CPUTF8 utf8;

  28.     private boolean hashCodeComputed;

  29.     private int cachedHashCode;

  30.     /**
  31.      * Creates a new CPClass
  32.      *
  33.      * @param name        TODO
  34.      * @param globalIndex index in CpBands
  35.      * @throws NullPointerException if name is null
  36.      */
  37.     public CPClass(final CPUTF8 name, final int globalIndex) {
  38.         super(CP_Class, globalIndex);
  39.         this.name = Objects.requireNonNull(name, "name").underlyingString();
  40.         this.utf8 = name;
  41.     }

  42.     @Override
  43.     public boolean equals(final Object obj) {
  44.         if (this == obj) {
  45.             return true;
  46.         }
  47.         if (obj == null) {
  48.             return false;
  49.         }
  50.         if (this.getClass() != obj.getClass()) {
  51.             return false;
  52.         }
  53.         final CPClass other = (CPClass) obj;
  54.         return utf8.equals(other.utf8);
  55.     }

  56.     private void generateHashCode() {
  57.         hashCodeComputed = true;
  58.         cachedHashCode = utf8.hashCode();
  59.     }

  60.     public String getName() {
  61.         return name;
  62.     }

  63.     @Override
  64.     protected ClassFileEntry[] getNestedClassFileEntries() {
  65.         return new ClassFileEntry[] { utf8, };
  66.     }

  67.     @Override
  68.     public int hashCode() {
  69.         if (!hashCodeComputed) {
  70.             generateHashCode();
  71.         }
  72.         return cachedHashCode;
  73.     }

  74.     @Override
  75.     protected void resolve(final ClassConstantPool pool) {
  76.         super.resolve(pool);
  77.         index = pool.indexOf(utf8);
  78.     }

  79.     @Override
  80.     public String toString() {
  81.         return "Class: " + getName();
  82.     }

  83.     @Override
  84.     protected void writeBody(final DataOutputStream dos) throws IOException {
  85.         dos.writeShort(index);
  86.     }
  87. }