/*
 * weinre is available under *either* the terms of the modified BSD license *or* the
 * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
 * 
 * Copyright (c) 2011 IBM Corporation
 */

package weinre.server;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.jetty.util.resource.Resource;

//-------------------------------------------------------------------
public class ExtensionManager {
    static private File     weinreHomeDir = null;     
    static private File     weinreExtDir  = null;    
    static private long     weinreExtDate = 0L;
    static private String[] extensions    = null;
    
    static private String[] EMPTY_STRING_ARRAY = {};

    //---------------------------------------------------------------
    static {
        initExtensions();
    }
    
    //---------------------------------------------------------------
    static public String[] getExtensions() {
        if (weinreExtDate != weinreExtDir.lastModified()) {
            initExtensions();
        }
        
        return extensions;
    }
    
    //---------------------------------------------------------------
    // path: /client/extensions/weinre-ext-sample/extension.html
    static public Resource getResource(String path) throws MalformedURLException {
        File resourceFile = new File(weinreExtDir, path.substring(18));
        if (!resourceFile.exists()) return null;
        
        try {
            return Resource.newResource(resourceFile.toURI().toURL().toExternalForm(), false);
        } 
        catch (IOException e) {
            throw new MalformedURLException();
        }
    }
    
    //---------------------------------------------------------------
    static private void initExtensions() {
        
        weinreHomeDir = new File(System.getProperty("user.home"), ".weinre");
        if (!weinreHomeDir.isDirectory()) {
            Main.info("extensions not enabled: ~/.weinre is not a directory");
            return;
        }

        weinreExtDir  = new File(weinreHomeDir, "extensions");
        weinreExtDate = weinreExtDir.lastModified();
        if (!weinreExtDir.isDirectory()) {
            Main.info("extensions not enabled: ~/.weinre/extensions is not a directory");
            return;
        }
        
        extensions = EMPTY_STRING_ARRAY;
            
        List<String> extensionList = new ArrayList<String>();
        
        String[] entries = weinreExtDir.list();
        for (String entry: entries) {
            if (entry.startsWith(".")) continue;
            
            File extDir = new File(weinreExtDir, entry);
            if (!extDir.isDirectory()) continue;
            
            File extensionHtml = new File(extDir, "extension.html");
            if (!extensionHtml.isFile()) continue;
            
            extensionList.add(entry);
        }
        
        extensions = extensionList.toArray(EMPTY_STRING_ARRAY);
    }
    
}
