001: package org.contineo.web.document;
002:
003: import org.apache.commons.logging.Log;
004: import org.apache.commons.logging.LogFactory;
005:
006: import org.contineo.core.document.Document;
007: import org.contineo.core.security.Group;
008: import org.contineo.core.security.GroupRule;
009: import org.contineo.core.security.Menu;
010: import org.contineo.core.security.MenuGroup;
011: import org.contineo.core.security.dao.GroupDAO;
012: import org.contineo.core.security.dao.MenuDAO;
013:
014: import org.contineo.util.Context;
015:
016: import org.contineo.web.SessionManagement;
017: import org.contineo.web.i18n.Messages;
018: import org.contineo.web.navigation.PageContentBean;
019:
020: import java.util.ArrayList;
021: import java.util.Collection;
022: import java.util.Iterator;
023:
024: import javax.faces.application.FacesMessage;
025:
026: /**
027: * Control that allows the user to select access rights
028: *
029: * @author Marco Meschieri
030: * @version $Id: RightsRecordsManager.java,v 1.4 2006/09/03 16:24:37 marco Exp $
031: * @since 3.0
032: */
033: public class RightsRecordsManager {
034: protected static Log log = LogFactory
035: .getLog(RightsRecordsManager.class);
036: private ArrayList<GroupRule> rules = new ArrayList<GroupRule>();
037: private Document selectedDocument;
038: private Directory selectedDirectory;
039: private boolean recursive = false;
040: private DocumentNavigation documentNavigation;
041:
042: public boolean isRecursive() {
043: return recursive;
044: }
045:
046: public void setRecursive(boolean recursive) {
047: this .recursive = recursive;
048: }
049:
050: /**
051: * Changes the currently selected directory and updates the rules list.
052: *
053: * @param dir
054: */
055: public void selectDirectory(Directory dir) {
056: recursive = false;
057: selectedDocument = null;
058: selectedDirectory = dir;
059:
060: initRights(dir.getMenuId());
061: }
062:
063: /**
064: * Changes the currently selected document and updates the rules list.
065: *
066: * @param doc
067: */
068: public void selectDocument(Document doc) {
069: recursive = false;
070: selectedDocument = doc;
071: selectedDirectory = null;
072:
073: initRights(doc.getMenuId());
074: }
075:
076: /**
077: * Initializes the collection of rights
078: *
079: * @param menuId The menu that must be evaluated
080: */
081: private void initRights(int menuId) {
082: // initiate the list
083: if (rules != null) {
084: rules.clear();
085: } else {
086: rules = new ArrayList<GroupRule>(10);
087: }
088:
089: try {
090: GroupDAO gdao = (GroupDAO) Context.getInstance().getBean(
091: GroupDAO.class);
092: MenuDAO mdao = (MenuDAO) Context.getInstance().getBean(
093: MenuDAO.class);
094: String username = SessionManagement.getUsername();
095:
096: if (mdao.isWriteEnable(menuId, username)) {
097: Collection groups = gdao.findAll();
098: Iterator iter = groups.iterator();
099:
100: while (iter.hasNext()) {
101: Group g = (Group) iter.next();
102: GroupRule gr = new GroupRule();
103: gr.setGroupName(g.getGroupName());
104:
105: // special handling for admin group, it has always
106: // write/read
107: if (g.getGroupName().equals("admin")) {
108: gr.setEnabled(false);
109: gr.setRead(true);
110: gr.setWrite(true);
111: } else {
112: gr.setEnabled(true);
113:
114: Menu menu = mdao.findByPrimaryKey(menuId);
115: MenuGroup mg = menu.getMenuGroup(g
116: .getGroupName());
117:
118: if ((mg == null)
119: || !mg.getGroupName().equals(
120: g.getGroupName())) {
121: gr.setRead(false);
122: gr.setWrite(false);
123: } else {
124: gr.setRead(true);
125:
126: if (mg.getWriteEnable() == 1) {
127: gr.setWrite(true);
128: } else {
129: gr.setWrite(false);
130: }
131: }
132: }
133:
134: rules.add(gr);
135: }
136: }
137: } catch (Exception e) {
138: log.error(e.getMessage(), e);
139: Messages.addMessage(FacesMessage.SEVERITY_ERROR, e
140: .getMessage(), e.getMessage());
141: }
142: }
143:
144: /**
145: * Cleans up the resources used by this class. This method could be called
146: * when a session destroyed event is called.
147: */
148: public void dispose() {
149: rules.clear();
150: }
151:
152: /**
153: * Gets the list of rules which will be used by the ice:dataTable component.
154: *
155: * @return array list of rights
156: */
157: public ArrayList getRules() {
158: return rules;
159: }
160:
161: public String back() {
162: documentNavigation.setSelectedPanel(new PageContentBean(
163: "documents"));
164:
165: return null;
166: }
167:
168: public String save() {
169: int id = (selectedDocument != null) ? selectedDocument
170: .getMenuId() : selectedDirectory.getMenuId();
171: String username = SessionManagement.getUsername();
172: saveRules(id, username);
173:
174: documentNavigation.setSelectedPanel(new PageContentBean(
175: "documents"));
176:
177: return null;
178: }
179:
180: /**
181: * Saves the selected rights into the current element
182: *
183: * @param id
184: * @param username
185: */
186: private void saveRules(int id, String username) {
187: MenuDAO mdao = (MenuDAO) Context.getInstance().getBean(
188: MenuDAO.class);
189:
190: if (!mdao.isWriteEnable(id, username)) {
191: return;
192: }
193:
194: Menu menu = mdao.findByPrimaryKey(id);
195:
196: boolean sqlerrors = false;
197:
198: for (GroupRule rule : rules) {
199: boolean read = rule.getRead();
200: boolean write = rule.getWrite();
201:
202: if ("admin".equals(rule.getGroupName())) {
203: read = true;
204: write = true;
205: }
206:
207: MenuGroup mg = menu.getMenuGroup(rule.getGroupName());
208:
209: if (read) {
210: if ((mg == null)
211: || !mg.getGroupName().equals(
212: rule.getGroupName())) {
213: mg = new MenuGroup();
214: mg.setGroupName(rule.getGroupName());
215: menu.getMenuGroups().add(mg);
216:
217: if (write) {
218: mg.setWriteEnable(1);
219: } else {
220: mg.setWriteEnable(0);
221: }
222:
223: boolean stored = mdao.store(menu);
224:
225: if (!stored) {
226: sqlerrors = true;
227: }
228: }
229: } else {
230: if (mg != null) {
231: menu.getMenuGroups().remove(mg);
232:
233: boolean deleted = mdao.store(menu);
234:
235: if (!deleted) {
236: sqlerrors = true;
237: }
238: }
239: }
240: }
241:
242: if (sqlerrors) {
243: Messages.addMessage(FacesMessage.SEVERITY_ERROR, Messages
244: .getMessage("errors.action.saverules"), Messages
245: .getMessage("errors.action.saverules"));
246: } else {
247: Messages.addMessage(FacesMessage.SEVERITY_INFO, Messages
248: .getMessage("msg.action.saverules"), Messages
249: .getMessage("msg.action.saverules"));
250: }
251:
252: if (recursive) {
253: // recursively apply permissions to all submenues
254: Collection<Menu> submenues = mdao.findByParentId(id);
255:
256: for (Menu submenu : submenues) {
257: saveRules(submenu.getMenuId(), username);
258: }
259: }
260: }
261:
262: public Document getSelectedDocument() {
263: return selectedDocument;
264: }
265:
266: public void setSelectedDocument(Document selectedDocument) {
267: this .selectedDocument = selectedDocument;
268: }
269:
270: public Directory getSelectedDirectory() {
271: return selectedDirectory;
272: }
273:
274: public void setDocumentNavigation(
275: DocumentNavigation documentNavigation) {
276: this.documentNavigation = documentNavigation;
277: }
278: }
|