Döcu Content

Phantom Pages and Links


Xpages Controls Per User Access


Xpages forms and links rendering have never been anymore dynamic. Load Documents, pages and so on via links on Xpages form, deposited to form on the fly, based on user permissions. Page names are submitted to back-end by each user to be called by Döcu Content App and allow user to click on own/specific link to get to page of choice.


Information contained in the following is presented as is. This tutorial assumes you have basic Lotus Notes Configuration and Programming knowledge.

Döcu Content JavaBean

Create JavaBean to read NSF back-end and grab page names added through Admin pages with the intent of using these page names through link controls to be viewed. These pages would have been added by the curent General user logged on or an Admin user inserting on other user's behalf. Each user has own page, thus link controls will list the specific page name to click on to get to that page. We recommend watching the following Youtube video for additional information:


JavaBean Create Instructions, see screenshots for areas of interest

  1. Create new JavaBean to read NSF back-end view documents

  2. Load Default Error page, where user does not have a page a retrieve



* Copyright 2014 Dököll Solutions, Inc.

Licensed under the Apache License, Version 2.0 (the "License");

you may not use this file except in compliance with the License.

You may obtain a copy of the License at


Unless required by applicable law or agreed to in writing, software

distributed under the License is distributed on an "AS IS" BASIS,


See the License for the specific language governing permissions and

limitations under the License.


* Program: PhantomPageBean.java

* @AppName: DöcuContent.nsf

* Created: 2014.

* JavaBean Class to load User-Specific Pages based on permissions, and URL Security Page submissions

* these pages would have been submitted to NSF back-end either by an Admin or the User


package com.dokoll.solutions.inc.developement.Utils;

//faces imports

import javax.faces.context.FacesContext;

//servlet imports

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServletRequest;

//domino imports

import lotus.domino.Database;

import lotus.domino.NotesException;

import lotus.domino.Session;

import lotus.domino.View;

import lotus.domino.ViewEntry;

import lotus.domino.ViewEntryCollection;

import com.ibm.xsp.model.domino.DominoUtils;


* @author Dököll Solutions, Inc.

* @version: 2014.


