Skip to content

Commit 73f3ce6

Browse files
committed
+ added StatusServlet.java
+ moved initialisation and properties to Manager.java + using filtered copy git-svn-id: svn://code/p/joggle/trunk@19 62b0412d-8fe6-4ae7-94e2-c7691c08b19d
1 parent 6848b84 commit 73f3ce6

File tree

11 files changed

+135
-54
lines changed

11 files changed

+135
-54
lines changed

src/main/java/joggle/data/Manager.java

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,42 @@
11
package joggle.data;
22

3+
import java.io.IOException;
4+
import java.io.InputStream;
35
import java.util.List;
6+
import java.util.Properties;
7+
import java.util.TreeSet;
8+
import java.util.logging.LogManager;
49

510
import javax.persistence.EntityManager;
611
import javax.persistence.Persistence;
712

13+
import org.apache.commons.io.IOUtils;
814
import org.slf4j.Logger;
915
import org.slf4j.LoggerFactory;
1016

1117
@SuppressWarnings("unchecked")
1218
public class Manager {
1319

1420
private static final Logger log = LoggerFactory.getLogger(Manager.class);
15-
private static final EntityManager manager = Persistence.createEntityManagerFactory("jogglemem").createEntityManager();
21+
private static final Properties properties = new Properties();
22+
23+
static {
24+
InputStream stream = Manager.class.getResourceAsStream("/logging.properties");
25+
try { LogManager.getLogManager().readConfiguration(stream); }
26+
catch (Exception e) { log.warn(e.getMessage()); }
27+
finally { IOUtils.closeQuietly(stream); }
28+
29+
stream = Manager.class.getResourceAsStream("/joggle.properties");
30+
try { properties.load(stream); log.info("Found joggle.properties in classpath"); }
31+
catch (IOException e) { log.warn(e.getMessage()); }
32+
finally { IOUtils.closeQuietly(stream); }
33+
34+
for (String s : new TreeSet<String>(properties.stringPropertyNames())) {
35+
log.info(" " + s + "=" + properties.get(s));
36+
}
37+
}
38+
39+
private static final EntityManager manager = Persistence.createEntityManagerFactory(properties.getProperty("joggle.persistence.unit")).createEntityManager();
1640
private static final Manager instance = new Manager();
1741

1842
private static final String aat = " order by s.artist, s.album, s.track";
@@ -25,6 +49,10 @@ public static Manager getInstance() {
2549
private Manager() {
2650
}
2751

52+
public String getProperty(String key) {
53+
return properties.getProperty(key);
54+
}
55+
2856
public List<String> albums() {
2957
return manager.createQuery("select distinct(s.album) from Song as s order by s.album").getResultList();
3058
}
@@ -49,10 +77,6 @@ public Song find(String id) {
4977
return manager.find(Song.class, id);
5078
}
5179

52-
public List<Song> list() {
53-
return manager.createQuery("select s from Song as s" + aat).getResultList();
54-
}
55-
5680
public void merge(Song s) {
5781
if (log.isDebugEnabled()) log.debug("merging " + s);
5882
manager.getTransaction().begin();
@@ -65,4 +89,8 @@ public List<Song> search(String keyword) {
6589
if (log.isDebugEnabled()) log.debug("searching " + search);
6690
return manager.createQuery("select s from Song as s where lower(s.album) like :search or lower(s.artist) like :search or lower(s.title) like :search" + aat).setParameter("search", search).getResultList();
6791
}
92+
93+
public List<Song> songs() {
94+
return manager.createQuery("select s from Song as s" + aat).getResultList();
95+
}
6896
}

src/main/java/joggle/web/ImageServlet.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public class ImageServlet extends HttpServlet {
2929
private static final long serialVersionUID = 5693065655963128553L;
3030
private static final Logger log = LoggerFactory.getLogger(ImageServlet.class);
3131
private static final Manager manager = Manager.getInstance();
32-
private static final String redirect = "/joggle/img/128/junk.png";
32+
private static final String redirect = manager.getProperty("joggle.image.default");
3333

3434
private static final String[] suffixes = {".png", ".jpg", ".jpeg", ".jpe", ".gif"};
3535
private static final FilenameFilter filter = new SuffixFileFilter(suffixes, IOCase.INSENSITIVE);
@@ -80,6 +80,6 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) t
8080
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
8181
}
8282
long t1 = System.currentTimeMillis();
83-
log.info("request: " + id + ", duration: " + (t1 - t0) + "ms");
83+
log.info("request: " + id + " duration: " + (t1 - t0) + "ms");
8484
}
8585
}

