Moved the typed object registry into the same package with the rest of
the typed object stuff; made events typed so they can be transported; further wiring up of event dispatch over the network. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@34 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: Client.java,v 1.5 2001/06/09 23:39:03 mdb Exp $
|
// $Id: Client.java,v 1.6 2001/06/11 17:44:03 mdb Exp $
|
||||||
|
|
||||||
package com.threerings.cocktail.cher.client;
|
package com.threerings.cocktail.cher.client;
|
||||||
|
|
||||||
@@ -9,7 +9,6 @@ import java.util.List;
|
|||||||
import com.threerings.cocktail.cher.Log;
|
import com.threerings.cocktail.cher.Log;
|
||||||
import com.threerings.cocktail.cher.dobj.DObjectManager;
|
import com.threerings.cocktail.cher.dobj.DObjectManager;
|
||||||
import com.threerings.cocktail.cher.net.Credentials;
|
import com.threerings.cocktail.cher.net.Credentials;
|
||||||
import com.threerings.cocktail.cher.net.Registry;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Through the client object, a connection to the system is established
|
* Through the client object, a connection to the system is established
|
||||||
@@ -243,9 +242,4 @@ public class Client
|
|||||||
static final int CLIENT_CONNECTION_FAILED = 2;
|
static final int CLIENT_CONNECTION_FAILED = 2;
|
||||||
static final int CLIENT_WILL_LOGOFF = 3;
|
static final int CLIENT_WILL_LOGOFF = 3;
|
||||||
static final int CLIENT_DID_LOGOFF = 4;
|
static final int CLIENT_DID_LOGOFF = 4;
|
||||||
|
|
||||||
// register our shared objects
|
|
||||||
static {
|
|
||||||
Registry.registerTypedObjects();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: ClientDObjectMgr.java,v 1.1 2001/06/09 23:39:03 mdb Exp $
|
// $Id: ClientDObjectMgr.java,v 1.2 2001/06/11 17:44:04 mdb Exp $
|
||||||
|
|
||||||
package com.threerings.cocktail.cher.client;
|
package com.threerings.cocktail.cher.client;
|
||||||
|
|
||||||
@@ -69,8 +69,13 @@ public class ClientDObjectMgr
|
|||||||
// inherit documentation from the interface
|
// inherit documentation from the interface
|
||||||
public void postEvent (DEvent event)
|
public void postEvent (DEvent event)
|
||||||
{
|
{
|
||||||
|
// we can cast the event to a typed event because only typed
|
||||||
|
// events will be kicking around on the client; bare DEvent
|
||||||
|
// instances are only used for internal messages on the server
|
||||||
|
TypedEvent tevent = (TypedEvent)event;
|
||||||
|
|
||||||
// send a forward event request to the server
|
// send a forward event request to the server
|
||||||
_comm.postMessage(new ForwardEventRequest(event));
|
_comm.postMessage(new ForwardEventRequest(tevent));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
//
|
//
|
||||||
// $Id: AttributeChangedEvent.java,v 1.3 2001/06/01 20:35:39 mdb Exp $
|
// $Id: AttributeChangedEvent.java,v 1.4 2001/06/11 17:44:04 mdb Exp $
|
||||||
|
|
||||||
package com.threerings.cocktail.cher.dobj;
|
package com.threerings.cocktail.cher.dobj;
|
||||||
|
|
||||||
|
import java.io.DataInputStream;
|
||||||
|
import java.io.DataOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
import com.threerings.cocktail.cher.Log;
|
import com.threerings.cocktail.cher.Log;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -13,8 +17,11 @@ import com.threerings.cocktail.cher.Log;
|
|||||||
*
|
*
|
||||||
* @see DObjectManager.postEvent
|
* @see DObjectManager.postEvent
|
||||||
*/
|
*/
|
||||||
public class AttributeChangedEvent extends DEvent
|
public class AttributeChangedEvent extends TypedEvent
|
||||||
{
|
{
|
||||||
|
/** The typed object code for this event. */
|
||||||
|
public static final short TYPE = TYPE_BASE + 1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a new attribute changed event on the specified target
|
* Constructs a new attribute changed event on the specified target
|
||||||
* object with the supplied attribute name and value.
|
* object with the supplied attribute name and value.
|
||||||
@@ -106,6 +113,27 @@ public class AttributeChangedEvent extends DEvent
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public short getType ()
|
||||||
|
{
|
||||||
|
return TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void writeTo (DataOutputStream out)
|
||||||
|
throws IOException
|
||||||
|
{
|
||||||
|
super.writeTo(out);
|
||||||
|
out.writeUTF(_name);
|
||||||
|
// out.write...(_value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void readFrom (DataInputStream in)
|
||||||
|
throws IOException
|
||||||
|
{
|
||||||
|
super.readFrom(in);
|
||||||
|
_name = in.readUTF();
|
||||||
|
// _value = in.read...
|
||||||
|
}
|
||||||
|
|
||||||
public String toString ()
|
public String toString ()
|
||||||
{
|
{
|
||||||
return "[CHANGE:targetOid=" + _toid + ", name=" + _name +
|
return "[CHANGE:targetOid=" + _toid + ", name=" + _name +
|
||||||
|
|||||||
@@ -1,8 +1,12 @@
|
|||||||
//
|
//
|
||||||
// $Id: AttributesChangedEvent.java,v 1.2 2001/06/02 01:30:37 mdb Exp $
|
// $Id: AttributesChangedEvent.java,v 1.3 2001/06/11 17:44:04 mdb Exp $
|
||||||
|
|
||||||
package com.threerings.cocktail.cher.dobj;
|
package com.threerings.cocktail.cher.dobj;
|
||||||
|
|
||||||
|
import java.io.DataInputStream;
|
||||||
|
import java.io.DataOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An attribute<em>s</em> changed event is dispatched when multiple
|
* An attribute<em>s</em> changed event is dispatched when multiple
|
||||||
* attributes of a distributed object have been changed in a single
|
* attributes of a distributed object have been changed in a single
|
||||||
@@ -10,8 +14,11 @@ package com.threerings.cocktail.cher.dobj;
|
|||||||
*
|
*
|
||||||
* @see DObjectManager.postEvent
|
* @see DObjectManager.postEvent
|
||||||
*/
|
*/
|
||||||
public class AttributesChangedEvent extends DEvent
|
public class AttributesChangedEvent extends TypedEvent
|
||||||
{
|
{
|
||||||
|
/** The typed object code for this event. */
|
||||||
|
public static final short TYPE = TYPE_BASE + 2;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a new attribute changed event on the specified target
|
* Constructs a new attribute changed event on the specified target
|
||||||
* object with the supplied attribute name and value.
|
* object with the supplied attribute name and value.
|
||||||
@@ -152,6 +159,35 @@ public class AttributesChangedEvent extends DEvent
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public short getType ()
|
||||||
|
{
|
||||||
|
return TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void writeTo (DataOutputStream out)
|
||||||
|
throws IOException
|
||||||
|
{
|
||||||
|
super.writeTo(out);
|
||||||
|
out.writeInt(_count);
|
||||||
|
for (int i = 0; i < _count; i++) {
|
||||||
|
out.writeUTF(_names[i]);
|
||||||
|
// out.write...(_values[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void readFrom (DataInputStream in)
|
||||||
|
throws IOException
|
||||||
|
{
|
||||||
|
super.readFrom(in);
|
||||||
|
_count = in.readInt();
|
||||||
|
_names = new String[_count];
|
||||||
|
_values = new Object[_count];
|
||||||
|
for (int i = 0; i < _count; i++) {
|
||||||
|
_names[i] = in.readUTF();
|
||||||
|
// _values[i] = ...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected int _count;
|
protected int _count;
|
||||||
protected String[] _names;
|
protected String[] _names;
|
||||||
protected Object[] _values;
|
protected Object[] _values;
|
||||||
|
|||||||
@@ -0,0 +1,65 @@
|
|||||||
|
//
|
||||||
|
// $Id: TypedEvent.java,v 1.1 2001/06/11 17:44:04 mdb Exp $
|
||||||
|
|
||||||
|
package com.threerings.cocktail.cher.dobj;
|
||||||
|
|
||||||
|
import java.io.DataInputStream;
|
||||||
|
import java.io.DataOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import com.threerings.cocktail.cher.io.TypedObject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A typed event is one that can be transmitted over the network. All
|
||||||
|
* event classes that will be shared between the client and server should
|
||||||
|
* derive from this class and be registered with the typed object factory
|
||||||
|
* so that they can be serialized and unserialized.
|
||||||
|
*/
|
||||||
|
public abstract class TypedEvent extends DEvent implements TypedObject
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* All event derived classes should base their typed object code on
|
||||||
|
* this base value.
|
||||||
|
*/
|
||||||
|
public static final short TYPE_BASE = 400;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a typed event, passing the target object id on to the
|
||||||
|
* <code>DEvent</code> constructor.
|
||||||
|
*/
|
||||||
|
public TypedEvent (int targetOid)
|
||||||
|
{
|
||||||
|
super(targetOid);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a blank typed event instance that will be unserialized
|
||||||
|
* from the network.
|
||||||
|
*/
|
||||||
|
public TypedEvent ()
|
||||||
|
{
|
||||||
|
super(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Derived classes should override this function to write their fields
|
||||||
|
* out to the supplied data output stream. They <em>must</em> be sure
|
||||||
|
* to first call <code>super.writeTo()</code>.
|
||||||
|
*/
|
||||||
|
public void writeTo (DataOutputStream out)
|
||||||
|
throws IOException
|
||||||
|
{
|
||||||
|
out.writeInt(_toid);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Derived classes should override this function to read their fields
|
||||||
|
* from the supplied data input stream. They <em>must</em> be sure to
|
||||||
|
* first call <code>super.readFrom()</code>.
|
||||||
|
*/
|
||||||
|
public void readFrom (DataInputStream in)
|
||||||
|
throws IOException
|
||||||
|
{
|
||||||
|
_toid = in.readInt();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: TypedObjectFactory.java,v 1.4 2001/05/30 23:58:31 mdb Exp $
|
// $Id: TypedObjectFactory.java,v 1.5 2001/06/11 17:44:04 mdb Exp $
|
||||||
|
|
||||||
package com.threerings.cocktail.cher.io;
|
package com.threerings.cocktail.cher.io;
|
||||||
|
|
||||||
@@ -92,4 +92,9 @@ public class TypedObjectFactory
|
|||||||
|
|
||||||
/** Our type to class mapping table. */
|
/** Our type to class mapping table. */
|
||||||
protected static HashMap _classes = new HashMap();
|
protected static HashMap _classes = new HashMap();
|
||||||
|
|
||||||
|
// register our typed object
|
||||||
|
static {
|
||||||
|
TypedObjectRegistry.registerTypedObjects();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-6
@@ -1,18 +1,17 @@
|
|||||||
//
|
//
|
||||||
// $Id: Registry.java,v 1.5 2001/06/09 23:39:04 mdb Exp $
|
// $Id: TypedObjectRegistry.java,v 1.1 2001/06/11 17:44:04 mdb Exp $
|
||||||
|
|
||||||
package com.threerings.cocktail.cher.net;
|
package com.threerings.cocktail.cher.io;
|
||||||
|
|
||||||
import com.threerings.cocktail.cher.dobj.DObject;
|
import com.threerings.cocktail.cher.dobj.*;
|
||||||
import com.threerings.cocktail.cher.io.TypedObject;
|
import com.threerings.cocktail.cher.net.*;
|
||||||
import com.threerings.cocktail.cher.io.TypedObjectFactory;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The registry provides a single place where all typed objects that are
|
* The registry provides a single place where all typed objects that are
|
||||||
* exchanged between the client and the server can be registered with the
|
* exchanged between the client and the server can be registered with the
|
||||||
* typed object factory.
|
* typed object factory.
|
||||||
*/
|
*/
|
||||||
public class Registry
|
public class TypedObjectRegistry
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Must be called once by the client and the server to ensure that all
|
* Must be called once by the client and the server to ensure that all
|
||||||
@@ -50,5 +49,10 @@ public class Registry
|
|||||||
TypedObjectFactory.registerClass(UsernamePasswordCreds.TYPE,
|
TypedObjectFactory.registerClass(UsernamePasswordCreds.TYPE,
|
||||||
UsernamePasswordCreds.class);
|
UsernamePasswordCreds.class);
|
||||||
|
|
||||||
|
// register our event classes
|
||||||
|
TypedObjectFactory.registerClass(AttributeChangedEvent.TYPE,
|
||||||
|
AttributeChangedEvent.class);
|
||||||
|
TypedObjectFactory.registerClass(AttributesChangedEvent.TYPE,
|
||||||
|
AttributesChangedEvent.class);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: EventNotification.java,v 1.6 2001/06/09 23:39:04 mdb Exp $
|
// $Id: EventNotification.java,v 1.7 2001/06/11 17:44:04 mdb Exp $
|
||||||
|
|
||||||
package com.threerings.cocktail.cher.net;
|
package com.threerings.cocktail.cher.net;
|
||||||
|
|
||||||
@@ -7,7 +7,8 @@ import java.io.IOException;
|
|||||||
import java.io.DataInputStream;
|
import java.io.DataInputStream;
|
||||||
import java.io.DataOutputStream;
|
import java.io.DataOutputStream;
|
||||||
|
|
||||||
import com.threerings.cocktail.cher.dobj.DEvent;
|
import com.threerings.cocktail.cher.dobj.TypedEvent;
|
||||||
|
import com.threerings.cocktail.cher.io.TypedObjectFactory;
|
||||||
|
|
||||||
public class EventNotification extends DownstreamMessage
|
public class EventNotification extends DownstreamMessage
|
||||||
{
|
{
|
||||||
@@ -25,7 +26,7 @@ public class EventNotification extends DownstreamMessage
|
|||||||
/**
|
/**
|
||||||
* Constructs an event notification for the supplied event.
|
* Constructs an event notification for the supplied event.
|
||||||
*/
|
*/
|
||||||
public EventNotification (DEvent event)
|
public EventNotification (TypedEvent event)
|
||||||
{
|
{
|
||||||
_event = event;
|
_event = event;
|
||||||
}
|
}
|
||||||
@@ -35,7 +36,7 @@ public class EventNotification extends DownstreamMessage
|
|||||||
return TYPE;
|
return TYPE;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DEvent getEvent ()
|
public TypedEvent getEvent ()
|
||||||
{
|
{
|
||||||
return _event;
|
return _event;
|
||||||
}
|
}
|
||||||
@@ -44,16 +45,18 @@ public class EventNotification extends DownstreamMessage
|
|||||||
throws IOException
|
throws IOException
|
||||||
{
|
{
|
||||||
super.writeTo(out);
|
super.writeTo(out);
|
||||||
// _event.writeTo(out);
|
// write the event out to the stream
|
||||||
|
TypedObjectFactory.writeTo(out, _event);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void readFrom (DataInputStream in)
|
public void readFrom (DataInputStream in)
|
||||||
throws IOException
|
throws IOException
|
||||||
{
|
{
|
||||||
super.readFrom(in);
|
super.readFrom(in);
|
||||||
// _event = EventFactory.readFrom(in);
|
// read the event in from the stream
|
||||||
|
_event = (TypedEvent)TypedObjectFactory.readFrom(in);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** The event which we are forwarding. */
|
/** The event which we are forwarding. */
|
||||||
protected DEvent _event;
|
protected TypedEvent _event;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: ForwardEventRequest.java,v 1.6 2001/06/05 22:44:31 mdb Exp $
|
// $Id: ForwardEventRequest.java,v 1.7 2001/06/11 17:44:04 mdb Exp $
|
||||||
|
|
||||||
package com.threerings.cocktail.cher.net;
|
package com.threerings.cocktail.cher.net;
|
||||||
|
|
||||||
@@ -7,7 +7,8 @@ import java.io.IOException;
|
|||||||
import java.io.DataInputStream;
|
import java.io.DataInputStream;
|
||||||
import java.io.DataOutputStream;
|
import java.io.DataOutputStream;
|
||||||
|
|
||||||
import com.threerings.cocktail.cher.dobj.DEvent;
|
import com.threerings.cocktail.cher.dobj.TypedEvent;
|
||||||
|
import com.threerings.cocktail.cher.io.TypedObjectFactory;
|
||||||
|
|
||||||
public class ForwardEventRequest extends UpstreamMessage
|
public class ForwardEventRequest extends UpstreamMessage
|
||||||
{
|
{
|
||||||
@@ -25,7 +26,7 @@ public class ForwardEventRequest extends UpstreamMessage
|
|||||||
/**
|
/**
|
||||||
* Constructs a forward event request for the supplied event.
|
* Constructs a forward event request for the supplied event.
|
||||||
*/
|
*/
|
||||||
public ForwardEventRequest (DEvent event)
|
public ForwardEventRequest (TypedEvent event)
|
||||||
{
|
{
|
||||||
_event = event;
|
_event = event;
|
||||||
}
|
}
|
||||||
@@ -38,7 +39,7 @@ public class ForwardEventRequest extends UpstreamMessage
|
|||||||
/**
|
/**
|
||||||
* Returns the event that we wish to have forwarded.
|
* Returns the event that we wish to have forwarded.
|
||||||
*/
|
*/
|
||||||
public DEvent getEvent ()
|
public TypedEvent getEvent ()
|
||||||
{
|
{
|
||||||
return _event;
|
return _event;
|
||||||
}
|
}
|
||||||
@@ -47,16 +48,18 @@ public class ForwardEventRequest extends UpstreamMessage
|
|||||||
throws IOException
|
throws IOException
|
||||||
{
|
{
|
||||||
super.writeTo(out);
|
super.writeTo(out);
|
||||||
// _event.writeTo(out);
|
// write the event out to the stream
|
||||||
|
TypedObjectFactory.writeTo(out, _event);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void readFrom (DataInputStream in)
|
public void readFrom (DataInputStream in)
|
||||||
throws IOException
|
throws IOException
|
||||||
{
|
{
|
||||||
super.readFrom(in);
|
super.readFrom(in);
|
||||||
// _event = EventFactory.readFrom(in);
|
// read the event in from the stream
|
||||||
|
_event = (TypedEvent)TypedObjectFactory.readFrom(in);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** The event which we are forwarding. */
|
/** The event which we are forwarding. */
|
||||||
protected DEvent _event;
|
protected TypedEvent _event;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: PresentsClient.java,v 1.3 2001/06/09 23:39:04 mdb Exp $
|
// $Id: PresentsClient.java,v 1.4 2001/06/11 17:44:04 mdb Exp $
|
||||||
|
|
||||||
package com.threerings.cocktail.cher.server;
|
package com.threerings.cocktail.cher.server;
|
||||||
|
|
||||||
@@ -155,7 +155,10 @@ public class Client implements Subscriber, MessageHandler
|
|||||||
// forward the event to the client
|
// forward the event to the client
|
||||||
Connection conn = getConnection();
|
Connection conn = getConnection();
|
||||||
if (conn != null) {
|
if (conn != null) {
|
||||||
conn.postMessage(new EventNotification(event));
|
// only typed events will be forwarded to the client, so we
|
||||||
|
// need not worry that a non-typed event would make it here
|
||||||
|
TypedEvent tevent = (TypedEvent)event;
|
||||||
|
conn.postMessage(new EventNotification(tevent));
|
||||||
} else {
|
} else {
|
||||||
Log.info("Dropped event forward notification " +
|
Log.info("Dropped event forward notification " +
|
||||||
"[client=" + this + ", event=" + event + "].");
|
"[client=" + this + ", event=" + event + "].");
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: ConnectionManager.java,v 1.4 2001/06/02 01:30:37 mdb Exp $
|
// $Id: ConnectionManager.java,v 1.5 2001/06/11 17:44:04 mdb Exp $
|
||||||
|
|
||||||
package com.threerings.cocktail.cher.server.net;
|
package com.threerings.cocktail.cher.server.net;
|
||||||
|
|
||||||
@@ -17,7 +17,6 @@ import com.threerings.cocktail.cher.io.FramingOutputStream;
|
|||||||
import com.threerings.cocktail.cher.io.TypedObjectFactory;
|
import com.threerings.cocktail.cher.io.TypedObjectFactory;
|
||||||
import com.threerings.cocktail.cher.net.Credentials;
|
import com.threerings.cocktail.cher.net.Credentials;
|
||||||
import com.threerings.cocktail.cher.net.DownstreamMessage;
|
import com.threerings.cocktail.cher.net.DownstreamMessage;
|
||||||
import com.threerings.cocktail.cher.net.Registry;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The connection manager manages the socket on which connections are
|
* The connection manager manages the socket on which connections are
|
||||||
@@ -322,9 +321,4 @@ public class ConnectionManager extends LoopingThread
|
|||||||
protected static final int CONNECTION_ESTABLISHED = 0;
|
protected static final int CONNECTION_ESTABLISHED = 0;
|
||||||
protected static final int CONNECTION_FAILED = 1;
|
protected static final int CONNECTION_FAILED = 1;
|
||||||
protected static final int CONNECTION_CLOSED = 2;
|
protected static final int CONNECTION_CLOSED = 2;
|
||||||
|
|
||||||
// register our shared objects
|
|
||||||
static {
|
|
||||||
Registry.registerTypedObjects();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user