/*** ** @(#) TradeCard.com 1.0 ** ** Copyright (c) 2010 TradeCard, Inc. All Rights Reserved. ** ** ** THIS COMPUTER SOFTWARE IS THE PROPERTY OF TradeCard, Inc. ** ** Permission is granted to use this software as specified by the TradeCard ** COMMERCIAL LICENSE AGREEMENT. You may use this software only for ** commercial purposes, as specified in the details of the license. ** TRADECARD SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY ** THE LICENSEE AS A RESULT OF USING OR MODIFYING THIS SOFTWARE IN ANY WAY. ** ** YOU MAY NOT DISTRIBUTE ANY SOURCE CODE OR OBJECT CODE FROM THE TradeCard.com ** TOOLKIT AT ANY TIME. VIOLATORS WILL BE PROSECUTED TO THE FULLEST EXTENT ** OF UNITED STATES LAW. ** ** @version 1.0 ** @author Copyright (c) 2010 TradeCard, Inc. All Rights Reserved. ** **/ package com.partydj.io.servlet; import java.net.*; import java.util.*; import javax.servlet.http.*; import com.partydj.player.*; import com.partydj.server.*; import com.partydj.util.*; import com.partydj.util.json.*; /** * **/ public class PlayerServlet extends BaseServlet { private static final String PLAYER = "player"; enum PlayerAction { NOWPLAYING() { @Override public Object invoke(HttpServletRequest servletRequest) { return PartyDJ.getInstance().getPlayer().getCurrentlyPlaying(); } }, QUEUE() { @Override public Object invoke(final HttpServletRequest servletRequest) { List<MediaFile> queue = PartyDJ.getInstance().getPlayer().getPlayQueue(); String sizeString = servletRequest.getParameter("size"); if (sizeString != null) { //accept an "only show the next 'n' songs" try { int size = Integer.valueOf(sizeString).intValue(); if (size < queue.size()) { queue = queue.subList(0, size); } } catch(Exception e) { //ignore } } final List<MediaFile> collection = queue; return new JSONSerializable() { public JSONStream toJSON() { JSONArray jsonArray = new JSONArray(); for (MediaFile item : collection) { if (item != null) { JSONObject json = item.toJSON(); if (jsonArray.size() == 0) { //push the can skip value into the first item in the playlist json.put("canSkip", PlaylistManager.INSTANCE.canSkip(getWho(servletRequest))); } jsonArray.add(json); } } return jsonArray; } }; } }, SEARCH() { @Override public Object invoke(HttpServletRequest servletRequest) { return PartyDJ.getInstance().getSearchProvider().find(servletRequest.getParameterMap()); } }, REQUEST() { @Override public Object invoke(HttpServletRequest servletRequest) { final JSONObject actualResult = new JSONObject(); String fileName = servletRequest.getParameter(MediaFile.FILENAME); if (fileName != null) { MediaFile file = MediaFile.create(fileName); if (file != null && file.getFile() != null && file.getFile().exists()) { int estimatedWaitTime = PlaylistManager.INSTANCE.request(file, getWho(servletRequest)); actualResult.put("wait", Etc.getTimeDurationDisplay(estimatedWaitTime)); } else { System.out.println(fileName + " does not exist."); } } return new JSONSerializable() { @Override public JSONStream toJSON() { return actualResult; } }; } }, LISTREQUESTS() { @Override public Object invoke(HttpServletRequest servletRequest) { return PlaylistManager.INSTANCE.getRequests(); } }, SKIP() { @Override public Object invoke(HttpServletRequest servletRequest) { PlaylistManager.INSTANCE.skipToNext(getWho(servletRequest)); return null; } } ; abstract Object invoke(HttpServletRequest servletRequest); protected String getWho(HttpServletRequest servletRequest) { String who = servletRequest.getRemoteHost(); if (who == null || who.length() == 0) { who = servletRequest.getRemoteAddr(); } return who; } static PlayerAction get(String actionName) { try { return valueOf(actionName.toUpperCase()); } catch (Exception e) { return null; } } } /** * Constructor */ public PlayerServlet() { super(PLAYER); } @Override protected int getMinArguments() { return 2; } @Override protected String getContentType(HttpServletRequest servletRequest) { return "application/json"; } private String format(Object operationResult) { if (operationResult instanceof JSONSerializable) { return ((JSONSerializable)operationResult).toJSON().toString(); } else if (operationResult instanceof Collection) { Collection collection = (Collection)operationResult; if (collection.size() > 0) { if (collection.iterator().next() instanceof JSONSerializable) { JSONArray json = new JSONArray(); for (Object item : collection) { if (item != null) { json.add(((JSONSerializable)item).toJSON()); } } return json.toString(); } else { StringBuilder buf = new StringBuilder(); for (Object item : collection) { buf.append(format(item)); //separator? } return buf.toString(); } } return new JSONArray().toString(); } else { return String.valueOf(operationResult); } } @Override protected ChunkedByteBuffer getResponseContents(HttpServletRequest servletRequest, Socket httpConnection) { ChunkedByteBuffer result = new ChunkedByteBuffer(); String uri = servletRequest.getRequestURI(); String[] uriParts = uri.substring(1).split("[/\\ ]+"); PlayerAction operation = PlayerAction.get(uriParts[1]); if (operation != null) { try { result.append(format(operation.invoke(servletRequest)).getBytes(CharsetConstants.UTF8.name())); } catch (Exception e) { e.printStackTrace(); } } return result; } }