package net.pterodactylus.demoscenemusic.core;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.InvocationTargetException;
import java.net.URISyntaxException;
+import java.util.Comparator;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import net.pterodactylus.demoscenemusic.data.Artist;
+import net.pterodactylus.demoscenemusic.data.Properties;
+import net.pterodactylus.demoscenemusic.data.Style;
+import net.pterodactylus.demoscenemusic.data.Track;
+import net.pterodactylus.demoscenemusic.data.TrackDerivative;
+import net.pterodactylus.demoscenemusic.data.User;
import net.pterodactylus.demoscenemusic.page.ServletRequest;
+import net.pterodactylus.demoscenemusic.template.ConciseNumberFilter;
+import net.pterodactylus.demoscenemusic.template.DurationFilter;
+import net.pterodactylus.demoscenemusic.template.PropertiesAccessor;
+import net.pterodactylus.demoscenemusic.template.TrackDerivativeAccessor;
+import net.pterodactylus.demoscenemusic.template.UserAccessor;
import net.pterodactylus.util.io.Closer;
+import net.pterodactylus.util.io.StreamCopier;
+import net.pterodactylus.util.template.ClassPathTemplateProvider;
+import net.pterodactylus.util.template.CollectionSortFilter;
import net.pterodactylus.util.template.HtmlFilter;
+import net.pterodactylus.util.template.MatchFilter;
import net.pterodactylus.util.template.ReflectionAccessor;
import net.pterodactylus.util.template.Template;
import net.pterodactylus.util.template.TemplateContextFactory;
public class TemplateServlet extends HttpServlet {
private Core core;
+
private final TemplateContextFactory templateContextFactory = new TemplateContextFactory();
private final Map<String, Page<ServletRequest>> pages = new HashMap<String, Page<ServletRequest>>();
core = (Core) config.getServletContext().getAttribute("core");
templateContextFactory.addAccessor(Object.class, new ReflectionAccessor());
+ templateContextFactory.addAccessor(User.class, new UserAccessor());
+ templateContextFactory.addAccessor(Properties.class, new PropertiesAccessor());
+ templateContextFactory.addAccessor(TrackDerivative.class, new TrackDerivativeAccessor());
templateContextFactory.addFilter("html", new HtmlFilter());
+ CollectionSortFilter sortFilter = new CollectionSortFilter();
+ sortFilter.addComparator(Artist.class, new Comparator<Artist>() {
+
+ @Override
+ public int compare(Artist leftArtist, Artist rightArtist) {
+ return leftArtist.getName().compareToIgnoreCase(rightArtist.getName());
+ }
+
+ });
+ sortFilter.addComparator(Track.class, new Comparator<Track>() {
+
+ @Override
+ public int compare(Track leftTrack, Track rightTrack) {
+ return leftTrack.getName().compareToIgnoreCase(rightTrack.getName());
+ }
+
+ });
+ sortFilter.addComparator(Style.class, new Comparator<Style>() {
+
+ @Override
+ public int compare(Style leftStyle, Style rightStyle) {
+ return leftStyle.getName().compareToIgnoreCase(rightStyle.getName());
+ }
+
+ });
+ templateContextFactory.addFilter("sort", sortFilter);
+ templateContextFactory.addFilter("matches", new MatchFilter());
+ templateContextFactory.addFilter("time", new DurationFilter());
+ templateContextFactory.addFilter("concise", new ConciseNumberFilter());
templateContextFactory.addTemplateObject("core", core);
templateContextFactory.addTemplateObject("dataManager", core.getDataManager());
+ templateContextFactory.addProvider(new ClassPathTemplateProvider(getClass(), "/templates/"));
+
for (@SuppressWarnings("rawtypes")
Enumeration parameterNames = config.getInitParameterNames(); parameterNames.hasMoreElements();) {
String pageName = (String) parameterNames.nextElement();
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse httpServletResponse) throws ServletException, IOException {
+ request.setCharacterEncoding("UTF-8");
String path = request.getPathInfo();
if (path.startsWith("/")) {
path = path.substring(1);
}
+ if ((path.length() == 0) || (path.endsWith("/"))) {
+ path += "index";
+ }
Page<ServletRequest> page = pages.get(path);
if (page != null) {
ServletRequest servletRequest;
try {
- servletRequest = new ServletRequest(request);
+ servletRequest = new ServletRequest(request, this);
} catch (URISyntaxException use1) {
throw new IOException("Could not create URI from " + request.getRequestURI(), use1);
}
- Response response = new Response(httpServletResponse.getOutputStream());
+ ByteArrayOutputStream responseOutputBuffer = new ByteArrayOutputStream();
+ Response response = new Response(responseOutputBuffer);
response = page.handleRequest(servletRequest, response);
for (Header header : response.getHeaders()) {
for (String value : header) {
}
httpServletResponse.setContentType(response.getContentType());
httpServletResponse.setStatus(response.getStatusCode());
+ StreamCopier.copy(new ByteArrayInputStream(responseOutputBuffer.toByteArray()), httpServletResponse.getOutputStream());
return;
}
}
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
+ doGet(httpServletRequest, httpServletResponse);
+ }
+
//
// PRIVATE METHODS
//