Optimierungsvorschläge

jj060286

Mitglied
Hallo Liebe Community,
mein Programm hat als Persistence Schicht einen Webservice in dem die ganzen Bestellungen etc... gespeichert sind, im Zuge der EAI hab ich doch durch zufall mal in den Adapter für den Webservice geschaut.

und ich finde er ist grauenvoll Programmiert, allerdings habe ich nun schon mit Axis versucht ihn umzubauen und ich bekomme keien Verbindung zu stande könnt Ihr bitte mal über den Code schauen und mir eure Verbesserungsvorschläge sagen. Vielleicht fällt euch ja ein Framework ein das das handlen kann.

Java:
public class TibaSoapPersistence implements IPersistence {

	private static final String SSSL_CONTEXT_INSTANCE = "SSL";
	private String m_username;
	private String m_password;
	private String m_baseUrl;

	public TibaSoapPersistence(String api_url, String username, String password)
										throws KeyManagementException, NoSuchAlgorithmException {
		this.m_baseUrl = api_url;
		this.m_username = username;
		this.m_password = password;
		// disable https certificate validation
		// Create a trust manager that does not validate certificate chains
		TrustManager[] trustAllCerts = new TrustManager[] { 
											new X509TrustManager() {
												public java.security.cert.X509Certificate[] getAcceptedIssuers() {
													return null;
												}
												public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {
												}
												public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {
												}
											}};

		SSLContext sc = SSLContext.getInstance(SSSL_CONTEXT_INSTANCE);
		sc.init(null, trustAllCerts, new java.security.SecureRandom());
		HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

	}


	private String GetValueString(String key, String value) {
		return "<tiba:" + key + ">" + value + "</tiba:" + key + ">\n";
	}

	private String SendRequest(String function, String valueCollection)
			throws IOException {
		Authenticator.setDefault(new Authenticator() {
			@Override
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication(m_username, m_password
						.toCharArray());
			}
		});
		URL url = new URL(this.m_baseUrl);
		// generate soap message
		String soapMessage = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:tiba=\""
				+ this.m_baseUrl + "\">\n";
		soapMessage += "<soapenv:Header/>\n";
		soapMessage += "<soapenv:Body>\n";
		soapMessage += "<tiba:" + function + ">\n";
		soapMessage += valueCollection;
		soapMessage += "</tiba:" + function + ">\n";
		soapMessage += "</soapenv:Body>\n";
		soapMessage += "</soapenv:Envelope>\n";
		//System.out.println(soapMessage);
		// open and do transaction
		HttpsURLConnection urlConnection = (HttpsURLConnection) url
				.openConnection();
		urlConnection.setRequestMethod("POST");
		urlConnection.setDoInput(true);
		urlConnection.setDoOutput(true);
		urlConnection.setRequestProperty("SOAPAction", "\"" + this.m_baseUrl
				+ function + "\"");
		urlConnection.setRequestProperty("Content-type",
				"text/xml; charset=utf-8");
		urlConnection.setRequestProperty("Content-length", String
				.valueOf(soapMessage.length()));
		PrintStream output = new PrintStream(urlConnection.getOutputStream());
		// send message
		output.print(soapMessage);
		output.close();
		// Object content = urlConnection.getContent();

		InputStream in = urlConnection.getInputStream();
		StringBuffer outputStr = new StringBuffer("");
		BufferedReader bufread = new BufferedReader(new InputStreamReader(in));
		String line;
		while ((line = bufread.readLine()) != null) {
			outputStr.append(line);
		}

		bufread.close();
		in.close();
		if(outputStr.toString().indexOf("<sqlrowcount:Count>0</sqlrowcount:Count>") > 0) {
			return "";
		}
		
		return outputStr.toString();

	}


Ich bin euch zu Dank verpflichtet
 

Landei

Top Contributor
Der Code sieht wirklich grausam aus und scheint zudem ohne Rücksicht auf Java-Konventionen aus C# "übersetzt" zu sein.

Das m_ für Membervariablen sollte man weglassen und sie dafür lieber final machen. Ganz elementar wäre der Einsatz eines StringBuilders in Zeile 48, der StringBuffer in Zeile 77 kann auch zu StringBuilder geändert werden. Das while in Zeile 80 schreibt man besser mit for. Generell sollte die SendRequest-Methode in handliche Happen aufgeteilt werden. Wenn man das hat, kann man vielleicht sehen, was der Code eigentlich tut und weiter dran feilen...
 

jj060286

Mitglied
Hi Landei,

ich habe nochmal nachgefragt und du hast recht das hat damals ein C# entwickelr einfach nach Java Portiert. Ich habe jetzt mal angefangen ein bisschen das zu Optimieren.

Wie meisnt du das mit der FOR schleife???

So sieht der Quelltext jetzt aus:

