/** * Executes a command as {@code user}. Saves the stdout/stderr in the corresponding fields and * returns the return code of the child process. * * @param cmd The command to execute * @param data The data to send to the stdin of the process * @param timelimt How many seconds the command can run * @param memlimit How many megabytes the command can use */ private int exec(String cmdS, String data, int timelimit, int memlimit) throws Exception { ArrayList<String> cmd = new ArrayList<String>(cmdPrefix); cmd.add("-m"); cmd.add("" + memlimit); cmd.add("-c"); cmd.add("" + timelimit); cmd.add("-w"); cmd.add("" + (3 * timelimit + 1)); cmd.add("-x"); cmd.add(cmdS); String tmp = ""; for (String cs : cmd) tmp += " \"" + cs + "\""; log.fine("exec " + tmp); ProcessBuilder pb = new ProcessBuilder(cmd); pb.directory(workDir); Process p = pb.start(); OutputStreamWriter writer = new OutputStreamWriter(p.getOutputStream()); StreamReader rOut = new StreamReader(p.getInputStream()); StreamReader rErr = new StreamReader(p.getErrorStream()); rOut.start(); rErr.start(); // TODO I think this may block for big tests. Check and Fix. // send and receive data "in parallel" writer.write(data); writer.flush(); writer.close(); rOut.join(); rErr.join(); stdout = rOut.result; stderr = rErr.result; if (rOut.exception != null) throw rOut.exception; if (rErr.exception != null) throw rErr.exception; // log.finer("out: " + stdout); // log.finer("err: " + stderr); // log.finer("done exec"); return p.waitFor(); }
/** * This calls the external Moodle web service. * * <p>params String containing the parameters of the call.<br> * elements NodeList containing name/value pairs of returned XML data. * * @param params String * @return elements NodeList * @throws MoodleRestException */ public static NodeList call(String params) throws MoodleRestException { NodeList elements = null; try { URL getUrl = new URL(url); HttpURLConnection connection = (HttpURLConnection) getUrl.openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("Accept", "application/xml"); connection.setDoOutput(true); OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream()); writer.write(params); writer.flush(); writer.close(); // Used for testing StringBuilder buffer = new StringBuilder(); BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line = reader.readLine(); buffer.append(line).append('\n'); // FindPath fp=new FindPath(); InputStream resource = ClassLoader.getSystemClassLoader() .getResourceAsStream("net/beaconhillcott/moodlerest/EntityInjection.xml"); BufferedReader entities = new BufferedReader(new InputStreamReader(/*fp.*/ resource)); String entitiesLine = null; while ((entitiesLine = entities.readLine()) != null) { // System.out.println(entitiesLine); buffer.append(entitiesLine).append('\n'); } entities.close(); boolean error = false; while ((line = reader.readLine()) != null) { // System.out.println(line); if (error) throw new MoodleRestException( line.substring(line.indexOf('>') + 1, line.indexOf('<', line.indexOf('>') + 1))); if (line.contains("<EXCEPTION")) error = true; buffer.append(line).append('\n'); } reader.close(); if (debug) { System.out.println(buffer.toString()); } XPath xpath = XPathFactory.newInstance().newXPath(); // InputSource source=new InputSource(connection.getInputStream()); InputSource source = new InputSource(new ByteArrayInputStream(buffer.toString().getBytes())); elements = (NodeList) xpath.evaluate("//VALUE", source, XPathConstants.NODESET); // Used for testing if (debug) { for (int i = 0; i < elements.getLength(); i++) { String parent = elements .item(i) .getParentNode() .getParentNode() .getParentNode() .getParentNode() .getNodeName(); if (parent.equals("KEY")) parent = elements .item(i) .getParentNode() .getParentNode() .getParentNode() .getParentNode() .getAttributes() .getNamedItem("name") .getNodeValue(); String content = elements.item(i).getTextContent(); String nodeName = elements.item(i).getParentNode().getAttributes().getNamedItem("name").getNodeValue(); System.out.println("parent=" + parent + " nodeName=" + nodeName + " content=" + content); } } connection.disconnect(); } catch (XPathExpressionException ex) { Logger.getLogger(MoodleCallRestWebService.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(MoodleCallRestWebService.class.getName()).log(Level.SEVERE, null, ex); } return elements; }