src/main/java/joggle/web/SearchServlet.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) t
2828
long t0 = System.currentTimeMillis();
2929
String callback = request.getParameter("$callback");
3030
String url = Serializer.decode(request.getRequestURI());
31-
log.info("request: " + url + ", callback: " + callback);
3231
List list = null;
3332
if (url.contains("/type/")) {
3433
String type = FilenameUtils.getName(url);
@@ -48,11 +47,25 @@ else if (url.contains("/album/")) {
4847
String keywords = url.split("/")[3];
4948
list = manager.search(keywords);
5049
}
51-
String result = callback + "({\"d\":" + Serializer.toJson(list) + "})";
50+
String result = "{\"d\":" + Serializer.toJson(list) + "}";
51+
if (callback != null) result = callback + "(" + result + ")";
5252
response.setCharacterEncoding("utf-8");
5353
Writer out = response.getWriter(); out.write(result);
5454
response.setStatus(HttpServletResponse.SC_OK);
5555
long t1 = System.currentTimeMillis();
56-
log.info("callback: " + callback + ", results: " + list.size() + ", duration: " + (t1 - t0) + "ms");
56+
if (log.isInfoEnabled()) {
57+
String string = "search: " + format(url, 40)+ " duration: " + (t1 - t0) + "ms" + "\tresults: " + list.size();
58+
if (log.isDebugEnabled()) string += "\tcallback: " + callback;
59+
log.info(string);
60+
}
61+
}
62+
63+
private static String format(String s, int m) {
64+
if (log.isDebugEnabled()) return s;
65+
String r = s.replaceFirst("/joggle/search/([^/]+)/(.+)$", "$1...$2")
66+
.replaceFirst("^album", "album..")
67+
.replaceFirst("^type", "type...")
68+
+ ".............................";
69+
return r.substring(0, m-2) + "..";
5770
}
5871
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package joggle.web;
2+
3+
import java.io.IOException;
4+
import java.io.Writer;
5+
import java.lang.management.ManagementFactory;
6+
import java.lang.management.RuntimeMXBean;
7+
import java.text.SimpleDateFormat;
8+
import java.util.Map;
9+
import java.util.TreeMap;
10+
11+
import javax.servlet.ServletException;
12+
import javax.servlet.http.HttpServlet;
13+
import javax.servlet.http.HttpServletRequest;
14+
import javax.servlet.http.HttpServletResponse;
15+
16+
import joggle.data.Manager;
17+
import joggle.data.Serializer;
18+
19+
import org.apache.commons.io.FileUtils;
20+
21+
public class StatusServlet extends HttpServlet {
22+
23+
private static final long serialVersionUID = 3640618359057072513L;
24+
private static final SimpleDateFormat df = new SimpleDateFormat("d MMM yyyy HH:mm:ss");
25+
26+
@Override
27+
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
28+
Writer out = response.getWriter();
29+
out.write(Serializer.toJson(status()));
30+
}
31+
32+
@SuppressWarnings("unchecked")
33+
private static Map status() {
34+
Manager manager = Manager.getInstance();
35+
int i = manager.albums().size(), j = manager.artists().size(), k = manager.songs().size();
36+
Map result = new TreeMap();
37+
RuntimeMXBean rb = ManagementFactory.getRuntimeMXBean();
38+
Runtime rt = Runtime.getRuntime();
39+
result.put("vmStartTime", df.format(rb.getStartTime()));
40+
result.put("vmUptime", rb.getUptime()); // TODO: format this
41+
result.put("memTotal", FileUtils.byteCountToDisplaySize(rt.totalMemory()));
42+
result.put("memFree", FileUtils.byteCountToDisplaySize(rt.freeMemory()));
43+
result.put("memMax", FileUtils.byteCountToDisplaySize(rt.maxMemory()));
44+
result.put("jgAlbums", i);
45+
result.put("jgArtists", j);
46+
result.put("jgSongs", k);
47+
return result;
48+
}
49+
}

