comparison src/main/java/edu/harvard/iq/dataverse/DataverseHeaderFragment.java @ 10:a50cf11e5178

Rewrite LGDataverse completely upgrading to dataverse4.0
author Zoe Hong <zhong@mpiwg-berlin.mpg.de>
date Tue, 08 Sep 2015 17:00:21 +0200
parents
children c2e2d794847f
comparison
equal deleted inserted replaced
9:5926d6419569 10:a50cf11e5178
1 /*
2 * To change this license header, choose License Headers in Project Properties.
3 * To change this template file, choose Tools | Templates
4 * and open the template in the editor.
5 */
6 package edu.harvard.iq.dataverse;
7
8 import edu.harvard.iq.dataverse.authorization.Permission;
9 import edu.harvard.iq.dataverse.authorization.groups.Group;
10 import edu.harvard.iq.dataverse.authorization.groups.GroupServiceBean;
11 import edu.harvard.iq.dataverse.authorization.users.User;
12 import edu.harvard.iq.dataverse.settings.SettingsServiceBean;
13 import static edu.harvard.iq.dataverse.util.JsfHelper.JH;
14 import edu.harvard.iq.dataverse.util.SystemConfig;
15 import java.io.UnsupportedEncodingException;
16 import java.net.URLDecoder;
17 import java.net.URLEncoder;
18 import java.util.ArrayList;
19 import java.util.Arrays;
20 import java.util.List;
21 import java.util.Map;
22 import java.util.Set;
23 import java.util.logging.Level;
24 import java.util.logging.Logger;
25 import javax.ejb.EJB;
26 import javax.faces.context.FacesContext;
27 import javax.faces.view.ViewScoped;
28 import javax.inject.Inject;
29 import javax.inject.Named;
30 import javax.servlet.http.HttpServletRequest;
31 import org.apache.commons.lang.StringUtils;
32
33 /**
34 *
35 * @author gdurand
36 */
37 @ViewScoped
38 @Named
39 public class DataverseHeaderFragment implements java.io.Serializable {
40
41 private static final Logger logger = Logger.getLogger(DataverseHeaderFragment.class.getName());
42
43 @EJB
44 DataverseServiceBean dataverseService;
45
46 @EJB
47 SettingsServiceBean settingsService;
48
49 @EJB
50 GroupServiceBean groupService;
51
52 @EJB
53 PermissionServiceBean permissionService;
54
55 @EJB
56 SystemConfig systemConfig;
57
58 @Inject
59 DataverseSession dataverseSession;
60
61 @EJB
62 UserNotificationServiceBean userNotificationService;
63
64 List<Breadcrumb> breadcrumbs = new ArrayList();
65
66 private Long unreadNotificationCount = null;
67
68 public List<Breadcrumb> getBreadcrumbs() {
69 return breadcrumbs;
70 }
71
72 public void setBreadcrumbs(List<Breadcrumb> breadcrumbs) {
73 this.breadcrumbs = breadcrumbs;
74 }
75
76 public void initBreadcrumbs(DvObject dvObject) {
77 if (dvObject.getId() != null) {
78 initBreadcrumbs(dvObject, null);
79 } else {
80 initBreadcrumbs(dvObject.getOwner(), dvObject instanceof Dataverse ? JH.localize("newDataverse") :
81 dvObject instanceof Dataset ? JH.localize("newDataset") : null );
82 }
83 }
84
85 public Long getUnreadNotificationCount(Long userId){
86
87 if (userId == null){
88 return new Long("0");
89 }
90
91 if (this.unreadNotificationCount != null){
92 return this.unreadNotificationCount;
93 }
94
95 try{
96 this.unreadNotificationCount = userNotificationService.getUnreadNotificationCountByUser(userId);
97 }catch (Exception e){
98 logger.warning("Error trying to retrieve unread notification count for user." + e.getMessage());
99 this.unreadNotificationCount = new Long("0");
100 }
101 return this.unreadNotificationCount;
102 }
103
104 public void initBreadcrumbs(DvObject dvObject, String subPage) {
105 breadcrumbs.clear();
106
107 while (dvObject != null) {
108 breadcrumbs.add(0, new Breadcrumb(dvObject.getDisplayName(), dvObject));
109 dvObject = dvObject.getOwner();
110 }
111
112 if (subPage != null) {
113 breadcrumbs.add(new Breadcrumb(subPage, null));
114 }
115 }
116
117
118
119 /* Old methods for breadcrumb and trees - currently disabled and deferred
120
121 public List<Dataverse> getDataverses(Dataverse dataverse) {
122 List dataverses = new ArrayList();
123 if (dataverse != null) {
124 dataverses.addAll(dataverse.getOwners());
125 dataverses.add(dataverse);
126 } else {
127 dataverses.add(dataverseService.findRootDataverse());
128 }
129 return dataverses;
130 }
131
132 // @todo right now we just check on if published or if you are the creator; need full permission support
133 public boolean hasVisibleChildren(Dataverse dataverse) {
134 for (Dataverse dv : dataverseService.findByOwnerId(dataverse.getId())) {
135 if (dv.isReleased() || dv.getCreator().equals(dataverseSession.getUser())) {
136 return true;
137 }
138 }
139
140 return false;
141
142 }
143
144 public TreeNode getDataverseTree(Dataverse dataverse) {
145 if (dataverse == null) { // the primefaces component seems to call this with dataverse == null for some reason
146 return null;
147 }
148 return getDataverseNode(dataverse, null, true);
149 }
150
151 private TreeNode getDataverseNode(Dataverse dataverse, TreeNode root, boolean expand) {
152 // @todo right now we just check on if published or if you are the creator; need full permission support
153 if (dataverse.isReleased() || dataverse.getCreator().equals(dataverseSession.getUser())) {
154 TreeNode dataverseNode = new DefaultTreeNode(dataverse, root);
155 dataverseNode.setExpanded(expand);
156 List<Dataverse> childDataversesOfCurrentDataverse = dataverseService.findByOwnerId(dataverse.getId());
157 for (Dataverse child : childDataversesOfCurrentDataverse) {
158 getDataverseNode(child, dataverseNode, false);
159 }
160 return dataverseNode;
161 }
162 return null;
163 }
164 */
165 public String logout() {
166 dataverseSession.setUser(null);
167
168 String redirectPage = getPageFromContext();
169 try {
170 redirectPage = URLDecoder.decode(redirectPage, "UTF-8");
171 } catch (UnsupportedEncodingException ex) {
172 Logger.getLogger(LoginPage.class.getName()).log(Level.SEVERE, null, ex);
173 redirectPage = "dataverse.xhtml&alias=" + dataverseService.findRootDataverse().getAlias();
174 }
175
176 if (StringUtils.isEmpty(redirectPage)) {
177 redirectPage = "dataverse.xhtml&alias=" + dataverseService.findRootDataverse().getAlias();
178 }
179
180 logger.log(Level.INFO, "Sending user to = " + redirectPage);
181 return redirectPage + (redirectPage.indexOf("?") == -1 ? "?" : "&") + "faces-redirect=true";
182 }
183
184 public boolean isSignupAllowed() {
185 boolean safeDefaultIfKeyNotFound = false;
186 return settingsService.isTrueForKey(SettingsServiceBean.Key.AllowSignUp, safeDefaultIfKeyNotFound);
187 }
188
189 public String getSignupUrl() {
190 String nonNullDefaultIfKeyNotFound = "";
191 String signUpUrl = settingsService.getValueForKey(SettingsServiceBean.Key.SignUpUrl, nonNullDefaultIfKeyNotFound);
192 return signUpUrl;
193 }
194
195 public String getLoginRedirectPage() {
196 return getRedirectPage();
197 }
198
199 // @todo consider creating a base bean, for now just make this static
200 public static String getRedirectPage() {
201
202 String redirectPage = getPageFromContext();
203 if (!StringUtils.isEmpty(redirectPage)) {
204 return "?redirectPage=" + redirectPage;
205 }
206 return "";
207 }
208
209 private static String getPageFromContext() {
210 try {
211 HttpServletRequest req = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
212 StringBuilder redirectPage = new StringBuilder();
213 redirectPage.append(req.getServletPath());
214
215 // to regenerate the query string, we need to use the parameter map; however this can contain internal POST parameters
216 // that we don't want, so we filter through a list of paramters we do allow
217 // @todo verify what needs to be in this list of available parameters (for example do we want to repeat searches when you login?
218 List acceptableParameters = new ArrayList();
219 acceptableParameters.addAll(Arrays.asList("id", "alias", "version", "q", "ownerId", "persistentId", "versionId"));
220
221 if (req.getParameterMap() != null) {
222 StringBuilder queryString = new StringBuilder();
223 for (Map.Entry<String, String[]> entry : ((Map<String, String[]>) req.getParameterMap()).entrySet()) {
224 String name = entry.getKey();
225 if (acceptableParameters.contains(name)) {
226 String value = entry.getValue()[0];
227 queryString.append(queryString.length() == 0 ? "?" : "&").append(name).append("=").append(value);
228 }
229 }
230 redirectPage.append(queryString);
231 }
232
233 return URLEncoder.encode(redirectPage.toString(), "UTF-8");
234 } catch (UnsupportedEncodingException ex) {
235 Logger.getLogger(DataverseHeaderFragment.class.getName()).log(Level.SEVERE, null, ex);
236 }
237 return "";
238 }
239
240 // inner class used for breadcrumbs
241 public static class Breadcrumb {
242
243 private final String breadcrumbText;
244 private final DvObject dvObject;
245
246 public Breadcrumb(String breadcrumbText, DvObject dvObject) {
247 this.breadcrumbText = breadcrumbText;
248 this.dvObject = dvObject;
249
250 }
251
252 public String getBreadcrumbText() {
253 return breadcrumbText;
254 }
255
256 public DvObject getDvObject() {
257 return dvObject;
258 }
259
260 }
261
262 public boolean isDebugShibboleth() {
263 return systemConfig.isDebugEnabled();
264 }
265
266 public List<String> getGroups(User user) {
267 List<String> groups = new ArrayList<>();
268 Set<Group> groupsForUser = groupService.groupsFor(user, null);
269 for (Group group : groupsForUser) {
270 groups.add(group.getDisplayName() + " (" + group.getIdentifier() + ")");
271 }
272 return groups;
273 }
274
275 public List<String> getPermissions(User user, Dataverse dataverse) {
276 List<String> permissions = new ArrayList<>();
277 for (Permission permission : permissionService.permissionsFor(user, dataverse)) {
278 permissions.add(permission.name());
279 }
280 return permissions;
281 }
282 }