169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal/*
269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Javassist, a Java-bytecode translator toolkit.
369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Copyright (C) 1999-2007 Shigeru Chiba. All Rights Reserved.
469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal *
569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * The contents of this file are subject to the Mozilla Public License Version
669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * 1.1 (the "License"); you may not use this file except in compliance with
769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * the License.  Alternatively, the contents of this file may be used under
869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * the terms of the GNU Lesser General Public License Version 2.1 or later.
969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal *
1069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Software distributed under the License is distributed on an "AS IS" basis,
1169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
1269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * for the specific language governing rights and limitations under the
1369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * License.
1469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */
1569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
1669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalpackage javassist;
1769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
1869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.bytecode.ClassFile;
1969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.bytecode.AccessFlag;
2069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.bytecode.InnerClassesAttribute;
2169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
2269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal/**
2369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * A newly created public nested class.
2469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */
2569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalclass CtNewNestedClass extends CtNewClass {
2669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    CtNewNestedClass(String realName, ClassPool cp, boolean isInterface,
2769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                     CtClass superclass) {
2869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        super(realName, cp, isInterface, superclass);
2969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
3069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
3169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
3269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * This method does not change the STATIC bit.  The original value is kept.
3369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
3469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void setModifiers(int mod) {
3569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        mod = mod & ~Modifier.STATIC;
3669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        super.setModifiers(mod);
3769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        updateInnerEntry(mod, getName(), this, true);
3869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
3969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
4069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    private static void updateInnerEntry(int mod, String name, CtClass clazz, boolean outer) {
4169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        ClassFile cf = clazz.getClassFile2();
4269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        InnerClassesAttribute ica = (InnerClassesAttribute)cf.getAttribute(
4369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                                                InnerClassesAttribute.tag);
4469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if (ica == null)
4569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return;
4669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
4769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        int n = ica.tableLength();
4869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        for (int i = 0; i < n; i++)
4969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            if (name.equals(ica.innerClass(i))) {
5069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                int acc = ica.accessFlags(i) & AccessFlag.STATIC;
5169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                ica.setAccessFlags(i, mod | acc);
5269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                String outName = ica.outerClass(i);
5369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                if (outName != null && outer)
5469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                    try {
5569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                        CtClass parent = clazz.getClassPool().get(outName);
5669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                        updateInnerEntry(mod, name, parent, false);
5769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                    }
5869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                    catch (NotFoundException e) {
5969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                        throw new RuntimeException("cannot find the declaring class: "
6069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                                                   + outName);
6169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                    }
6269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
6369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                break;
6469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            }
6569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
6669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal}
67