Hurray! – have now finished (*I think*) creating all the services that we need using the ES SDK, and it all seems to be working fine, I’ve updated my standalone application so it now runs by connecting to the EnterpriseClient (which in turn connects to EnterpriseServer, then on to my sample database). I’ve tried to put all the changes back up on SF but it appears to be down at the moment (or at least I can’t connect).
There are still the methods that I couldn’t figure out how to achieve in IMS ES which still bypass the SDK, but I don’t think there’s going to be much I can do about that. So now I can get on and start sorting out how the LAMS-Moodle module needs to be updated to use these services and the Moodle API.
Problems with the membership service now solved!! – I think 😉
Scott asked to me check the DataBridgeImpl class, and there was the problem, the newManagementService() method was returning null rather than a new MembershipManagementImpl(). So hope to be able to get on and implement the membership services properly rather than the horrible hack I had before.
Unfortunately, I think we’ll still need to add a couple of our own service methods which aren’t part of the IMS ES spec. For example, in the standalone interface, this has no database behind it, so in order to display anything, it needs a starting point. So we need a method called something like readAllTopLevelGroups – (with no parameters, and returns all the groups with no parent), whereas all the IMS ES service method require a starting identifier.
Thought of a really bad hack around the problems I’m having with the Membership service, and that is that I _could_ just connect the EnterpriseClient module up directly to the database (using the code I have from the JoinInDB service), but this would really be a last resort just to get something working. So if I don’t get anywhere early next week with the Membership service I’ll get this set up, at least then I’ll have something to demonstrate – but would be a far from ideal solution, as it negates the point of using the SDK!
Have now got some the the Enterprise SDK working correctly, still working on getting the membership service working, but at least I’m making progress – see the full details on my JoinIn blog
Have just switched my axis version over to 1.3 in the hope that this would solve the problem with the Membership service, but that unfortunately hasn’t fixed the problem – I still get the same error message, so going back to Axis 1.1. I’ve added some more debug code (in the EnterpriseServer module) to try and track the problem, but the constructor method for the MembershipManagementImpl isn’t getting called, so I think there is something up with the actual service, rather than the code I’m using 🙁
Made a fair bit more progress today, I’ve now got the readGroup and createGroup methods (doesn’t sound like very much though!!) – so all pleased about that, should get more straightforward to get the other methods that we need implemented.
All I need to figure out now is how to get at the raw XML that gets returned to the client, as I need this to return in the simplified service that Moodle will be connecting to.
Hurray!! – have now got the Enterprise Client connecting up correctly to an Enterprise server and returning group data from the database. This is thanks to Carol sending me the code that she’d got working. I still need to go through and check to see what was wrong with the code I was using.
Very pleased to have got this working now, though it’s only for the readGroup method, but hope it won’t be too difficult to extend this to the other methods.
Am still attempting to get the SDK working, though still not having any luck, so getting quite frustrated with it all! When the my client code calls the service it just returns an error saying there is a communications link failure – but the service and correct method is actually called (I can see from some of the debugging output that it’s getting to the right method), though the id is not being passed over.
If I try to call up the service in the browser (ie by looking at: http://localhost:8080/EnterpriseServer/services/GroupManagementServiceSyncSoap?method=readGroup) I just get the follwoing error returned:
Tried to invoke method public void uk.ac.cetis.enterprise.group.http.GroupManagementServiceSyncSoapSkeleton.readGroup(uk.ac.cetis.enterprise.group.messages._readGroupRequest,uk.ac.cetis.enterprise.iaf.messages._syncRequestHeaderInfo,uk.ac.cetis.enterprise.group.messages.holders._readGroupResponseHolder,uk.ac.cetis.enterprise.iaf.messages.holders._syncResponseHeaderInfoHolder) throws java.rmi.RemoteException with arguments uk.ac.cetis.enterprise.group.messages._readGroupRequest,uk.ac.cetis.enterprise.group.messages.holders._readGroupResponseHolder,uk.ac.cetis.enterprise.iaf.messages.holders._syncResponseHeaderInfoHolder,null. The arguments do not match the signature.; nested exception is:
java.lang.IllegalArgumentException: argument type mismatch
I’m not sure why this is! I’ve been sent an example application which uses Axis 1.3, but I’ve not been able to run this as I need to get the database set up first. I’m also a bit wary of spending a lot of time trying to get something else running, and my feeling is that if I can’t get this running this week, then we’ll just have to stick with the sample database application I wrote a few weeks ago, as we know this works and we’ve got plenty more to be getting on with on the project other than Enterprise 🙁
Made some more progress today with using the Enterprise SDK as I’ve now solved the problem i was having with running Axis 1.1 on Tomcat 5.5. It turned out that in one of my web.xml files it was referring to a listener-class (org.apache.axis.transport.http.AxisHTTPSessionListener) which wasn’t found in axis 1.1 – hence the problem when tomcat tried to start up!! So all my own fault really!
I’ve now got the beginnings of my EnterpriseClient, but I’ve just got to now figure out how in the client I can get ‘hold’ of the whole xml string that has been returned from the EnterpriseServer, rather than just the component parts. Looking at the Plex example, using _responseHolder.value.getGroup() this returns a GroupDType object, which you can then extract parts from (eg getDataSource()), but I can’t see any way to just give the whole xml string that was returned by the EnterpriseServer in the first place. Will keep trying….!
Had good couple of days up in Bolton with Scott and at the ELF developers forum. We spent one day going through how to get the Enterprise SDK running, and although it’s not yet completely working I do feel i understand a lot more about it, and we’ve got some sample code which interacts with a database now.
The reason we couldn’t get it actually running was a problem between the different versions of Axis. The cetis-ws-client was built using Axis 1.1, and I’ve been using Axis 1.2, differences in the ‘constants’ package stop them being compatible with each other. So I thought I would try to switch to v1.1, but it I try to run with this I get errors when trying to start up tomcat (5.5), not sure why this is. So the plan is to update the client code so it can use Axis 1.2 instead – hopefully it’s not too much to change 😉
There are some other things for us to decide on too, mainly what to do about getting Moodle connected up to the Enterprise service and we’ve got a couple of options…
1) Build a PHP client for the Enterprise Service. With this option we’re really not sure how big a job this would be, it could be anything from couple of weeks to couple of months or more.
2) Build a client module which then provides a simpler interface for Moodle to connect to. This could be a ‘proper’ web service, or a rest type service.
My feeling is that we go for creating a rest client module for Moodle to connect to , as this ought to be the simplest to create. We need something simple and easy to do, as doing all this Enterprise stuff isn’t meant to be the focus of our project, and we’re in danger of spending all our time getting Enterprise Services working, rather than doing the grouping service!!