@@ -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}
0 commit comments