/*
* Copyright 2009-2012 by KNURT Systeme (http://www.knurt.de)
*
* Licensed under the Creative Commons License Attribution-NonCommercial-ShareAlike 3.0 Unported;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://creativecommons.org/licenses/by-nc-sa/3.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 de.knurt.fam.template.controller;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import de.knurt.fam.connector.FamConnector;
import de.knurt.fam.connector.RedirectTarget;
import de.knurt.fam.core.util.mvc.RedirectResolver;
import de.knurt.fam.template.model.TemplateResource;
import de.knurt.fam.template.util.TemplateConfig;
/**
* default answer factory of the system delegating all requests to
* {@link TemplateConfig#getContentFactory()}. if content found, put it. if not,
* put an error message out.
*
* @author Daniel Oltmanns
* @since 1.3.0 (09/28/2010)
*/
public class DefaultAnswerFactory implements AnswerFactory {
/** one and only instance of DefaultAnswerFactory */
private volatile static DefaultAnswerFactory me;
/** construct DefaultAnswerFactory */
private DefaultAnswerFactory() {
}
/**
* return the one and only instance of DefaultAnswerFactory
*
* @return the one and only instance of DefaultAnswerFactory
*/
public static DefaultAnswerFactory me() {
if (me == null) {
// ↖ no instance so far
synchronized (DefaultAnswerFactory.class) {
if (me == null) {
// ↖ still no instance so far
// ↓ the one and only me
me = new DefaultAnswerFactory();
}
}
}
return me;
}
private ModelAndView answerAll(TemplateResource templateResource, HttpServletResponse response, HttpServletRequest request, PrintWriter pw) {
String content = TemplateConfig.me().getContentFactory().getContent(templateResource);
if (content == null) {
return this.answerNotFound(templateResource, response, pw);
} else {
pw.write(content);
return null;
}
}
private ModelAndView answerNotFound(TemplateResource templateResource, HttpServletResponse response, PrintWriter pw) {
ModelAndView mav = null;
if (FamConnector.isDev()) {
response.setContentType("text/plain; charset=UTF-8");
pw.write(String.format("there is an error on rendering this resource: %s\n", templateResource));
pw.write("check the velocity log file!\n");
pw.write("----\n");
pw.write(String.format("template-directory: %s\n", FamConnector.templateDirectory()));
pw.write("----\n");
pw.write("Is the page defined in config and lang xml? Is the visibility set correctly in both?");
// TODO #20 create dtd for template system
} else {
mav = RedirectResolver.redirect(RedirectTarget.PUBLIC_HOME);
}
return mav;
}
@Override
public ModelAndView answerHTML(TemplateResource templateResource, HttpServletResponse response, HttpServletRequest request, PrintWriter pw) {
return this.answerAll(templateResource, response, request, pw);
}
@Override
public ModelAndView answerCSS(TemplateResource templateResource, HttpServletResponse response, HttpServletRequest request, PrintWriter pw) {
return this.answerAll(templateResource, response, request, pw);
}
@Override
public ModelAndView answerJS(TemplateResource templateResource, HttpServletResponse response, HttpServletRequest request, PrintWriter pw) {
return this.answerAll(templateResource, response, request, pw);
}
@Override
public ModelAndView answerUnknown(TemplateResource templateResource, HttpServletResponse response, HttpServletRequest request, PrintWriter pw) {
return this.answerAll(templateResource, response, request, pw);
}
@Override
public ModelAndView answerJSON(TemplateResource templateResource, HttpServletResponse response, HttpServletRequest request, PrintWriter pw) {
return this.answerAll(templateResource, response, request, pw);
}
}