/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.felix.deploymentadmin;

import java.util.BitSet;
import java.util.jar.Attributes;

import org.osgi.service.deploymentadmin.DeploymentException;

/**
 * Objects of this class represent the meta data for a resource from a deployment package, this
 * can be either bundle resources or processed resources.
 */
public class AbstractInfo implements Constants {

    private static final BitSet VALID_RESOURCE_PATH_CHARS;
    static {
        VALID_RESOURCE_PATH_CHARS = new BitSet();
        for (int i = 'a'; i <= 'z'; i++) {
            VALID_RESOURCE_PATH_CHARS.set(i);
        }
        for (int i = 'A'; i <= 'Z'; i++) {
            VALID_RESOURCE_PATH_CHARS.set(i);
        }
        for (int i = '0'; i <= '9'; i++) {
            VALID_RESOURCE_PATH_CHARS.set(i);
        }
        VALID_RESOURCE_PATH_CHARS.set('.');
        VALID_RESOURCE_PATH_CHARS.set('-');
        VALID_RESOURCE_PATH_CHARS.set('_');
        VALID_RESOURCE_PATH_CHARS.set('/');
    }

    private final String m_path;
    private final Attributes m_attributes;
    private final boolean m_missing;

    /**
     * Create an instance
     *
     * @param path Resource-id aka path of the resource
     * @param attributes Attributes containing the meta data of the resource
     * @throws DeploymentException If the specified attributes do not match the correct syntax for a deployment package resource.
     */
    public AbstractInfo(String path, Attributes attributes) throws DeploymentException {
        verifyEntryName(path);
        m_path = path;
        m_attributes = attributes;
        m_missing = parseBooleanHeader(attributes, DEPLOYMENTPACKAGE_MISSING);
    }

    /**
     * @return The path of the resource
     */
    public String getPath() {
        return m_path;
    }

    /**
     * Return the value of a header for this resource
     * 
     * @param header Name of the header
     * @return Value of the header specified by the given header name
     */
    public String getHeader(String header) {
        return m_attributes.getValue(header);
    }

    private void verifyEntryName(String name) throws DeploymentException {
        byte[] bytes = name.getBytes();
        boolean delimiterSeen = false;
        for (int j = 0; j < bytes.length; j++) {
            if (!VALID_RESOURCE_PATH_CHARS.get(bytes[j])) {
                throw new DeploymentException(CODE_BAD_HEADER, "Resource ID '" + name + "' contains invalid character(s)");
            }
            if (bytes[j] == '/') {
                if (delimiterSeen) {
                    throw new DeploymentException(CODE_BAD_HEADER, "Resource ID '" + name + "' contains multiple consequetive path seperators");
                }
                else {
                    delimiterSeen = true;
                }
            }
            else {
                delimiterSeen = false;
            }
        }
    }

    /**
     * Determine if a resource is missing or not
     * 
     * @return True if the actual data for this resource is not present, false otherwise
     */
    public boolean isMissing() {
        return m_missing;
    }

    /**
     * Parses a header that is allowed to have only boolean values.
     *
     * @param attributes Set of attributes containing the header
     * @param header The header to verify
     * @return true if the value of the header was "true", false if the value was "false"
     * @throws DeploymentException if the value was not "true" or "false"
     */
    protected boolean parseBooleanHeader(Attributes attributes, String header) throws DeploymentException {
        String value = attributes.getValue(header);
        if (value != null) {
            if ("true".equals(value)) {
                return true;
            }
            else if ("false".equals(value)) {
                return false;
            }
            else {
                throw new DeploymentException(CODE_BAD_HEADER, "Invalid '" + header + "' header for manifest " + "entry '" + getPath() + "' header, should be either 'true' or 'false' or not present");
            }
        }
        return false;
    }

}
