Skip to content

Commit bfa4993

Browse files
committed
fix default behaviour for homepage
1 parent 0e867a1 commit bfa4993

4 files changed

Lines changed: 281 additions & 12 deletions

File tree

knowage-core/src/main/java/it/eng/spagobi/api/v2/HomepageResource.java

Lines changed: 108 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ public class HomepageResource extends AbstractSpagoBIResource {
5252

5353
private static final Logger LOGGER = Logger.getLogger(HomepageResource.class);
5454
private static final String CHARSET = "; charset=UTF-8";
55+
private static final String DEFAULT_ROLE_TOKEN = "default";
5556

5657
@GET
5758
@Path("/default")
@@ -75,13 +76,23 @@ public Response getDefaultHomepage() {
7576
@Path("/preview/{roleId}")
7677
@UserConstraint(functionalities = { CommunityFunctionalityConstants.MENU_MANAGEMENT })
7778
@Produces(MediaType.APPLICATION_JSON + CHARSET)
78-
public Response previewHomepageByRole(@PathParam("roleId") Integer roleId) {
79+
public Response previewHomepageByRole(@PathParam("roleId") String roleId) {
7980
try {
80-
Homepage homepage = getHomepageDAO().loadHomepageByRoleId(roleId);
81+
RoleRequest roleRequest = parseRoleRequest(roleId);
82+
Homepage homepage = roleRequest.isDefaultRequest()
83+
? getHomepageDAO().loadDefaultHomepage()
84+
: getHomepageDAO().loadHomepageByRoleId(roleRequest.getRoleId());
8185
if (homepage == null) {
8286
return Response.status(Response.Status.NOT_FOUND).build();
8387
}
84-
return Response.ok(filterHomepageForRole(homepage, roleId)).build();
88+
if (roleRequest.isDefaultRequest()) {
89+
return Response.ok(homepage).build();
90+
}
91+
return Response.ok(filterHomepageForRole(homepage, roleRequest.getRoleId())).build();
92+
} catch (NotFoundException e) {
93+
throw e;
94+
} catch (SpagoBIRuntimeException e) {
95+
throw e;
8596
} catch (Exception e) {
8697
String errorString = "sbi.homepage.preview.error";
8798
LOGGER.error(errorString, e);
@@ -92,16 +103,23 @@ public Response previewHomepageByRole(@PathParam("roleId") Integer roleId) {
92103
@GET
93104
@Path("/{roleId}")
94105
@Produces(MediaType.APPLICATION_JSON + CHARSET)
95-
public Response getHomepageByRole(@PathParam("roleId") Integer roleId) {
106+
public Response getHomepageByRole(@PathParam("roleId") String roleId) {
96107
try {
97-
if (!canReadRole(roleId)) {
108+
RoleRequest roleRequest = parseRoleRequest(roleId);
109+
if (!roleRequest.isDefaultRequest() && !canReadRole(roleRequest.getRoleId())) {
98110
return Response.status(Response.Status.FORBIDDEN).build();
99111
}
100-
Homepage homepage = getHomepageDAO().loadHomepageByRoleId(roleId);
112+
Homepage homepage = roleRequest.isDefaultRequest()
113+
? getHomepageDAO().loadDefaultHomepage()
114+
: getHomepageDAO().loadHomepageByRoleId(roleRequest.getRoleId());
101115
if (homepage == null) {
102116
return Response.status(Response.Status.NOT_FOUND).build();
103117
}
104118
return Response.ok(homepage).build();
119+
} catch (NotFoundException e) {
120+
throw e;
121+
} catch (SpagoBIRuntimeException e) {
122+
throw e;
105123
} catch (Exception e) {
106124
String errorString = "sbi.homepage.load.error";
107125
LOGGER.error(errorString, e);
@@ -158,7 +176,8 @@ private IHomepageDAO getHomepageDAO() throws EMFUserError {
158176
private Homepage readHomepage(HttpServletRequest request) throws Exception {
159177
JSONObject body = RestUtilities.readBodyAsJSONObject(request);
160178
Homepage homepage = new Homepage();
161-
homepage.setDefaultHomepage(body.optBoolean("default", body.optBoolean("isDefault", false)));
179+
boolean hasExplicitDefaultFlag = body.has("default") || body.has("isDefault");
180+
boolean defaultHomepage = body.optBoolean("default", body.optBoolean("isDefault", false));
162181
homepage.setType(body.optString("type", null));
163182

164183
if (body.has("documentId") && !body.isNull("documentId")) {
@@ -190,16 +209,37 @@ private Homepage readHomepage(HttpServletRequest request) throws Exception {
190209
}
191210

192211
List<Integer> roleIds = new ArrayList<>();
212+
boolean defaultRoleRequested = false;
193213
if (body.has("roleIds") && !body.isNull("roleIds")) {
194-
roleIds.addAll(readIntegerArray(body.getJSONArray("roleIds")));
214+
defaultRoleRequested = readRoleArray(body.getJSONArray("roleIds"), roleIds) || defaultRoleRequested;
195215
}
196216
if (body.has("roleId") && !body.isNull("roleId")) {
197-
roleIds.add(body.getInt("roleId"));
217+
defaultRoleRequested = addRoleValue(body.get("roleId"), "roleId", roleIds) || defaultRoleRequested;
198218
}
219+
boolean inferDefaultHomepage = !hasExplicitDefaultFlag && !defaultRoleRequested && roleIds.isEmpty();
220+
homepage.setDefaultHomepage(defaultHomepage || defaultRoleRequested || inferDefaultHomepage);
199221
homepage.setRoleIds(roleIds.stream().distinct().collect(Collectors.toList()));
200222
return homepage;
201223
}
202224

225+
private RoleRequest parseRoleRequest(String roleId) {
226+
if (roleId == null) {
227+
throw new NotFoundException();
228+
}
229+
String normalizedRoleId = roleId.trim();
230+
if (normalizedRoleId.isEmpty()) {
231+
throw new NotFoundException();
232+
}
233+
if (DEFAULT_ROLE_TOKEN.equalsIgnoreCase(normalizedRoleId)) {
234+
return RoleRequest.defaultRequest();
235+
}
236+
try {
237+
return RoleRequest.forRole(Integer.valueOf(normalizedRoleId));
238+
} catch (NumberFormatException e) {
239+
throw new NotFoundException();
240+
}
241+
}
242+
203243
private List<MenuPlaceholder> readMenuPlaceholders(JSONArray jsonArray) throws JSONException {
204244
List<MenuPlaceholder> placeholders = new ArrayList<>();
205245
for (int i = 0; i < jsonArray.length(); i++) {
@@ -225,6 +265,38 @@ private List<Integer> readIntegerArray(JSONArray jsonArray) throws JSONException
225265
return integers;
226266
}
227267

268+
private boolean readRoleArray(JSONArray jsonArray, List<Integer> roleIds) throws JSONException {
269+
boolean defaultRoleRequested = false;
270+
for (int i = 0; i < jsonArray.length(); i++) {
271+
defaultRoleRequested = addRoleValue(jsonArray.get(i), "roleIds[" + i + "]", roleIds) || defaultRoleRequested;
272+
}
273+
return defaultRoleRequested;
274+
}
275+
276+
private boolean addRoleValue(Object rawRoleValue, String fieldName, List<Integer> roleIds) {
277+
if (rawRoleValue == null || JSONObject.NULL.equals(rawRoleValue)) {
278+
throw validationException(fieldName + " cannot be null");
279+
}
280+
if (rawRoleValue instanceof Number) {
281+
roleIds.add(((Number) rawRoleValue).intValue());
282+
return false;
283+
}
284+
285+
String normalizedRoleValue = rawRoleValue.toString().trim();
286+
if (normalizedRoleValue.isEmpty()) {
287+
throw validationException(fieldName + " cannot be blank");
288+
}
289+
if (DEFAULT_ROLE_TOKEN.equalsIgnoreCase(normalizedRoleValue)) {
290+
return true;
291+
}
292+
try {
293+
roleIds.add(Integer.valueOf(normalizedRoleValue));
294+
return false;
295+
} catch (NumberFormatException e) {
296+
throw validationException("Invalid " + fieldName + " value [" + rawRoleValue + "]", e);
297+
}
298+
}
299+
228300
private void validateHomepage(Homepage homepage) {
229301
HomepageType homepageType;
230302
try {
@@ -383,4 +455,31 @@ private SpagoBIRuntimeException validationException(String message, Throwable th
383455
return new SpagoBIRuntimeException(message, throwable);
384456
}
385457

458+
private static final class RoleRequest {
459+
460+
private final Integer roleId;
461+
private final boolean defaultRequest;
462+
463+
private RoleRequest(Integer roleId, boolean defaultRequest) {
464+
this.roleId = roleId;
465+
this.defaultRequest = defaultRequest;
466+
}
467+
468+
private static RoleRequest defaultRequest() {
469+
return new RoleRequest(null, true);
470+
}
471+
472+
private static RoleRequest forRole(Integer roleId) {
473+
return new RoleRequest(roleId, false);
474+
}
475+
476+
private Integer getRoleId() {
477+
return roleId;
478+
}
479+
480+
private boolean isDefaultRequest() {
481+
return defaultRequest;
482+
}
483+
}
484+
386485
}

knowage-core/src/main/java/it/eng/spagobi/api/v2/MenuResource.java

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import javax.ws.rs.Consumes;
3030
import javax.ws.rs.DELETE;
3131
import javax.ws.rs.GET;
32+
import javax.ws.rs.NotFoundException;
3233
import javax.ws.rs.POST;
3334
import javax.ws.rs.PUT;
3435
import javax.ws.rs.Path;
@@ -75,6 +76,7 @@ public class MenuResource extends AbstractSpagoBIResource {
7576
private static final Logger LOGGER = LogManager.getLogger(MenuResource.class);
7677

7778
private static final String CHARSET = "; charset=UTF-8";
79+
private static final String DEFAULT_ROLE_TOKEN = "default";
7880

7981
/**
8082
* Getting list of all menus. Arrays of Roles that belong to one menu are implemented to be like: One Role only with id and name
@@ -113,21 +115,30 @@ public Response getMenues() {
113115
@Path("/preview/{roleId}")
114116
@UserConstraint(functionalities = { CommunityFunctionalityConstants.MENU_MANAGEMENT })
115117
@Produces(MediaType.APPLICATION_JSON + CHARSET)
116-
public Response previewMenuByRole(@PathParam("roleId") Integer roleId) {
118+
public Response previewMenuByRole(@PathParam("roleId") String roleId) {
117119
LOGGER.debug("IN");
118120

119121
try {
120122
UserProfile profile = getUserProfile();
123+
Integer parsedRoleId = parseRoleId(roleId);
124+
if (parsedRoleId == null) {
125+
List menuItems = MenuUtilities.getMenuItems(profile, true);
126+
MenuUtilities.filterListForUserClickableElements(menuItems, profile);
127+
return Response.ok(menuItems).build();
128+
}
129+
121130
IRoleDAO roleDao = DAOFactory.getRoleDAO();
122131
roleDao.setUserProfile(profile);
123132

124-
Role role = roleDao.loadByID(roleId);
133+
Role role = roleDao.loadByID(parsedRoleId);
125134
if (role == null) {
126135
return Response.status(Response.Status.NOT_FOUND).build();
127136
}
128137

129138
List menuItems = MenuUtilities.getMenuItemsForRole(profile, role.getName());
130139
return Response.ok(menuItems).build();
140+
} catch (NotFoundException e) {
141+
throw e;
131142
} catch (Exception e) {
132143
String errorString = "sbi.menu.load.preview.error";
133144
LOGGER.error(errorString, e);
@@ -137,6 +148,24 @@ public Response previewMenuByRole(@PathParam("roleId") Integer roleId) {
137148
}
138149
}
139150

151+
private Integer parseRoleId(String roleId) {
152+
if (roleId == null) {
153+
throw new NotFoundException();
154+
}
155+
String normalizedRoleId = roleId.trim();
156+
if (normalizedRoleId.isEmpty()) {
157+
throw new NotFoundException();
158+
}
159+
if (DEFAULT_ROLE_TOKEN.equalsIgnoreCase(normalizedRoleId)) {
160+
return null;
161+
}
162+
try {
163+
return Integer.valueOf(normalizedRoleId);
164+
} catch (NumberFormatException e) {
165+
throw new NotFoundException();
166+
}
167+
}
168+
140169
@SuppressWarnings("unchecked")
141170
@GET
142171
@Path("/functionalities")

0 commit comments

Comments
 (0)