From ef16561272dd3c5cf3630e7727b66b4f84f16afc Mon Sep 17 00:00:00 2001
From: jendib
Date: Thu, 24 Mar 2016 00:35:53 +0100
Subject: [PATCH 01/42] Fix PDF export if description is null
---
.../src/main/java/com/sismics/docs/core/util/pdf/PdfPage.java | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/docs-core/src/main/java/com/sismics/docs/core/util/pdf/PdfPage.java b/docs-core/src/main/java/com/sismics/docs/core/util/pdf/PdfPage.java
index af9aafb2..0adae219 100644
--- a/docs-core/src/main/java/com/sismics/docs/core/util/pdf/PdfPage.java
+++ b/docs-core/src/main/java/com/sismics/docs/core/util/pdf/PdfPage.java
@@ -99,6 +99,10 @@ public class PdfPage implements Closeable {
* @throws IOException
*/
private void drawText(float paragraphWidth, PDFont font, int fontSize, String text, boolean centered) throws IOException {
+ if (text == null) {
+ return;
+ }
+
pdContent.setFont(font, fontSize);
int start = 0;
int end = 0;
From 274512a58e52df2852adc314e3eb286409659264 Mon Sep 17 00:00:00 2001
From: jendib
Date: Thu, 24 Mar 2016 00:41:31 +0100
Subject: [PATCH 02/42] Fix if a file is deleted before text extraction is
finished
---
.../main/java/com/sismics/docs/core/dao/jpa/FileDao.java | 6 ++++--
.../docs/core/listener/async/FileCreatedAsyncListener.java | 2 +-
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/docs-core/src/main/java/com/sismics/docs/core/dao/jpa/FileDao.java b/docs-core/src/main/java/com/sismics/docs/core/dao/jpa/FileDao.java
index 96fe6eab..ed2036f8 100644
--- a/docs-core/src/main/java/com/sismics/docs/core/dao/jpa/FileDao.java
+++ b/docs-core/src/main/java/com/sismics/docs/core/dao/jpa/FileDao.java
@@ -155,10 +155,12 @@ public class FileDao {
* @param id File ID
* @return File
*/
- public File getById(String id) {
+ public File getActiveById(String id) {
EntityManager em = ThreadLocalContext.get().getEntityManager();
+ Query q = em.createQuery("select f from File f where f.id = :id and f.deleteDate is null");
+ q.setParameter("id", id);
try {
- return em.find(File.class, id);
+ return (File) q.getSingleResult();
} catch (NoResultException e) {
return null;
}
diff --git a/docs-core/src/main/java/com/sismics/docs/core/listener/async/FileCreatedAsyncListener.java b/docs-core/src/main/java/com/sismics/docs/core/listener/async/FileCreatedAsyncListener.java
index a5301769..e2244ad5 100644
--- a/docs-core/src/main/java/com/sismics/docs/core/listener/async/FileCreatedAsyncListener.java
+++ b/docs-core/src/main/java/com/sismics/docs/core/listener/async/FileCreatedAsyncListener.java
@@ -54,7 +54,7 @@ public class FileCreatedAsyncListener {
@Override
public void run() {
FileDao fileDao = new FileDao();
- if (fileDao.getById(file.getId()) == null) {
+ if (fileDao.getActiveById(file.getId()) == null) {
// The file has been deleted since the text extraction started, ignore the result
return;
}
From 8ad9c529b68d1502ba055225da43d60e9f2da0f4 Mon Sep 17 00:00:00 2001
From: jendib
Date: Sat, 9 Apr 2016 21:23:55 +0200
Subject: [PATCH 03/42] #79: Resource to generate a dynamic CSS
---
.../docs/rest/resource/ThemeResource.java | 29 +++++++++++++++++++
docs-web/src/main/webapp/src/index.html | 1 +
docs-web/src/main/webapp/src/share.html | 1 +
.../sismics/docs/rest/TestThemeResource.java | 21 ++++++++++++++
4 files changed, 52 insertions(+)
create mode 100644 docs-web/src/main/java/com/sismics/docs/rest/resource/ThemeResource.java
create mode 100644 docs-web/src/test/java/com/sismics/docs/rest/TestThemeResource.java
diff --git a/docs-web/src/main/java/com/sismics/docs/rest/resource/ThemeResource.java b/docs-web/src/main/java/com/sismics/docs/rest/resource/ThemeResource.java
new file mode 100644
index 00000000..a8f72deb
--- /dev/null
+++ b/docs-web/src/main/java/com/sismics/docs/rest/resource/ThemeResource.java
@@ -0,0 +1,29 @@
+package com.sismics.docs.rest.resource;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Response;
+
+/**
+ * Theme REST resources.
+ *
+ * @author bgamard
+ */
+@Path("/theme")
+public class ThemeResource extends BaseResource {
+ /**
+ * Returns custom CSS stylesheet.
+ *
+ * @return Response
+ */
+ @GET
+ @Path("/stylesheet")
+ @Produces("text/css")
+ public Response stylesheet() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("body {\n");
+ sb.append("}");
+ return Response.ok().entity(sb.toString()).build();
+ }
+}
diff --git a/docs-web/src/main/webapp/src/index.html b/docs-web/src/main/webapp/src/index.html
index 7772ef24..15e59c41 100644
--- a/docs-web/src/main/webapp/src/index.html
+++ b/docs-web/src/main/webapp/src/index.html
@@ -10,6 +10,7 @@
+
+
diff --git a/docs-web/src/main/webapp/src/partial/docs/settings.html b/docs-web/src/main/webapp/src/partial/docs/settings.html
index e9799ae9..6594764f 100644
--- a/docs-web/src/main/webapp/src/partial/docs/settings.html
+++ b/docs-web/src/main/webapp/src/partial/docs/settings.html
@@ -15,6 +15,7 @@
Users
Groups
Vocabularies
+ Theme
Server logs
diff --git a/docs-web/src/main/webapp/src/partial/docs/settings.theme.html b/docs-web/src/main/webapp/src/partial/docs/settings.theme.html
new file mode 100644
index 00000000..093a8521
--- /dev/null
+++ b/docs-web/src/main/webapp/src/partial/docs/settings.theme.html
@@ -0,0 +1,8 @@
+Theme customization
+
\ No newline at end of file
From 542ab737a24e71c844182aab729864d403345fe1 Mon Sep 17 00:00:00 2001
From: jendib
Date: Wed, 27 Apr 2016 00:05:25 +0200
Subject: [PATCH 15/42] #79: POST /theme, GET /theme
---
.../docs/rest/resource/ThemeResource.java | 51 ++++++++++++++++++-
.../sismics/docs/rest/TestThemeResource.java | 19 +++++--
2 files changed, 65 insertions(+), 5 deletions(-)
diff --git a/docs-web/src/main/java/com/sismics/docs/rest/resource/ThemeResource.java b/docs-web/src/main/java/com/sismics/docs/rest/resource/ThemeResource.java
index d1576c44..abf6ee13 100644
--- a/docs-web/src/main/java/com/sismics/docs/rest/resource/ThemeResource.java
+++ b/docs-web/src/main/java/com/sismics/docs/rest/resource/ThemeResource.java
@@ -10,8 +10,11 @@ import com.sismics.docs.core.dao.jpa.ConfigDao;
import com.sismics.docs.core.model.jpa.Config;
import com.sismics.docs.rest.constant.BaseFunction;
import com.sismics.rest.exception.ForbiddenClientException;
+import com.sismics.rest.util.JsonUtil;
import com.sismics.rest.util.ValidationUtil;
import com.sismics.util.css.Selector;
+import org.glassfish.jersey.media.multipart.FormDataBodyPart;
+import org.glassfish.jersey.media.multipart.FormDataParam;
import java.io.StringReader;
import java.util.Map;
@@ -38,13 +41,36 @@ public class ThemeResource extends BaseResource {
StringBuilder sb = new StringBuilder();
sb.append(new Selector(".navbar")
.rule("background-color", themeConfig.getString("color", "#263238")));
+ sb.append(themeConfig.getString("css", ""));
return Response.ok().entity(sb.toString()).build();
}
+ /**
+ * Returns the theme configuration.
+ *
+ * @return Response
+ */
+ @GET
+ public Response get() {
+ JsonObject themeConfig = getThemeConfig();
+ JsonObjectBuilder json = Json.createObjectBuilder();
+ json.add("name", themeConfig.getString("name", "Sismics Docs"));
+ return Response.ok().entity(json.build()).build();
+ }
+
+ /**
+ * Change the theme configuration.
+ *
+ * @param color Theme color
+ * @param name Application name
+ * @param css Custom CSS
+ * @return Response
+ */
@POST
- @Path("/color")
- public Response color(@FormParam("color") String color) {
+ public Response theme(@FormParam("color") String color,
+ @FormParam("name") String name,
+ @FormParam("css") String css) {
if (!authenticate()) {
throw new ForbiddenClientException();
}
@@ -52,6 +78,7 @@ public class ThemeResource extends BaseResource {
// Validate input data
ValidationUtil.validateHexColor(color, "color", true);
+ name = ValidationUtil.validateLength(name, "name", 3, 30, true);
// Update the JSON
JsonObjectBuilder json = getMutableThemeConfig();
@@ -60,6 +87,12 @@ public class ThemeResource extends BaseResource {
} else {
json.add("color", color);
}
+ if (Strings.isNullOrEmpty(name)) {
+ json.add("name", JsonValue.NULL);
+ } else {
+ json.add("name", name);
+ }
+ json.add("css", JsonUtil.nullable(css));
// Persist the new configuration
ConfigDao configDao = new ConfigDao();
@@ -71,6 +104,20 @@ public class ThemeResource extends BaseResource {
return Response.ok().entity(response.build()).build();
}
+ @PUT
+ @Path("images")
+ @Consumes("multipart/form-data")
+ public Response images(
+ @FormDataParam("logo") FormDataBodyPart logoBodyPart,
+ @FormDataParam("background") FormDataBodyPart backgrounBodyPart) {
+ if (!authenticate()) {
+ throw new ForbiddenClientException();
+ }
+ checkBaseFunction(BaseFunction.ADMIN);
+
+ return Response.ok().build();
+ }
+
/**
* Returns the theme configuration object.
*
diff --git a/docs-web/src/test/java/com/sismics/docs/rest/TestThemeResource.java b/docs-web/src/test/java/com/sismics/docs/rest/TestThemeResource.java
index 2de11477..61c06cef 100644
--- a/docs-web/src/test/java/com/sismics/docs/rest/TestThemeResource.java
+++ b/docs-web/src/test/java/com/sismics/docs/rest/TestThemeResource.java
@@ -25,17 +25,30 @@ public class TestThemeResource extends BaseJerseyTest {
// Get the stylesheet anonymously
String stylesheet = target().path("/theme/stylesheet").request()
.get(String.class);
- Assert.assertTrue(stylesheet.contains("background-color: inherit;"));
+ Assert.assertTrue(stylesheet.contains("background-color: #263238;"));
+
+ // Get the theme configuration anonymously
+ JsonObject json = target().path("/theme").request()
+ .get(JsonObject.class);
+ Assert.assertEquals("Sismics Docs", json.getString("name"));
// Update the main color as admin
- target().path("/theme/color").request()
+ target().path("/theme").request()
.cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken)
.post(Entity.form(new Form()
- .param("color", "#ff0000")), JsonObject.class);
+ .param("color", "#ff0000")
+ .param("name", "My App")
+ .param("css", ".body { content: 'Custom CSS'; }")), JsonObject.class);
// Get the stylesheet anonymously
stylesheet = target().path("/theme/stylesheet").request()
.get(String.class);
Assert.assertTrue(stylesheet.contains("background-color: #ff0000;"));
+ Assert.assertTrue(stylesheet.contains("Custom CSS"));
+
+ // Get the theme configuration anonymously
+ json = target().path("/theme").request()
+ .get(JsonObject.class);
+ Assert.assertEquals("My App", json.getString("name"));
}
}
\ No newline at end of file
From 09a53d5c4e18a492bd3b3b12cbdbb386cb362773 Mon Sep 17 00:00:00 2001
From: jendib
Date: Sat, 30 Apr 2016 01:52:24 +0200
Subject: [PATCH 16/42] #83: Handles tags as source ACL in GET /document/list
---
.../com/sismics/docs/core/dao/jpa/AclDao.java | 16 +++++--------
.../docs/core/dao/jpa/DocumentDao.java | 23 ++++++++++---------
.../docs/rest/resource/AclResource.java | 2 +-
.../sismics/docs/rest/TestAclResource.java | 6 ++---
.../docs/rest/TestDocumentResource.java | 12 +++++-----
5 files changed, 28 insertions(+), 31 deletions(-)
diff --git a/docs-core/src/main/java/com/sismics/docs/core/dao/jpa/AclDao.java b/docs-core/src/main/java/com/sismics/docs/core/dao/jpa/AclDao.java
index 96989163..1338770c 100644
--- a/docs-core/src/main/java/com/sismics/docs/core/dao/jpa/AclDao.java
+++ b/docs-core/src/main/java/com/sismics/docs/core/dao/jpa/AclDao.java
@@ -28,7 +28,6 @@ public class AclDao {
* @param acl ACL
* @param userId User ID
* @return New ID
- * @throws Exception
*/
public String create(Acl acl, String userId) {
// Create the UUID
@@ -82,7 +81,7 @@ public class AclDao {
List
-
+
diff --git a/docs-web/src/main/webapp/src/style/main.less b/docs-web/src/main/webapp/src/style/main.less
index a1f3e31f..dbf01f1c 100644
--- a/docs-web/src/main/webapp/src/style/main.less
+++ b/docs-web/src/main/webapp/src/style/main.less
@@ -21,6 +21,17 @@
}
}
+// Tags list
+.table-tags {
+ td {
+ vertical-align: middle !important;
+ }
+
+ .label {
+ font-size: 100%;
+ }
+}
+
// Documents list
.table-documents {
thead th {
diff --git a/docs-web/src/test/java/com/sismics/docs/rest/TestTagResource.java b/docs-web/src/test/java/com/sismics/docs/rest/TestTagResource.java
index 3724d848..c7d61e80 100644
--- a/docs-web/src/test/java/com/sismics/docs/rest/TestTagResource.java
+++ b/docs-web/src/test/java/com/sismics/docs/rest/TestTagResource.java
@@ -54,6 +54,7 @@ public class TestTagResource extends BaseJerseyTest {
Assert.assertEquals("Tag4", json.getString("name"));
Assert.assertEquals("tag1", json.getString("creator"));
Assert.assertEquals("#00ff00", json.getString("color"));
+ Assert.assertEquals(tag3Id, json.getString("parent"));
Assert.assertTrue(json.getBoolean("writable"));
JsonArray acls = json.getJsonArray("acls");
Assert.assertEquals(2, acls.size());