Page tree
Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Next »

Quellcode der Klasse

 

package systems.sdw.statt.util;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import java.util.Properties;
 
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.json.JSONException;
import org.json.JSONObject;
 
import systems.sdw.generic.Exceptions;
 
 
public class Client {
	// 
	CloseableHttpClient httpclient=null;
	// default encoding
	public static String encodingUTF8="UTF-8";
	// properties map
	public static final String propServer="server";
	public static final String propPort="port";
	public static final String propScheme="scheme";
	public static final String propLogin="login";
	public static final String propPassword="password";
	//
	private String scheme="https";
	private String server="stattbuchung.de";
	private String port="443";
 
	private String path="/SDW/statt";
	private String login="?";
	private String password="?";
 
	// opcodes
	private static final String opcLogon="1003";	// connect and start session
	private static final String opcLogoff="1002";	// close session properly and disconnect
 
	// challange url is prohibited so server starts authentification process when calling this (1. step)
	private String getLoginURL() {
		return scheme+"://"+server+":"+port+path+"?opc="+opcLogon;
	}
	// login form url. call this as 2. step
	private String getFormURL() {
		return scheme+"://"+server+":"+port+path+"/j_security_check";
	}
	// use this url for all communication after login in succeeded
	private String getFcURL(String opc) {
		return scheme+"://"+server+":"+port+path+"?opc="+opc;
	}
	private String getFcURL(String opc, List <NameValuePair> nvps) {
		StringBuffer buf=new StringBuffer(getFcURL(opc));
		ListIterator<NameValuePair> it=nvps.listIterator();
		while (it.hasNext()) {
			try {
				NameValuePair nvp=it.next();
				buf.append("&"+nvp.getName()+"="+URLEncoder.encode(nvp.getValue(), encodingUTF8));
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
		}
		return buf.toString();
	}
	// quit session by calling this url
	private String getLogoutURL() {
		return scheme+"://"+server+":"+port+path+"?opc="+opcLogoff;
	}
 
	// default constructor with properties map
	public Client(Properties props) {
		// provide at least login and password
		if (props.getProperty(propServer)!=null) this.setServer((String) props.getProperty(propServer));
		if (props.getProperty(propScheme)!=null) this.setScheme((String) props.getProperty(propScheme));
		if (props.getProperty(propPort)!=null) this.setPort((String) props.getProperty(propPort));
		if (props.getProperty(propLogin)!=null) this.setKennung((String) props.getProperty(propLogin));
		if (props.getProperty(propPassword)!=null) this.setKennwort((String) props.getProperty(propPassword));
		//
		try {
			this.httpclient=HttpClients.createDefault();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
 
	public boolean connect() throws Exception {
 
		System.out.println("Client trying to connect with given params:");
		System.out.println(server);
		System.out.println(port);
		System.out.println(scheme);
		System.out.println(login);
		System.out.println(password);
 
		try {
			// call prohibited url to log in
			HttpGet httpGet=new HttpGet(getLoginURL());
			HttpResponse response=httpclient.execute(httpGet);
			System.out.println("HTTPClient connect 1/3 "+getLoginURL()+" "+response.getStatusLine());
			if (response.getStatusLine().getStatusCode()!=200) {
				System.out.println("Server-Fehler beim Zugriff auf die URL "+getLoginURL());
				return false;
			}
			HttpEntity entity=response.getEntity();
			EntityUtils.consume(entity);
			// call login form url and prived credentials
			HttpPost httpPost=new HttpPost(getFormURL());
			List <NameValuePair> nvps=new ArrayList <NameValuePair>();
			nvps.add(new BasicNameValuePair("j_username", this.login));
			nvps.add(new BasicNameValuePair("j_password", this.password));
			httpPost.setEntity(new UrlEncodedFormEntity(nvps, encodingUTF8));
 
			response=httpclient.execute(httpPost);
			System.out.println("HTTPClient connect 2/3 "+getFormURL()+" "+nvps.toString()+ " " + response.getStatusLine());
			entity=response.getEntity();
			EntityUtils.consume(entity);
 
			// if credentials are ok server maps desired url so we can access it: check also for status 302=moved temporarily
			if (response.getStatusLine().getStatusCode()==302) {
				// no we can call login url again to establish session
				httpGet=new HttpGet(getLoginURL());
				response=httpclient.execute(httpGet);
				System.out.println("HTTPClient connect 3/3 "+getLoginURL()+" "+response.getStatusLine());
				// it's always a good idea to check for successfull login on transport layer
				if (response.getStatusLine().getStatusCode()!=200) {
					System.out.println("Server-Fehler beim Zugriff auf die URL "+getLoginURL());
					return false;
				}
				// check for any exception reported from server on logical layer after successfull login 
				// dont use a connection when any exception is reported because there is no valid session
				checkExceptions(response.getEntity());
				// ok, login successfull and session established
				EntityUtils.consume(entity);
				return true;
			}
			else {
				// otherwise: credentials not ok!
				System.out.println("Die Kennung/Kennwort-Kombination "+login+"/"+password+" ist vom Server nicht akzeptiert worden.");
				return false;
			}
		} catch (ClientProtocolException e) {
			e.printStackTrace();
			return false;
		} catch (IOException e) {
			e.printStackTrace();
			return false;
		}
	}
 
 
	public static void checkExceptions(HttpEntity responseEntity) throws Exception {
		checkExceptions(getResponseAsJSON(responseEntity));
	}
 
	public static void checkExceptions(JSONObject response) throws Exception {
 
		try {
			JSONObject exception=response.getJSONObject("exception");
			if (exception!=null) {
				if (exception.getString("exception").equalsIgnoreCase("NoSessionAvailableException")) {
					throw new Exceptions.NoSessionAvailableException(exception);
				}
				else if (exception.getString("exception").equalsIgnoreCase("WrongParamException")) {
					throw new Exceptions.WrongParamException(exception);
				}
				else throw new Exception(exception.getString("exception"));
			}
		} catch (JSONException e) {;}
	}
 
 
	public static JSONObject getResponseAsJSON(HttpEntity responseEntity) {
		if (responseEntity != null){
			try {
				BufferedReader streamReader = new BufferedReader(new InputStreamReader(responseEntity.getContent(), "UTF-8")); 
				StringBuilder responseStrBuilder = new StringBuilder();
				String inputStr=null;
				while ((inputStr = streamReader.readLine()) != null) responseStrBuilder.append(inputStr);
				JSONObject json=new JSONObject(responseStrBuilder.toString());
				//System.out.println(json.toString(4));
				return json;
			} catch (IllegalStateException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return null;
	}
 
	// use this to dump response to stdout for debugging purposes
	@SuppressWarnings("unused")
	private static void dump(HttpEntity entity) throws IllegalStateException, IOException {
		BufferedReader  br = new BufferedReader(new InputStreamReader(entity.getContent()));
		String readLine;
		while(((readLine = br.readLine()) != null)) {
			System.err.println(readLine);
		}
	}
 
	private static boolean checkStatus(HttpResponse response) {
		switch (response.getStatusLine().getStatusCode()) {
		case 200:
		case 302:
			return true;
		default:
			return false;
		}
	}
 
	public boolean disconnect() {
		try {
			HttpGet httpGet=new HttpGet(getLogoutURL());
			HttpResponse response=httpclient.execute(httpGet);
			System.out.println("HTTPClient disconnect 1/1 "+getLogoutURL()+" "+response.getStatusLine());
			if (response.getStatusLine().getStatusCode()!=200) return false;
			HttpEntity entity=response.getEntity();
			EntityUtils.consume(entity);
			httpclient=null;
			return true;
		} catch (ClientProtocolException e) {
			e.printStackTrace();
			return false;
		} catch (IOException e) {
			e.printStackTrace();
			return false;
		}
	}
 
	public JSONObject get(String opc) throws Exception {
		return get(opc, new ArrayList <NameValuePair>());
	}
 
	public JSONObject get(String opc, List <NameValuePair> nvps) throws Exception {
		JSONObject result=null;
		HttpGet httpGet= new HttpGet(this.getFcURL(opc, nvps));
		try {
			HttpResponse response=httpclient.execute(httpGet);
			System.out.println("HTTPClient get 1/1 "+getFcURL(opc, nvps)+" "+response.getStatusLine());
 
			if (checkStatus(response)) {
				HttpEntity entity=response.getEntity();
				result=getResponseAsJSON(entity);
				EntityUtils.consume(entity);
				checkExceptions(result);
			}
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return result;		
	}
 
	public JSONObject post(String opc, JSONObject json) throws Exception {
		JSONObject result=null;
		HttpPost httpPost=new HttpPost(this.getFcURL(opc));
		try {
			List <NameValuePair> nvps=new ArrayList <NameValuePair>();
			nvps.add(new BasicNameValuePair("data", json.toString()));
			httpPost.setEntity(new UrlEncodedFormEntity(nvps, encodingUTF8));
			            UrlEncodedFormEntity x=new UrlEncodedFormEntity(nvps, encodingUTF8);
			            x.writeTo(System.out);
			HttpResponse response=httpclient.execute(httpPost);
			System.out.println("HTTPClient post 1/1 "+response.getStatusLine());
 
			if (checkStatus(response)) {
				HttpEntity entity=response.getEntity();
				result=getResponseAsJSON(entity);
				EntityUtils.consume(entity);
				checkExceptions(result);
			}
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return result;		
	}
 
	public String getScheme() {return scheme;}
	public void setScheme(String scheme) {this.scheme=scheme;}
	public void setKennung(String login) {this.login= login;}
	public void setKennwort(String password) {this.password= password;}
	public String getServer() {return server;}
	public void setServer(String server) {this.server=server;}
	public String getPort() {return port;}
	public void setPort(String port) {this.port=port;}
	public String getPath() {return path;}
	public void setPath(String path) {this.path=path;}
 
 
}
  • No labels