Skip to content

Commit 1ce315a

Browse files
authored
Merge pull request #789 from parallaxinc/demo
Version 0.93 251
2 parents 20d1a2a + 7cfd5e2 commit 1ce315a

File tree

87 files changed

+2330
-743
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

87 files changed

+2330
-743
lines changed

db-updates/0006-add-user-coach.sql

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
/*
2+
* Add coach email address field to support email cc option.
3+
*/
4+
ALTER TABLE user ADD COLUMN coach_email VARCHAR(250) AFTER screen_name;

pom.xml

+24
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,30 @@
417417
<artifactId>metrics-core</artifactId>
418418
<version>${metrics-version}</version>
419419
</dependency>
420+
421+
<dependency>
422+
<groupId>io.dropwizard.metrics</groupId>
423+
<artifactId>metrics-graphite</artifactId>
424+
<version>${metrics-version}</version>
425+
</dependency>
426+
427+
<dependency>
428+
<groupId>io.dropwizard.metrics</groupId>
429+
<artifactId>metrics-jvm</artifactId>
430+
<version>${metrics-version}</version>
431+
</dependency>
432+
433+
<dependency>
434+
<groupId>io.dropwizard.metrics</groupId>
435+
<artifactId>metrics-log4j</artifactId>
436+
<version>${metrics-version}</version>
437+
</dependency>
438+
439+
<dependency>
440+
<groupId>io.dropwizard.metrics</groupId>
441+
<artifactId>metrics-servlet</artifactId>
442+
<version>${metrics-version}</version>
443+
</dependency>
420444

421445
<dependency>
422446
<groupId>com.google.guava</groupId>

src/main/java/com/parallax/server/blocklyprop/config/SetupConfig.java

