Skip to content

Commit

Permalink
Refactoring entity URI utils, supporting snake case by default.
Browse files Browse the repository at this point in the history
  • Loading branch information
nmihajlovski committed Mar 20, 2016
1 parent 49ec89d commit 9ff8a3a
Show file tree
Hide file tree
Showing 6 changed files with 68 additions and 32 deletions.
15 changes: 10 additions & 5 deletions rapidoid-commons/src/main/java/org/rapidoid/commons/Str.java
Expand Up @@ -35,8 +35,9 @@ public class Str {

// regex taken from
// http://stackoverflow.com/questions/2559759/how-do-i-convert-camelcase-into-human-readable-names-in-java
private static final Pattern CAMEL_SPLITTER_PATTERN = Pattern
.compile("(?<=[A-Z])(?=[A-Z][a-z])|(?<=[^A-Z])(?=[A-Z])|(?<=[A-Za-z])(?=[^A-Za-z])");
public static final String CAMEL_REGEX = "(?<=[A-Z])(?=[A-Z][a-z])|(?<=[^A-Z])(?=[A-Z])|(?<=[A-Za-z])(?=[^A-Za-z])";

private static final Pattern CAMEL_SPLITTER_PATTERN = Pattern.compile(CAMEL_REGEX);

private static final String[][] XML_ESCAPE = {
{"&", "&amp;"},
Expand All @@ -63,12 +64,12 @@ public class Str {
private Str() {
}

public static String camelSplit(String s) {
return CAMEL_SPLITTER_PATTERN.matcher(s).replaceAll(" ");
public static String[] camelSplit(String s) {
return s.split(CAMEL_REGEX);
}

public static String camelPhrase(String s) {
return capitalized(camelSplit(s).toLowerCase());
return capitalized(U.join(" ", camelSplit(s)).toLowerCase());
}

public static String replace(String s, String[][] repls) {
Expand Down Expand Up @@ -215,4 +216,8 @@ public static String javaEscape(String s) {
return Str.replace(s, JAVA_ESCAPE);
}

public static String camelToSnake(String s) {
return U.join("_", Str.camelSplit(s)).toLowerCase();
}

}
5 changes: 5 additions & 0 deletions rapidoid-commons/src/main/java/org/rapidoid/jpa/JPA.java
Expand Up @@ -182,4 +182,9 @@ public static Object getIdentifier(Object entity) {
public static <T> List<T> jpql(String jpql, Object... args) {
return with(em()).jpql(jpql, args);
}

public static boolean isEntity(Object obj) {
return obj != null && entities().contains(obj.getClass().getName());
}

}
20 changes: 20 additions & 0 deletions rapidoid-commons/src/main/java/org/rapidoid/util/UTILS.java
Expand Up @@ -27,12 +27,15 @@
import org.rapidoid.annotation.Since;
import org.rapidoid.cls.Cls;
import org.rapidoid.commons.Arr;
import org.rapidoid.commons.English;
import org.rapidoid.commons.Str;
import org.rapidoid.config.Conf;
import org.rapidoid.ctx.Ctx;
import org.rapidoid.ctx.Ctxs;
import org.rapidoid.insight.Insights;
import org.rapidoid.io.IO;
import org.rapidoid.io.Res;
import org.rapidoid.jpa.JPA;
import org.rapidoid.lambda.Dynamic;
import org.rapidoid.lambda.F2;
import org.rapidoid.lambda.Lmbd;
Expand Down Expand Up @@ -736,4 +739,21 @@ public static void logProperties(Properties props) {
}
}

public static String uriFor(Object entity) {
if (!JPA.isEntity(entity)) {
return "";
}

Object id = JPA.getIdentifier(entity);

if (id != null) {
String name = Str.camelToSnake(English.plural(Cls.entityName(entity)));
String frm = Conf.ROOT.is("generate") ? "%s%s.html" : "/%s/%s";
return U.frmt(frm, name, id);

} else {
return "";
}
}

}
27 changes: 27 additions & 0 deletions rapidoid-commons/src/test/java/org/rapidoid/commons/StrTest.java
Expand Up @@ -70,4 +70,31 @@ public void testCut() throws Exception {
eq(Str.cutFromLast("a.b.c", "-"), null);
}

@Test
public void testCamelSplit() {
eq(Str.camelSplit("bookTitle"), new String[]{"book", "Title"});
eq(Str.camelSplit("BookTitle"), new String[]{"Book", "Title"});
eq(Str.camelSplit("MyFoo"), new String[]{"My", "Foo"});
eq(Str.camelSplit("Foo"), new String[]{"Foo"});
eq(Str.camelSplit("bar"), new String[]{"bar"});
eq(Str.camelSplit("ABC"), new String[]{"ABC"});
eq(Str.camelSplit("myID"), new String[]{"my", "ID"});
eq(Str.camelSplit("xID2"), new String[]{"x", "ID", "2"});
eq(Str.camelSplit("date1"), new String[]{"date", "1"});
eq(Str.camelSplit("myDate2"), new String[]{"my", "Date", "2"});
}

@Test
public void testCamelToSnake() {
eq(Str.camelToSnake("bookTitle"), "book_title");
eq(Str.camelToSnake("BookTitle"), "book_title");
eq(Str.camelToSnake("Foo"), "foo");
eq(Str.camelToSnake("bar"), "bar");
eq(Str.camelToSnake("ABC"), "abc");
eq(Str.camelToSnake("myID"), "my_id");
eq(Str.camelToSnake("xID2"), "x_id_2");
eq(Str.camelToSnake("date1"), "date_1");
eq(Str.camelToSnake("myDate2"), "my_date_2");
}

}
3 changes: 2 additions & 1 deletion rapidoid-gui/src/main/java/org/rapidoid/gui/Grid.java
Expand Up @@ -29,6 +29,7 @@
import org.rapidoid.model.Items;
import org.rapidoid.model.Property;
import org.rapidoid.u.U;
import org.rapidoid.util.UTILS;
import org.rapidoid.var.Var;

import java.util.List;
Expand Down Expand Up @@ -164,7 +165,7 @@ protected Tag itemRow(List<Property> properties, Item item) {
}

protected String onClickScript(Item item) {
String js = U.frmt("Rapidoid.goAt('%s');", urlFor(item.value()));
String js = U.frmt("Rapidoid.goAt('%s');", UTILS.uriFor(item.value()));
return js;
}

Expand Down
Expand Up @@ -8,7 +8,6 @@
import org.rapidoid.commons.Rnd;
import org.rapidoid.commons.Str;
import org.rapidoid.commons.TimeSeries;
import org.rapidoid.config.Conf;
import org.rapidoid.gui.*;
import org.rapidoid.gui.reqinfo.IReqInfo;
import org.rapidoid.gui.reqinfo.ReqInfo;
Expand All @@ -20,6 +19,7 @@
import org.rapidoid.html.customtag.ColspanTag;
import org.rapidoid.html.tag.*;
import org.rapidoid.http.HttpVerb;
import org.rapidoid.jpa.JPA;
import org.rapidoid.lambda.Calc;
import org.rapidoid.lambda.ToMap;
import org.rapidoid.model.Item;
Expand Down Expand Up @@ -513,7 +513,7 @@ public static Tag[] mediaList(List<Object> found) {

for (Object result : found) {
Object id = Beany.getId(result);
String url = urlFor(result);
String url = UTILS.uriFor(result);

Tag left = h6("(ID", NBSP, "=", NBSP, id, ")");
Object header = span(result.getClass().getSimpleName());
Expand Down Expand Up @@ -549,28 +549,6 @@ public static Var<Integer> local(String name, int defaultValue, int min, int max
return var;
}

public static boolean isEntity(Object obj) {
return Cls.isAppBean(obj)
&& !(obj instanceof Tag)
&& !(obj instanceof AbstractWidget)
&& Beany.hasProperty(obj, "id");
}

public static String urlFor(Object entity) {
if (!isEntity(entity)) {
return "";
}

Object id = Beany.getIdIfExists(entity);
if (id != null) {
String className = Cls.entityName(entity);
String frm = Conf.ROOT.is("generate") ? "%s%s.html" : "/%s/%s";
return U.frmt(frm, Str.uncapitalized(className), id);
} else {
return "";
}
}

public static Object highlight(String text) {
return highlight(text, null);
}
Expand Down Expand Up @@ -776,8 +754,8 @@ public static Object display(Object item) {
return widget.render(null);
}

if (isEntity(item)) {
return a(escape(item.toString())).href(urlFor(item));
if (JPA.isEntity(item)) {
return a(escape(item.toString())).href(UTILS.uriFor(item));
}

if (isBean(item)) return GUI.show(item);
Expand Down

0 comments on commit 9ff8a3a

Please sign in to comment.