Skip to content

Commit 9a9cdfa

Browse files
committed
Merge branch '4.1.18'
2 parents 250da4c + f7dbe8a commit 9a9cdfa

16 files changed

+389
-140
lines changed

pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<groupId>org.jbei</groupId>
55
<artifactId>ice</artifactId>
66
<packaging>war</packaging>
7-
<version>4.1.17</version>
7+
<version>4.1.18</version>
88
<name>ice</name>
99
<description>Inventory of Composable Elements (ICE) for Synthetic Biology</description>
1010
<repositories>

src/main/java/org/jbei/ice/lib/dao/hibernate/PermissionDAO.java

+29
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,35 @@ public List<Long> getCanReadEntries(Account account, Set<Group> groups, List<Lon
347347
.list();
348348
}
349349

350+
/**
351+
* Determines if the specified account has write privileges on the entries passed on the parameter
352+
*
353+
* @param account user account
354+
* @param groups groups that the account belongs to
355+
* @param entries list of entry Ids to check
356+
* @return true if the user has write privileges on <b>all</b> the entries specified in the parameter
357+
*/
358+
public boolean canWrite(Account account, Set<Group> groups, List<Long> entries) {
359+
Criteria criteria = currentSession().createCriteria(Permission.class);
360+
Disjunction disjunction = Restrictions.disjunction();
361+
disjunction.add(Restrictions.and(Restrictions.eq("account", account), Restrictions.eq("canWrite", true)));
362+
disjunction.add(Restrictions.eq("entry.ownerEmail", account.getEmail()));
363+
364+
if (!groups.isEmpty()) {
365+
disjunction.add(Restrictions.and(Restrictions.in("group", groups), Restrictions.eq("canWrite", true)));
366+
}
367+
368+
criteria.createAlias("entry", "entry", JoinType.LEFT_OUTER_JOIN)
369+
.add(Restrictions.in("entry.id", entries))
370+
.add(Restrictions.eq("entry.visibility", Visibility.OK.getValue()));
371+
372+
criteria.add(disjunction);
373+
criteria.setProjection(Projections.distinct(Projections.property("entry.id")));
374+
375+
Number number = (Number) criteria.setProjection(Projections.rowCount()).uniqueResult();
376+
return number.intValue() == entries.size();
377+
}
378+
350379
@Override
351380
public Permission get(long id) {
352381
return super.get(Permission.class, id);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package org.jbei.ice.lib.entry;
2+
3+
import org.jbei.ice.lib.account.AccountController;
4+
import org.jbei.ice.lib.account.model.Account;
5+
import org.jbei.ice.lib.dao.DAOFactory;
6+
import org.jbei.ice.lib.dao.hibernate.EntryDAO;
7+
import org.jbei.ice.lib.dao.hibernate.PermissionDAO;
8+
import org.jbei.ice.lib.dto.entry.Visibility;
9+
import org.jbei.ice.lib.entry.model.Entry;
10+
import org.jbei.ice.lib.group.Group;
11+
import org.jbei.ice.lib.group.GroupController;
12+
13+
import java.util.List;
14+
import java.util.Set;
15+
16+
/**
17+
* @author Hector Plahar
18+
*/
19+
public class Entries {
20+
21+
private final EntryDAO dao;
22+
23+
public Entries() {
24+
this.dao = DAOFactory.getEntryDAO();
25+
}
26+
27+
public boolean updateVisibility(String userId, List<Long> entryIds, Visibility visibility) {
28+
Account account = DAOFactory.getAccountDAO().getByEmail(userId);
29+
Set<Group> accountGroups = new GroupController().getAllGroups(account);
30+
PermissionDAO permissionDAO = DAOFactory.getPermissionDAO();
31+
if (!new AccountController().isAdministrator(userId) && !permissionDAO.canWrite(account, accountGroups, entryIds))
32+
return false;
33+
34+
for (long entryId : entryIds) {
35+
Entry entry = dao.get(entryId);
36+
if (entry.getVisibility() == visibility.getValue())
37+
continue;
38+
39+
entry.setVisibility(visibility.getValue());
40+
dao.update(entry);
41+
}
42+
43+
return true;
44+
}
45+
}

src/main/java/org/jbei/ice/lib/entry/EntryController.java

+48-2
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,50 @@ public long getNumberOfOwnerEntries(String requesterUserEmail, String ownerEmail
173173
return dao.ownerEntryCount(account, ownerEmail, accountGroups);
174174
}
175175

176+
/**
177+
* Determines if the two entries can be linked
178+
*
179+
* @param entry parent in link hierarchy
180+
* @param link child in link hierarchy
181+
* @return true if the two entries can be linked in the hierarchy specified
182+
*/
183+
private boolean canLink(Entry entry, Entry link) {
184+
if (entry == null || link == null || entry.getId() == link.getId())
185+
return false;
186+
187+
if (link.getLinkedEntries().contains(entry))
188+
return false;
189+
190+
EntryType linkedType = EntryType.nameToType(link.getRecordType());
191+
EntryType type = EntryType.nameToType(entry.getRecordType());
192+
if (type == null || linkedType == null)
193+
return false;
194+
195+
switch (type) {
196+
case PLASMID:
197+
if (linkedType != type && linkedType != EntryType.PART)
198+
return false;
199+
break;
200+
201+
case PART:
202+
if (linkedType != type)
203+
return false;
204+
break;
205+
206+
case STRAIN:
207+
if (linkedType != type && linkedType != EntryType.PLASMID && linkedType != EntryType.PART)
208+
return false;
209+
break;
210+
211+
case ARABIDOPSIS:
212+
if (linkedType != type && linkedType != EntryType.PART)
213+
return false;
214+
break;
215+
}
216+
217+
return true;
218+
}
219+
176220
public long updatePart(String userId, long partId, PartData part) {
177221
Entry existing = dao.get(partId);
178222
authorization.expectWrite(userId, existing);
@@ -182,13 +226,15 @@ public long updatePart(String userId, long partId, PartData part) {
182226
if (part.getLinkedParts() != null && part.getLinkedParts().size() > 0) {
183227
for (PartData data : part.getLinkedParts()) {
184228
Entry linked = dao.getByPartNumber(data.getPartId());
185-
if (linked == null)
186-
continue;
187229

230+
// check permissions on link
188231
if (!authorization.canRead(userId, linked)) {
189232
continue;
190233
}
191234

235+
if (!canLink(entry, linked))
236+
continue;
237+
192238
entry.getLinkedEntries().add(linked);
193239
}
194240
}

src/main/java/org/jbei/ice/services/rest/ArrayDataJSONHandler.java

+8-17
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,9 @@
11
package org.jbei.ice.services.rest;
22

3-
import java.io.IOException;
4-
import java.io.InputStream;
5-
import java.io.InputStreamReader;
6-
import java.io.OutputStream;
7-
import java.io.OutputStreamWriter;
8-
import java.io.Reader;
9-
import java.io.Writer;
10-
import java.lang.annotation.Annotation;
11-
import java.lang.reflect.Type;
12-
import java.util.ArrayList;
3+
import com.google.gson.Gson;
4+
import com.google.gson.GsonBuilder;
5+
import org.jbei.ice.lib.dao.IDataTransferModel;
6+
137
import javax.ws.rs.Consumes;
148
import javax.ws.rs.Produces;
159
import javax.ws.rs.WebApplicationException;
@@ -18,13 +12,10 @@
1812
import javax.ws.rs.ext.MessageBodyReader;
1913
import javax.ws.rs.ext.MessageBodyWriter;
2014
import javax.ws.rs.ext.Provider;
21-
22-
import org.jbei.ice.lib.dao.IDataTransferModel;
23-
24-
import com.google.gson.Gson;
25-
import com.google.gson.GsonBuilder;
26-
import com.google.gson.JsonElement;
27-
import com.google.gson.reflect.TypeToken;
15+
import java.io.*;
16+
import java.lang.annotation.Annotation;
17+
import java.lang.reflect.Type;
18+
import java.util.ArrayList;
2819

2920
/**
3021
* @author Hector Plahar

src/main/java/org/jbei/ice/services/rest/PartDataJSONHandler.java

+7-18
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
11
package org.jbei.ice.services.rest;
22

3-
import java.io.IOException;
4-
import java.io.InputStream;
5-
import java.io.InputStreamReader;
6-
import java.io.OutputStream;
7-
import java.io.OutputStreamWriter;
8-
import java.io.Reader;
9-
import java.io.Writer;
10-
import java.lang.annotation.Annotation;
11-
import java.lang.reflect.Type;
3+
import com.google.gson.Gson;
4+
import com.google.gson.GsonBuilder;
5+
import org.jbei.ice.lib.dao.IDataTransferModel;
6+
127
import javax.ws.rs.Consumes;
138
import javax.ws.rs.Produces;
149
import javax.ws.rs.WebApplicationException;
@@ -17,11 +12,9 @@
1712
import javax.ws.rs.ext.MessageBodyReader;
1813
import javax.ws.rs.ext.MessageBodyWriter;
1914
import javax.ws.rs.ext.Provider;
20-
21-
import org.jbei.ice.lib.dao.IDataTransferModel;
22-
23-
import com.google.gson.Gson;
24-
import com.google.gson.GsonBuilder;
15+
import java.io.*;
16+
import java.lang.annotation.Annotation;
17+
import java.lang.reflect.Type;
2518

2619
/**
2720
* Custom Writer and Reader for classes that extend {@link IDataTransferModel} using GSON for JSON conversion
@@ -36,8 +29,6 @@ public class PartDataJSONHandler
3629

3730
@Override
3831
public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
39-
// return type == PartData.class || type == PlasmidData.class || type == StrainData.class || type ==
40-
// ArabidopsisSeedData.class;
4132
return true;
4233
}
4334

@@ -59,8 +50,6 @@ public void writeTo(IDataTransferModel data, Class<?> type, Type genericType, An
5950

6051
@Override
6152
public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
62-
// return type == PartData.class || type == PlasmidData.class || type == StrainData.class || type ==
63-
// ArabidopsisSeedData.class;
6453
return true;
6554
}
6655

0 commit comments

Comments
 (0)