Skip to content

Commit d5f3065

Browse files
author
nborja
committed
Localisation, lazy loading, and more
1 parent 0f5503d commit d5f3065

35 files changed

+305
-50
lines changed

src/main/java/launch/Main.java

+55-10
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,16 @@
33
import java.io.File;
44

55
import org.apache.catalina.WebResourceRoot;
6-
import org.apache.catalina.core.StandardContext;
6+
// import org.apache.catalina.core.StandardContext;
77
import org.apache.catalina.startup.Tomcat;
8+
import org.apache.catalina.connector.Connector;
89
import org.apache.catalina.webresources.DirResourceSet;
910
import org.apache.catalina.webresources.StandardRoot;
1011

12+
import org.apache.catalina.Context;
13+
import org.apache.catalina.WebResourceSet;
14+
import org.apache.catalina.webresources.EmptyResourceSet;
15+
1116
// import java.io.FileReader;
1217

1318
// import javax.script.ScriptEngine;
@@ -24,27 +29,67 @@ public static void main(String[] args) throws Exception {
2429
//The port that we should run on can be set into an environment variable
2530
//Look for that variable and default to 8080 if it isn't there.
2631
String webPort = System.getenv("PORT");
27-
if(webPort == null || webPort.isEmpty()) {
32+
if (webPort == null || webPort.isEmpty()) {
2833
webPort = "8080";
2934
}
3035

36+
// tomcat.setPort(Integer.valueOf(webPort));
37+
38+
Connector httpsConnector = new Connector();
39+
httpsConnector.setProtocol("org.apache.coyote.http11.Http11NioProtocol");
40+
httpsConnector.setPort(8081);
41+
httpsConnector.setSecure(true);
42+
httpsConnector.setScheme("https");
43+
httpsConnector.setAttribute("keystoreFile", new File(webappDirLocation).getAbsolutePath() + "/cert/keystore");
44+
httpsConnector.setAttribute("keystorePass", "password");
45+
// httpsConnector.setAttribute("truststoreFile",
46+
// new File(webappDirLocation).getAbsolutePath() + "/cert/server.cer");
47+
// httpsConnector.setAttribute("truststorePass", "");
48+
httpsConnector.setAttribute("clientAuth", false);
49+
httpsConnector.setAttribute("sslProtocol", "TLS");
50+
httpsConnector.setAttribute("SSLEnabled", true);
51+
3152
tomcat.setPort(Integer.valueOf(webPort));
53+
tomcat.getService().addConnector(httpsConnector);
54+
55+
Connector defaultConnector = tomcat.getConnector();
56+
defaultConnector.setRedirectPort(8081);
57+
58+
// StandardContext ctx = (StandardContext) tomcat.addWebapp("", new File(webappDirLocation).getAbsolutePath());
59+
// System.out.println("configuring app with basedir: " + new File("./" + webappDirLocation).getAbsolutePath());
3260

33-
StandardContext ctx = (StandardContext) tomcat.addWebapp("/", new File(webappDirLocation).getAbsolutePath());
34-
System.out.println("configuring app with basedir: " + new File("./" + webappDirLocation).getAbsolutePath());
61+
// // Declare an alternative location for your "WEB-INF/classes" dir
62+
// // Servlet 3.0 annotation will work
63+
// File additionWebInfClasses = new File("target/classes");
64+
// WebResourceRoot resources = new StandardRoot(ctx);
65+
// resources.addPreResources(
66+
// new DirResourceSet(resources, "/WEB-INF/classes", additionWebInfClasses.getAbsolutePath(), "/"));
67+
// ctx.setResources(resources);
68+
69+
// Define a web application context.
70+
Context context = tomcat.addWebapp("", new File(webappDirLocation).getAbsolutePath());
3571

3672
// Declare an alternative location for your "WEB-INF/classes" dir
3773
// Servlet 3.0 annotation will work
38-
File additionWebInfClasses = new File("target/classes");
39-
WebResourceRoot resources = new StandardRoot(ctx);
40-
resources.addPreResources(new DirResourceSet(resources, "/WEB-INF/classes",
41-
additionWebInfClasses.getAbsolutePath(), "/"));
42-
ctx.setResources(resources);
74+
File additionWebInfClassesFolder = new File("target/classes");
75+
WebResourceRoot resources = new StandardRoot(context);
76+
77+
WebResourceSet resourceSet;
78+
if (additionWebInfClassesFolder.exists()) {
79+
resourceSet = new DirResourceSet(resources, "/WEB-INF/classes",
80+
additionWebInfClassesFolder.getAbsolutePath(), "/");
81+
System.out.println(
82+
"loading WEB-INF resources from as '" + additionWebInfClassesFolder.getAbsolutePath() + "'");
83+
} else {
84+
resourceSet = new EmptyResourceSet(resources);
85+
}
86+
87+
resources.addPreResources(resourceSet);
88+
context.setResources(resources);
4389

4490
tomcat.start();
4591
tomcat.getServer().await();
4692

47-
4893
// Server-rendering with Nashorn
4994
// ScriptEngine nashorn = new ScriptEngineManager().getEngineByName("nashorn");
5095
// nashorn.eval(new FileReader(webappDirLocation + "public/bundle.js"));

src/main/java/servlet/About.java

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package servlet;
2+
3+
import java.io.IOException;
4+
5+
import javax.servlet.ServletException;
6+
// import javax.servlet.ServletOutputStream;
7+
import javax.servlet.annotation.WebServlet;
8+
import javax.servlet.http.HttpServlet;
9+
import javax.servlet.http.HttpServletRequest;
10+
import javax.servlet.http.HttpServletResponse;
11+
12+
@WebServlet(name = "About", urlPatterns = { "/about" })
13+
public class About extends HttpServlet {
14+
15+
@Override
16+
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
17+
request.getSession().setAttribute("title", "About Carrefour");
18+
request.getSession().setAttribute("description", "About description");
19+
request.getRequestDispatcher("index.jsp").forward(request, response);
20+
}
21+
}

src/main/java/servlet/HelloServlet.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class HelloServlet extends HttpServlet {
1515
@Override
1616
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
1717
ServletOutputStream out = resp.getOutputStream();
18-
out.write("Hello! Happy Coding! :)".getBytes());
18+
out.write("Hello! Happy Coding!!!".getBytes());
1919
out.flush();
2020
out.close();
2121
}

src/main/java/servlet/Home.java

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package servlet;
2+
3+
import java.io.IOException;
4+
5+
import javax.servlet.ServletException;
6+
// import javax.servlet.ServletOutputStream;
7+
import javax.servlet.annotation.WebServlet;
8+
import javax.servlet.http.HttpServlet;
9+
import javax.servlet.http.HttpServletRequest;
10+
import javax.servlet.http.HttpServletResponse;
11+
12+
@WebServlet(name = "Home", urlPatterns = { "" })
13+
public class Home extends HttpServlet {
14+
15+
@Override
16+
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
17+
request.getSession().setAttribute("title", "Welcome to Carrefour");
18+
request.getSession().setAttribute("description", "Home description");
19+
request.getRequestDispatcher("index.jsp").forward(request, response);
20+
}
21+
}

