001: /*
002: * Copyright (c) 2001 Silvere Martin-Michiellot All Rights Reserved.
003: *
004: * Silvere Martin-Michiellot grants you ("Licensee") a non-exclusive,
005: * royalty free, license to use, modify and redistribute this
006: * software in source and binary code form,
007: * provided that i) this copyright notice and license appear on all copies of
008: * the software; and ii) Licensee does not utilize the software in a manner
009: * which is disparaging to Silvere Martin-Michiellot.
010: *
011: * This software is provided "AS IS," without a warranty of any kind. ALL
012: * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
013: * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
014: * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. Silvere Martin-Michiellot
015: * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES
016: * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
017: * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
018: * Silvere Martin-Michiellot OR ITS LICENSORS BE LIABLE
019: * FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
020: * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
021: * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
022: * OR INABILITY TO USE SOFTWARE, EVEN IF Silvere Martin-Michiellot HAS BEEN
023: * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
024: *
025: * This software is not designed or intended for use in on-line control of
026: * aircraft, air traffic, aircraft navigation or aircraft communications; or in
027: * the design, construction, operation or maintenance of any nuclear
028: * facility. Licensee represents and warrants that it will not use or
029: * redistribute the Software for such purposes.
030: *
031: * @Author: Silvere Martin-Michiellot
032: *
033: */
034:
035: package com.db.server;
036:
037: import java.io.Serializable;
038: import com.db.net.*;
039:
040: /**
041: */
042:
043: //In a big community, lords will probably be notified about many vassals actions (requests from their vassals to access land...). This should rapidly create an
044: //unwanted network overload as well as a lot of unwanted junk data. A filter mechanism is proposed in which users can decide not to be notified when a
045: //vassal makes a request (the notification message is not send from the server). The filter is a list of pairs key-key value.
046: //The key mentions the Object concerned and the kind of request:
047: // Request field read - field write (of an object, tool, guide, avatar, land, World Spot)
048: // Request action execution (of an object, tool, guide, avatar, land, World Spot), the action may involve creation, modification or deletion of an object,
049: // tool, guide, avatar, land.
050: //The key-value is given with 6 booleans to grant notification about users' actions for the owner himself, lords, invited lords, peers, peers vassals and vassals.
051: //Using the notification filter, users can choose not to see or hear or collide from objects, tools, guides, avatars, owners (corresponding fields in the avatar).
052: //Users that make no filtering will have a log of every actions about themselves, lords, invited lords, peers, peers vassals and vassals. Since lords can also
053: //decide to refuse to be queried, this log can be incomplete. The only complete log is the one of the top lord if he requests no filtering.
054: //
055: //the notification filter mentions positive notification
056: //users are notified of nothing (except answers to their requests) if they do not request anything
057: //if a user want to be notified of a lord visiting one of its lands then he has to add en entry in the notification filter
058: //as of this version, we do not use filters where object is an instance of Avatar
059: //ie: you can't track avatar creation, deletion, read or write
060: public class Filter extends Object implements Serializable {
061:
062: //Read access on the Object
063: public final static int READ_ACCESS = 1;
064: //Write (and read) access on the Object
065: public final static int READ_WRITE_ACCESS = 2;
066: //Addition of an Object (in the library if it is a class or in the world if it is an object)
067: public final static int ADDITION = 3;
068: //Deletion of an Object (from the library if it is a class or from the world if it is an object)
069: public final static int DELETION = 4;
070:
071: private Avatar requester;
072: //object is one of VirtualElement, Avatar
073: private Object object;
074: private int accessKind;
075:
076: //builds up a new filter for the user (requester) to be notified of actions (accessKind) on the object (VirtualElement, Avatar) from a specific kind of user (Avatar.LORD, Avatar.PEERSLORD, Avatar.PEER, Avatar.PEERSVASSAL, Avatar.VASSAL and Avatar.SELF)
077: //client log of the user then receives and appends every request provided the user has the rights himself to access the object
078: //Filter does NOT notify about filter access writes (as this would lead to infinite access)
079: //Filter therefore defines log you want to read, not the opposite which would lead to really big traffic
080:
081: //Filters should be the last priority on the server for all users but the ruler
082: //If performance is really to low, server should stop to send notifications to the clients (except ruler) to do some more interesting job
083:
084: //Ruler may wish to build or not filters so that he has a log of some or all actions
085: public Filter(Avatar requester, Object object, int accessKind) {
086:
087: if ((object instanceof VirtualElement)
088: || (object instanceof Avatar)
089: || (object instanceof Class)) {
090: if ((accessKind >= Filter.READ_ACCESS)
091: && (accessKind <= Filter.DELETION)) {
092: this .requester = requester;
093: this .object = object;
094: this .accessKind = accessKind;
095: } else {
096: throw new IllegalArgumentException(
097: "filtering access kind must be one of Filter.READ_ACCESS, Filter.READ_WRITE_ACCESS, Filter.ADDITION or Filter.DELETION.");
098: }
099: } else {
100: throw new IllegalArgumentException(
101: "object filtered must be an instance of VirtualElement, Avatar or Class.");
102: }
103:
104: }
105:
106: public Avatar getRequester() {
107:
108: return this .requester;
109:
110: }
111:
112: public Object getObject() {
113:
114: return this .requester;
115:
116: }
117:
118: public int getAccessKind() {
119:
120: return this.accessKind;
121:
122: }
123:
124: }
|