The problem I have here is related to static variables. I want to create a global class which can hold global data which can be shared between Zone extension and the Room extensions in that zone.
Following below are the files:
Class: Test_Zone_Ext_1
Code: Select all
public class Test_Zone_Ext_1 extends AbstractExtension
{
public void init()
{
trace("Hello from Test_Zone_Ext_1");
}
public void destroy()
{
trace("Bye bye! Test_Zone_Ext_1 is shutting down!");
}
public void handleRequest(String arg0, ActionscriptObject arg1, User arg2, int arg3)
{
// TODO Auto-generated method stub
}
public void handleRequest(String arg0, String[] arg1, User arg2, int arg3)
{
// TODO Auto-generated method stub
}
public void handleInternalEvent(InternalEventObject ieo)
{
String evtName = ieo.getEventName();
if(evtName.equals("serverReady"))
{
init2();
}
}
private void init2()
{
try
{
_helper = ExtensionHelper.instance();
_zone = _helper.getZone(this.getOwnerZone());
readConfig("javaExtensions/TestZoneData.xml");
initRooms();
trace("Created Rooms");
trace("Zone Count1: "+Globals.getCount());
trace("Zone Count2: "+Globals.getCount());
}
catch(Exception ex)
{
trace("[ERROR] Test_Zone_Ext_1::Init2: "+ex.getMessage()+", Stack: "+ex.getStackTrace());
}
}
private void initRooms()
{
try
{
for(int i = 0; i < _roomsData.size(); ++i)
{
HashMap<String, String> params = _roomsData.get(i);
Room room = _helper.createRoom(_zone, params, null, null, null, false, true, false);
trace("Room Created: Id: "+room.getId()+", Name: "+room.getName()+", Ext Name: "+params.get("xtName"));
}
}
catch(Exception ex)
{
trace("[ERROR] creating rooms: "+ex.getMessage());
}
}
private void readConfig(String path)
{
try
{
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document doc = docBuilder.parse (new File(path));
doc.getDocumentElement ().normalize ();
//
_roomsData = new ArrayList<HashMap<String, String>>();
//
Element roomsNode = (Element) doc.getElementsByTagName("Rooms").item(0);
NodeList rooms = roomsNode.getElementsByTagName("Room");
trace("Total Rooms: "+rooms.getLength());
for(int i = 0; i < rooms.getLength(); ++i)
{
Element room = (Element) rooms.item(i);
HashMap<String, String> roomParams = new HashMap<String, String>();
roomParams.put("name", room.getAttribute("name"));
roomParams.put("pwd", room.getAttribute("pwd"));
roomParams.put("maxU", room.getAttribute("maxU"));
roomParams.put("maxS", room.getAttribute("maxS"));
roomParams.put("isGame", room.getAttribute("isGame"));
roomParams.put("isLimbo", room.getAttribute("isLimbo"));
roomParams.put("uCount", room.getAttribute("uCount"));
roomParams.put("xtName", room.getAttribute("xtName"));
roomParams.put("xtClass", room.getAttribute("xtClass"));
_roomsData.add(roomParams);
}
}
catch(SAXParseException ex1)
{
trace("[ERROR] Parsing error" + ", line " + ex1.getLineNumber () + ", uri " + ex1.getSystemId () + "MSG: "+ex1.getMessage());
}
catch(SAXException ex2)
{
Exception x = ex2.getException ();
((x == null) ? ex2 : x).printStackTrace ();
}
catch(ParserConfigurationException ex3)
{
trace("[ERROR] ParserConfigurationException: "+ex3.getMessage()+", Stack: "+ex3.getStackTrace());
}
catch(Throwable ex4)
{
trace("[ERROR] Exception: "+ex4.getMessage()+", Stack: "+ex4.getStackTrace());
}
}
//
private Zone _zone;
private ExtensionHelper _helper;
private ArrayList<HashMap<String, String>> _roomsData;
}
Class: Test_Room_Ext_1
Code: Select all
public class Test_Room_Ext_1 extends AbstractExtension
{
public void init()
{
trace("Hello from Test_Room_Ext_1");
trace("Room Count1: "+Globals.getCount());
trace("Room Count2: "+Globals.getCount());
}
public void destroy()
{
trace("Bye bye! Test_Room_Ext_1 is shutting down!");
}
public void handleRequest(String arg0, ActionscriptObject arg1, User arg2, int arg3)
{
// TODO Auto-generated method stub
}
public void handleRequest(String arg0, String[] arg1, User arg2, int arg3)
{
// TODO Auto-generated method stub
}
public void handleInternalEvent(InternalEventObject ieo)
{
// TODO Auto-generated method stub
}
}
Class: Globals
Code: Select all
public class Globals
{
public Globals()
{
super();
}
public static int getCount()
{
return _var1++;
}
//
private static int _var1 = 0;
}
File: TestZoneData.xml
Code: Select all
<Test_Zone debug="true">
<Rooms>
<Room name="Test_Room_1" pwd="" maxU="500" maxS="100" isGame="true" isLimbo="false" uCount="false" xtName="TRExt1" xtClass="Test_Room_Ext_1">
</Room>
<Room name="Test_Room_2" pwd="" maxU="500" maxS="100" isGame="true" isLimbo="false" uCount="false" xtName="TRExt2" xtClass="Test_Room_Ext_1">
</Room>
<Room name="Test_Room_3" pwd="" maxU="500" maxS="100" isGame="true" isLimbo="false" uCount="false" xtName="TRExt3" xtClass="Test_Room_Ext_1">
</Room>
</Rooms>
</Test_Zone>
Console Output:
Code: Select all
[ Test_Zone_Ext_1 ]: Total Rooms: 3
15:10:12.977 - [ INFO ] > Room Extension [ TRExt1 ] created!
[ Test_Room_Ext_1 ]: Hello from Test_Room_Ext_1
[ Test_Room_Ext_1 ]: Room Count1: 0
[ Test_Room_Ext_1 ]: Room Count2: 1
[ Test_Zone_Ext_1 ]: Room Created: Id: 2, Name: Test_Room_1, Ext Name: TRExt1
15:10:12.987 - [ INFO ] > Room Extension [ TRExt2 ] created!
[ Test_Room_Ext_1 ]: Hello from Test_Room_Ext_1
[ Test_Room_Ext_1 ]: Room Count1: 0
[ Test_Room_Ext_1 ]: Room Count2: 1
[ Test_Zone_Ext_1 ]: Room Created: Id: 3, Name: Test_Room_2, Ext Name: TRExt2
15:10:12.993 - [ INFO ] > Room Extension [ TRExt3 ] created!
[ Test_Room_Ext_1 ]: Hello from Test_Room_Ext_1
[ Test_Room_Ext_1 ]: Room Count1: 0
[ Test_Room_Ext_1 ]: Room Count2: 1
[ Test_Zone_Ext_1 ]: Room Created: Id: 4, Name: Test_Room_3, Ext Name: TRExt3
[ Test_Zone_Ext_1 ]: Created Rooms
[ Test_Zone_Ext_1 ]: Zone Count1: 0
[ Test_Zone_Ext_1 ]: Zone Count2: 1
From the output we can clearly see that the static variable "_var1" of class Globals has been created 4 times: once for zone extension and thrice for the room extensions. So it is impossible to share data between Room extensions and Zone extensions using this method.
I don't know what is causing the SFS or JRE to create separate static variables for different extensions. Is there a way we can instruct SFS or JRE to create only one static variable and not so many?