    001/*
    002 * Licensed to the Apache Software Foundation (ASF) under one
    003 * or more contributor license agreements.  See the NOTICE file
    004 * distributed with this work for additional information
    005 * regarding copyright ownership.  The ASF licenses this file
    006 * to you under the Apache License, Version 2.0 (the
    007 * "License"); you may not use this file except in compliance
    008 * with the License.  You may obtain a copy of the License at
    009 *
    010 *   https://www.apache.org/licenses/LICENSE-2.0
    011 *
    012 * Unless required by applicable law or agreed to in writing,
    013 * software distributed under the License is distributed on an
    014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    015 * KIND, either express or implied.  See the License for the
    016 * specific language governing permissions and limitations
    017 * under the License.
    018 */
    019package org.apache.commons.compress.harmony.unpack200;
    020
    021import java.io.IOException;
    022import java.io.InputStream;
    023
    024import org.apache.commons.compress.harmony.pack200.Codec;
    025import org.apache.commons.compress.harmony.pack200.Pack200Exception;
    026import org.apache.commons.compress.harmony.unpack200.bytecode.AnnotationDefaultAttribute;
    027import org.apache.commons.compress.harmony.unpack200.bytecode.CodeAttribute;
    028import org.apache.commons.compress.harmony.unpack200.bytecode.ConstantValueAttribute;
    029import org.apache.commons.compress.harmony.unpack200.bytecode.DeprecatedAttribute;
    030import org.apache.commons.compress.harmony.unpack200.bytecode.EnclosingMethodAttribute;
    031import org.apache.commons.compress.harmony.unpack200.bytecode.ExceptionsAttribute;
    032import org.apache.commons.compress.harmony.unpack200.bytecode.InnerClassesAttribute;
    033import org.apache.commons.compress.harmony.unpack200.bytecode.LineNumberTableAttribute;
    034import org.apache.commons.compress.harmony.unpack200.bytecode.LocalVariableTableAttribute;
    035import org.apache.commons.compress.harmony.unpack200.bytecode.LocalVariableTypeTableAttribute;
    036import org.apache.commons.compress.harmony.unpack200.bytecode.SignatureAttribute;
    037import org.apache.commons.compress.harmony.unpack200.bytecode.SourceFileAttribute;
    038
    039/**
    040 * Attribute definition bands are the set of bands used to define extra attributes transmitted in the archive.
    041 */
    042public class AttrDefinitionBands extends BandSet {
    043
    044    private int[] attributeDefinitionHeader;
    045
    046    private String[] attributeDefinitionLayout;
    047
    048    private String[] attributeDefinitionName;
    049
    050    private AttributeLayoutMap attributeDefinitionMap;
    051
    052    private final String[] cpUTF8;
    053
    054    /**
    055     * Constructs a new instance.
    056     *
    057     * @param segment the segment.
    058     */
    059    public AttrDefinitionBands(final Segment segment) {
    060        super(segment);
    061        this.cpUTF8 = segment.getCpBands().getCpUTF8();
    062    }
    063
    064    /**
    065     * Gets the attribute layout map.
    066     *
    067     * @return the attribute layout map.
    068     */
    069    public AttributeLayoutMap getAttributeDefinitionMap() {
    070        return attributeDefinitionMap;
    071    }
    072
    073    /*
    074     * (non-Javadoc)
    075     *
    076     * @see org.apache.commons.compress.harmony.unpack200.BandSet#unpack(java.io.InputStream)
    077     */
    078    @Override
    079    public void read(final InputStream in) throws IOException, Pack200Exception {
    080        final int attributeDefinitionCount = header.getAttributeDefinitionCount();
    081        attributeDefinitionHeader = decodeBandInt("attr_definition_headers", in, Codec.BYTE1, attributeDefinitionCount);
    082        attributeDefinitionName = parseReferences("attr_definition_name", in, Codec.UNSIGNED5, attributeDefinitionCount, cpUTF8);
    083        attributeDefinitionLayout = parseReferences("attr_definition_layout", in, Codec.UNSIGNED5, attributeDefinitionCount, cpUTF8);
    084
    085        attributeDefinitionMap = new AttributeLayoutMap();
    086
    087        int overflowIndex = 32;
    088        if (segment.getSegmentHeader().getOptions().hasClassFlagsHi()) {
    089            overflowIndex = 63;
    090        }
    091        for (int i = 0; i < attributeDefinitionCount; i++) {
    092            final int context = attributeDefinitionHeader[i] & 0x03;
    093            int index = (attributeDefinitionHeader[i] >> 2) - 1;
    094            if (index == -1) {
    095                index = overflowIndex++;
    096            }
    097            final AttributeLayout layout = new AttributeLayout(attributeDefinitionName[i], context, attributeDefinitionLayout[i], index, false);
    098            final NewAttributeBands newBands = new NewAttributeBands(segment, layout);
    099            attributeDefinitionMap.add(layout, newBands);
    100        }
    101        attributeDefinitionMap.checkMap();
    102        setupDefaultAttributeNames();
    103    }
    104
    105    private void setupDefaultAttributeNames() {
    106        AnnotationDefaultAttribute.setAttributeName(segment.getCpBands().cpUTF8Value("AnnotationDefault")); //$NON-NLS-1$
    107        CodeAttribute.setAttributeName(segment.getCpBands().cpUTF8Value("Code")); //$NON-NLS-1$
    108        ConstantValueAttribute.setAttributeName(segment.getCpBands().cpUTF8Value("ConstantValue")); //$NON-NLS-1$
    109        DeprecatedAttribute.setAttributeName(segment.getCpBands().cpUTF8Value("Deprecated")); //$NON-NLS-1$
    110        EnclosingMethodAttribute.setAttributeName(segment.getCpBands().cpUTF8Value("EnclosingMethod")); //$NON-NLS-1$
    111        ExceptionsAttribute.setAttributeName(segment.getCpBands().cpUTF8Value("Exceptions")); //$NON-NLS-1$
    112        InnerClassesAttribute.setAttributeName(segment.getCpBands().cpUTF8Value("InnerClasses")); //$NON-NLS-1$
    113        LineNumberTableAttribute.setAttributeName(segment.getCpBands().cpUTF8Value("LineNumberTable")); //$NON-NLS-1$
    114        LocalVariableTableAttribute.setAttributeName(segment.getCpBands().cpUTF8Value("LocalVariableTable")); //$NON-NLS-1$
    115        LocalVariableTypeTableAttribute.setAttributeName(segment.getCpBands().cpUTF8Value("LocalVariableTypeTable")); //$NON-NLS-1$
    116        SignatureAttribute.setAttributeName(segment.getCpBands().cpUTF8Value("Signature")); //$NON-NLS-1$
    117        SourceFileAttribute.setAttributeName(segment.getCpBands().cpUTF8Value("SourceFile")); //$NON-NLS-1$
    118        MetadataBandGroup.setRvaAttributeName(segment.getCpBands().cpUTF8Value("RuntimeVisibleAnnotations"));
    119        MetadataBandGroup.setRiaAttributeName(segment.getCpBands().cpUTF8Value("RuntimeInvisibleAnnotations"));
    120        MetadataBandGroup.setRvpaAttributeName(segment.getCpBands().cpUTF8Value("RuntimeVisibleParameterAnnotations"));
    121        MetadataBandGroup.setRipaAttributeName(segment.getCpBands().cpUTF8Value("RuntimeInvisibleParameterAnnotations"));
    122    }
    123
    124    @Override
    125    public void unpack() throws Pack200Exception, IOException {
    126
    127    }
    128
    129}