src/main/webapp/cert/.keystore

2.51 KB
Binary file not shown.

src/main/webapp/cert/keystore

2.51 KB
Binary file not shown.

src/main/webapp/cert/selfsigned.jks

4.8 KB
Binary file not shown.

src/main/webapp/cert/server.cer

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDYzCCAkugAwIBAgIEAzx/ZjANBgkqhkiG9w0BAQsFADBiMQswCQYDVQQGEwJh
3+
ZTEOMAwGA1UECBMFZHViYWkxDjAMBgNVBAcTBWR1YmFpMRIwEAYDVQQKEwljYXJy
4+
ZWZvdXIxEjAQBgNVBAsTCWNhcnJlZm91cjELMAkGA1UEAxMCbmIwHhcNMTcxMjI3
5+
MTE0NDEyWhcNMTgwMzI3MTE0NDEyWjBiMQswCQYDVQQGEwJhZTEOMAwGA1UECBMF
6+
ZHViYWkxDjAMBgNVBAcTBWR1YmFpMRIwEAYDVQQKEwljYXJyZWZvdXIxEjAQBgNV
7+
BAsTCWNhcnJlZm91cjELMAkGA1UEAxMCbmIwggEiMA0GCSqGSIb3DQEBAQUAA4IB
8+
DwAwggEKAoIBAQCwAVCcO76GhmKlbiH2IQ+F/QFmZqe8K+60CFZBMpmchb4s/P0J
9+
CB3yHyfWoyWGhvow7R+e3In/OOq7YD26dTUTm4jt/J0lgX9+Duwi2lKXPUPMkSXj
10+
LQyXSiQiMJZN+bURyGm42fykANOtYdv/IZD8YvMTZYXR87t4pJ6+vA3oNQRsdSX7
11+
ZO4ixoX7Fg2NOfH75o4aQ+KWf4FTr58Bd74D2VIK6b7AOwMypPWc0BPMmNRUswQZ
12+
LK4SxMYytYd2w0g2z4P0cV+m/5KK1p21y6wIxuUuHEgmwVfnxKf3SdtD7UzJ7ahw
13+
yTKuk9TJXiwYs7jE8PlskxVL9g9Frj1LHxfBAgMBAAGjITAfMB0GA1UdDgQWBBT3
14+
WV8+Q4lxIYlUvU3v9FkeYnE77jANBgkqhkiG9w0BAQsFAAOCAQEAgx/Bp2GFTTIy
15+
nCdUTyVJ5v2L5Cue1kFBbRYauerwD3E14MAoe9cvExtiqlmRHtT1L5kg/1jroJvY
16+
BHmXntVYLGOis1SOCKyjgvCuQLiky5Cu/olNdRngT4qWpYiw0HqwkXosZBURd/LN
17+
J1T/MfkNzALEKe4T/ANccZHkIBns1zEvjuwus7RvJggH4r2W3J95F5sOWdx42ndc
18+
B4vNw0ajRhSNvK6N9WhXkyJYe0aerKFIEp0RO/gj1stim1xhD1+FS1GHasnJHS+W
19+
/x6sxYsbPe4XcoCZ8eRt5ONu9nsBB6mXy/nkhd5wdgPqkPLV6RvkfoI1O/hIXc+w
20+
x6nHoWHd4w==
21+
-----END CERTIFICATE-----

