Index: sakai-lamstwo/impl/logic/src/java/org/lamsfoundation/lams/integrations/sakai/logic/impl/LamstwoConstants.java =================================================================== diff -u -rc144f53e688b530044b19ff807e502a41d33039a -r975e90051619a8ee83c8e25952061c644af8cc94 --- sakai-lamstwo/impl/logic/src/java/org/lamsfoundation/lams/integrations/sakai/logic/impl/LamstwoConstants.java (.../LamstwoConstants.java) (revision c144f53e688b530044b19ff807e502a41d33039a) +++ sakai-lamstwo/impl/logic/src/java/org/lamsfoundation/lams/integrations/sakai/logic/impl/LamstwoConstants.java (.../LamstwoConstants.java) (revision 975e90051619a8ee83c8e25952061c644af8cc94) @@ -12,10 +12,17 @@ package org.lamsfoundation.lams.integrations.sakai.logic.impl; public class LamstwoConstants { - + + // Conf file constants public static final String CONF_SERVER_ADDRRESS = "lamstwo.serverAddr"; public static final String CONF_SERVER_ID = "lamstwo.serverId"; public static final String CONF_SERVER_KEY = "lamstwo.serverKey"; public static final String CONF_REQUEST_SOURCE = "lamstwo.requestSrc"; + // XML format constnats + public static final String ELEM_FOLDER = "Folder"; + public static final String ELEM_LEARNING_DESIGN = "LearningDesign"; + public static final String ATTR_NAME = "name"; + public static final String ATTR_RESOURCE_ID = "resourceId"; + } Index: sakai-lamstwo/impl/logic/src/java/org/lamsfoundation/lams/integrations/sakai/logic/impl/LamstwoLogicImpl.java =================================================================== diff -u -rc144f53e688b530044b19ff807e502a41d33039a -r975e90051619a8ee83c8e25952061c644af8cc94 --- sakai-lamstwo/impl/logic/src/java/org/lamsfoundation/lams/integrations/sakai/logic/impl/LamstwoLogicImpl.java (.../LamstwoLogicImpl.java) (revision c144f53e688b530044b19ff807e502a41d33039a) +++ sakai-lamstwo/impl/logic/src/java/org/lamsfoundation/lams/integrations/sakai/logic/impl/LamstwoLogicImpl.java (.../LamstwoLogicImpl.java) (revision 975e90051619a8ee83c8e25952061c644af8cc94) @@ -11,25 +11,29 @@ package org.lamsfoundation.lams.integrations.sakai.logic.impl; +import java.io.IOException; +import java.io.InputStream; import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; +import java.net.URLConnection; import java.net.URLEncoder; import java.rmi.RemoteException; import java.util.Date; import java.util.List; import java.util.Locale; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; import javax.xml.rpc.ServiceException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.lamsfoundation.lams.integrations.sakai.dao.LamstwoDao; import org.lamsfoundation.lams.integrations.sakai.logic.LamstwoLogic; import org.lamsfoundation.lams.integrations.sakai.model.LamstwoItem; -import org.lamsfoundation.lams.webservice.LearningDesignRepository; -import org.lamsfoundation.lams.webservice.LearningDesignRepositoryService; -import org.lamsfoundation.lams.webservice.LearningDesignRepositoryServiceLocator; import org.lamsfoundation.lams.webservice.LessonManager; import org.lamsfoundation.lams.webservice.LessonManagerService; import org.lamsfoundation.lams.webservice.LessonManagerServiceLocator; @@ -43,14 +47,17 @@ import org.sakaiproject.component.cover.ServerConfigurationService; import org.sakaiproject.site.api.SiteService; import org.sakaiproject.thread_local.cover.ThreadLocalManager; -import org.sakaiproject.tool.api.Placement; import org.sakaiproject.tool.api.Session; import org.sakaiproject.tool.api.SessionManager; import org.sakaiproject.tool.api.ToolManager; import org.sakaiproject.user.api.User; import org.sakaiproject.user.api.UserDirectoryService; import org.sakaiproject.user.api.UserNotDefinedException; import org.sakaiproject.util.ResourceLoader; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; /** * This is the implementation of the business logic interface @@ -332,49 +339,70 @@ * @see org.lamsfoundation.lams.integrations.sakai.logic.LamstwoLogic#getLearningDesigns() */ public String getLearningDesigns(Integer mode) { - - - String serverID = getServerID(); String serverAddress = getServerAddress(); + String serverID = getServerID(); String serverKey = getServerKey(); - + String datetime = new Long(System.currentTimeMillis()).toString(); String username = getCurrentUserId(); - String siteId = getCurrentContext(); - - if (serverID == null || serverAddress == null || serverKey == null ) { - log.error("Unable to retrieve learning designs from LAMS, one or more lams configuration properties is null"); - return null; - } - + String hashValue = LamstwoUtils.generateAuthenticationHash(serverID, serverKey, username, datetime); + String courseId = getCurrentContext(); + String country = getCountryCode(); + String lang = getLanguageCode(); + + String learningDesigns = "[]"; // empty javascript array try { - String datetime = new Date().toString(); - String hashValue = LamstwoUtils.generateAuthenticationHash(serverID, serverKey, username, datetime); - - LearningDesignRepositoryService service = new LearningDesignRepositoryServiceLocator(); - LearningDesignRepository ldr = service.getLearningDesignRepository(new URL(serverAddress + "/services/LearningDesignRepositoryService")); - String result = ldr.getLearningDesigns(serverID, datetime, hashValue, username, siteId, mode, getCountryCode(), getLanguageCode()); + String serviceURL = serverAddress + "/services/xml/LearningDesignRepository?" + + "datetime=" + datetime + + "&username=" + URLEncoder.encode(username, "utf8") + + "&serverId=" + URLEncoder.encode(serverID, "utf8") + + "&serverKey=" + URLEncoder.encode(serverKey, "utf8") + + "&hashValue=" + hashValue + + "&courseId=" + courseId + + "&country=" + country + + "&lang=" + lang + + "&mode=" + mode; - // TODO check if result is valid ?? + URL url = new URL(serviceURL); + URLConnection conn = url.openConnection(); + if (!(conn instanceof HttpURLConnection)) { + log.error("Unable to open connection to: " + serviceURL); + } + HttpURLConnection httpConn = (HttpURLConnection)conn; + + if (httpConn.getResponseCode() != HttpURLConnection.HTTP_OK) { + log.error("HTTP Response Code: " + httpConn.getResponseCode() + + ", HTTP Response Message: " + httpConn.getResponseMessage()); + } + + InputStream is = url.openConnection().getInputStream(); + + // parse xml response + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder db = dbf.newDocumentBuilder(); + Document document = db.parse(is); + + learningDesigns = "[" + convertToTigraFormat(document.getDocumentElement()) + "]"; + + // replace sequence id with javascript method String pattern = "'(\\d+)'"; String replacement = "'javascript:selectSequence($1)'"; + learningDesigns = learningDesigns.replaceAll(pattern, replacement); - result = result.replaceAll(pattern, replacement); - - return result; - + // TODO better error handling } catch (MalformedURLException e) { - log.error("Unable to retrieve learning designs from LAMS, bad URL: '" - + serverAddress - + "', please check sakai.properties"); - } catch (ServiceException e) { - log.error("Unable to retrieve learning designs from LAMS, RPC Service Exception"); e.printStackTrace(); - } catch (RemoteException e) { - log.error("Unable to retrieve learning designs from LAMS, RMI Remote Exception"); + } catch (UnsupportedEncodingException e) { e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (ParserConfigurationException e) { + e.printStackTrace(); + } catch (SAXException e) { + e.printStackTrace(); } - return null; + + return learningDesigns; } /* (non-Javadoc) @@ -615,4 +643,43 @@ } return false; } + + + + private String convertToTigraFormat(Node node) { + + StringBuilder sb = new StringBuilder(); + + if (node.getNodeName().equals(LamstwoConstants.ELEM_FOLDER)) { + sb.append("['"); + sb.append( + node.getAttributes().getNamedItem( + LamstwoConstants.ATTR_NAME).getNodeValue()).append( + "',").append("null").append(','); + + NodeList children = node.getChildNodes(); + if (children.getLength() == 0) { + sb.append("['',null]"); + } else { + sb.append(convertToTigraFormat(children.item(0))); + for (int i = 1; i < children.getLength(); i++) { + sb.append(',').append( + convertToTigraFormat(children.item(i))); + } + } + sb.append(']'); + } else if (node.getNodeName().equals( + LamstwoConstants.ELEM_LEARNING_DESIGN)) { + sb.append('['); + sb.append('\'').append( + node.getAttributes().getNamedItem( + LamstwoConstants.ATTR_NAME).getNodeValue()).append( + '\'').append(',').append('\'').append( + node.getAttributes().getNamedItem( + LamstwoConstants.ATTR_RESOURCE_ID).getNodeValue()) + .append('\''); + sb.append(']'); + } + return sb.toString(); + } } Fisheye: Tag 975e90051619a8ee83c8e25952061c644af8cc94 refers to a dead (removed) revision in file `sakai-lamstwo/impl/logic/src/java/org/lamsfoundation/lams/webservice/LearningDesignRepository.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 975e90051619a8ee83c8e25952061c644af8cc94 refers to a dead (removed) revision in file `sakai-lamstwo/impl/logic/src/java/org/lamsfoundation/lams/webservice/LearningDesignRepositoryService.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 975e90051619a8ee83c8e25952061c644af8cc94 refers to a dead (removed) revision in file `sakai-lamstwo/impl/logic/src/java/org/lamsfoundation/lams/webservice/LearningDesignRepositoryServiceLocator.java'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 975e90051619a8ee83c8e25952061c644af8cc94 refers to a dead (removed) revision in file `sakai-lamstwo/impl/logic/src/java/org/lamsfoundation/lams/webservice/LearningDesignRepositorySoapBindingStub.java'. Fisheye: No comparison available. Pass `N' to diff?