Skip to content

Commit 0b2178c

Browse files
Release 3.0.0 updates
- CSS cleanup and optimization - PW strength lang translations - Proper role lang translations - UI redesign - Fixes - Doc
1 parent a4ad34b commit 0b2178c

File tree

69 files changed

+482
-59658
lines changed

Some content is hidden

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

69 files changed

+482
-59658
lines changed

README.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ The Web framework is shipped with the following features ready to use:
134134
- Easy to understand HTML template engine
135135
- HTTPS protocol and TLS for mail if configured
136136
- Bean support with transient and unique fields
137-
- User session are stored when servers are stopped
137+
- User sessions are stored when servers are stopped
138138
- Entities can be served through the JSON REST API
139139
- Logging implementations other than log4j2 supported
140140
- Add, edit, view, list and delete functionality for entities
@@ -554,6 +554,19 @@ edit- and add-handler or add your new role management by adjusting your `edit.ht
554554
- If you want to see, how role authorization is done in handlers, see `hasAccess`-method, e.g., in the `ch.autumo.beetroot.handler.tasks.TasksAddHandler` class.
555555
- If you want to see, how role authorization is done in the web templates, see, e.g., `web/html/en/home.html` and `web/html/blocks/head.html` template.
556556

557+
Example with an entity (<code>Users</code>) and actions (<code>add</code>, <code>edit</code>):
558+
559+
```Html
560+
{$if-entity=Users:}
561+
{$if-action=add,edit:}
562+
<!-- E.g., limit the use of BootStrap here -->
563+
<link rel="stylesheet" href="/css/bootstrap.min.css">
564+
{$endif-action;}
565+
{$endif-entity;}
566+
```
567+
568+
**Note**: You can cascade web template authorizations in the order `roles` &#x2192; `entity` (only one allowed) &#x2192; `actions` only.
569+
557570
<p align="right">(<a href="#top">back to top</a>)</p>
558571

559572

src/main/java/ch/autumo/beetroot/BeetRootWebServer.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import java.util.List;
3434
import java.util.Map;
3535
import java.util.concurrent.ConcurrentHashMap;
36+
import java.util.regex.Pattern;
3637

3738
import javax.servlet.ServletContext;
3839
import javax.servlet.http.HttpServletRequest;
@@ -598,6 +599,12 @@ public Response serve(BeetRootHTTPSession session, HttpServletRequest request) {
598599

599600
return Response.newFixedLengthResponse(Status.OK, "text/css", css);
600601
}
602+
603+
// Parse password strength javas-cript file for translations
604+
if (requestedFile.equals("password-strength.js")) {
605+
final String js = PwsParser.parseAll(fc.getTextData(), userSession);
606+
return Response.newFixedLengthResponse(Status.OK, "application/javascript", js);
607+
}
601608

602609
// Everything else: Text data !
603610
if (MIME.isMimeTypeText(mimeType))
@@ -1230,5 +1237,39 @@ public void addMappings() {
12301237
addRoute(route.getRoute(), route.getPriority(), route.getHandler(), route.getInitParameter());
12311238
}
12321239
}
1240+
1241+
/**
1242+
* Parser for 'password-strength.js'.
1243+
*/
1244+
private static class PwsParser {
1245+
1246+
public static Pattern PATTERN_INFO = Pattern.compile("\\{\\$pw.info\\}");
1247+
public static Pattern PATTERN_HIDE = Pattern.compile("\\{\\$pw.hide\\}");
1248+
public static Pattern PATTERN_SHOW = Pattern.compile("\\{\\$pw.show\\}");
1249+
public static Pattern PATTERN_CHARS = Pattern.compile("\\{\\$pw.chars\\}");
1250+
public static Pattern PATTERN_CAPITAL = Pattern.compile("\\{\\$pw.capital\\}");
1251+
public static Pattern PATTERN_NUMBER = Pattern.compile("\\{\\$pw.number\\}");
1252+
public static Pattern PATTERN_SPECIAL = Pattern.compile("\\{\\$pw.special\\}");
1253+
public static Pattern PATTERN_LETTER = Pattern.compile("\\{\\$pw.letter\\}");
1254+
1255+
/**
1256+
* Replace all variables.
1257+
*
1258+
* @param script java-script file contents
1259+
* @param userSession user session
1260+
* @return replaced java-script contents
1261+
*/
1262+
public static String parseAll(String script, Session userSession) {
1263+
script = PATTERN_INFO.matcher(script).replaceAll(LanguageManager.getInstance().translate("pw.info", userSession));
1264+
script = PATTERN_HIDE.matcher(script).replaceAll(LanguageManager.getInstance().translate("pw.hide", userSession));
1265+
script = PATTERN_SHOW.matcher(script).replaceAll(LanguageManager.getInstance().translate("pw.show", userSession));
1266+
script = PATTERN_CHARS.matcher(script).replaceAll(LanguageManager.getInstance().translate("pw.chars", userSession));
1267+
script = PATTERN_CAPITAL.matcher(script).replaceAll(LanguageManager.getInstance().translate("pw.capital", userSession));
1268+
script = PATTERN_NUMBER.matcher(script).replaceAll(LanguageManager.getInstance().translate("pw.number", userSession));
1269+
script = PATTERN_SPECIAL.matcher(script).replaceAll(LanguageManager.getInstance().translate("pw.special", userSession));
1270+
script = PATTERN_LETTER.matcher(script).replaceAll(LanguageManager.getInstance().translate("pw.letter", userSession));
1271+
return script;
1272+
}
1273+
}
12331274

12341275
}

src/main/java/ch/autumo/beetroot/cache/FileCache.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,6 @@ public Response createResponse(String mimeType) throws IOException {
381381
* @throws IOException IO exception
382382
*/
383383
public Response createResponse() throws IOException {
384-
385384
return this.createResponse(this.contentType.getContentType());
386385
}
387386

@@ -415,7 +414,6 @@ public String getEncoding() {
415414
* @return file path
416415
*/
417416
public String getFullPath() {
418-
419417
return this.filePath.toAbsolutePath().toString();
420418
}
421419

src/main/java/ch/autumo/beetroot/handler/BaseHandler.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1045,7 +1045,7 @@ private String processJSON(BeetRootHTTPSession session) {
10451045
/**
10461046
* Process handlers to get the whole HTML page.
10471047
*
1048-
* @param session beetroot session
1048+
* @param session beetRoot session
10491049
* @param origId original DB id
10501050
* @return whole parsed HTML page
10511051
* @throws Exception exception
@@ -1411,29 +1411,34 @@ public String[] getSimpleManagementUserRoles() {
14111411
*
14121412
* @param snippet buffered code snippet
14131413
* @param list the list with the associated entities
1414+
* @param session beetRoot session
14141415
*/
1415-
protected void parseAssociatedEntities(StringBuffer snippet, List<Model> list) {
1416-
this.parseAssociations("{$assignedRoles}", snippet, list);
1416+
protected void parseAssociatedEntities(StringBuffer snippet, List<Model> list, BeetRootHTTPSession session) {
1417+
this.parseAssociations("{$assignedRoles}", snippet, list, session);
14171418
}
14181419

14191420
/**
14201421
* Parse un-associated list.
14211422
*
14221423
* @param snippet buffered code snippet
14231424
* @param list the list with the un-associated entities
1425+
* @param session beetRoot session
14241426
*/
1425-
protected void parseUnassociatedEntities(StringBuffer snippet, List<Model> list) {
1426-
this.parseAssociations("{$unassignedRoles}", snippet, list);
1427+
protected void parseUnassociatedEntities(StringBuffer snippet, List<Model> list, BeetRootHTTPSession session) {
1428+
this.parseAssociations("{$unassignedRoles}", snippet, list, session);
14271429
}
14281430

1429-
private void parseAssociations(String tag, StringBuffer snippet, List<Model> list) {
1431+
private void parseAssociations(String tag, StringBuffer snippet, List<Model> list, BeetRootHTTPSession session) {
14301432
final int idx = snippet.indexOf(tag);
14311433
if (idx == -1)
14321434
return;
14331435
String txt = "";
14341436
for (Iterator<Model> iterator = list.iterator(); iterator.hasNext();) {
14351437
final Model model = iterator.next();
1436-
txt += "<li class=\"list-group-item\" draggable=\"true\" ondragstart=\"drag(event)\" data-id=\""+model.getId()+"\">"+model.getDisplayValue()+"</li>\n";
1438+
String roleVal = model.getDisplayValue();
1439+
if (model.modelClass().equals(Role.class))
1440+
roleVal = LanguageManager.getInstance().translateOrDefVal("role."+roleVal, roleVal, session.getUserSession());
1441+
txt += "<li class=\"list-group-item\" draggable=\"true\" ondragstart=\"drag(event)\" data-id=\""+model.getId()+"\">"+roleVal+"</li>\n";
14371442
}
14381443
snippet.replace(idx, idx + tag.length(), txt);
14391444
}

src/main/java/ch/autumo/beetroot/handler/users/ExtUsersAddHandler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@ public String extractCustomSingleInputDiv(BeetRootHTTPSession session, String va
8787

8888
final StringBuffer snippet = super.readSnippetResource("web/html/:lang/users/snippets/roles.html", session.getUserSession());
8989

90-
super.parseAssociatedEntities(snippet, associatedRoles);
91-
super.parseUnassociatedEntities(snippet, unassociatedRoles);
90+
super.parseAssociatedEntities(snippet, associatedRoles, session);
91+
super.parseUnassociatedEntities(snippet, unassociatedRoles,session);
9292

9393
return snippet.toString();
9494
}

src/main/java/ch/autumo/beetroot/handler/users/ExtUsersEditHandler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,8 @@ public String extractCustomSingleInputDiv(BeetRootHTTPSession session, String va
103103

104104
final StringBuffer snippet = super.readSnippetResource("web/html/:lang/users/snippets/roles.html", session.getUserSession());
105105

106-
super.parseAssociatedEntities(snippet, associatedRoles);
107-
super.parseUnassociatedEntities(snippet, unassociatedRoles);
106+
super.parseAssociatedEntities(snippet, associatedRoles, session);
107+
super.parseUnassociatedEntities(snippet, unassociatedRoles, session);
108108

109109
return snippet.toString();
110110
}

src/main/java/ch/autumo/beetroot/handler/users/ExtUsersIndexHandler.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@ public String extractSingleTableData(BeetRootHTTPSession session, ResultSet set,
5252
for (Iterator<Model> iterator = usersRoles.iterator(); iterator.hasNext();) {
5353
final UserRole userRole = (UserRole) iterator.next();
5454
final Role role = (Role) userRole.getAssociatedReference(Role.class);
55-
strRoles += role.getName() + ", ";
55+
String name = role.getName();
56+
name = LanguageManager.getInstance().translateOrDefVal("role."+name, name, session.getUserSession());
57+
strRoles += name + ", ";
5658
}
5759
if (usersRoles.size() > 0)
5860
strRoles = strRoles.substring(0, strRoles.length() - 2);

src/main/java/ch/autumo/beetroot/handler/users/ExtUsersViewHandler.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@ public String extractSingleTableData(BeetRootHTTPSession session, ResultSet set,
5050
for (Iterator<Model> iterator = usersRoles.iterator(); iterator.hasNext();) {
5151
final UserRole userRole = (UserRole) iterator.next();
5252
final Role role = (Role) userRole.getAssociatedReference(Role.class);
53-
strRoles += role.getName() + ", ";
53+
String name = role.getName();
54+
name = LanguageManager.getInstance().translateOrDefVal("role."+name, name, session.getUserSession());
55+
strRoles += name + ", ";
5456
}
5557
if (usersRoles.size() > 0)
5658
strRoles = strRoles.substring(0, strRoles.length() - 2);

src/main/java/ch/autumo/beetroot/handler/users/UsersIndexHandler.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,20 +46,16 @@ public UsersIndexHandler(String entity, String msg) {
4646

4747
@Override
4848
public String extractSingleTableData(BeetRootHTTPSession session, ResultSet set, String columnName, int idx, Entity entity) throws Exception {
49-
5049
switch (columnName) {
51-
5250
case "username" : return "<td>" + DB.getValue(set, columnName) + "</td>";
5351
case "email" : return "<td>" + DB.getValue(set, columnName) + "</td>";
54-
case "role" : return "<td>" + DB.getValue(set, columnName) + "</td>";
55-
52+
case "role" : String r = DB.getValue(set, columnName);
53+
return "<td>" + LanguageManager.getInstance().translateOrDefVal("role."+r, r, session.getUserSession()) + "</td>";
5654
case "two_fa" : return set.getBoolean(columnName) ?
5755
"<td>" + LanguageManager.getInstance().translate("base.switch.yes", session.getUserSession()) + "</td>" :
5856
"<td>" + LanguageManager.getInstance().translate("base.switch.no", session.getUserSession()) + "</td>";
59-
6057
case "created" : return "<td>" + Time.getGUIDate(set.getTimestamp(columnName)) + "</td>";
6158
case "modified" : return "<td>" + Time.getGUIDate(set.getTimestamp(columnName)) + "</td>";
62-
6359
default : return "<td>" + set.getObject(columnName) + "</td>";
6460
}
6561
}

src/main/java/ch/autumo/beetroot/handler/users/UsersViewHandler.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,27 +50,20 @@ public UsersViewHandler(String entity) {
5050

5151
@Override
5252
public String extractSingleTableData(BeetRootHTTPSession session, ResultSet set, String columnName, int idx, Entity entity) throws Exception {
53-
5453
final User user = (User) entity;
55-
5654
switch (columnName) {
57-
5855
case "username" : userName = set.getString(columnName);
5956
return "<td>"+userName+"</td>";
60-
6157
case "email" : return "<td>" + DB.getValue(set, columnName) + "</td>";
62-
case "role" : return "<td>" + DB.getValue(set, columnName) + "</td>";
63-
58+
case "role" : String r = DB.getValue(set, columnName);
59+
return "<td>" + LanguageManager.getInstance().translateOrDefVal("role."+r, r, session.getUserSession()) + "</td>";
6460
case "two_fa" : return set.getBoolean(columnName) ?
6561
"<td>" + LanguageManager.getInstance().translate("base.switch.yes", session.getUserSession()) + "</td>" :
6662
"<td>" + LanguageManager.getInstance().translate("base.switch.no", session.getUserSession()) + "</td>";
67-
6863
case "created" : return "<td>"+Time.getGUIDate(set.getTimestamp(columnName))+"</td>";
6964
case "modified" : return "<td>"+Time.getGUIDate(set.getTimestamp(columnName))+"</td>";
70-
7165
// transient field 'code'
7266
case "code" : return "<td>"+this.get2FAQRImage(session, user)+"</td>";
73-
7467
default : return "<td>"+set.getObject(columnName)+"</td>";
7568
}
7669
}

web/css/base.css

Lines changed: 18 additions & 19 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

web/css/base.min.css

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)