src/main/java/joggle/web/StreamServlet.java

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,6 @@
33
import java.io.File;
44
import java.io.FileInputStream;
55
import java.io.IOException;
6-
import java.io.InputStream;
7-
import java.util.Properties;
8-
import java.util.TreeSet;
9-
import java.util.logging.LogManager;
106

117
import javax.servlet.ServletException;
128
import javax.servlet.http.HttpServlet;
@@ -29,19 +25,7 @@ public class StreamServlet extends HttpServlet {
2925

3026
@Override
3127
public void init() throws ServletException {
32-
InputStream lpis = Manager.class.getResourceAsStream("/logging.properties");
33-
try { LogManager.getLogManager().readConfiguration(lpis); }
34-
catch (Exception e) { log.warn(e.getMessage()); }
35-
finally { IOUtils.closeQuietly(lpis); }
36-
37-
Properties properties = new Properties();
38-
InputStream jpis = Manager.class.getResourceAsStream("/joggle.properties");
39-
try { properties.load(jpis); log.info("Found joggle.properties in classpath"); }
40-
catch (IOException e) { log.warn(e.getMessage()); }
41-
finally { IOUtils.closeQuietly(jpis); }
42-
43-
for (String s : new TreeSet<String>(properties.stringPropertyNames())) log.info(s + "=" + properties.get(s));
44-
String directory = properties.getProperty("joggle.music.directory");
28+
String directory = manager.getProperty("joggle.music.directory");
4529
Scanner scanner = new Scanner();
4630
scanner.scan(directory);
4731
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
joggle.application.revision=Revision: ${build.revision}
22
joggle.application.timestamp=${build.timestamp}
33
joggle.application.version=Version: ${project.version}
4-
joggle.image.default=../img/128/junk.png
4+
joggle.image.default=/${project.name}/img/128/junk.png
55
joggle.music.directory=E:/music
6+
joggle.persistence.unit=jogglemem

src/main/webapp/WEB-INF/web.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@
1212
<servlet-name>image</servlet-name>
1313
<servlet-class>joggle.web.ImageServlet</servlet-class>
1414
</servlet>
15+
<servlet>
16+
<servlet-name>status</servlet-name>
17+
<servlet-class>joggle.web.StatusServlet</servlet-class>
18+
</servlet>
1519
<servlet>
1620
<servlet-name>stream</servlet-name>
1721
<servlet-class>joggle.web.StreamServlet</servlet-class>
@@ -25,6 +29,10 @@
2529
<servlet-name>image</servlet-name>
2630
<url-pattern>/image/*</url-pattern>
2731
</servlet-mapping>
32+
<servlet-mapping>
33+
<servlet-name>status</servlet-name>
34+
<url-pattern>/status/*</url-pattern>
35+
</servlet-mapping>
2836
<servlet-mapping>
2937
<servlet-name>stream</servlet-name>
3038
<url-pattern>/stream/*</url-pattern>

src/main/webapp/audio.html

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,7 @@
2222
</div>
2323
<div class="playlist bubble">
2424
<nav id="playlist-nav">
25-
<img id="back" src="./img/16/back.png"><img id="stop" src="./img/16/pause.png" alt="./img/16/play.png"><!-- ugly toggle hack--><img id="next" src="./img/16/next.png">
26-
<!-- stupid filter copy breaks ❚
27-
<a id="back">◄</a>
28-
<a id="stop">❚</a>
29-
<a id="next">►</a>
30-
-->
25+
<a id="back"></a><a id="stop">&#10074;</a><a id="next"></a>
3126
<a id="clear" class="right"></a>
3227
<a id="clean" class="right"></a>
3328
</nav>
@@ -37,13 +32,14 @@
3732
<section class="middle column">
3833
<div class="browse bubble">
3934
<nav>
40-
<img id="brart" src="./img/16/artist.png"><img id="bralb" src="./img/16/album.png">
35+
<a id="brart" title="browse artists">A</a>
36+
<a id="bralb" title="browse albums">O</a>
4137
</nav>
4238
<ul id="browser"></ul>
4339
</div>
4440
</section>
4541
</article>
46-
<footer><details><summary title="Revision: ${build.revision}">✰ ${project.name} ✰ v${project.version} ✰ ⅿⅿⅺ ✰</summary><p>${project.name}, version ${project.version}, revision ${build.revision}, year ${project.inceptionYear}</p></details></footer>
42+
<footer><details><summary title="Revision: ${build.revision}">✰ ${project.name} ✰ v${project.version} ✰ ⅿⅿⅺ ✰</summary><p><a href="${project.url}">${project.name}</a>, version ${project.version}, revision ${build.revision}, year ${project.inceptionYear}</p></details></footer>
4743
<script id="tart" type="text/x-jquery-tmpl"><li><a onclick="queue('artist', '{{= escape($data)}}')">${}</a></li></script>
4844
<script id="talb" type="text/x-jquery-tmpl"><li><a onclick="queue('album', '{{= escape($data)}}')">${}</a></li></script>
4945
<script id="plt" type="text/x-jquery-tmpl"><li><a id="{{= id }}" class="${type} nobr" onclick="play('{{= id }}', '${escape(artist)}', '${escape(album)}', '${escape(title)}', '${track}')">${artist} - ${title}</a></li></script>

src/main/webapp/css/style.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ footer { font-size:small; position:fixed; bottom:5px; }
44
header { font-size:xx-large; font-weight:bold; }
55
header, footer { color:#888888; width:100%; }
66
a { color:#333366; cursor:pointer; }
7+
nav a { color:#528 }
78
.album { font-size:smaller; }
89
.artist { font-weight:bold; margin-top:10px; }
910
.browse { text-align:left; width:300px; }

src/main/webapp/js/joggle.js

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,7 @@ $('#bralb').click(function(){browse('album')});
99

1010
function beh() { $('.cur').parent().prev().children().first().click() }
1111
function neh() { $('.cur').parent().next().children().first().click() }
12-
13-
function peh() {
14-
var p = document.getElementById('player'); p.paused ? p.play() : p.pause()
15-
var alt = $('#stop').attr('alt'); var src = $('#stop').attr('src');
16-
$('#stop').attr('alt', src); $('#stop').attr('src', alt);
17-
}
12+
function peh() { var p = document.getElementById('player'); p.paused ? p.play() : p.pause() }
1813

1914
function queue(what, keyword) {
2015
$.ajax({ dataType: "jsonp", jsonp: "$callback", url: "./search/" + what + "/" + keyword, success: function(data){ prender(data.d) } });
@@ -25,9 +20,8 @@ function browse(what) {
2520
}
2621

2722
function brender(what, data) {
28-
var t = (what == 'album') ? '#talb' : '#tart';
2923
$('#browser').empty(); $('#browser-nav').empty();
30-
$(t).tmpl(data).appendTo('#browser');
24+
$((what == 'album') ? '#talb' : '#tart').tmpl(data).appendTo('#browser');
3125
$('#browser').listnav({includeAll: false, noMatchText: "nothing", showCounts: false});
3226
$('.ln-letters a').removeAttr('href');
3327
}

0 commit comments

Comments
 (0)