//package fixmico;
/**
* <p>Title: Request.java </p>
* <p>Description: </p>
*
* @author: Jessica Rogers
*/
import java.util.*;
import java.io.*;
public class Request {
private PDUXml _pdu;
private XmlObject _xmlobject;
private CodecXml _codec;
private ObjectReference _ref;
private String _opname;
public Request(ObjectReference ref, String opname) {
_opname = opname;
_ref = ref;
_pdu = new PDUXml(_ref, _opname);
_xmlobject = _pdu.xmlObject();
_codec = _pdu.codec();
}
public void addString (String arg)
{
_codec.putString(arg);
}
public void addInteger(int arg)
{
_codec.putInteger(arg);
}
public void addBoolean(boolean arg)
{
_codec.putBoolean(arg);
}
public void addDecimal(Double arg)
{
_codec.putDecimal(arg);
}
public void addObjectId(String arg) {
_codec.putObjectId(arg);
}
public void addClassName(String arg) {
_codec.putClassName(arg);
}
public void addObjectImplementation(Map obj_impl) {
_codec.putObjectImplementation(obj_impl);
}
public void addXmlMapper(XmlMapper xmlmapper) {
_codec.putXmlMapper(xmlmapper);
}
public void addSequenceReference(Map hashmap) {
beginSequence();
Iterator iterator = hashmap.keySet().iterator();
while (iterator.hasNext()) {
String name = (String) iterator.next();
//echo("Room name: "+name);
Object obj = (Object) hashmap.get(name);
//putStringReply(name);
addObjectReference(obj.objectReference().getXmlReference());
}
endSequence();
}
public boolean raisedException() {
if (_pdu.replyStatus()==1)
return true ;
else
return false;
}
/**
* Obtem o tipo de reply
* @return
*/
public String getReplyType() {
return _codec.getReplyType();
}
public String getString() {
return _codec.getString();
}
public int getInteger() {
return _codec.getInteger();
}
public boolean getBoolean() {
return _codec.getBoolean();
}
public boolean getDouble() {
return _codec.getDouble();
}
/**
* Envia a mensagem para o skel
*/
public void invoke() {
if (_codec.getTmpBuffer().toString().length() == 0) {
_pdu.send(_codec.getBuffer().toString());
_codec.clearTmpBuffer();
}else{
_pdu.send(_codec.getTmpBuffer().toString());
_codec.clearTmpBuffer();
}
_codec.setTmpBuffer(_codec.getBuffer());
long pduType = -1;
pduType = _pdu.recvNextPdu ();
if (pduType == 1) {
//trato o reply
StringBuffer buff = new StringBuffer();
buff.append(_pdu.getReplyMessage());
_codec.setBuffer(buff);
//Reply de erro
String reply_type = getReplyType();
if (reply_type.equals("error")) {
String msg = getString();
List parsed = getParsed(msg, ":");
String ref_aux = (String) parsed.get(0);
String host = (String) parsed.get(1);
String port = (String) parsed.get(2);
echo("atualizando a referencia");
_ref.updateReference(ref_aux, host, port);
_pdu.updateReference(_ref, _opname);
echo("encaminhando o request para o endereco novo...");
//Re-invoke
invoke();
}
}else{
System.out.println("[Request] reply not sent");
}
}
public CodecXml codec() {
return _codec;
}
public XmlObject XmlObject(){
return _xmlobject;
}
public void endXml(){
_codec.append("</request>");
}
public void beginParameter(){
_codec.addField(1, "parameters", "BEGIN");
}
public void endParameter(){
_codec.addField(1, "parameters", "END");
}
public void beginSequence(){
_codec.addField(2, "sequence", "BEGIN");
}
public void endSequence(){
_codec.addField(2, "sequence", "END");
}
public void beginStruct() {
_codec.addField(3, "struct", "BEGIN");
}
public void endStruct() {
_codec.addField(3, "struct", "END");
}
public void beginString() {
_codec.addField(3, "string", "BEGIN");
}
public void endString() {
_codec.addField(3, "string", "END");
}
public void addSequence(String type, String value){
_codec.addField(3, type, value);
}
public void addObjectReference(String xml) {
// TODO Auto-generated method stub
_codec.addField(xml);
}
public String getObjectReference() {
// TODO Auto-generated method stub
return _codec.getObjectReference();
}
public String getObjectHost() {
return _codec.getObjectHost();
}
public String getObjectPort() {
return _codec.getObjectPort();
}
/////////////
//SEQUENCE //
/////////////
public List getSequenceReference() {
return _codec.getSequenceReference();
}
public List getSequenceString() {
return _codec.getSequenceString();
}
private void echo(String msg) {
System.out.println("[Request] "+msg);
}
protected List getParsed(String msg, String delimitador) {
List parsed = new ArrayList();
StringTokenizer st = new StringTokenizer(msg,delimitador);
while (st.hasMoreTokens()) {
parsed.add(st.nextToken());
}
return parsed;
}
}