Java:
public class TibaSoapPersistence implements IPersistence {

	private static final String SSL_CONTEXT_INSTANCE = "SSL";
	private static final String ENV = "Tiba";
	private static final String REQUEST_METHOD = "POST";

	private String username;
	private String password;
	private String baseUrl;

	public TibaSoapPersistence(String api_url, String username, String password) {
		this.username = username;
		this.password = password;
		this.baseUrl = api_url;
	}

	public TibaSoapPersistence() {
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getBaseUrl() {
		return baseUrl;
	}

	public void setBaseUrl(String baseUrl) {
		this.baseUrl = baseUrl;
	}

	public void initTrustManager() throws NoSuchAlgorithmException, KeyManagementException {

		TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
			public java.security.cert.X509Certificate[] getAcceptedIssuers() {
				return null;
			}

			public void checkClientTrusted(
					java.security.cert.X509Certificate[] certs, String authType) {
			}

			public void checkServerTrusted(
					java.security.cert.X509Certificate[] certs, String authType) {
			}
		} };

		SSLContext sc = SSLContext.getInstance(SSL_CONTEXT_INSTANCE);
		sc.init(null, trustAllCerts, new java.security.SecureRandom());
		HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
	}

	private String GetValueString(String key, String value) {
		return "<" + ENV + ":" + key + ">" + value + "</" + ENV + ":" + key + ">\n";
	}

	private String SendRequest(String function, String valueCollection)
			throws IOException {
		Authenticator.setDefault(new Authenticator() {
			@Override
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication(getUsername(), getPassword()
						.toCharArray());
			}
		});
		URL url = new URL(getBaseUrl());
		// generate soap message

		String request = generateSOAPMesssage(function, valueCollection);

		// open and do transaction
		HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
		urlConnection.setRequestMethod(REQUEST_METHOD);
		urlConnection.setDoInput(true);
		urlConnection.setDoOutput(true);
		urlConnection.setRequestProperty("SOAPAction", "\"" + getBaseUrl()+ function + "\"");
		urlConnection.setRequestProperty("Content-type","text/xml; charset=utf-8");
		urlConnection.setRequestProperty("Content-length",String.valueOf(request.length()));
		PrintStream output = new PrintStream(urlConnection.getOutputStream());
		// send message
		
		output.print(request);
		output.close();
		

		InputStream in = urlConnection.getInputStream();
		StringBuilder response = new StringBuilder();

		BufferedReader bufread = new BufferedReader(new InputStreamReader(in));
		
		String line;
		while ((line = bufread.readLine()) != null) {
			response.append(line);
		}

		bufread.close();
		in.close();
		if (response.toString().indexOf(
				"<sqlrowcount:Count>0</sqlrowcount:Count>") > 0) {
			return "";
		}

		return response.toString();

	}

	private String generateSOAPMesssage(String function, String valueCollection) {
		StringBuilder soapMessage = new StringBuilder("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:"
				+ ENV + "=\"" + getBaseUrl() + "\">\n");
		soapMessage.append("<soapenv:Header/>\n");
		soapMessage.append("<soapenv:Body>\n");
		soapMessage.append("<" + ENV + ":" + function + ">\n");
		soapMessage.append(valueCollection);
		soapMessage.append("</" + ENV + ":" + function + ">\n");
		soapMessage.append("</soapenv:Body>\n");
		soapMessage.append("</soapenv:Envelope>\n");
		return soapMessage.toString();

	}
}

erstmnal vielen Dank, ich hoffe noch auf viele Optimiereungen und Hilfen, wahrscheinlihc kennt ihr selbst alle das Problem wenn man mal auf alten Code stöst :)
 

Murray

Top Contributor
Noch eine Kleinigkeit: es hat sich eingebürgert, Passwörter - wenn man sie denn überhaupt als Klartext irgendwo im Code herumreichen muss - aus Sicherheitsgründen 1. nicht als Strings, sondern als Character-Arrays (char[]) abzulegen und 2. nur solange aufzubewahren, wie man sie auch wirklich braucht.
 

Landei

Top Contributor
Noch zwei Vorschläge:
Java:
//Zeile 104ff
for(String line = bufread.readLine(); line != null; line = bufread.readLine()) {
            response.append(line);
}

//Zeile 109ff
String res = response.toString();
return (res.indexOf("<sqlrowcount:Count>0</sqlrowcount:Count>") > 0) 
   ? "" : res;

Weiterhin sollte die ganze SendRequest-Methode so geschrieben werden:
Java:
try{ 
   ... 
  return...
} finally {
   try { if(bufread != null) bufread.close(); } catch(Throwable t) {}
   try { if(in != null) in.close(); } catch(Throwable t) {}
}
Damit wird auch im Fehlerfall versucht, die Streams zu schließen.
 

jj060286