public class PhantomPageBean {

// ...

// declare static variable for comparison block

static String URL_SEC_ROLE_VIEW = "SecurityAccessView";

static String URL_SEC_ACCESS_VIEW = "MyURLSecurityAccessView";

static String URL_SEC_PAGE_NODEFAULT = "No Default Page";

// ...

// 2014.

public String UserName;

// ...

// DöcuContent data

public String UrlID=null;

public String ViewURL=null;

public String AddURL=null;

public String UpdateURL=null;

public String DeleteURL=null;

// ...

// Cookie data

public String UserNameValue;

public String RoleNameValue;

// getter/setter methods


* @return the userName


public String getUserName() {

return UserName;



* @param userName

* the userName to set


public void setUserName(String userName) {

UserName = userName;



* @return the urlID


public String getUrlID() {

return UrlID;



* @param urlID

* the urlID to set


public void setUrlID(String urlID) {

UrlID = urlID;



* @return the viewURL


public String getViewURL() {

return ViewURL;



* @param viewURL

* the viewURL to set


public void setViewURL(String viewURL) {

ViewURL = viewURL;



* @return the addURL


public String getAddURL() {

//throw user's default page link to form's Navigation

//provided user has the page, previous submitted to back-end

//as preferences

if (UrlID.equalsIgnoreCase(RoleNameValue)) {

System.out.println("User Access Okay() for..." + AddURL);

return AddURL;

//give user a default error-friendly page

//TODO: Put some stuff on there, give user options to try

// Put some items user can do/see, as default information

} else {

System.out.println("User Access for User..."

+ "No Page URL Found");

return "/xpnopageaccess.xsp";




* @param addURL

* the addURL to set


public void setAddURL(String addURL) {

AddURL = addURL;



* @return the updateURL


public String getUpdateURL() {

return UpdateURL;



* @param updateURL

* the updateURL to set


public void setUpdateURL(String updateURL) {

UpdateURL = updateURL;



* @return the deleteURL


public String getDeleteURL() {

return DeleteURL;



* @param deleteURL

* the deleteURL to set


public void setDeleteURL(String deleteURL) {

DeleteURL = deleteURL;



* @return the userNameValue


public String getUserNameValue() {

return UserNameValue;



* @param userNameValue

* the userNameValue to set


public void setUserNameValue(String userNameValue) {

UserNameValue = userNameValue;



* @return the roleNameValue


public String getRoleNameValue() {

return RoleNameValue;



* @param roleNameValue

* the roleNameValue to set


public void setRoleNameValue(String roleNameValue) {

RoleNameValue = roleNameValue;


public PhantomPageBean() {

// get userCookies

FacesContext facesContext = FacesContext.getCurrentInstance();

String cookieName = null;

Cookie cookie[] = ((HttpServletRequest) facesContext


if (cookie != null && cookie.length > 0) {

for (int i = 0; i < cookie.length; i++) {

cookieName = cookie[i].getName();

if (cookieName.equals("cookieKeyUser")) {

UserNameValue = cookie[i].getValue();

System.out.println("WOAAAHHH! Found this UserNameValue Cookie..."+ UserNameValue);


if (cookieName.equals("cookieKeyRole")) {

RoleNameValue = cookie[i].getValue();

System.out.println("WOAAAHHH! Found this RoleNameValue Cookie..."+ RoleNameValue);

} else

System.out.println("Cookies not found...");

// TODO: Add this method to JSFUtil class,

// also delete the cookies when logging out






* Method: doLoadPanthomPages() Created from Copy: 2014. URL

* Security Access Pages, some may be Hidden/Showing



// links control, items on form load based on user url security pages

// previously submitted

// for viewurl, updateurl, addurl, and deleteurl in NSF back-end

public void doLoadPanthomPages() {

// let's add a try catch here, to grab errors near the end

try {


System.out.println("BEGIN DEBUG | PhantomPageBean.java - doLoadPanthomPages started... ");

Session session = DominoUtils.getCurrentSession(FacesContext


System.out.println("docucontent.nsf | doLoadPanthomPages() in PhantomPageBean.java Session Obtained..."

+ session);

// find database in question from current session

System.out.println("docucontent.nsf | doLoadPanthomPages() in PhantomPageBean.java finding docucontent.nsf based on Global User Session...");

Database database = session.getDatabase(session.getServerName(),


System.out.println("doLoadPanthomPages() in PhantomPageBean.java Fetched Database..."

+ database);

System.out.println("Getting a database connection... ");

System.out.println("PhantomPageBean.java | doLoadPanthomPages Connected to "

+ database);

// Find the view in question

View view = database.getView(URL_SEC_ACCESS_VIEW);

System.out.println("PhantomPageBean.java | doLoadPanthomPages Connected to "

+ view);

// determine database state for searching

if (database.isFTIndexed())




// Collect entries based on search criteria in UserNameValue = ?

// (Cookie/Session based values)

ViewEntryCollection vec = view.getAllEntriesByKey(UserNameValue);

System.out.println("PhantomPageBean.java | ViewEntryCollection Counts Obtained...");

System.out.println("PhantomPageBean.java | ViewEntries "

+ vec.getCount() + " Account(s)");

System.out.println("PhantomPageBean.java | ViewEntryCollection completed successfully...");

ViewEntry tmpentry;

ViewEntry entry = vec.getFirstEntry();

// if so, load text/err Message(s) to user

if (entry == null) {

// add Message value...

// TODO: Do something else with the current component

// example, combine with built-in items

// ...

UserName = "Anonymous";

UrlID = "General";


AddURL = "xpnopageaccess.xsp";

System.out.println("No Access to Page");

// otherwise load the value needed to let user continue

} else {

// add value needed for pairing with cookies, and so on...

String strUserName = entry.getDocument().getItemValueString("userID");

String strUrlID = entry.getDocument().getItemValueString("URLID");

//if user returned info is solid, be nice and let user see his or her stuff

//in which case, we're speaking of default pages previously submitted

//These would have been submitted by either the user upon registration via xpmyusersecuredefinedurl.xsp

//or by an Admin, entering on behalf of users

//TODO: Limit the powers of LoggedIn User who enters info, based on permissions...

// Only Admins should be able to ad stuff for others

if (strUserName.equalsIgnoreCase(UserNameValue) && strUrlID.equalsIgnoreCase(RoleNameValue)) {

UserName = entry.getDocument().getItemValueString("userID");

//DEBUG: Remove System.outs here, meant for testing returned values from NSF back-end

System.out.println("ENDING DEBUG | PhantomPageBean.java - doLoadPanthomPages accessed: "+ UserName + " for UserName Field(s) / Link controls... ");

UrlID = entry.getDocument().getItemValueString("URLID");

//DEBUG: Remove System.outs here, meant for testing returned values from NSF back-end

System.out.println("ENDING DEBUG | PhantomPageBean.java - doLoadPanthomPages accessed: "+ UrlID + " for User URL Field(s) / Link controls... ");

ViewURL = entry.getDocument().getItemValueString("ViewURL");

//DEBUG: Remove System.outs here, meant for testing returned values from NSF back-end

System.out.println("ENDING DEBUG | PhantomPageBean.java - doLoadPanthomPages accessed: "+ ViewURL + " for User ViewURL Name Field(s) / Link controls... ");

AddURL = entry.getDocument().getItemValueString("AddURL");

//DEBUG: Remove System.outs here, meant for testing returned values from NSF back-end

System.out.println("ENDING DEBUG | PhantomPageBean.java - doLoadPanthomPages accessed: "+ AddURL + " for User PageName Field(s) / Link controls... ");

// doLoadPanthomAccess();

tmpentry = vec.getNextEntry();


entry = tmpentry;

System.out.println("DEBUG ENDED | PhantomPageBean.java - doLoadPanthomPages released access to controls... ");





} catch (NotesException e) {

System.out.println(e.id + " " + e.text);


} catch (Exception e) {






xpnavlinks.xsp Link Control Excerpt:

View Entries for Each User:

  1. Valid users are AlienHouse and username101, should see own page

  2. username102 being used for this exercise should see default page

AlienHouse User Screenshots:

User is Logged In

Here is the User Page, based on view item(s)

username101 User Screenshots:

User is Logged In

Here is the User Page, based on view item(s)

username102 User Screenshots:

User is Logged In

Here is the User Page, based on view item(s)


You can now load specific page name and allow user to interact with preferences, based on user permissions. This should facilitate user-setting pages that only certain users need to see.

Questions, comments, please post a brief message on our Contact form on the main site.

Thank you for coming...