+2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import com.google.inject.servlet.GuiceServletContextListener;
1212
import com.parallax.server.blocklyprop.SessionData;
1313
import com.parallax.server.blocklyprop.jsp.Properties;
14+
import com.parallax.server.blocklyprop.monitoring.Monitor;
1415
import com.parallax.server.blocklyprop.utils.HelpFileInitializer;
1516
import java.sql.Driver;
1617
import java.sql.DriverManager;
@@ -43,6 +44,7 @@ protected void configure() {
4344
bind(Properties.class).asEagerSingleton();
4445

4546
bind(HelpFileInitializer.class).asEagerSingleton();
47+
bind(Monitor.class).asEagerSingleton();
4648

4749
install(new PersistenceModule(configuration));
4850
install(new DaoModule());
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
* To change this license header, choose License Headers in Project Properties.
3+
* To change this template file, choose Tools | Templates
4+
* and open the template in the editor.
5+
*/
6+
package com.parallax.server.blocklyprop.enums;
7+
8+
/**
9+
*
10+
* @author Michel
11+
*/
12+
public enum ConfirmPage {
13+
14+
ALREADY_CONFIRMED("already-confirmed"),
15+
CONFIRM_REQUESTED("confirm-requested"),
16+
CONFIRMED("confirmed");
17+
18+
private final String page;
19+
20+
private ConfirmPage(String page) {
21+
this.page = page;
22+
}
23+
24+
public String getPage() {
25+
return page;
26+
}
27+
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
* To change this license header, choose License Headers in Project Properties.
3+
* To change this template file, choose Tools | Templates
4+
* and open the template in the editor.
5+
*/
6+
package com.parallax.server.blocklyprop.enums;
7+
8+
/**
9+
*
10+
* @author Michel
11+
*/
12+
public enum PasswordResetPage {
13+
14+
RESET_DONE("reset-done"),
15+
RESET_REQUESTED("reset-requested");
16+
17+
private final String page;
18+
19+
private PasswordResetPage(String page) {
20+
this.page = page;
21+
}
22+
23+
public String getPage() {
24+
return page;
25+
}
26+
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*
2+
* To change this license header, choose License Headers in Project Properties.
3+
* To change this template file, choose Tools | Templates
4+
* and open the template in the editor.
5+
*/
6+
package com.parallax.server.blocklyprop.monitoring;
7+
8+
import com.codahale.metrics.MetricRegistry;
9+
import com.codahale.metrics.servlet.InstrumentedFilterContextListener;
10+
11+
/**
12+
*
13+
* @author Michel
14+
*/
15+
public class BlocklyPropInstrumentedFilterContextListener extends InstrumentedFilterContextListener {
16+
17+
@Override
18+
protected MetricRegistry getMetricRegistry() {
19+
return Monitor.metrics();
20+
}
21+
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/*
2+
* To change this license header, choose License Headers in Project Properties.
3+
* To change this template file, choose Tools | Templates
4+
* and open the template in the editor.
5+
*/
6+
package com.parallax.server.blocklyprop.monitoring;
7+
8+
import com.codahale.metrics.ConsoleReporter;
9+
import com.codahale.metrics.MetricFilter;
10+
import com.codahale.metrics.MetricRegistry;
11+
import com.codahale.metrics.graphite.GraphiteReporter;
12+
import com.codahale.metrics.graphite.PickledGraphite;
13+
import com.codahale.metrics.jvm.GarbageCollectorMetricSet;
14+
import com.codahale.metrics.jvm.MemoryUsageGaugeSet;
15+
import com.codahale.metrics.log4j.InstrumentedAppender;
16+
import com.google.inject.Inject;
17+
import com.google.inject.Singleton;
18+
import java.net.InetSocketAddress;
19+
import java.util.concurrent.TimeUnit;
20+
import org.apache.commons.configuration.Configuration;
21+
import org.apache.log4j.LogManager;
22+
23+
/**
24+
*
25+
* @author Michel
26+
*/
27+
@Singleton
28+
public class Monitor {
29+
30+
private static final MetricRegistry metrics = new MetricRegistry();
31+
32+
private final boolean consoleEnabled;
33+
private final int consoleReportingInterval;
34+
35+
private final boolean graphiteEnabled;
36+
private final String graphitePrefix;
37+
private final String graphiteServerAddress;
38+
private final int graphiteServerPort;
39+
private final int graphiteReportingInterval;
40+
41+
@Inject
42+
public Monitor(Configuration configuration) {
43+
consoleEnabled = configuration.getBoolean("monitor.console.enabled", false);
44+
consoleReportingInterval = configuration.getInt("monitor.console.interval", 300);
45+
46+
graphiteEnabled = configuration.getBoolean("monitor.graphite.enabled", false);
47+
graphitePrefix = configuration.getString("monitor.graphite.prefix", "blocklyprop");
48+
graphiteServerAddress = configuration.getString("monitor.graphite.address", "localhost");
49+
graphiteServerPort = configuration.getInt("monitor.graphite.port", 2003);
50+
graphiteReportingInterval = configuration.getInt("monitor.graphite.interval", 30);
51+
52+
init();
53+
}
54+
55+
private void init() {
56+
if (consoleEnabled) {
57+
ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics).convertDurationsTo(TimeUnit.MILLISECONDS).build();
58+
reporter.start(consoleReportingInterval, TimeUnit.SECONDS);
59+
}
60+
61+
if (graphiteEnabled) {
62+
final PickledGraphite pickledGraphite = new PickledGraphite(new InetSocketAddress(graphiteServerAddress, graphiteServerPort));
63+
final GraphiteReporter graphiteReporter = GraphiteReporter.forRegistry(metrics).prefixedWith(graphitePrefix).convertDurationsTo(TimeUnit.MILLISECONDS).filter(MetricFilter.ALL).build(pickledGraphite);
64+
graphiteReporter.start(graphiteReportingInterval, TimeUnit.SECONDS);
65+
}
66+
67+
InstrumentedAppender appender = new InstrumentedAppender(metrics);
68+
appender.activateOptions();
69+
70+
LogManager.getRootLogger().addAppender(appender);
71+
72+
MemoryUsageGaugeSet memoryUsageGaugeSet = new MemoryUsageGaugeSet();
73+
metrics.registerAll(memoryUsageGaugeSet);
74+
75+
GarbageCollectorMetricSet garbageCollectorMetricSet = new GarbageCollectorMetricSet();
76+
metrics.registerAll(garbageCollectorMetricSet);
77+
}
78+
79+
public static MetricRegistry metrics() {
80+
return metrics;
81+
}
82+
83+
}

src/main/java/com/parallax/server/blocklyprop/servlets/ConfirmRequestServlet.java

+15-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
import com.parallax.client.cloudsession.exceptions.ServerException;
1515
import com.parallax.client.cloudsession.exceptions.UnknownUserException;
1616
import com.parallax.client.cloudsession.exceptions.WrongAuthenticationSourceException;
17+
import com.parallax.server.blocklyprop.enums.ConfirmPage;
18+
import com.parallax.server.blocklyprop.utils.ServletUtils;
19+
import com.parallax.server.blocklyprop.utils.TextileReader;
1720
import java.io.IOException;
1821
import javax.servlet.ServletException;
1922
import javax.servlet.http.HttpServlet;
@@ -32,6 +35,8 @@ public class ConfirmRequestServlet extends HttpServlet {
3235

3336
private static Logger log = LoggerFactory.getLogger(ConfirmRequestServlet.class);
3437

38+
private final TextileReader textileFileReader = new TextileReader();
39+
3540
private CloudSessionLocalUserService cloudSessionLocalUserService;
3641
private Configuration configuration;
3742

@@ -54,7 +59,8 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S
5459
} else {
5560
try {
5661
if (cloudSessionLocalUserService.requestNewConfirmEmail(email)) {
57-
req.getRequestDispatcher("WEB-INF/servlet/confirm/confirm-requested.jsp").forward(req, resp);
62+
showTextilePage(req, resp, ConfirmPage.CONFIRM_REQUESTED);
63+
//req.getRequestDispatcher("WEB-INF/servlet/confirm/confirm-requested.jsp").forward(req, resp);
5864
} else {
5965
req.setAttribute("error", true);
6066
req.getRequestDispatcher("WEB-INF/servlet/confirm/confirm-request.jsp").forward(req, resp);
@@ -66,7 +72,8 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S
6672
req.setAttribute("insufficientTokens", true);
6773
req.getRequestDispatcher("WEB-INF/servlet/confirm/confirm-request.jsp").forward(req, resp);
6874
} catch (EmailAlreadyConfirmedException ex) {
69-
req.getRequestDispatcher("WEB-INF/servlet/confirm/already-confirmed.jsp").forward(req, resp);
75+
showTextilePage(req, resp, ConfirmPage.ALREADY_CONFIRMED);
76+
//req.getRequestDispatcher("WEB-INF/servlet/confirm/already-confirmed.jsp").forward(req, resp);
7077
} catch (ServerException se) {
7178
req.setAttribute("server-exception", "Server exception");
7279
req.getRequestDispatcher("WEB-INF/servlet/confirm/confirm-request.jsp").forward(req, resp);
@@ -78,4 +85,10 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S
7885
}
7986
}
8087

88+
public void showTextilePage(HttpServletRequest req, HttpServletResponse resp, ConfirmPage confirmPage) throws ServletException, IOException {
89+
String html = textileFileReader.readFile("confirm/" + confirmPage.getPage(), ServletUtils.getLocale(req), req.isSecure());
90+
req.setAttribute("html", html);
91+
req.getRequestDispatcher("/WEB-INF/servlet/html.jsp").forward(req, resp);
92+
}
93+
8194
}

src/main/java/com/parallax/server/blocklyprop/servlets/ConfirmServlet.java

+14-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
import com.parallax.client.cloudsession.exceptions.UnknownUserException;
1414
import com.parallax.client.cloudsession.exceptions.WrongAuthenticationSourceException;
1515
import com.parallax.server.blocklyprop.db.dao.UserDao;
16+
import com.parallax.server.blocklyprop.enums.ConfirmPage;
17+
import com.parallax.server.blocklyprop.utils.ServletUtils;
18+
import com.parallax.server.blocklyprop.utils.TextileReader;
1619
import java.io.IOException;
1720
import javax.servlet.ServletException;
1821
import javax.servlet.http.HttpServlet;
@@ -31,6 +34,8 @@ public class ConfirmServlet extends HttpServlet {
3134

3235
private static Logger log = LoggerFactory.getLogger(ConfirmServlet.class);
3336

37+
private final TextileReader textileFileReader = new TextileReader();
38+
3439
private CloudSessionLocalUserService cloudSessionLocalUserService;
3540
private Configuration configuration;
3641

@@ -67,7 +72,9 @@ public void confirmToken(HttpServletRequest req, HttpServletResponse resp) throw
6772
} else {
6873
try {
6974
if (cloudSessionLocalUserService.doConfirm(email, token)) {
70-
req.getRequestDispatcher("WEB-INF/servlet/confirm/confirmed.jsp").forward(req, resp);
75+
// req.getRequestDispatcher("WEB-INF/servlet/confirm/confirmed.jsp").forward(req, resp);
76+
77+
showTextilePage(req, resp, ConfirmPage.CONFIRMED);
7178
} else {
7279
req.setAttribute("invalidToken", "Invalid token");
7380
req.getRequestDispatcher("WEB-INF/servlet/confirm/confirm.jsp").forward(req, resp);
@@ -86,4 +93,10 @@ public void confirmToken(HttpServletRequest req, HttpServletResponse resp) throw
8693
}
8794
}
8895

96+
public void showTextilePage(HttpServletRequest req, HttpServletResponse resp, ConfirmPage confirmPage) throws ServletException, IOException {
97+
String html = textileFileReader.readFile("confirm/" + confirmPage.getPage(), ServletUtils.getLocale(req), req.isSecure());
98+
req.setAttribute("html", html);
99+
req.getRequestDispatcher("/WEB-INF/servlet/html.jsp").forward(req, resp);
100+
}
101+
89102
}

src/main/java/com/parallax/server/blocklyprop/servlets/PasswordResetRequestServlet.java

+13-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
import com.parallax.client.cloudsession.exceptions.ServerException;
1414
import com.parallax.client.cloudsession.exceptions.UnknownUserException;
1515
import com.parallax.client.cloudsession.exceptions.WrongAuthenticationSourceException;
16+
import com.parallax.server.blocklyprop.enums.PasswordResetPage;
17+
import com.parallax.server.blocklyprop.utils.ServletUtils;
18+
import com.parallax.server.blocklyprop.utils.TextileReader;
1619
import java.io.IOException;
1720
import javax.servlet.ServletException;
1821
import javax.servlet.http.HttpServlet;
@@ -31,6 +34,8 @@ public class PasswordResetRequestServlet extends HttpServlet {
3134

3235
private static Logger log = LoggerFactory.getLogger(PasswordResetRequestServlet.class);
3336

37+
private final TextileReader textileFileReader = new TextileReader();
38+
3439
private CloudSessionLocalUserService cloudSessionLocalUserService;
3540
private Configuration configuration;
3641

@@ -53,7 +58,8 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S
5358
} else {
5459
try {
5560
if (cloudSessionLocalUserService.requestPasswordReset(email)) {
56-
req.getRequestDispatcher("WEB-INF/servlet/password-reset/reset-requested.jsp").forward(req, resp);
61+
showTextilePage(req, resp, PasswordResetPage.RESET_REQUESTED);
62+
// req.getRequestDispatcher("WEB-INF/servlet/password-reset/reset-requested.jsp").forward(req, resp);
5763
} else {
5864
req.setAttribute("error", true);
5965
req.getRequestDispatcher("WEB-INF/servlet/password-reset/reset-request.jsp").forward(req, resp);
@@ -75,4 +81,10 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S
7581
}
7682
}
7783

84+
public void showTextilePage(HttpServletRequest req, HttpServletResponse resp, PasswordResetPage passwordResetPage) throws ServletException, IOException {
85+
String html = textileFileReader.readFile("password-reset/" + passwordResetPage.getPage(), ServletUtils.getLocale(req), req.isSecure());
86+
req.setAttribute("html", html);
87+
req.getRequestDispatcher("/WEB-INF/servlet/html.jsp").forward(req, resp);
88+
}
89+
7890
}

src/main/java/com/parallax/server/blocklyprop/servlets/PasswordResetServlet.java

+13-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
import com.parallax.client.cloudsession.exceptions.ServerException;
1515
import com.parallax.client.cloudsession.exceptions.UnknownUserException;
1616
import com.parallax.client.cloudsession.exceptions.WrongAuthenticationSourceException;
17+
import com.parallax.server.blocklyprop.enums.PasswordResetPage;
18+
import com.parallax.server.blocklyprop.utils.ServletUtils;
19+
import com.parallax.server.blocklyprop.utils.TextileReader;
1720
import java.io.IOException;
1821
import javax.servlet.ServletException;
1922
import javax.servlet.http.HttpServlet;
@@ -32,6 +35,8 @@ public class PasswordResetServlet extends HttpServlet {
3235

3336
private static Logger log = LoggerFactory.getLogger(PasswordResetServlet.class);
3437

38+
private final TextileReader textileFileReader = new TextileReader();
39+
3540
private CloudSessionLocalUserService cloudSessionLocalUserService;
3641
private Configuration configuration;
3742

@@ -63,7 +68,8 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S
6368
} else {
6469
try {
6570
if (cloudSessionLocalUserService.doPasswordReset(token, email, password, confirmPassword)) {
66-
req.getRequestDispatcher("WEB-INF/servlet/password-reset/reset-done.jsp").forward(req, resp);
71+
showTextilePage(req, resp, PasswordResetPage.RESET_DONE);
72+
//req.getRequestDispatcher("WEB-INF/servlet/password-reset/reset-done.jsp").forward(req, resp);
6773
} else {
6874
req.setAttribute("invalidToken", "Invalid token");
6975
req.getRequestDispatcher("WEB-INF/servlet/password-reset/do-reset.jsp").forward(req, resp);
@@ -88,4 +94,10 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S
8894
}
8995
}
9096

97+
public void showTextilePage(HttpServletRequest req, HttpServletResponse resp, PasswordResetPage passwordResetPage) throws ServletException, IOException {
98+
String html = textileFileReader.readFile("password-reset/" + passwordResetPage.getPage(), ServletUtils.getLocale(req), req.isSecure());
99+
req.setAttribute("html", html);
100+
req.getRequestDispatcher("/WEB-INF/servlet/html.jsp").forward(req, resp);
101+
}
102+
91103
}

0 commit comments

Comments
 (0)