/****************************************************************
 * 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.james.jspf.impl;

import org.apache.james.jspf.core.LogEnabled;
import org.apache.james.jspf.core.Logger;
import org.apache.james.jspf.core.exceptions.PermErrorException;
import org.apache.james.jspf.parser.TermDefinition;
import org.apache.james.jspf.parser.TermsFactory;
import org.apache.james.jspf.terms.Configuration;
import org.apache.james.jspf.terms.ConfigurationEnabled;
import org.apache.james.jspf.wiring.WiringService;
import org.apache.james.jspf.wiring.WiringServiceException;
import org.apache.james.jspf.wiring.WiringServiceTable;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Properties;

/**
 * The default implementation of the TermsFactory
 */
public class DefaultTermsFactory implements TermsFactory {
    
    private String termFile = "org/apache/james/jspf/parser/jspf.default.terms";
    
    private Collection<TermDefinition> mechanismsCollection;

    private Collection<TermDefinition> modifiersCollection;

    private Logger log;
    
    private WiringService wiringService;

    public DefaultTermsFactory(Logger log) {
        this.log = log;
        this.wiringService = new WiringServiceTable();
        ((WiringServiceTable) this.wiringService).put(LogEnabled.class, log);
        init();
    }

    public DefaultTermsFactory(Logger log, WiringService wiringService) {
        this.log = log;
        this.wiringService = wiringService;
        init();
    }

    /**
     * Initialize the factory and the services
     */
    private void init() {
        try {
            InputStream is = Thread.currentThread().getContextClassLoader()
                    .getResourceAsStream(termFile);
            if (is == null) {
                throw new NullPointerException("Unable to find the "+termFile+" resource in the classpath");
            }
            Properties p = new Properties();
            p.load(is);
            String mechs = p.getProperty("mechanisms");
            String mods = p.getProperty("modifiers");
            String[] classes;
            classes = mechs.split(",");
            Class<?>[] knownMechanisms = new Class[classes.length];
            for (int i = 0; i < classes.length; i++) {
                log.debug("Add following class as known mechanismn: "
                        + classes[i]);
                knownMechanisms[i] = Thread.currentThread()
                        .getContextClassLoader().loadClass(classes[i]);
            }
            mechanismsCollection = createTermDefinitionCollection(knownMechanisms);
            classes = mods.split(",");
            Class<?>[] knownModifiers = new Class[classes.length];
            for (int i = 0; i < classes.length; i++) {
                log.debug("Add following class as known modifier: "
                        + classes[i]);
                knownModifiers[i] = Thread.currentThread()
                        .getContextClassLoader().loadClass(classes[i]);
            }
            modifiersCollection = createTermDefinitionCollection(knownModifiers);
    
        } catch (IOException e) {
            throw new IllegalStateException(
                    "Term configuration cannot be found");
        } catch (ClassNotFoundException e) {
            throw new IllegalStateException(
                    "One configured class cannot be found");
        }
    }


    /**
     * Create a collection of term definitions supported by this factory.
     * 
     * @param classes
     *            classes to analyze
     * @param staticFieldName
     *            static field to concatenate
     * @return map <Class,Pattern>
     */
    private Collection<TermDefinition> createTermDefinitionCollection(Class<?>[] classes) {
        Collection<TermDefinition> l = new ArrayList<TermDefinition>();
        for (int j = 0; j < classes.length; j++) {
            try {
                l.add(new DefaultTermDefinition(classes[j]));
            } catch (Exception e) {
                log.debug("Unable to create the term collection", e);
                throw new IllegalStateException(
                        "Unable to create the term collection");
            }
        }
        return Collections.synchronizedCollection(l);
    }


    /**
     * @see org.apache.james.jspf.parser.TermsFactory#createTerm(java.lang.Class, org.apache.james.jspf.terms.Configuration)
     */
    public Object createTerm(Class<?> termDef, Configuration subres) throws PermErrorException, InstantiationException {
        try {
            Object term = termDef.newInstance();
            
            try {
                wiringService.wire(term);
            } catch (WiringServiceException e) {
                throw new InstantiationException(
                        "Unexpected error adding dependencies to term: " + e.getMessage());
            }

            if (term instanceof ConfigurationEnabled) {
                if (subres == null || subres.groupCount() == 0) {
                    ((ConfigurationEnabled) term).config(null);
                } else {
                    ((ConfigurationEnabled) term).config(subres);
                }
            }
            return term;
        } catch (IllegalAccessException e) {
            throw new InstantiationException(
                    "Unexpected error creating term: " + e.getMessage());
        }
    }


    /**
     * @see org.apache.james.jspf.parser.TermsFactory#getMechanismsCollection()
     */
    public Collection<TermDefinition> getMechanismsCollection() {
        return mechanismsCollection;
    }


    /**
     * @see org.apache.james.jspf.parser.TermsFactory#getModifiersCollection()
     */
    public Collection<TermDefinition> getModifiersCollection() {
        return modifiersCollection;
    }

}
