/*******************************************************************************
 * Copyright (c) 2006, 2008, 2009 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *   David Knibb               initial implementation      
 *   Matthew Webster           Eclipse 3.2 changes     
 *   Martin Lippert            extracted caching service factory
 *   Martin Lippert            caching of generated classes
 *******************************************************************************/

package org.eclipse.equinox.weaving.internal.caching.j9;

import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Map;

import com.ibm.oti.shared.HelperAlreadyDefinedException;
import com.ibm.oti.shared.Shared;
import com.ibm.oti.shared.SharedClassURLHelper;

import org.eclipse.equinox.service.weaving.CacheEntry;
import org.eclipse.equinox.service.weaving.ICachingService;
import org.osgi.framework.Bundle;

public class CachingService implements ICachingService {

    SharedClassURLHelper urlhelper;

    private final Bundle bundle;

    private final ClassLoader classLoader;

    private final String partition;

    public CachingService(final ClassLoader loader, final Bundle bundle,
            final String key) {
        if (CachingServicePlugin.DEBUG)
            System.out.println("> CachingService.<init>() bundle="
                    + bundle.getSymbolicName() + ", loader=" + loader
                    + ", key='" + key + "'");
        this.bundle = bundle;
        this.classLoader = loader;
        this.partition = hashNamespace(key + bundle.getBundleId()
                + bundle.getLastModified());
        try {
            urlhelper = Shared.getSharedClassHelperFactory().getURLHelper(
                    classLoader);
        } catch (final HelperAlreadyDefinedException e) {
            e.printStackTrace();
        }
        if (CachingServicePlugin.DEBUG)
            System.out.println("< CachingService.<init>() partition='"
                    + partition + "', urlhelper=" + urlhelper);
    }

    /**
     * @see org.eclipse.equinox.service.weaving.ICachingService#canCacheGeneratedClasses()
     */
    public boolean canCacheGeneratedClasses() {
        return false;
    }

    /**
     * @see org.eclipse.equinox.service.weaving.ICachingService#findStoredClass(java.lang.String,
     *      java.net.URL, java.lang.String)
     */
    public CacheEntry findStoredClass(final String namespace,
            final URL sourceFileURL, final String name) {
        final byte[] bytes = urlhelper.findSharedClass(partition,
                sourceFileURL, name);
        if (CachingServicePlugin.DEBUG && bytes != null)
            System.out.println("- CachingService.findStoredClass() bundle="
                    + bundle.getSymbolicName() + ", name=" + name + ", url="
                    + sourceFileURL + ", bytes=" + bytes);

        if (bytes != null) {
            return new CacheEntry(true, bytes);
        } else {
            return new CacheEntry(false, null);
        }
    }

    /**
     * Hash the shared class namespace using MD5
     * 
     * @param keyToHash
     * @return the MD5 version of the input string
     */
    public String hashNamespace(final String namespace) {
        MessageDigest md = null;
        try {
            md = MessageDigest.getInstance("MD5");
        } catch (final NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        final byte[] bytes = md.digest(namespace.getBytes());
        final StringBuffer result = new StringBuffer();
        for (int i = 0; i < bytes.length; i++) {
            final byte b = bytes[i];
            int num;
            if (b < 0) {
                num = b + 256;
            } else {
                num = b;
            }
            String s = Integer.toHexString(num);
            while (s.length() < 2) {
                s = "0" + s;
            }
            result.append(s);
        }
        return new String(result);
    }

    /**
     * @see org.eclipse.equinox.service.weaving.ICachingService#stop()
     */
    public void stop() {
    }

    /**
     * @see org.eclipse.equinox.service.weaving.ICachingService#storeClass(java.lang.String,
     *      java.net.URL, java.lang.Class, byte[])
     */
    public boolean storeClass(final String namespace, final URL sourceFileURL,
            final Class<?> clazz, final byte[] classbytes) {
        final boolean success = urlhelper.storeSharedClass(partition,
                sourceFileURL, clazz);
        if (CachingServicePlugin.DEBUG && success)
            System.out.println("- CachingService.storeClass() bundle="
                    + bundle.getSymbolicName() + ", clazz=" + clazz + ", url="
                    + sourceFileURL);
        return success;
    }

    /**
     * @see org.eclipse.equinox.service.weaving.ICachingService#storeClassAndGeneratedClasses(java.lang.String,
     *      java.net.URL, java.lang.Class, byte[], java.util.Map)
     */
    public boolean storeClassAndGeneratedClasses(final String namespace,
            final URL sourceFileUrl, final Class<?> clazz,
            final byte[] classbytes, final Map<String, byte[]> generatedClasses) {
        return false;
    }

}