src/main/webapp/cert/server.csr

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
-----BEGIN NEW CERTIFICATE REQUEST-----
2+
MIIC1zCCAb8CAQAwYjELMAkGA1UEBhMCYWUxDjAMBgNVBAgTBWR1YmFpMQ4wDAYD
3+
VQQHEwVkdWJhaTESMBAGA1UEChMJY2FycmVmb3VyMRIwEAYDVQQLEwljYXJyZWZv
4+
dXIxCzAJBgNVBAMTAm5iMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
5+
sAFQnDu+hoZipW4h9iEPhf0BZmanvCvutAhWQTKZnIW+LPz9CQgd8h8n1qMlhob6
6+
MO0fntyJ/zjqu2A9unU1E5uI7fydJYF/fg7sItpSlz1DzJEl4y0Ml0okIjCWTfm1
7+
EchpuNn8pADTrWHb/yGQ/GLzE2WF0fO7eKSevrwN6DUEbHUl+2TuIsaF+xYNjTnx
8+
++aOGkPiln+BU6+fAXe+A9lSCum+wDsDMqT1nNATzJjUVLMEGSyuEsTGMrWHdsNI
9+
Ns+D9HFfpv+SitadtcusCMblLhxIJsFX58Sn90nbQ+1Mye2ocMkyrpPUyV4sGLO4
10+
xPD5bJMVS/YPRa49Sx8XwQIDAQABoDAwLgYJKoZIhvcNAQkOMSEwHzAdBgNVHQ4E
11+
FgQU91lfPkOJcSGJVL1N7/RZHmJxO+4wDQYJKoZIhvcNAQELBQADggEBAE5+of9O
12+
KUH3H6/lTSGxksAwTx62oNr/jyO3wPslhG6UG4tdYWaKJMHWk4dInrheUkFlYFj9
13+
vinqLKwaFbyjMF5GR4q0OitsP4ACd7nWpvAzgh7D0mTR+dQSbRwdq5O5cnubgkMq
14+
RTITJoTvEc3NY4lZ/IP3I9qpOW54L7Uxwmf15hRlh/vC5qGF2HEvTP3oiKRYhADm
15+
/o3NvCTKBc3mZ1TcJ61sz54vQVfCsRhbybCpYAZhFc+eBe9tCwwJNAAe8CIjk5AW
16+
fP7OEXCotuSRnVuqP+4gGhpIG3ivCqPMNHoaVMEQM5b7e3kLrAlMjSO0t+KCd1dx
17+
t2SvHo0W59DDzXs=
18+
-----END NEW CERTIFICATE REQUEST-----

