import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.DomDriver; public class CodecXml extends CodecXmlObject{ public CodecXml(){ super(); } public CodecXml(StringBuffer buffer) { setBuffer(buffer); } public void putString(String arg) { addField(4, "string", arg); } public void putInteger(int arg) { addField(4, "integer", String.valueOf(arg)); } public void putBoolean(boolean arg) { addField(4, "boolean", String.valueOf(arg)); } public void putDecimal(Double arg) { addField(4, "decimal", String.valueOf(arg)); } public void putObjectId(String key) { addField(4, "objectid", key); } public void putClassName(String arg) { addField(4, "classname", arg); } public String getString() { return getField("string"); } public String getObjectId() { return getField("objectid"); } public String getClassName() { return getField("classname"); } public int getInteger() { return Integer.valueOf(getField("integer")); } public boolean getBoolean() { return Boolean.valueOf(getField("boolean")); } public boolean getDouble() { // TODO Auto-generated method stub return false; } //////////////////// //ObjectReference // //////////////////// public String getObjectReference(){ return getField("object"); } public String getObjectHost() { return getField("host"); } public String getObjectPort() { return getField("port"); } public void putObjectReference(String xml_reference) { addField(xml_reference); } private List getSequenceStriped(String field_name) { List fields = new ArrayList(); StringBuffer new_buff = new StringBuffer(); StringTokenizer st = new StringTokenizer(getBuffer().toString(),"\n"); int count_tokens = st.countTokens(); //echo("tokens count: "+st.countTokens()); String linha =""; boolean found = false; while (st.hasMoreTokens()) { while (st.hasMoreTokens()) { linha = st.nextToken(); if (linha.trim().equals("<"+field_name+">")) { found = true; break; } } if (found) { //new_buff.append(linha+"\n"); while (st.hasMoreTokens()) { linha = st.nextToken(); if (linha.trim().equals("</"+field_name+">")) { //new_buff.append(linha); fields.add(new_buff.toString()); new_buff.delete(0, new_buff.length()); found = false; break; } new_buff.append(linha+"\n"); } } } return fields; } public List getSequence (String field_name) { List fields = new ArrayList(); StringBuffer new_buff = new StringBuffer(); StringTokenizer st = new StringTokenizer(getBuffer().toString(),"\n"); int count_tokens = st.countTokens(); //echo("tokens count: "+st.countTokens()); String linha =""; boolean found = false; while (st.hasMoreTokens()) { while (st.hasMoreTokens()) { linha = st.nextToken(); if (linha.trim().equals("<"+field_name+">")) { found = true; break; } } if (found) { new_buff.append(linha+"\n"); while (st.hasMoreTokens()) { linha = st.nextToken(); if (linha.trim().equals("</"+field_name+">")) { new_buff.append(linha); fields.add(new_buff.toString()); new_buff.delete(0, new_buff.length()); found = false; break; } new_buff.append(linha+"\n"); } } } return fields; } /** * Obtem lista com a sequencia de referencias * @return */ public List getSequenceReference() { return getSequence("reference"); } /** * Obtem sequencia de struct * @return */ public List getSruct() { return getSequence("struct"); } public List getSructStriped() { // TODO Auto-generated method stub return getSequenceStriped("struct"); } public String getStringStriped() { // TODO Auto-generated method stub List string = getSequenceStriped("string"); return (String) string.get(0); } public List getSequenceString() { String sequence_xml = getXmlStrip("sequence"); XStream xstream = new XStream(new DomDriver()); xstream.addImplicitCollection(SequenceStrings.class, "strings"); xstream.alias("sequence", SequenceStrings.class); SequenceStrings sequence = (SequenceStrings) xstream.fromXML(sequence_xml); xstream = null; return sequence.getStrings(); } //Extrai reference de uma sequence public String getObjectReferenceFromSequence() { String xml_ref = getXmlStrip("reference"); XStream xstream = new XStream(new DomDriver()); xstream.alias("reference", ObjectXmlReference.class); ObjectXmlReference obj_xml_reference = (ObjectXmlReference) xstream.fromXML(xml_ref); return obj_xml_reference.getObject(); } public String getOperation(){ return getField("operation"); } public String getField(String field_name) { String patternStr = "<"+field_name+">(.*?)</"+field_name+">"; String field_value = null; //System.out.println("[CodecXml] pattern: "+patternStr); //Regexp para extrair informacao do xml Pattern pattern = Pattern.compile(patternStr); Matcher matcher = pattern.matcher(getBuffer().toString()); boolean matchFound = matcher.find(); if (matchFound) { field_value = matcher.group(matcher.groupCount()); }else{ echo("field tag "+field_name+" not found!"); } return field_value; } //Retorna parte do xml public String getXmlStrip(String field_name) { StringBuffer new_buff = new StringBuffer(); StringTokenizer st = new StringTokenizer(getBuffer().toString(),"\n"); int count_tokens = st.countTokens(); //echo("tokens count: "+st.countTokens()); String linha =""; boolean found = false; while (st.hasMoreTokens()) { linha = st.nextToken(); if (linha.trim().equals("<"+field_name+">")) { found = true; break; } } if (found) { new_buff.append("<"+field_name+">\n"); while (st.hasMoreTokens()) { linha = st.nextToken(); if (linha.trim().equals("</"+field_name+">")) { new_buff.append("</"+field_name+">\n"); found = false; break; } new_buff.append(linha+"\n"); } } return new_buff.toString(); } /** * Obtem o tipo de reply * @return */ public String getReplyType(){ String field_name = "result"; String patternStr = "<"+field_name+" kind=\"(.*?)\">"; String field_value = null; //Regexp Pattern pattern = Pattern.compile(patternStr); Matcher matcher = pattern.matcher(getBuffer().toString()); boolean matchFound = matcher.find(); if (matchFound) { field_value = matcher.group(matcher.groupCount()); }else{ echo("pattern "+patternStr+" not found!"); } return field_value; } /** * Seta o tipo de reply e atualiza o stringbuffer * @param type */ public void setReplyType(String type) { String tmp = getReplyType(); String buffer_tmp = getBuffer().toString().replaceAll("<result kind=\""+tmp+"\">", "<result kind=\""+type+"\">"); clearBuffer(); append(buffer_tmp); } /** * Encondo o xml mapper na mensagem * @param xmlmapper */ public void putXmlMapper(XmlMapper xmlmapper) { XStream xstream = new XStream(new DomDriver()); xstream.alias("roomregistry", RoomRegistryXml.class); xstream.alias("chatroom", ChatRoomXml.class); xstream.alias("chatuser", ChatUserXml.class); xstream.addImplicitCollection(RoomRegistryXml.class, "chatroomskel"); xstream.addImplicitCollection(ChatRoomXml.class, "chatuserstub"); String xml = xstream.toXML(xmlmapper); //echo("XML TO ENCODE:"); //System.out.println(xml); append(xml+"\n"); } /** * Adiciona um objectImplentation no xml * @param obj_impl */ public void putObjectImplementation(Map obj_impl) { Iterator iterator = obj_impl.keySet().iterator(); while (iterator.hasNext()) { String key = (String) iterator.next(); ObjectImpl obj_impl_aux = (ObjectImpl) obj_impl.get(key); String classname = obj_impl_aux.getClass().getName(); echo("classname: "+classname); if (classname.equals("RoomRegistryImpl")){ RoomRegistryXml roomregistryxml = new RoomRegistryXml(key, classname); ////////////////// //Pego as salas // ////////////////// Map salas_criadas = ((RoomRegistryImpl) obj_impl_aux).getRooms(); Iterator iterator_salas = salas_criadas.keySet().iterator(); while(iterator_salas.hasNext()){ String room_name = (String) iterator_salas.next(); ChatRoomImpl chatroom_impl = (ChatRoomImpl) salas_criadas.get(room_name); //CRIO O XML ChatRoomXml chatroomxml_aux = new ChatRoomXml(room_name, chatroom_impl.getKey(), chatroom_impl.getClass().getName()); ///////////////////// // PEGO OS USUARIOS// ///////////////////// Map usuarios_sala = chatroom_impl.getUsers(); Iterator iterator_users = usuarios_sala.keySet().iterator(); while (iterator_users.hasNext()) { String user_name = (String) iterator_users.next(); ChatUserStub chatuser_stub = (ChatUserStub) usuarios_sala.get(user_name); String classname_chatuser = chatuser_stub.getClass().getName(); String host_chatuser = chatuser_stub.getObjectReference().getHost(); String port_chatuser = String.valueOf(chatuser_stub.getObjectReference().getPort()); String ref_chatuser = chatuser_stub.getObjectReference().stringify(); ChatUserXml chatuserxml_aux = new ChatUserXml(user_name, classname_chatuser, ref_chatuser, host_chatuser, port_chatuser); //Adiciono o chatuser no chatroom chatroomxml_aux.addChatUser(chatuserxml_aux); } //Adiciono o chatroom no roomregistry roomregistryxml.addChatroom(chatroomxml_aux); } //ENCODE XML XStream xstream = new XStream(new DomDriver()); xstream.alias("roomregistry", RoomRegistryXml.class); xstream.alias("chatroom", ChatRoomXml.class); xstream.alias("chatuser", ChatUserXml.class); xstream.addImplicitCollection(RoomRegistryXml.class, "chatroomskel"); xstream.addImplicitCollection(ChatRoomXml.class, "chatuserstub"); String xml = xstream.toXML(roomregistryxml); echo("XML ROOMREGISTRY TO ENCODE:"); System.out.println(xml); append(xml+"\n"); }else if (classname.equals("ChatRoomImpl")){ ChatRoomImpl chatroom_impl = (ChatRoomImpl) obj_impl_aux; String room_name = chatroom_impl.getName(); //CRIO O XML ChatRoomXml chatroomxml_aux = new ChatRoomXml(room_name, chatroom_impl.getKey(), chatroom_impl.getClass().getName()); ///////////////////// // PEGO OS USUARIOS// ///////////////////// Map usuarios_sala = chatroom_impl.getUsers(); Iterator iterator_users = usuarios_sala.keySet().iterator(); while (iterator_users.hasNext()) { String user_name = (String) iterator_users.next(); ChatUserStub chatuser_stub = (ChatUserStub) usuarios_sala.get(user_name); String classname_chatuser = chatuser_stub.getClass().getName(); String host_chatuser = chatuser_stub.getObjectReference().getHost(); String port_chatuser = String.valueOf(chatuser_stub.getObjectReference().getPort()); String ref_chatuser = chatuser_stub.getObjectReference().stringify(); ChatUserXml chatuserxml_aux = new ChatUserXml(user_name, classname_chatuser, ref_chatuser, host_chatuser, port_chatuser); //Adiciono o chatuser no chatroom chatroomxml_aux.addChatUser(chatuserxml_aux); } //ENCODE XML XStream xstream = new XStream(new DomDriver()); xstream.alias("chatroom", ChatRoomXml.class); xstream.alias("chatuser", ChatUserXml.class); xstream.addImplicitCollection(ChatRoomXml.class, "chatuserstub"); String xml = xstream.toXML(chatroomxml_aux); echo("XML CHATROOM TO ENCODE:"); System.out.println(xml); append(xml+"\n"); } } } private void echo(String msg) { System.out.println("[CodecXml] "+msg); } /** * Retorna a representacao do objeto no xml * @param xml * @return */ public XmlMapper getXmlMapper(String xml) { XmlMapper xml_mapper = null; XStream xstream = new XStream(new DomDriver()); if (xml.startsWith("<roomregistry>")){ echo("Decoding roomregistry xml"); xstream.alias("roomregistry", RoomRegistryXml.class); xstream.alias("chatroom", ChatRoomXml.class); xstream.alias("chatuser", ChatUserXml.class); xstream.addImplicitCollection(RoomRegistryXml.class, "chatroomskel"); xstream.addImplicitCollection(ChatRoomXml.class, "chatuserstub"); xml_mapper = (RoomRegistryXml) xstream.fromXML(xml); }else if (xml.startsWith("<chatroom>")){ echo("Decoding chatroom xml"); xstream.alias("chatroom", ChatRoomXml.class); xstream.alias("chatuser", ChatUserXml.class); xstream.addImplicitCollection(ChatRoomXml.class, "chatuserstub"); xml_mapper = (ChatRoomXml) xstream.fromXML(xml); } return xml_mapper; } }