diff --git a/src/zutil/db/MySQLConnection.java b/src/zutil/db/MySQLConnection.java index 4cb82c6..89af2d4 100644 --- a/src/zutil/db/MySQLConnection.java +++ b/src/zutil/db/MySQLConnection.java @@ -18,24 +18,41 @@ public class MySQLConnection { * @param user is the user name * @param password is the password */ - public MySQLConnection(String url,String db,String user, String password) throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException{ + public MySQLConnection(String url, String db, String user, String password) + throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException{ Class.forName ("com.mysql.jdbc.Driver").newInstance(); conn = DriverManager.getConnection ("jdbc:mysql://"+url+"/"+db, user, password); } /** * Runs a query and returns the result.
- * NOTE: Don't forget to close the ResultSet and the Statement or it can lead to memory leak tex: rows.getStatement().close(); + * NOTE: Don't forget to close the ResultSet and the Statement or it + * can lead to memory leak: rows.getStatement().close(); * * @param sql is the query to execute * @return the data that the DB returned */ - public synchronized ResultSet returnQuery(String sql) throws SQLException{ + public synchronized ResultSet query(String sql) throws SQLException{ Statement s = conn.createStatement (); - s.executeQuery (sql); + s.executeQuery(sql); return s.getResultSet(); } + /** + * Returns the first cell of the first row of the query + * + * @param sql is the SQL query to run, preferably with the LIMIT 1 at the end + * @return A SQL row if it exists or else null + */ + public synchronized String simpleQuery(String sql) throws SQLException{ + Statement s = conn.createStatement (); + s.executeQuery(sql); + ResultSet result = s.getResultSet(); + if(result.next()) + return result.getString(0); + return null; + } + /** * Runs a query in the MySQL server and returns effected rows * @@ -52,6 +69,7 @@ public class MySQLConnection { /** * Runs a Prepared Statement.
* NOTE: Don't forget to close the PreparedStatement or it can lead to memory leak + * * @param sql is the SQL query to run * @return The PreparedStatement */ diff --git a/src/zutil/db/MySQLQueue.java b/src/zutil/db/MySQLQueue.java index 171a478..7ca1bf8 100644 --- a/src/zutil/db/MySQLQueue.java +++ b/src/zutil/db/MySQLQueue.java @@ -63,7 +63,7 @@ public class MySQLQueue implements Queue{ @SuppressWarnings("unchecked") public synchronized E peek() { try { - ResultSet rs = db.returnQuery("SELECT * FROM "+table+" LIMIT 1"); + ResultSet rs = db.query("SELECT * FROM "+table+" LIMIT 1"); if (rs.next()) { return (E) Converter.toObject(rs.getBytes("data")); } @@ -77,7 +77,7 @@ public class MySQLQueue implements Queue{ @SuppressWarnings("unchecked") public synchronized E poll() { try { - ResultSet rs = db.returnQuery("SELECT * FROM "+table+" LIMIT 1"); + ResultSet rs = db.query("SELECT * FROM "+table+" LIMIT 1"); if (rs.next()) { db.updateQuery("DELETE FROM "+table+" WHERE id="+rs.getInt("id")+" LIMIT 1"); return (E) Converter.toObject(rs.getBytes("data")); @@ -108,7 +108,7 @@ public class MySQLQueue implements Queue{ public boolean contains(Object arg0) { try { - ResultSet rs = db.returnQuery("SELECT data FROM "+table+" WHERE data='"+Converter.toBytes(arg0)+"' LIMIT 1"); + ResultSet rs = db.query("SELECT data FROM "+table+" WHERE data='"+Converter.toBytes(arg0)+"' LIMIT 1"); if (rs.next()) { return true; } @@ -135,7 +135,7 @@ public class MySQLQueue implements Queue{ public synchronized boolean remove(Object arg0) { try { - ResultSet rs = db.returnQuery("DELETE FROM "+table+" WHERE data='"+Converter.toBytes(arg0)+"' LIMIT 1"); + ResultSet rs = db.query("DELETE FROM "+table+" WHERE data='"+Converter.toBytes(arg0)+"' LIMIT 1"); rs.getStatement().close(); return true; } catch (Exception e) { @@ -156,7 +156,7 @@ public class MySQLQueue implements Queue{ public int size() { try { - ResultSet rs = db.returnQuery("SELECT count(*) FROM "+table); + ResultSet rs = db.query("SELECT count(*) FROM "+table); if (rs.next()) { return rs.getInt(1); } diff --git a/src/zutil/network/http/HttpServer.java b/src/zutil/network/http/HttpServer.java index 51e0774..1dfbc9d 100644 --- a/src/zutil/network/http/HttpServer.java +++ b/src/zutil/network/http/HttpServer.java @@ -244,13 +244,13 @@ public class HttpServer extends Thread{ tmpb.append((char)in.read()); } - if(client_info.get("Content-Type").equals("application/x-www-form-urlencoded")){ + if(client_info.get("Content-Type").contains("application/x-www-form-urlencoded")){ // get the variables parseVariables(tmpb.toString(), request); } - else if(client_info.get("Content-Type").equals("application/soap+xml") || - client_info.get("Content-Type").equals("text/xml") || - client_info.get("Content-Type").equals("text/plain")){ + else if(client_info.get("Content-Type").contains("application/soap+xml") || + client_info.get("Content-Type").contains("text/xml") || + client_info.get("Content-Type").contains("text/plain")){ // save the variables request.put("" , tmpb.toString()); } diff --git a/src/zutil/network/http/soap/SOAPHttpPage.java b/src/zutil/network/http/soap/SOAPHttpPage.java index 6ebc3b4..4c7a8c0 100644 --- a/src/zutil/network/http/soap/SOAPHttpPage.java +++ b/src/zutil/network/http/soap/SOAPHttpPage.java @@ -37,13 +37,6 @@ import javax.wsdl.factory.WSDLFactory; import javax.wsdl.xml.WSDLWriter; import javax.xml.namespace.QName; -import zutil.network.http.HttpPage; -import zutil.network.http.HttpPrintStream; -import zutil.network.http.soap.SOAPInterface.WSDLDocumentation; -import zutil.network.http.soap.SOAPInterface.WSDLParamDocumentation; -import zutil.network.http.soap.SOAPObject.SOAPFieldName; -import zutil.MultiPrintStream; - import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; @@ -53,6 +46,13 @@ import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; import org.xml.sax.SAXException; +import zutil.MultiPrintStream; +import zutil.network.http.HttpPage; +import zutil.network.http.HttpPrintStream; +import zutil.network.http.soap.SOAPInterface.WSDLDocumentation; +import zutil.network.http.soap.SOAPInterface.WSDLParamDocumentation; +import zutil.network.http.soap.SOAPObject.SOAPFieldName; + import com.ibm.wsdl.extensions.PopulatedExtensionRegistry; import com.ibm.wsdl.extensions.soap.SOAPConstants; import com.sun.org.apache.xerces.internal.dom.DocumentImpl; @@ -89,16 +89,16 @@ import com.sun.org.apache.xerces.internal.dom.DocumentImpl; */ public class SOAPHttpPage implements HttpPage{ // valid methods for this soap page - private HashMap methods; + private HashMap methods; // contains an method and the names for the parameters - private class MethodChasch{ + private class MethodCache{ String[] paramName; boolean[] paramOptional; String returnName; Method method; boolean header; - MethodChasch(Method m){ + MethodCache(Method m){ method = m; paramName = new String[method.getParameterTypes().length]; paramOptional = new boolean[method.getParameterTypes().length]; @@ -122,13 +122,13 @@ public class SOAPHttpPage implements HttpPage{ this.url = url; this.interf = interf; this.session_enabled = false; - methods = new HashMap(); + methods = new HashMap(); for(Method m : interf.getClass().getDeclaredMethods()){ // check for public methods if((m.getModifiers() & Modifier.PUBLIC) > 0 && !m.isAnnotationPresent(SOAPInterface.SOAPDisabled.class)){ - MethodChasch chasch = new MethodChasch(m); + MethodCache chasch = new MethodCache(m); StringBuffer tmp = new StringBuffer(m.getName()+"("); // Get the parameter names @@ -218,11 +218,21 @@ public class SOAPHttpPage implements HttpPage{ if(session_enabled) session.put("SOAPInterface", obj); } + Document document = soapResponse( request.get(""), obj); - + OutputFormat format = OutputFormat.createPrettyPrint(); XMLWriter writer = new XMLWriter( out, format ); writer.write( document ); + + /* + // DEBUG + System.out.println("Request"); + System.out.println(request); + System.out.println("Response"); + writer = new XMLWriter( System.out, format ); + writer.write( document ); + */ } } catch (Exception e) { e.printStackTrace(MultiPrintStream.out); @@ -238,24 +248,25 @@ public class SOAPHttpPage implements HttpPage{ try { return soapResponse(xml, interf.getClass().newInstance()); } catch (Exception e) { - e.printStackTrace(); + e.printStackTrace(MultiPrintStream.out); } return null; } protected Document soapResponse(String xml, SOAPInterface obj){ + Document document = DocumentHelper.createDocument(); + Element envelope = document.addElement("soap:Envelope"); try { - Document document = DocumentHelper.createDocument(); - Element envelope = document.addElement("soap:Envelope"); - envelope.add(new Namespace("soap", "http://www.w3.org/2001/12/soap-envelope")); - envelope.addAttribute("soap:encodingStyle", "http://www.w3.org/2001/12/soap-encoding"); - - Element header = envelope.addElement( "soap:Header" ); + envelope.add(new Namespace("soap", "http://schemas.xmlsoap.org/soap/envelope/")); + envelope.addAttribute("soap:encodingStyle", "http://schemas.xmlsoap.org/soap/envelope/"); + Element body = envelope.addElement( "soap:Body" ); try{ Element request = getXMLRoot(xml); + if(request == null) return document; // Header if( request.element("Header") != null){ + Element header = envelope.addElement( "soap:Header" ); prepareInvoke( obj, request.element("Header"), header ); } @@ -278,13 +289,11 @@ public class SOAPHttpPage implements HttpPage{ fault.addElement("faultstring").setText( ""+e.getMessage() ); e.printStackTrace(MultiPrintStream.out); } - - return document; } catch (Exception e) { e.printStackTrace(MultiPrintStream.out); } - return null; + return document; } /** @@ -301,7 +310,7 @@ public class SOAPHttpPage implements HttpPage{ while( it.hasNext() ){ Element e = it.next(); if(methods.containsKey(e.getQName().getName())){ - MethodChasch m = methods.get(e.getQName().getName()); + MethodCache m = methods.get(e.getQName().getName()); Object[] params = new Object[m.paramName.length]; // Get the param values @@ -318,7 +327,7 @@ public class SOAPHttpPage implements HttpPage{ // generate response xml if(m.method.getReturnType() != void.class){ Element response = responseRoot.addElement(m.method.getName()+"Response"); - createReturnXML(response, ret, m.returnName, m); + generateReturnXML(response, ret, m.returnName, m); } } else{ @@ -337,7 +346,7 @@ public class SOAPHttpPage implements HttpPage{ * @param ename is the name of the parent Element * @param m is the method that returned the ret */ - private void createReturnXML(Element root, Object ret, String ename, MethodChasch m) throws IllegalArgumentException, IllegalAccessException{ + private void generateReturnXML(Element root, Object ret, String ename, MethodCache m) throws IllegalArgumentException, IllegalAccessException{ if(ret == null) return; if(byte[].class.isAssignableFrom(ret.getClass())){ Element valueE = root.addElement( ename ); @@ -355,7 +364,7 @@ public class SOAPHttpPage implements HttpPage{ array.addAttribute("type", "soap:Array"); array.addAttribute("soap:arrayType", arrayType); for(int i=0; i 0){ @@ -535,6 +553,11 @@ public class SOAPHttpPage implements HttpPage{ input.setMessage(msgIn); operation.setInput(input); } + else{ + Input input = wsdl.createInput(); + input.setMessage(empty); + operation.setInput(input); + } //********** Response Message if(!m.method.getReturnType().equals( void.class )){ Message msgOut = wsdl.createMessage(); @@ -611,30 +634,30 @@ public class SOAPHttpPage implements HttpPage{ soapBinding.setTransportURI("http://schemas.xmlsoap.org/soap/http"); binding.addExtensibilityElement(soapBinding); - for(MethodChasch m : methods.values()){ + for(MethodCache m : methods.values()){ BindingOperation operation = wsdl.createBindingOperation(); operation.setName(m.method.getName()); SOAPOperation soapOperation = (SOAPOperation)extReg.createExtension(BindingOperation.class, SOAPConstants.Q_ELEM_SOAP_OPERATION); - soapOperation.setSoapActionURI(""); + soapOperation.setSoapActionURI(url+""+m.method.getName()); operation.addExtensibilityElement(soapOperation); // input - if(m.paramName.length > 0){ - BindingInput input = wsdl.createBindingInput(); - // Header - if(m.header){ - SOAPHeader soapHeader = (SOAPHeader)extReg.createExtension(BindingInput.class, SOAPConstants.Q_ELEM_SOAP_HEADER); - soapHeader.setUse("literal"); - input.addExtensibilityElement(soapHeader); - }// Body - else{ - SOAPBody soapBody = (SOAPBody)extReg.createExtension(BindingInput.class, SOAPConstants.Q_ELEM_SOAP_BODY); - soapBody.setUse("literal"); - input.addExtensibilityElement(soapBody); - } - operation.setBindingInput(input); + BindingInput input = wsdl.createBindingInput(); + // Header + if(m.header){ + SOAPHeader soapHeader = (SOAPHeader)extReg.createExtension(BindingInput.class, SOAPConstants.Q_ELEM_SOAP_HEADER); + soapHeader.setUse("literal"); + soapHeader.setNamespaceURI(url+""+m.method.getName()); + input.addExtensibilityElement(soapHeader); + }// Body + else{ + SOAPBody soapBody = (SOAPBody)extReg.createExtension(BindingInput.class, SOAPConstants.Q_ELEM_SOAP_BODY); + soapBody.setUse("literal"); + soapBody.setNamespaceURI(url+""+m.method.getName()); + input.addExtensibilityElement(soapBody); } + operation.setBindingInput(input); // output if(!m.method.getReturnType().equals( void.class )){ @@ -643,11 +666,13 @@ public class SOAPHttpPage implements HttpPage{ if(m.header){ SOAPHeader soapHeader = (SOAPHeader)extReg.createExtension(BindingInput.class, SOAPConstants.Q_ELEM_SOAP_HEADER); soapHeader.setUse("literal"); + soapHeader.setNamespaceURI(url+""+m.method.getName()); output.addExtensibilityElement(soapHeader); }// Body else{ SOAPBody soapBody = (SOAPBody)extReg.createExtension(BindingInput.class, SOAPConstants.Q_ELEM_SOAP_BODY); soapBody.setUse("literal"); + soapBody.setNamespaceURI(url+""+m.method.getName()); output.addExtensibilityElement(soapBody); } operation.setBindingOutput(output); @@ -683,12 +708,19 @@ public class SOAPHttpPage implements HttpPage{ wsdlType = DocumentHelper.createDocument(); Element definitions = wsdlType.addElement( "wsdl:definitions" ); definitions.addAttribute("targetNamespace", url+"?type"); + definitions.addNamespace("tns", url+"?type"); definitions.addNamespace("xsd", "http://www.w3.org/2001/XMLSchema"); definitions.addNamespace("wsdl", "http://schemas.xmlsoap.org/wsdl/"); definitions.addNamespace("SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/"); Element typeE = definitions.addElement("wsdl:types"); - Element schema = typeE.addElement("xsd:schema"); + Element schema = typeE.addElement("xsd:schema"); + schema.addAttribute("targetNamespace", url+"?type"); + + // empty type + Element empty = schema.addElement("xsd:complexType"); + empty.addAttribute("name", "empty"); + empty.addElement("xsd:sequence"); for(int n=0; n c = types.get(n); @@ -699,6 +731,8 @@ public class SOAPHttpPage implements HttpPage{ Element type = schema.addElement("xsd:complexType"); type.addAttribute("name", "ArrayOf"+getClassSOAPName(c).replaceAll("[\\[\\]]", "")); + + /*// .Net can't handle this code Element complexContent = type.addElement("complexContent"); Element restriction = complexContent.addElement("restriction"); @@ -707,6 +741,19 @@ public class SOAPHttpPage implements HttpPage{ Element attribute = restriction.addElement("attribute"); attribute.addAttribute("ref", "SOAP-ENC:arrayType"); attribute.addAttribute("wsdl:arrayType", "tns:"+getClassSOAPName(c)); + */ + + Element sequence = type.addElement("xsd:sequence"); + + Element element = sequence.addElement("xsd:element"); + element.addAttribute("minOccurs", "0"); + element.addAttribute("maxOccurs", "unbounded"); + element.addAttribute("name", "element"); + element.addAttribute("nillable", "true"); + if(SOAPObject.class.isAssignableFrom(ctmp)) + element.addAttribute("type", "tns:"+getClassSOAPName(c).replace("[]", "")); + else + element.addAttribute("type", "xsd:"+getClassSOAPName(c).replace("[]", "")); if(!types.contains(ctmp)) types.add(ctmp); @@ -752,5 +799,4 @@ public class SOAPHttpPage implements HttpPage{ } return c; } - }