src/main/webapp/client/app/components/App.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import React from "react";
22
import { connect } from "react-redux";
33
import { bindActionCreators } from "redux";
4+
// https://github.com/amsul/react-translated
45
import { Provider } from "react-translated";
56

67
import { updatei18n } from "../actions/i18n";
@@ -46,7 +47,11 @@ class App extends React.PureComponent {
4647
<Provider language={this.props.language} translation={this.props.i18n}>
4748
<Header />
4849
<Routes />
49-
<select onChange={this.props.onChangeLanguage}>
50+
<select
51+
onChange={this.props.onChangeLanguage}
52+
style={{ marginTop: 20, padding: 10, WebkitAppearance: "none" }}
53+
value={this.props.language}
54+
>
5055
<option value="en">English</option>
5156
<option value="ar">Arabic</option>
5257
</select>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import React from "react";
2+
3+
export default () => (
4+
<p className="g-flex g-flex-item-stretch g-flex-content-center">
5+
Page Not Found
6+
</p>
7+
);

src/main/webapp/client/app/components/Routes.js

+8
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const Search = CustomLoadable({
1111
const Home = CustomLoadable({
1212
loader: () => import("./home"),
1313
render({ default: Component }, props) {
14+
// About.preload();
1415
Search.preload();
1516
return <Component {...props} />;
1617
}
@@ -22,10 +23,17 @@ const About = CustomLoadable({
2223
return <Component {...props} />;
2324
}
2425
});
26+
const NotFound = CustomLoadable({
27+
loader: () => import("./NotFound"),
28+
render({ default: Component }, props) {
29+
return <Component {...props} />;
30+
}
31+
});
2532

2633
export default () => (
2734
<Switch>
2835
<Route exact path="/" component={Home} />
2936
<Route exact path="/about" component={About} />
37+
<Route component={NotFound} />
3038
</Switch>
3139
);

src/main/webapp/client/app/components/about/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import Hello from "./Hello";
66
import "./style.scss";
77

88
export default () => (
9-
<div className="about">
9+
<div className="about g-flex-item-stretch">
1010
<Title />
1111
<Hello />
1212
</div>

src/main/webapp/client/app/components/header/index.js

+12-4
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
11
import React from "react";
22
import Nav from "../nav";
3+
import MaterialRipple from "../material-ripple";
34

45
import "./style.scss";
56

67
export default () => (
78
<header className="header g-flex">
8-
<img
9-
alt="Carrefour"
10-
src="https://www.carrefouruae.com/_ui/responsive/theme-blue/images/logo.svg"
11-
width={150}
9+
<MaterialRipple to="/">
10+
<img
11+
alt="Carrefour"
12+
src="https://www.carrefouruae.com/_ui/responsive/theme-blue/images/logo.svg"
13+
width={150}
14+
/>
15+
</MaterialRipple>
16+
<input
17+
className="header__search"
18+
type="text"
19+
placeholder="What are you looking for?"
1220
/>
1321
<Nav />
1422
</header>
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,17 @@
11
.header {
22
border-bottom: 2px dashed $border-color;
33
padding-bottom: 20px;
4+
5+
&__search {
6+
display: none;
7+
8+
@include tabletAndUp {
9+
display: block;
10+
padding: 10px;
11+
border-radius: 10px;
12+
border: 2px solid #1159a7;
13+
width: 40%;
14+
max-width: 400px;
15+
}
16+
}
417
}

src/main/webapp/client/app/components/home/Counter.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import MaterialButton from "../material-button";
33

44
export default props => (
55
<section className="g-flex-item-stretch">
6-
<p className="counter">❤️ Rates: {props.count}%</p>
6+
<p className="counter">Rate❤️ {props.count}%</p>
77

88
<MaterialButton
99
text="Increment"

src/main/webapp/client/app/components/home/Notes.js

-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import React from "react";
22
import Aux from "../Aux";
3-
import { Translate } from "react-translated";
43

54
export default () => (
65
<Aux>
@@ -11,6 +10,5 @@ export default () => (
1110
<p className="home__note">
1211
Also now supports custom HTML attributes eg: ❤️ 🦄
1312
</p>
14-
<Translate text="English" />
1513
</Aux>
1614
);

src/main/webapp/client/app/components/material-ripple/index.js

+1
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ class MaterialRipple extends React.PureComponent {
152152

153153
MaterialRipple.defaultProps = {
154154
centerRipple: true,
155+
className: "",
155156
delayRipple: false,
156157
smallRipple: false,
157158
type: "button"

src/main/webapp/client/app/components/misc/CustomLoadable.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// https://github.com/thejameskyle/react-loadable
2+
// import React from "react";
23
import Loadable from "react-loadable";
34
import Loader from "./Loader";
45

@@ -9,7 +10,7 @@ export default options =>
910
immutableObjectMerge(
1011
{
1112
loading: Loader,
12-
// delay: 200,
13+
delay: 0,
1314
timeout: 20000 // 20 sec
1415
},
1516
options

src/main/webapp/client/app/components/misc/Loader.js

+10-8
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
1+
import React from "react";
2+
13
export default props => {
2-
if (props.error) {
4+
if (props.error || props.timedOut || props.pastDelay) {
35
// When the loader has errored
4-
return <div>Error!</div>;
5-
} else if (props.timedOut) {
6-
// When the loader has taken longer than the timeout
7-
return <div>Taking a long time...</div>;
8-
} else if (props.pastDelay) {
9-
// When the loader has taken longer than the delay
10-
return <div>Loading...</div>;
6+
return (
7+
<div className="g-flex g-flex-item-stretch g-flex-content-center">
8+
{props.error
9+
? "Error!"
10+
: props.timedOut ? "Taking a long time..." : "Loading..."}
11+
</div>
12+
);
1113
} else {
1214
// When the loader has just started
1315
return null;
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,22 @@
11
import React from "react";
2-
2+
import { Translate } from "react-translated";
33
import MaterialRipple from "../material-ripple";
44

55
import "./style.scss";
66

77
export default () => (
88
<nav className="nav">
9-
<MaterialRipple smallRipple className="nav__item" text="Home" to="/" />
109
<MaterialRipple
1110
smallRipple
1211
className="nav__item"
13-
text="About"
12+
text={<Translate text="About" />}
1413
to="/about"
1514
/>
15+
<MaterialRipple
16+
smallRipple
17+
className="nav__item"
18+
text={<Translate text="Not Found" />}
19+
to="not-found"
20+
/>
1621
</nav>
1722
);

0 commit comments

Comments
 (0)