// Path: core/src/main/java/org/mvcspec/ozark/engine/ViewEngineBase.java
// public abstract class ViewEngineBase implements ViewEngine {
// 
//     /**
//      * Resolves a view path based on {@link javax.mvc.engine.ViewEngine#VIEW_FOLDER}
//      * in the active configuration. If the view is absolute, starts with '/', then
//      * it is returned unchanged.
//      *
//      * @param context view engine context.
//      * @return resolved view.
//      */
//     protected String resolveView(ViewEngineContext context) {
//         final String view = context.getView();
//         if (!PathUtils.hasStartingSlash(view)) {        // Relative?
//             final String viewFolder = PropertyUtils.getProperty(context.getConfiguration(), VIEW_FOLDER, DEFAULT_VIEW_FOLDER);
//             return PathUtils.ensureEndingSlash(viewFolder) + view;
//         }
//         return view;
//     }
// 
//     /**
//      * This methods reads the 'charset' parameter from the media type and falls back to 'UTF-8'
//      * if the parameter is missing. It then adds a corresponding 'Content-Type' with the correct
//      * encoding to the response headers. Finally it returns the effective character set so that
//      * the view engine implementation can use it write the data correctly to the output stream.
//      *
//      * @param context The context
//      * @return the effective charset
//      */
//     protected Charset resolveCharsetAndSetContentType(ViewEngineContext context) {
// 
//         String charset = context.getMediaType().getParameters().get("charset");
//         if (charset == null) {
//             charset = "UTF-8";
//         }
// 
//         MediaType mediaType = context.getMediaType().withCharset(charset);
// 
//         context.getResponseHeaders().putSingle(HttpHeaders.CONTENT_TYPE, mediaType.toString());
// 
//         return Charset.forName(charset);
// 
//     }
// 
// 
// }


import com.github.jknack.handlebars.Handlebars;
import com.github.jknack.handlebars.Template;
import org.mvcspec.ozark.engine.ViewEngineBase;
import org.mvcspec.ozark.engine.ViewEngineConfig;
import javax.annotation.Priority;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.mvc.engine.ViewEngine;
import javax.mvc.engine.ViewEngineContext;
import javax.mvc.engine.ViewEngineException;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
/*
 * Copyright © 2017 Ivar Grimstad (ivar.grimstad@gmail.com)
 *
 * Licensed 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.mvcspec.ozark.ext.handlebars;



/**
 * Class HandlebarsViewEngine
 *
 * @author Rahman Usta
 */
@ApplicationScoped
@Priority(ViewEngine.PRIORITY_FRAMEWORK)
public class HandlebarsViewEngine extends ViewEngineBase {

    @Inject
    private ServletContext servletContext;

    @Inject
    @ViewEngineConfig
    private Handlebars handlebars;

    @Override
    public boolean supports(String view) {
        return view.endsWith(".hbs") || view.endsWith(".handlebars");
    }

    @Override
    public void processView(ViewEngineContext context) throws ViewEngineException {

// Path: core/src/main/java/org/mvcspec/ozark/engine/ViewEngineBase.java
// public abstract class ViewEngineBase implements ViewEngine {
// 
//     /**
//      * Resolves a view path based on {@link javax.mvc.engine.ViewEngine#VIEW_FOLDER}
//      * in the active configuration. If the view is absolute, starts with '/', then
//      * it is returned unchanged.
//      *
//      * @param context view engine context.
//      * @return resolved view.
//      */
//     protected String resolveView(ViewEngineContext context) {
//         final String view = context.getView();
//         if (!PathUtils.hasStartingSlash(view)) {        // Relative?
//             final String viewFolder = PropertyUtils.getProperty(context.getConfiguration(), VIEW_FOLDER, DEFAULT_VIEW_FOLDER);
//             return PathUtils.ensureEndingSlash(viewFolder) + view;
//         }
//         return view;
//     }
// 
//     /**
//      * This methods reads the 'charset' parameter from the media type and falls back to 'UTF-8'
//      * if the parameter is missing. It then adds a corresponding 'Content-Type' with the correct
//      * encoding to the response headers. Finally it returns the effective character set so that
//      * the view engine implementation can use it write the data correctly to the output stream.
//      *
//      * @param context The context
//      * @return the effective charset
//      */
//     protected Charset resolveCharsetAndSetContentType(ViewEngineContext context) {
// 
//         String charset = context.getMediaType().getParameters().get("charset");
//         if (charset == null) {
//             charset = "UTF-8";
//         }
// 
//         MediaType mediaType = context.getMediaType().withCharset(charset);
// 
//         context.getResponseHeaders().putSingle(HttpHeaders.CONTENT_TYPE, mediaType.toString());
// 
//         return Charset.forName(charset);
// 
//     }
// 
// 
// }


// Path: ext/handlebars/src/main/java/org/mvcspec/ozark/ext/handlebars/HandlebarsViewEngine.java
import com.github.jknack.handlebars.Handlebars;
import com.github.jknack.handlebars.Template;
import org.mvcspec.ozark.engine.ViewEngineBase;
import org.mvcspec.ozark.engine.ViewEngineConfig;
import javax.annotation.Priority;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.mvc.engine.ViewEngine;
import javax.mvc.engine.ViewEngineContext;
import javax.mvc.engine.ViewEngineException;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;

/*
 * Copyright © 2017 Ivar Grimstad (ivar.grimstad@gmail.com)
 *
 * Licensed 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.mvcspec.ozark.ext.handlebars;



/**
 * Class HandlebarsViewEngine
 *
 * @author Rahman Usta
 */
@ApplicationScoped
@Priority(ViewEngine.PRIORITY_FRAMEWORK)
public class HandlebarsViewEngine extends ViewEngineBase {

    @Inject
    private ServletContext servletContext;

    @Inject
    @ViewEngineConfig
    private Handlebars handlebars;

    @Override
    public boolean supports(String view) {
        return view.endsWith(".hbs") || view.endsWith(".handlebars");
    }

    @Override
    public void processView(ViewEngineContext context) throws ViewEngineException {

        Map<String, Object> model = new HashMap<>(context.getModels().asMap());