001: /*
002: * Lucane - a collaborative platform
003: * Copyright (C) 2003 Vincent Fiack <vfiack@mail15.com>
004: *
005: * This library is free software; you can redistribute it and/or
006: * modify it under the terms of the GNU Lesser General Public
007: * License as published by the Free Software Foundation; either
008: * version 2.1 of the License, or (at your option) any later version.
009: *
010: * This library is distributed in the hope that it will be useful,
011: * but WITHOUT ANY WARRANTY; without even the implied warranty of
012: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
013: * Lesser General Public License for more details.
014: *
015: * You should have received a copy of the GNU Lesser General Public
016: * License along with this library; if not, write to the Free Software
017: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
018: */
019:
020: package org.lucane.applications.administrator;
021:
022: import java.awt.Dimension;
023: import java.util.*;
024:
025: import org.lucane.client.*;
026: import org.lucane.client.widgets.*;
027: import org.lucane.common.*;
028: import org.lucane.common.concepts.*;
029: import org.lucane.common.net.ObjectConnection;
030: import org.lucane.applications.administrator.gui.*;
031:
032: public class AdministratorPlugin extends StandalonePlugin {
033: private ConnectInfo service;
034: private ArrayList allGroups = null;
035: private ArrayList allUsers = null;
036: private ArrayList allPlugins = null;
037: private ArrayList allServices = null;
038:
039: //-- from Plugin
040: public AdministratorPlugin() {
041: }
042:
043: public Plugin newInstance(ConnectInfo[] friends) {
044: return new AdministratorPlugin();
045: }
046:
047: public void start() {
048: service = Communicator.getInstance().getConnectInfo(
049: "org.lucane.applications.administrator");
050:
051: ManagedWindow win = new ManagedWindow(this , "Admin plugin");
052: win.setExitPluginOnClose(true);
053: win.getContentPane().add(new MainPanel(this ));
054: win.setPreferredSize(new Dimension(800, 550));
055: win.show();
056: }
057:
058: //-- get cached concepts
059:
060: public ArrayList getAllGroups(boolean fetch) {
061: if (fetch || allGroups == null)
062: fetchAllGroups();
063:
064: return allGroups;
065: }
066:
067: public ArrayList getAllUsers(boolean fetch) {
068: if (fetch || allUsers == null)
069: fetchAllUsers();
070:
071: return allUsers;
072: }
073:
074: public ArrayList getAllPlugins(boolean fetch) {
075: if (fetch || allPlugins == null)
076: fetchAllPlugins();
077:
078: return allPlugins;
079: }
080:
081: public ArrayList getAllServices(boolean fetch) {
082: if (fetch || allServices == null)
083: fetchAllServices();
084:
085: return allServices;
086: }
087:
088: // -- really fetch concepts
089:
090: private void fetchAllGroups() {
091: try {
092: AdminAction action = new AdminAction(
093: AdminAction.GET_ALL_GROUPS);
094: ObjectConnection oc = Communicator.getInstance()
095: .sendMessageTo(service, service.getName(), action);
096: String ack = oc.readString();
097: if (ack.startsWith("FAILED"))
098: DialogBox.error(tr("err.fetchAllGroups"));
099:
100: allGroups = (ArrayList) oc.read();
101:
102: oc.close();
103: } catch (Exception e) {
104: allGroups = new ArrayList();
105: DialogBox.error(tr("err") + e);
106: }
107: }
108:
109: private void fetchAllUsers() {
110: try {
111: AdminAction action = new AdminAction(
112: AdminAction.GET_ALL_USERS);
113: ObjectConnection oc = Communicator.getInstance()
114: .sendMessageTo(service, service.getName(), action);
115: String ack = oc.readString();
116: if (ack.startsWith("FAILED"))
117: DialogBox.error(tr("err.fetchAllUsers"));
118:
119: allUsers = (ArrayList) oc.read();
120:
121: oc.close();
122: } catch (Exception e) {
123: allUsers = new ArrayList();
124: DialogBox.error(tr("err") + e);
125: }
126: }
127:
128: private void fetchAllPlugins() {
129: try {
130: AdminAction action = new AdminAction(
131: AdminAction.GET_ALL_PLUGINS);
132: ObjectConnection oc = Communicator.getInstance()
133: .sendMessageTo(service, service.getName(), action);
134: String ack = oc.readString();
135: if (ack.startsWith("FAILED"))
136: DialogBox.error(tr("err.fetchAllPlugins"));
137:
138: allPlugins = (ArrayList) oc.read();
139:
140: oc.close();
141: } catch (Exception e) {
142: allPlugins = new ArrayList();
143: DialogBox.error(tr("err") + e);
144: }
145: }
146:
147: private void fetchAllServices() {
148: try {
149: AdminAction action = new AdminAction(
150: AdminAction.GET_ALL_SERVICES);
151: ObjectConnection oc = Communicator.getInstance()
152: .sendMessageTo(service, service.getName(), action);
153: String ack = oc.readString();
154: if (ack.startsWith("FAILED"))
155: DialogBox.error(tr("err.fetchAllServices"));
156:
157: allServices = (ArrayList) oc.read();
158:
159: oc.close();
160: } catch (Exception e) {
161: allServices = new ArrayList();
162: DialogBox.error(tr("err") + e);
163: }
164: }
165:
166: //--
167:
168: public ArrayList getAuthorizedPlugins(UserConcept user) {
169: ArrayList list = null;
170:
171: try {
172: AdminAction action = new AdminAction(
173: AdminAction.GET_AUTHORIZED_PLUGINS, user);
174: ObjectConnection oc = Communicator.getInstance()
175: .sendMessageTo(service, service.getName(), action);
176: String ack = oc.readString();
177: if (ack.startsWith("FAILED"))
178: DialogBox.error(tr("err.getAuthorizedPluginsFor")
179: + user);
180:
181: list = (ArrayList) oc.read();
182:
183: oc.close();
184: } catch (Exception e) {
185: list = new ArrayList();
186: DialogBox.error(tr("err") + e);
187: }
188:
189: return list;
190: }
191:
192: //-- update concept storage
193:
194: public void storeConcept(Concept concept) {
195: try {
196: AdminAction action = new AdminAction(AdminAction.STORE,
197: concept);
198: ObjectConnection oc = Communicator.getInstance()
199: .sendMessageTo(service, service.getName(), action);
200: String ack = oc.readString();
201: if (ack.startsWith("FAILED"))
202: DialogBox.error(tr("err.storeConcept") + concept);
203:
204: oc.close();
205: } catch (Exception e) {
206: DialogBox.error(tr("err") + e);
207: }
208: }
209:
210: public void updateConcept(Concept concept) {
211: this .updateConcept(concept, true);
212: }
213:
214: public void updateConcept(Concept concept, boolean verbose) {
215: if (!verbose || updateIsSafe(concept)) {
216: try {
217: AdminAction action = new AdminAction(
218: AdminAction.UPDATE, concept);
219: ObjectConnection oc = Communicator.getInstance()
220: .sendMessageTo(service, service.getName(),
221: action);
222: String ack = oc.readString();
223: if (ack.startsWith("FAILED"))
224: DialogBox.error(tr("err.updateConcept") + concept);
225: else if (verbose)
226: DialogBox.info(tr("msg.conceptUpdated") + concept);
227:
228: oc.close();
229: } catch (Exception e) {
230: DialogBox.error(tr("err") + e);
231: }
232: }
233:
234: }
235:
236: public void removeConcept(Concept concept) {
237: if (removeIsSafe(concept)) {
238: try {
239: AdminAction action = new AdminAction(
240: AdminAction.REMOVE, concept);
241: ObjectConnection oc = Communicator.getInstance()
242: .sendMessageTo(service, service.getName(),
243: action);
244: String ack = oc.readString();
245: if (ack.startsWith("FAILED"))
246: DialogBox.error(tr("err.removeConcept") + concept);
247:
248: oc.close();
249: } catch (Exception e) {
250: DialogBox.error(tr("err") + e);
251: }
252: }
253: }
254:
255: //-- fetch users
256:
257: public List getAllConnectedUsers() {
258: return Client.getInstance().getUserList();
259: }
260:
261: public ArrayList getConnectedUsersForConcept(Concept concept) {
262: ArrayList list = new ArrayList();
263:
264: try {
265: AdminAction action = new AdminAction(
266: AdminAction.GET_USERS_FOR, concept);
267: ObjectConnection oc = Communicator.getInstance()
268: .sendMessageTo(service, service.getName(), action);
269: String ack = oc.readString();
270: if (ack.startsWith("FAILED"))
271: DialogBox.error(tr("err.getUsersForConcept") + concept);
272: else {
273: ArrayList users = (ArrayList) oc.read();
274: Iterator i = users.iterator();
275: while (i.hasNext()) {
276: UserConcept user = (UserConcept) i.next();
277: if (isConnected(user))
278: list.add(user.getName());
279: }
280: }
281:
282: oc.close();
283: } catch (Exception e) {
284: DialogBox.error(tr("err") + e);
285: e.printStackTrace();
286: }
287: return list;
288: }
289:
290: /**
291: * Check if a user is connected
292: *
293: * @param user the UserConcept
294: * @return true if connected
295: */
296: private boolean isConnected(UserConcept user) {
297: List users = Client.getInstance().getUserList();
298: return users.contains(user.getName());
299: }
300:
301: /**
302: * Removing plugins or users from admin concept is dangerous
303: */
304: private boolean updateIsSafe(Concept concept) {
305: //admin group
306: if (concept.getName().equals("Admins")
307: && concept instanceof GroupConcept) {
308: GroupConcept group = (GroupConcept) concept;
309:
310: //basic applications
311: if (!group.hasPlugin(new PluginConcept(
312: "org.lucane.application.quicklaunch", "version")))
313: return askForConfirmation(tr("dangerous.update"));
314: if (!group.hasPlugin(new PluginConcept(
315: "org.lucane.application.maininterface", "version")))
316: return askForConfirmation(tr("dangerous.update"));
317: if (!group.hasPlugin(new PluginConcept(
318: "org.lucane.application.administrator", "version")))
319: return askForConfirmation(tr("dangerous.update"));
320: if (!group.hasService(new ServiceConcept(
321: "org.lucane.application.administrator", false)))
322: return askForConfirmation(tr("dangerous.update"));
323:
324: //at least one user
325: if (!group.getUsers().hasNext())
326: return askForConfirmation(tr("dangerous.update"));
327: }
328:
329: //admin user
330: if (concept.getName().equals("admin")
331: && concept instanceof UserConcept)
332: return askForConfirmation(tr("dangerous.update"));
333:
334: return true;
335: }
336:
337: /**
338: * Removing a plugin might break everything
339: */
340: private boolean removeIsSafe(Concept concept) {
341: String[] dangerous = {
342: "Admins", //group
343: "admin", //user
344: "org.lucane.applications.maininterface",
345: "org.lucane.applications.quicklaunch",
346: "org.lucane.applications.administrator", };
347:
348: for (int i = 0; i < dangerous.length; i++) {
349: if (dangerous[i].equals(concept.getName()))
350: return askForConfirmation(tr("dangerous.remove"));
351: }
352:
353: return true;
354: }
355:
356: /**
357: * Ask the user before screwing everything
358: */
359: private boolean askForConfirmation(String message) {
360: return DialogBox.question(getTitle(), message);
361: }
362: }
|