/*
 * 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.myfaces.extensions.scripting.jsf.dynamicDecorators.factories;

import org.apache.myfaces.extensions.scripting.core.api.Decorated;
import org.apache.myfaces.extensions.scripting.core.api.WeavingContext;
import org.apache.myfaces.extensions.scripting.jsf.dynamicDecorators.implementations.ApplicationProxy;

import javax.faces.application.Application;
import javax.faces.application.ApplicationFactory;

/**
 * Application factory which introduces
 * scripting proxies for their artefacts
 * <p/>
 * We use a mix of AOP and helper constructs
 * to reach the goal to be dynamic.
 * For most artefacts we just need to
 * check if the object is a Groovy object
 * and then reload at their connection interfaces
 * <p/>
 * Some artefacts have a longer lifespan and/or are stateless
 * for those we have to work with reloading AOP
 *
 * @author Werner Punz
 */
public class ScriptingApplicationFactory extends ApplicationFactory implements Decorated
{

    ApplicationFactory _delegate;


    public ScriptingApplicationFactory(ApplicationFactory delegate) {
        _delegate = delegate;

    }

    public Application getApplication() {
        Application retVal = _delegate.getApplication();

        if (WeavingContext.getInstance().isScriptingEnabled()  && !(retVal instanceof ApplicationProxy))
            retVal = new ApplicationProxy(retVal);

        return retVal;
    }

    public void setApplication(Application application) {
        if (WeavingContext.getInstance().isScriptingEnabled() && !(application instanceof ApplicationProxy))
            application = new ApplicationProxy(application);

        _delegate.setApplication(application);
    }

    @Override
    public ApplicationFactory getWrapped() {
        return _delegate.getWrapped();
    }

    public Object getDelegate() {
        return _delegate;
    }
}
