dhis2-devs team mailing list archive
-
dhis2-devs team
-
Mailing list archive
-
Message #21600
[Branch ~dhis2-devs-core/dhis2/trunk] Rev 10259: Added new property for idObjects, access. Used in AbstractCrudController to fill in information a...
------------------------------------------------------------
revno: 10259
committer: Morten Olav Hansen <mortenoh@xxxxxxxxx>
branch nick: dhis2
timestamp: Sat 2013-03-16 00:37:07 +0700
message:
Added new property for idObjects, access. Used in AbstractCrudController to fill in information about what the user can do with the object.
added:
dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/Access.java
modified:
dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/BaseIdentifiableObject.java
dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/IdentifiableObject.java
dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/AbstractCrudController.java
--
lp:dhis2
https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk
Your team DHIS 2 developers is subscribed to branch lp:dhis2.
To unsubscribe from this branch go to https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk/+edit-subscription
=== added file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/Access.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/Access.java 1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/Access.java 2013-03-15 17:37:07 +0000
@@ -0,0 +1,113 @@
+package org.hisp.dhis.common;
+
+/*
+ * Copyright (c) 2004-2013, University of Oslo
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * * Neither the name of the HISP project nor the names of its contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+
+/**
+ * @author Morten Olav Hansen <mortenoh@xxxxxxxxx>
+ */
+@JacksonXmlRootElement( localName = "access", namespace = DxfNamespaces.DXF_2_0 )
+public class Access
+{
+ private boolean manage;
+
+ private boolean write;
+
+ private boolean read;
+
+ private boolean update;
+
+ private boolean delete;
+
+ public Access()
+ {
+ }
+
+ @JsonProperty
+ @JacksonXmlProperty( localName = "manage", namespace = DxfNamespaces.DXF_2_0 )
+ public boolean isManage()
+ {
+ return manage;
+ }
+
+ public void setManage( boolean manage )
+ {
+ this.manage = manage;
+ }
+
+ @JsonProperty
+ @JacksonXmlProperty( localName = "write", namespace = DxfNamespaces.DXF_2_0 )
+ public boolean isWrite()
+ {
+ return write;
+ }
+
+ public void setWrite( boolean write )
+ {
+ this.write = write;
+ }
+
+ @JsonProperty
+ @JacksonXmlProperty( localName = "read", namespace = DxfNamespaces.DXF_2_0 )
+ public boolean isRead()
+ {
+ return read;
+ }
+
+ public void setRead( boolean read )
+ {
+ this.read = read;
+ }
+
+ @JsonProperty
+ @JacksonXmlProperty( localName = "update", namespace = DxfNamespaces.DXF_2_0 )
+ public boolean isUpdate()
+ {
+ return update;
+ }
+
+ public void setUpdate( boolean update )
+ {
+ this.update = update;
+ }
+
+ @JsonProperty
+ @JacksonXmlProperty( localName = "delete", namespace = DxfNamespaces.DXF_2_0 )
+ public boolean isDelete()
+ {
+ return delete;
+ }
+
+ public void setDelete( boolean delete )
+ {
+ this.delete = delete;
+ }
+}
=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/BaseIdentifiableObject.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/BaseIdentifiableObject.java 2013-03-01 10:18:31 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/BaseIdentifiableObject.java 2013-03-15 17:37:07 +0000
@@ -49,7 +49,7 @@
/**
* @author Bob Jolliffe
*/
-@JacksonXmlRootElement( localName = "identifiableObject", namespace = DxfNamespaces.DXF_2_0 )
+@JacksonXmlRootElement(localName = "identifiableObject", namespace = DxfNamespaces.DXF_2_0)
public class BaseIdentifiableObject
extends BaseLinkableObject
implements IdentifiableObject
@@ -105,6 +105,11 @@
protected Set<UserGroupAccess> userGroupAccesses = new HashSet<UserGroupAccess>();
/**
+ * Access information for this object. Applies to current user.
+ */
+ protected transient Access access;
+
+ /**
* The i18n variant of the name. Should not be persisted.
*/
protected transient String displayName;
@@ -158,8 +163,8 @@
this.id = id;
}
- @JsonProperty( value = "id" )
- @JacksonXmlProperty( localName = "id", isAttribute = true )
+ @JsonProperty(value = "id")
+ @JacksonXmlProperty(localName = "id", isAttribute = true)
public String getUid()
{
return uid;
@@ -171,7 +176,7 @@
}
@JsonProperty
- @JacksonXmlProperty( isAttribute = true )
+ @JacksonXmlProperty(isAttribute = true)
public String getCode()
{
return code;
@@ -183,7 +188,7 @@
}
@JsonProperty
- @JacksonXmlProperty( isAttribute = true )
+ @JacksonXmlProperty(isAttribute = true)
public String getName()
{
return name;
@@ -207,7 +212,7 @@
}
@JsonProperty
- @JacksonXmlProperty( isAttribute = true )
+ @JacksonXmlProperty(isAttribute = true)
public Date getCreated()
{
return created;
@@ -219,7 +224,7 @@
}
@JsonProperty
- @JacksonXmlProperty( isAttribute = true )
+ @JacksonXmlProperty(isAttribute = true)
public Date getLastUpdated()
{
return lastUpdated;
@@ -232,8 +237,8 @@
@Override
@JsonProperty
- @JsonView( { DetailedView.class, ExportView.class } )
- @JacksonXmlProperty( namespace = DxfNamespaces.DXF_2_0 )
+ @JsonView({ DetailedView.class, ExportView.class })
+ @JacksonXmlProperty(namespace = DxfNamespaces.DXF_2_0)
public String getPublicAccess()
{
return publicAccess;
@@ -262,9 +267,9 @@
}
@JsonProperty
- @JsonView( { DetailedView.class, ExportView.class } )
- @JacksonXmlElementWrapper( localName = "userGroupAccesses", namespace = DxfNamespaces.DXF_2_0 )
- @JacksonXmlProperty( localName = "userGroupAccess", namespace = DxfNamespaces.DXF_2_0 )
+ @JsonView({ DetailedView.class, ExportView.class })
+ @JacksonXmlElementWrapper(localName = "userGroupAccesses", namespace = DxfNamespaces.DXF_2_0)
+ @JacksonXmlProperty(localName = "userGroupAccess", namespace = DxfNamespaces.DXF_2_0)
public Set<UserGroupAccess> getUserGroupAccesses()
{
return userGroupAccesses;
@@ -275,6 +280,18 @@
this.userGroupAccesses = userGroupAccesses;
}
+ @JsonProperty
+ @JacksonXmlProperty(localName = "access", namespace = DxfNamespaces.DXF_2_0)
+ public Access getAccess()
+ {
+ return access;
+ }
+
+ public void setAccess( Access access )
+ {
+ this.access = access;
+ }
+
public String getDisplayName()
{
return displayName != null && !displayName.trim().isEmpty() ? displayName : getName();
=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/IdentifiableObject.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/IdentifiableObject.java 2013-03-01 05:40:28 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/IdentifiableObject.java 2013-03-15 17:37:07 +0000
@@ -1,7 +1,7 @@
package org.hisp.dhis.common;
/*
- * Copyright (c) 2004-2012, University of Oslo
+ * Copyright (c) 2004-2013, University of Oslo
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -66,4 +66,6 @@
Set<UserGroupAccess> getUserGroupAccesses();
String getDisplayName();
+
+ Access getAccess();
}
=== modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/AbstractCrudController.java'
--- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/AbstractCrudController.java 2013-03-14 11:28:38 +0000
+++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/AbstractCrudController.java 2013-03-15 17:37:07 +0000
@@ -29,11 +29,15 @@
import org.hisp.dhis.api.utils.ContextUtils;
import org.hisp.dhis.api.utils.WebUtils;
+import org.hisp.dhis.common.Access;
+import org.hisp.dhis.common.BaseIdentifiableObject;
import org.hisp.dhis.common.IdentifiableObject;
import org.hisp.dhis.common.IdentifiableObjectManager;
import org.hisp.dhis.common.Pager;
+import org.hisp.dhis.common.SharingUtils;
import org.hisp.dhis.dxf2.metadata.ExchangeClasses;
import org.hisp.dhis.system.util.ReflectionUtils;
+import org.hisp.dhis.user.CurrentUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.ui.Model;
@@ -67,11 +71,14 @@
@Autowired
protected IdentifiableObjectManager manager;
+ @Autowired
+ protected CurrentUserService currentUserService;
+
//--------------------------------------------------------------------------
// GET
//--------------------------------------------------------------------------
- @RequestMapping(method = RequestMethod.GET)
+ @RequestMapping( method = RequestMethod.GET )
public String getObjectList( @RequestParam Map<String, String> parameters, Model model, HttpServletRequest request ) throws Exception
{
WebOptions options = new WebOptions( parameters );
@@ -85,6 +92,14 @@
WebUtils.generateLinks( metaData );
}
+ if ( SharingUtils.isSupported( getEntityClass() ) )
+ {
+ for ( T object : entityList )
+ {
+ addAccessProperties( object );
+ }
+ }
+
postProcessEntities( entityList );
postProcessEntities( entityList, parameters );
@@ -94,7 +109,7 @@
return StringUtils.uncapitalize( getEntitySimpleName() ) + "List";
}
- @RequestMapping(value = "/query/{query}", method = RequestMethod.GET)
+ @RequestMapping( value = "/query/{query}", method = RequestMethod.GET )
public String query( @PathVariable String query, @RequestParam Map<String, String> parameters, Model model, HttpServletRequest request ) throws Exception
{
WebOptions options = new WebOptions( parameters );
@@ -117,8 +132,8 @@
return StringUtils.uncapitalize( getEntitySimpleName() ) + "List";
}
- @RequestMapping(value = "/{uid}", method = RequestMethod.GET)
- public String getObject( @PathVariable("uid") String uid, @RequestParam Map<String, String> parameters,
+ @RequestMapping( value = "/{uid}", method = RequestMethod.GET )
+ public String getObject( @PathVariable( "uid" ) String uid, @RequestParam Map<String, String> parameters,
Model model, HttpServletRequest request, HttpServletResponse response ) throws Exception
{
WebOptions options = new WebOptions( parameters );
@@ -135,6 +150,11 @@
WebUtils.generateLinks( entity );
}
+ if ( SharingUtils.isSupported( getEntityClass() ) )
+ {
+ addAccessProperties( entity );
+ }
+
postProcessEntity( entity );
postProcessEntity( entity, parameters );
@@ -144,7 +164,7 @@
return StringUtils.uncapitalize( getEntitySimpleName() );
}
- @RequestMapping(value = "/search/{query}", method = RequestMethod.GET)
+ @RequestMapping( value = "/search/{query}", method = RequestMethod.GET )
public String search( @PathVariable String query, @RequestParam Map<String, String> parameters,
Model model, HttpServletRequest request, HttpServletResponse response ) throws Exception
{
@@ -175,13 +195,13 @@
// POST
//--------------------------------------------------------------------------
- @RequestMapping(method = RequestMethod.POST, consumes = { "application/xml", "text/xml" })
+ @RequestMapping( method = RequestMethod.POST, consumes = { "application/xml", "text/xml" } )
public void postXmlObject( HttpServletResponse response, HttpServletRequest request, InputStream input ) throws Exception
{
throw new HttpRequestMethodNotSupportedException( RequestMethod.POST.toString() );
}
- @RequestMapping(method = RequestMethod.POST, consumes = "application/json")
+ @RequestMapping( method = RequestMethod.POST, consumes = "application/json" )
public void postJsonObject( HttpServletResponse response, HttpServletRequest request, InputStream input ) throws Exception
{
throw new HttpRequestMethodNotSupportedException( RequestMethod.POST.toString() );
@@ -191,16 +211,16 @@
// PUT
//--------------------------------------------------------------------------
- @RequestMapping(value = "/{uid}", method = RequestMethod.PUT, consumes = { "application/xml", "text/xml" })
- @ResponseStatus(value = HttpStatus.NO_CONTENT)
- public void putXmlObject( HttpServletResponse response, HttpServletRequest request, @PathVariable("uid") String uid, InputStream input ) throws Exception
+ @RequestMapping( value = "/{uid}", method = RequestMethod.PUT, consumes = { "application/xml", "text/xml" } )
+ @ResponseStatus( value = HttpStatus.NO_CONTENT )
+ public void putXmlObject( HttpServletResponse response, HttpServletRequest request, @PathVariable( "uid" ) String uid, InputStream input ) throws Exception
{
throw new HttpRequestMethodNotSupportedException( RequestMethod.PUT.toString() );
}
- @RequestMapping(value = "/{uid}", method = RequestMethod.PUT, consumes = "application/json")
- @ResponseStatus(value = HttpStatus.NO_CONTENT)
- public void putJsonObject( HttpServletResponse response, HttpServletRequest request, @PathVariable("uid") String uid, InputStream input ) throws Exception
+ @RequestMapping( value = "/{uid}", method = RequestMethod.PUT, consumes = "application/json" )
+ @ResponseStatus( value = HttpStatus.NO_CONTENT )
+ public void putJsonObject( HttpServletResponse response, HttpServletRequest request, @PathVariable( "uid" ) String uid, InputStream input ) throws Exception
{
throw new HttpRequestMethodNotSupportedException( RequestMethod.PUT.toString() );
}
@@ -209,9 +229,9 @@
// DELETE
//--------------------------------------------------------------------------
- @RequestMapping(value = "/{uid}", method = RequestMethod.DELETE)
- @ResponseStatus(value = HttpStatus.NO_CONTENT)
- public void deleteObject( HttpServletResponse response, HttpServletRequest request, @PathVariable("uid") String uid ) throws Exception
+ @RequestMapping( value = "/{uid}", method = RequestMethod.DELETE )
+ @ResponseStatus( value = HttpStatus.NO_CONTENT )
+ public void deleteObject( HttpServletResponse response, HttpServletRequest request, @PathVariable( "uid" ) String uid ) throws Exception
{
throw new HttpRequestMethodNotSupportedException( RequestMethod.DELETE.toString() );
}
@@ -312,6 +332,18 @@
return manager.get( getEntityClass(), uid );
}
+ protected void addAccessProperties( T object )
+ {
+ Access access = new Access();
+ access.setManage( SharingUtils.canManage( currentUserService.getCurrentUser(), object ) );
+ access.setWrite( SharingUtils.canWrite( currentUserService.getCurrentUser(), object ) );
+ access.setRead( SharingUtils.canRead( currentUserService.getCurrentUser(), object ) );
+ access.setUpdate( SharingUtils.canUpdate( currentUserService.getCurrentUser(), object ) );
+ access.setDelete( SharingUtils.canDelete( currentUserService.getCurrentUser(), object ) );
+
+ ((BaseIdentifiableObject) object).setAccess( access );
+ }
+
//--------------------------------------------------------------------------
// Reflection helpers
//--------------------------------------------------------------------------
@@ -322,7 +354,7 @@
private String entitySimpleName;
- @SuppressWarnings("unchecked")
+ @SuppressWarnings( "unchecked" )
protected Class<T> getEntityClass()
{
if ( entityClass == null )
@@ -354,7 +386,7 @@
return entitySimpleName;
}
- @SuppressWarnings("unchecked")
+ @SuppressWarnings( "unchecked" )
protected T getEntityInstance()
{
try