{"id":723,"date":"2012-05-31T08:31:04","date_gmt":"2012-05-31T06:31:04","guid":{"rendered":"http:\/\/hasselba.ch\/blog\/?p=723"},"modified":"2012-05-31T08:31:04","modified_gmt":"2012-05-31T06:31:04","slug":"documentdatasource-with-signersignerwithfullaccess-rights","status":"publish","type":"post","link":"https:\/\/hasselba.ch\/blog\/?p=723","title":{"rendered":"DocumentDataSource with Signer\/SignerWithFullAccess-Rights"},"content":{"rendered":"<p>Yesterday I read the <a title=\"stackoverflow.com - sessionAsSignerWithFullAccess\" href=\"http:\/\/stackoverflow.com\/questions\/10799360\/sessionassignerwithfullaccess-for-access-notesdocument-with-reader-field\" target=\"_blank\">very interessting question<\/a> from <a href=\"http:\/\/stackoverflow.com\/users\/1173013\/daniele-grillo\">Daniele Grillo<\/a> at stackoverflow.com: Is a datasource available for XPages who can access the underlying document with different access levels?<\/p>\n<p>I have never seen one before, so I decided to do some tests and tried to find a workaround \/ hack for this problem. But after a while and a some lines of coding, I was unable to get a solution, so I decided to create a new datasource: A datasource which can access the documents in the backend with different access levels: <em>sessionAsSigner<\/em> and <em>sessionAsSignerWithFullAccess<\/em>.<\/p>\n<p>The datasource is still in beta version, there are some limitations because I have implemented the basic functionallity only. It must be added programmatically, I have no ambitions to create a design element of it, but perhaps I will create a XSnippet.<\/p>\n<p>To use this datasource, you can add it to a XPage and control it via URL parameters.<\/p>\n<ul>\n<li><em>Open document as current user<\/em><\/li>\n<\/ul>\n<pre>XPage.xsp?documentId=&lt;DocUNID&gt;<\/pre>\n<ul>\n<li><em>Open document as Signer<\/em><\/li>\n<\/ul>\n<pre>XPage.xsp?documentId=&lt;DocUNID&gt;&amp;access=sessionAsSigner<\/pre>\n<ul>\n<li><em>Open document as Signer with Full Access<\/em><\/li>\n<\/ul>\n<pre>XPage.xsp?documentId=&lt;DocUNID&gt;&amp;access=sessionAsSignerWithFullAccess<\/pre>\n<p>To use this datasource in your XPage, you have to add some SSJS code:<\/p>\n<pre>&lt;xp:this.beforePageLoad&gt;\r\n   &lt;![CDATA[#{javascript:\r\n      importPackage(ch.hasselba.xpages.jsf.core);\r\n      var ds = new \r\n         ch.hasselba.xpages.jsf.core.AccessDocDataSource();\r\n      ds.setVar( \"<strong><span style=\"color: #ff0000;\">document1<\/span><\/strong>\" );\r\n\u00a0\u00a0 \u00a0\u00a0 ds.setConcurrencyMode( \"force\" );\r\n\u00a0\u00a0 \u00a0\u00a0 view.addData(ds);\r\n   }]]&gt;\r\n&lt;\/xp:this.beforePageLoad&gt;<\/pre>\n<p><em>[You can change the name of the datasource (marked red) to fit your requirements.]<\/em><\/p>\n<p>The datasource can be used like a normal document datasource:<\/p>\n<pre>&lt;xp:inputText id=\"inputText1\" value=\"#{<strong><span style=\"color: #ff0000;\">document1<\/span><\/strong>.Test}\" \/&gt;<\/pre>\n<p>To save the document you have to call the save method directly (The default actions are currently not working. Maybe because the actions check the object type. I am trying to figure this out):<\/p>\n<pre>&lt;xp:button value=\"Save\" id=\"button1\"&gt;\r\n   &lt;xp:eventHandler event=\"onclick\" submit=\"true\"\r\n      refreshMode=\"complete\"&gt;\r\n\u00a0\u00a0 \u00a0\u00a0 &lt;xp:this.action&gt;\r\n         &lt;![CDATA[#{javascript:<strong><span style=\"color: #ff0000;\">document1<\/span><\/strong>.save()}]]&gt;\r\n      &lt;\/xp:this.action&gt;\r\n   &lt;\/xp:eventHandler&gt;\r\n&lt;\/xp:button&gt;<\/pre>\n<p>Here is the Java code:<\/p>\n<pre>package ch.hasselba.xpages.jsf.core;\r\n\r\nimport com.ibm.xsp.FacesExceptionEx;\r\nimport com.ibm.xsp.model.AbstractDocumentDataSource;\r\nimport com.ibm.xsp.model.DocDataSource;\r\nimport com.ibm.xsp.model.DocumentDataContainer;\r\nimport com.ibm.xsp.model.domino.wrapped.DominoDocument;\r\nimport javax.faces.context.FacesContext;\r\nimport javax.faces.el.ValueBinding;\r\nimport lotus.domino.Document;\r\nimport lotus.domino.NotesException;\r\nimport lotus.domino.Session;\r\nimport java.util.Map;\r\n\r\npublic class AccessDocDataSource extends AbstractDocumentDataSource\r\n   implements DocDataSource {\r\n\r\n\u00a0\u00a0 \u00a0private final static String DEFAULT_CONCURRENCYMODE = \"force\";\r\n\u00a0\u00a0 \u00a0private final static String CONCURRENCYMODE = \"concurrencyMode\";\r\n\u00a0\u00a0 \u00a0private final static String ACTION = \"action\";\r\n\u00a0\u00a0 \u00a0private final static String ACCESS = \"access\";\r\n\u00a0\u00a0 \u00a0private final static String DOCUMENTID = \"documentId\";\r\n\u00a0\u00a0 \u00a0private final static String CONST_SESSION = \"session\";\r\n\u00a0\u00a0 \u00a0private final static String CONST_SESSIONASSIGNER = \"sessionAsSigner\";\r\n\u00a0\u00a0 \u00a0private final static String CONST_SESSIONASSIGNERFULLACCESS = \"sessionAsSignerWithFullAccess\";\r\n\u00a0\u00a0 \u00a0private final static String MSG_DOCSAVE_FAILED = \"doSaveDocument failed!\";\r\n\r\n\u00a0\u00a0 \u00a0private String _docId;\r\n\u00a0\u00a0 \u00a0private String _action;\r\n\u00a0\u00a0 \u00a0private String _concurrencyMode;\r\n\u00a0\u00a0 \u00a0private String _access;\r\n\r\n\u00a0\u00a0 \u00a0private DominoDocument _doc;\r\n\r\n\u00a0\u00a0 \u00a0private static boolean isStrEmpty(final String str) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (str == null)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return true;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (str.length() == 0)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return true;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0private static Object getVariableValue(String varName) {\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0FacesContext context = FacesContext.getCurrentInstance();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return context.getApplication().getVariableResolver().resolveVariable(\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0context, varName);\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0@Override\r\n\u00a0\u00a0 \u00a0public void readRequestParams(FacesContext paramFacesContext,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Map&lt;String, Object&gt; pMap) {\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0String tmpStr = (String) pMap.get(prefixRequestParam(DOCUMENTID));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (!isStrEmpty(tmpStr))\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0this._docId = tmpStr;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0tmpStr = (String) pMap.get(prefixRequestParam(ACTION));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (!isStrEmpty(tmpStr))\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0this._action = tmpStr;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0tmpStr = (String) pMap.get(prefixRequestParam(ACCESS));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (!isStrEmpty(tmpStr))\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0this._access = tmpStr;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0@Override\r\n\u00a0\u00a0 \u00a0public Object getDataObject() {\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return this._doc;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0@Override\r\n\u00a0\u00a0 \u00a0public boolean isReadonly() {\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0DominoDocument doc = getDocument();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (doc == null)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return true;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return isReadOnly( doc );\r\n\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0@Override\r\n\u00a0\u00a0 \u00a0public boolean isReadOnly(Object paramObject) {\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return !((DominoDocument) paramObject).isEditable();\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0@SuppressWarnings(\"deprecation\")\r\n\u00a0\u00a0 \u00a0public DominoDocument getDocument() {\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Document d = null;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0DominoDocument doc = null;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (this._doc != null)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return this._doc;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0try {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Session s = (Session) getVariableValue(getAccess());\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0d = s.getCurrentDatabase().getDocumentByUNID(getDocumentId());\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0doc = com.ibm.xsp.model.domino.wrapped.DominoDocument.wrap(d\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0.getParentDatabase().getFilePath(), d, null,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0getConcurrencyMode(), false, null);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0this._doc = doc;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0} catch (Exception e) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0e.printStackTrace();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return doc;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0public String getConcurrencyMode() {\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (this._concurrencyMode != null) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return this._concurrencyMode;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ValueBinding vb = getValueBinding(CONCURRENCYMODE);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (vb != null) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return (String) vb.getValue(FacesContext.getCurrentInstance());\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return DEFAULT_CONCURRENCYMODE;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0public void setConcurrencyMode(String pString) {\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0this._concurrencyMode = pString;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0public String getDocumentId() {\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (this._docId != null) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return this._docId;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ValueBinding vb = getValueBinding(DOCUMENTID);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (vb != null) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return (String) vb.getValue(FacesContext.getCurrentInstance());\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return null;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0public void setDocumentId(String pString) {\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0this._docId = pString;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0public String getAccess(){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (this._access != null) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return this._access;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ValueBinding vb = getValueBinding(ACCESS);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (vb != null) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return (String) vb.getValue(FacesContext.getCurrentInstance());\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return null;\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0public void setAccess( String pString ){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if( isStrEmpty( pString ) ){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0this._access = CONST_SESSION;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if( pString.equals( CONST_SESSIONASSIGNER ) ){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0this._access = CONST_SESSIONASSIGNER;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if( pString.equals( CONST_SESSIONASSIGNERFULLACCESS\u00a0 ) ){\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0this._access = CONST_SESSIONASSIGNERFULLACCESS ;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0this._access = CONST_SESSION;\r\n\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0@Override\r\n\u00a0\u00a0 \u00a0public boolean doSaveDocument(FacesContext paramFacesContext, Object paramObject)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0throws FacesExceptionEx {\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0try {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return ((DominoDocument) paramObject).save();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0} catch (NotesException ne) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ne.printStackTrace();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0throw new FacesExceptionEx( MSG_DOCSAVE_FAILED , null);\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0@Override\r\n\u00a0\u00a0 \u00a0public Object saveState(FacesContext paramFacesContext) {\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Object[] objArr = new Object[5];\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0objArr[0] = super.saveState(paramFacesContext);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0objArr[1] = this._docId;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0objArr[2] = this._concurrencyMode;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0objArr[3] = this._action;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0objArr[4] = this._access;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return objArr;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0@Override\r\n\u00a0\u00a0 \u00a0public void restoreState(FacesContext paramFacesContext, Object paramObject) {\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Object[] objArr = (Object[]) paramObject;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0super.restoreState(paramFacesContext, objArr[0]);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0this._docId = ((String) objArr[1]);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0this._concurrencyMode = ((String) objArr[2]);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0this._action = ((String) objArr[3]);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0this._access = ((String) objArr[4]);\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0@Override\r\n\u00a0\u00a0 \u00a0public DocumentDataContainer doNewDocument(FacesContext paramFacesContext)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0throws FacesExceptionEx {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ TODO Auto-generated method stub\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return null;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0@Override\r\n\u00a0\u00a0 \u00a0public DocumentDataContainer doOpenDocument(FacesContext paramFacesContext)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0throws FacesExceptionEx {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ TODO Auto-generated method stub\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return null;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0public boolean isNewDocument(FacesContext paramFacesContext) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ TODO Auto-generated method stub\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0@Override\r\n\u00a0\u00a0 \u00a0public void doComputeDocument(FacesContext paramFacesContext, Object paramObject)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0throws FacesExceptionEx {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ TODO Auto-generated method stub\r\n\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0@Override\r\n\u00a0\u00a0 \u00a0public void doDeleteDocument(FacesContext paramFacesContext, Object paramObject)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0throws FacesExceptionEx {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ TODO Auto-generated method stub\r\n\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0@Override\r\n\u00a0\u00a0 \u00a0protected String composeUniqueId() {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ TODO Auto-generated method stub\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return null;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0public boolean isDocument(Object paramObject) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ TODO Auto-generated method stub\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Yesterday I read the very interessting question from Daniele Grillo at stackoverflow.com: Is a datasource available for XPages who can access the underlying document with different access levels? I have never seen one before, so I decided to do some &hellip; <a href=\"https:\/\/hasselba.ch\/blog\/?p=723\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[89,26,35,76,74],"tags":[33,7,31,86,90,5,3],"class_list":["post-723","post","type-post","status-publish","format-standard","hentry","category-java","category-jsf","category-security","category-ssjs","category-xpages","tag-8-5-3","tag-domino","tag-java","tag-jsf","tag-security","tag-ssjs","tag-xpages"],"_links":{"self":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/723","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=723"}],"version-history":[{"count":8,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/723\/revisions"}],"predecessor-version":[{"id":731,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=\/wp\/v2\/posts\/723\/revisions\/731"}],"wp:attachment":[{"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=723"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=723"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hasselba.ch\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=723"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}