Mitglied
ich habe es mit axis2 schon probiert und komme da auf keinen grünen Zweig, da er den TrustManager nicht auf "Trust ALL" ;) setzen kann und auch die Authentifiezierung nicht geklappt hatte oder hast du da bessere/andere Erfahrungen?
 

jj060286

Mitglied
@Fassy es wär cool wenn du mir mehr darüber sagen konntest, ich hatte schonmal kurz mit Axis2 was geamcht aber bin nciht richtig durchgestiegen, daher habe ich es weider gelassen.
Mir wäre es mit Axis2 auch lieber

meine Klasse sieht jetzt wie folgt aus:

Java:
public class TibaSoapPersistence implements IPersistence {

	private static final String SSL_CONTEXT_INSTANCE = "SSL";
	private static final String ENV = "Tiba";
	private static final String REQUEST_METHOD = "POST";
	private static final String CONTENT_TYPE = "text/xml; charset=utf-8";

	private String username;
	private char[] password;
	private String baseUrl;

	private HttpsURLConnection urlConnection;

	public TibaSoapPersistence(String api_url, String username, char[] password)
			throws KeyManagementException, NoSuchAlgorithmException {
		this.baseUrl = api_url;
		this.username = username;
		this.password = password;

		initTrustManager();
	}

	public void initTrustManager() throws NoSuchAlgorithmException,
			KeyManagementException {

		TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
			public java.security.cert.X509Certificate[] getAcceptedIssuers() {
				return null;
			}

			public void checkClientTrusted(
					java.security.cert.X509Certificate[] certs, String authType) {
			}

			public void checkServerTrusted(
					java.security.cert.X509Certificate[] certs, String authType) {
			}
		} };

		SSLContext sc = SSLContext.getInstance(SSL_CONTEXT_INSTANCE);
		sc.init(null, trustAllCerts, new java.security.SecureRandom());
		HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
	}

	private String GetValueString(String key, String value) {
		return "<" + ENV + ":" + key + ">" + value + "</" + ENV + ":" + key + ">\n";
	}

	private void SendRequest(String function, String valueCollection) throws Exception {
		
		Authenticator.setDefault(new Authenticator() {
			@Override
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication(getUsername(), getPassword());
			}
		});

		String request = generateSOAPMesssage(function, valueCollection);

		HttpsURLConnection urlConnection = getURLConnection();

		urlConnection.setRequestMethod(REQUEST_METHOD);
		urlConnection.setDoInput(true);
		urlConnection.setDoOutput(true);
		urlConnection.setRequestProperty("SOAPAction", "\"" + getBaseUrl() + function + "\"");
		urlConnection.setRequestProperty("Content-type", CONTENT_TYPE);
		urlConnection.setRequestProperty("Content-length",Integer.toString(request.length()));
	
		PrintStream output = new PrintStream(urlConnection.getOutputStream());
		output.print(request);
		output.close();

	}

	public String getResponse() {
		StringBuilder response = new StringBuilder();
		BufferedReader bufread = null;
		InputStream in = null;
		try {
			urlConnection = getURLConnection();
			in = urlConnection.getInputStream();
			bufread = new BufferedReader(new InputStreamReader(in));
			
			for (String line = bufread.readLine(); line != null; line = bufread.readLine()) {
				response.append(line);
			}

			bufread.close();
			in.close();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try { if (bufread != null) { bufread.close(); }	} catch (IOException e) { e.printStackTrace(); }
			try { if (in != null) { in.close(); } } catch (IOException e) { e.printStackTrace(); }
		}

		String res = response.toString();
		return (res.indexOf("<sqlrowcount:Count>0</sqlrowcount:Count>") > 0) ? "" : res;

	}

	private String generateSOAPMesssage(String function, String valueCollection) {
		StringBuilder soapMessage = new StringBuilder(
				"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:"
						+ ENV + "=\"" + getBaseUrl() + "\">\n");
		soapMessage.append("<soapenv:Header/>\n");
		soapMessage.append("<soapenv:Body>\n");
		soapMessage.append("<" + ENV + ":" + function + ">\n");
		soapMessage.append(valueCollection);
		soapMessage.append("</" + ENV + ":" + function + ">\n");
		soapMessage.append("</soapenv:Body>\n");
		soapMessage.append("</soapenv:Envelope>\n");
		return soapMessage.toString();

	}

	
	
	
	public String getUsername() {
		return username;
	}

	public char[] getPassword() {
		return password;
	}

	public String getBaseUrl() {
		return baseUrl;
	}

	private HttpsURLConnection getURLConnection() throws Exception {
		if (this.urlConnection == null) {
			URL url = new URL(getBaseUrl());
			this.urlConnection = (HttpsURLConnection) url.openConnection();
		}
		return this.urlConnection;
	}

	
	
}
 

Neue Themen


Oben