package system.util;

import java.util.*;
import javax.servlet.http.*;
/**
 * Parces the packet send from market_rwServer and handles the data.
 * @author: nik
 */
public class rwParsedPacket {
	public long wrKey = 0;
	public short langKey = 0;
	public short marketKey = 0;
	
	public String ReqType = null;
	public String rwString[] = null;
	public long rwCounts[] = null;
	public short Num = 0;

	public long rwKey[] = null;
	public StringBuffer ret_rwKeys = null;
	private LogPrinter log = null;
/**
 * rwParsedPacket constructor comment.
 */
public rwParsedPacket(LogPrinter Clog) {
	super();
	if (Clog != null) {		
		log = Clog;
		log.log("rwParsedPacket (rwParsedPacket) : rwParsedPacket declared.", LogPrinter.DEBUG_2);
	}
	ret_rwKeys = null;
	Num = 0;
	ReqType = null;
	wrKey = 0;
	langKey = 0;
	marketKey = 0;
}
/**
 * Adds a element to the result packet(with all rwKeys) which can be send to market_rwServer as a result.
 * @return boolean
 */
public boolean AddElementToResult(long RrwKey) {
	try {
		if (ret_rwKeys == null) {
			ret_rwKeys = new StringBuffer();
			if (RrwKey < 255)
				ret_rwKeys.append(String.valueOf(Constants.No_Key));
			else {
				ret_rwKeys.append(String.valueOf(RrwKey));
				log.log("rwParsedPacket (AddElement) : rwKey - (" + RrwKey + ") inserted in the packet.", LogPrinter.DEBUG);
			}
		} else {
			ret_rwKeys.append(Constants.Packet_Delimiter);
			if (RrwKey < 255)
				ret_rwKeys.append(String.valueOf(Constants.No_Key));
			else {
				ret_rwKeys.append(String.valueOf(RrwKey));
				log.log("rwParsedPacket (AddElement) : rwKey - (" + RrwKey + ") inserted in the packet.", LogPrinter.DEBUG);
			}
		}
		return true;
	} catch (Exception e) {
		log.log("rwParsedPacket (AddElement) : Exception occured during insert of rwKey - " + RrwKey + " rwKeys - " + ret_rwKeys + ". " + e, LogPrinter.ERROR);
		log.flush();
		return false;
	}
}
/**
 * Parces the send packet and stroes the data in local variables.
 * @return boolean
 * @param Request com.ibm.ivj.toolserver.server.servlet.http.HttpRequest
 */
public boolean createParsedPacket(HttpServletRequest Request) {
	String temp = null;
	try {
		log.log("rwParsedPacket (createParsedPacket) : Packet recived : " + Request.getQueryString(), LogPrinter.DEBUG);
		temp = Request.getParameter(Constants.cs_WR_KEY);
		wrKey = Long.valueOf(temp).longValue();
		if (wrKey < 1) {
			log.log("rwParsedPacket (createParsedPacket) : wrKey sould not be > 0 (" + temp + ")", LogPrinter.ERROR);
			log.flush();
			return false;
		}
		temp = Request.getParameter(Constants.cs_MARKET_KEY);
		marketKey = Short.valueOf(temp).shortValue();
		if (marketKey < 1) {
			log.log("rwParsedPacket (createParsedPacket) : marketKey sould not be > 0 (" + temp + ")", LogPrinter.ERROR);
			log.flush();
			return false;
		}
		temp = Request.getParameter(Constants.cs_Packet_Number);
		Num = Short.valueOf(temp).shortValue();
		if (Num < 1) {
			log.log("rwParsedPacket (createParsedPacket) : Number of elements in the packet sould not be > 0 (" + temp + ")", LogPrinter.ERROR);
			log.flush();
			return false;
		}
	} catch (Exception t) {
		log.log("rwParsedPacket (createParsedPacket) : Exception occuered in parsing wrKey - " + wrKey + ", marketKey - " + marketKey + ", langKey - " + langKey + ", Number of el.- " + Num + ", temp - " + temp + "\n" + t, LogPrinter.ERROR);
		log.flush();
		return false;
	}

	// what kind of operation we have
	temp = Request.getParameter(Constants.cs_ReqType);
	if (temp == null) {
		log.log("rwParsedPacket (createParsedPacket) : No action specified. (" + temp + ")", LogPrinter.ERROR);
		log.flush();
		return false;
	} else
		
		// if we have counting		
		if (temp.equals(Constants.cs_PACKET_COUNTING)) {
			//rwKeys parsing			
			temp = Request.getParameter(Constants.cs_RW_KEY);
			if (temp == null) {
				log.log("rwParsedPacket (createParsedPacket) : No rwKeys given. (" + temp + ")", LogPrinter.ERROR);
				log.flush();
				return false;
			}
			rwKey = new long[Num];
			String next = null;
			StringTokenizer rwKeys_token = new StringTokenizer(temp, String.valueOf(Constants.Packet_Delimiter));
			try {
				for (int i = 0; i < Num; i++) {
					next = rwKeys_token.nextToken();
					rwKey[i] = Long.valueOf(next).longValue();
				}
			} catch (Exception e) {
				log.log("rwParsedPacket (createParsedPacket) : Exception in parsing rwKeys. (" + temp + ", " + next + ")\n" + e, LogPrinter.ERROR);
				log.flush();
				return false;
			}
			//rwCounts parsing
			temp = Request.getParameter(Constants.cs_RW_COUNTS);
			if (temp == null) {
				log.log("rwParsedPacket (createParsedPacket) : No rwCounts given. (" + temp + ", " + next + ")", LogPrinter.ERROR);
				log.flush();
				return false;
			}
			rwCounts = new long[Num];
			next = null;
			StringTokenizer rwCounts_token = new StringTokenizer(temp, String.valueOf(Constants.Packet_Delimiter));
			try {
				for (int i = 0; i < Num; i++) {
					next = rwCounts_token.nextToken();
					rwCounts[i] = Long.valueOf(next).longValue();
				}
			} catch (Exception e) {
				log.log("rwParsedPacket (createParsedPacket) : (count) Exception in parsing rwCounts. (" + temp + ", " + next + ")\n" + e, LogPrinter.ERROR);
				log.flush();
				return false;
			}
			return true;
		} else
			
			// if we have registration
			if (temp.equals(Constants.cs_PACKET_REGISTRATION)) {
				//langKey parsing
				temp = Request.getParameter(Constants.cs_LANG_KEY);
				langKey = Short.valueOf(temp).shortValue();
				if (langKey < 1) {
					log.log("rwParsedPacket (createParsedPacket) : langKey sould not be > 0 (" + temp + ")", LogPrinter.ERROR);
					log.flush();
					return false;
				}
				//rwStrings parsing
				temp = Request.getParameter(Constants.cs_RW_STRING);
				if (temp == null) {
					log.log("rwParsedPacket (createParsedPacket) : No rwStrings given. (" + temp + ")", LogPrinter.ERROR);
					log.flush();
					return false;
				}
				rwString = new String[Num];
				String next = null;
				StringTokenizer rwString_token = new StringTokenizer(temp, String.valueOf(Constants.Packet_Delimiter));
				try {
					for (int i = 0; i < Num; i++) {
						next = rwString_token.nextToken();
						rwString[i] = next;
					}
				} catch (Exception e) {
					log.log("rwParsedPacket (createParsedPacket) : Exception in parsing rwStrings. (" + temp + ", " + next + ")\n" + e, LogPrinter.ERROR);
					log.flush();
					return false;
				}
				//rwCounts parsing
				temp = Request.getParameter(Constants.cs_RW_COUNTS);
				if (temp == null) {
					log.log("rwParsedPacket (createParsedPacket) : (reg) No rwCounts given. (" + temp + ", " + next + ")", LogPrinter.ERROR);
					log.flush();
					return false;
				}
				rwCounts = new long[Num];
				next = null;
				StringTokenizer rwCounts_token = new StringTokenizer(temp, String.valueOf(Constants.Packet_Delimiter));
				try {
					for (int i = 0; i < Num; i++) {
						next = rwCounts_token.nextToken();
						rwCounts[i] = Long.valueOf(next).longValue();
					}
				} catch (Exception e) {
					log.log("rwParsedPacket (createParsedPacket) : (reg) Exception in parsing rwCounts. (" + temp + ", " + next + ")\n" + e, LogPrinter.ERROR);
					log.flush();
					return false;
				}
				return true;
			}
	log.log("rwParsedPacket (createParsedPacket) : Not a valid (reg/count) process specified (" + temp + ").", LogPrinter.ERROR);
	log.flush();
	return false;
}
}

