/*******************************************************************************
 * Copyright (c), 2001, 2002 N2 Broadband, Inc.  All Rights Reserved.
 *
 * This module contains unpublished, confidential, proprietary
 * material.  The use and dissemination of this material are
 * governed by a license.  The above copyright notice does not
 * evidence any actual or intended publication of this material.
 *
 * Author:  Drake H. Henderson
 * Created:  11-12-01
 *
 ******************************************************************************/

package com.n2bb.plugins;

import java.util.Set;
import java.util.Map;
import java.util.Iterator;
import java.util.Properties;
import java.util.TreeMap;
import java.util.Collections;
import java.io.InputStream;
import javax.servlet.ServletException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.action.PlugIn;
import org.apache.struts.config.ModuleConfig;
import com.n2bb.web.help.HelpBean;
import com.n2bb.util.N2bbException;

public final class HelpPlugIn implements PlugIn {

  private Log n2bbLog = LogFactory.getLog(HelpPlugIn.class);

  private ActionServlet servlet = null;

  private String helpBase = "/help/";
  
  /*****
   *
   *****/
  public void init(ActionServlet servlet, ModuleConfig config) throws ServletException {
    n2bbLog.debug("enter");
    
    this.servlet = servlet;
    
    Map products = Collections.synchronizedMap(new TreeMap());

    Set helpPaths = servlet.getServletContext().getResourcePaths(helpBase);
    for (Iterator i=helpPaths.iterator(); i.hasNext();) {
      String path = (String)i.next();
      if (path.endsWith("/")) {
        try {
          Properties props = new Properties();
          InputStream is = servlet.getServletContext().getResourceAsStream(path + "product.properties");
          if (is == null) {
            n2bbLog.error("no product.properties file under... " + path + " - skipping directory");
            continue;
          } else {
            try {
              props.load(is);
            } catch (Exception e) {
              n2bbLog.warn("failed to load product.properties - message... " + e.getMessage(), e);
            }
          }
          
          // truncate version to 3 places...
          String version = parseVersion(props.getProperty("version"));
          HelpBean bean = new HelpBean(props.getProperty("name"), version);
          n2bbLog.info("product name... " + bean.getName());
          n2bbLog.info("path... " + path);
          
          Set helpFiles = servlet.getServletContext().getResourcePaths(path);
          for (Iterator i2=helpFiles.iterator(); i2.hasNext();) {
            String file = (String)i2.next();
            if (file.indexOf("product.properties") == -1) {
              n2bbLog.info("help file... " + file);
              bean.addDoc(file);
            }
          }
          
          products.put(bean.getName(), bean);
        
        } catch (Exception e) {
          n2bbLog.warn("error initializing help for path... " + path  + " - message... " + e.getMessage(), e);
        }
      }
    }
    
    servlet.getServletContext().setAttribute("helpDocs", products);
    
  }
  
  /*****
   *
   *****/
  private String parseVersion(String version) {
    try {
      if (version == null)
        return version;
        
      int end = 0;
      int dot = 0;
      
      for (int i=0; i<=2; i++) {
        dot = version.indexOf('.', dot);
        
        //System.out.println("dot at... " + dot);
        
        // version does not have two dots (3 places), so return entire string
        if (dot == -1) {
          end = version.length();
          break;
        }
          
        end = dot;
        dot++;
      }
      
      version = version.substring(0, end);
      n2bbLog.debug("version... " + version);
      
    } catch (Exception e) {
      n2bbLog.error(e.getMessage(), e);
    }
    
    return version;
    
  }

  /*****
   *
   *****/
  public void destroy() {
    servlet.getServletContext().removeAttribute("helpDocs");
  }

  
}

