1
0
Fork 0
mirror of https://github.com/vanitasvitae/Smack.git synced 2025-12-06 02:51:11 +01:00

Adding workgroup API (SMACK-185).

git-svn-id: http://svn.igniterealtime.org/svn/repos/smack/trunk@7400 b35dd754-fafc-0310-a699-88a17e54d16e
This commit is contained in:
Matt Tucker 2007-03-07 23:38:36 +00:00 committed by matt
parent 939feb9017
commit fe545abeae
64 changed files with 9744 additions and 0 deletions

View file

@ -0,0 +1,82 @@
/**
* $Revision$
* $Date$
*
* Copyright 2003-2007 Jive Software.
*
* All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jivesoftware.smackx.workgroup.ext.forms;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.provider.IQProvider;
import org.jivesoftware.smack.util.PacketParserUtils;
import org.xmlpull.v1.XmlPullParser;
public class WorkgroupForm extends IQ {
/**
* Element name of the packet extension.
*/
public static final String ELEMENT_NAME = "workgroup-form";
/**
* Namespace of the packet extension.
*/
public static final String NAMESPACE = "http://jivesoftware.com/protocol/workgroup";
public String getChildElementXML() {
StringBuilder buf = new StringBuilder();
buf.append("<").append(ELEMENT_NAME).append(" xmlns=\"").append(NAMESPACE).append("\">");
// Add packet extensions, if any are defined.
buf.append(getExtensionsXML());
buf.append("</").append(ELEMENT_NAME).append("> ");
return buf.toString();
}
/**
* An IQProvider for WebForm packets.
*
* @author Derek DeMoro
*/
public static class InternalProvider implements IQProvider {
public InternalProvider() {
super();
}
public IQ parseIQ(XmlPullParser parser) throws Exception {
WorkgroupForm answer = new WorkgroupForm();
boolean done = false;
while (!done) {
int eventType = parser.next();
if (eventType == XmlPullParser.START_TAG) {
// Parse the packet extension
answer.addExtension(PacketParserUtils.parsePacketExtension(parser.getName(),
parser.getNamespace(), parser));
}
else if (eventType == XmlPullParser.END_TAG) {
if (parser.getName().equals(ELEMENT_NAME)) {
done = true;
}
}
}
return answer;
}
}
}

View file

@ -0,0 +1,155 @@
/**
* $Revision$
* $Date$
*
* Copyright 2003-2007 Jive Software.
*
* All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jivesoftware.smackx.workgroup.ext.history;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.provider.IQProvider;
import org.xmlpull.v1.XmlPullParser;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
/**
* IQ provider used to retrieve individual agent information. Each chat session can be mapped
* to one or more jids and therefore retrievable.
*/
public class AgentChatHistory extends IQ {
private String agentJID;
private int maxSessions;
private long startDate;
private List agentChatSessions = new ArrayList();
public AgentChatHistory(String agentJID, int maxSessions, Date startDate) {
this.agentJID = agentJID;
this.maxSessions = maxSessions;
this.startDate = startDate.getTime();
}
public AgentChatHistory(String agentJID, int maxSessions) {
this.agentJID = agentJID;
this.maxSessions = maxSessions;
this.startDate = 0;
}
public AgentChatHistory() {
}
public void addChatSession(AgentChatSession chatSession) {
agentChatSessions.add(chatSession);
}
public Collection getAgentChatSessions() {
return agentChatSessions;
}
/**
* Element name of the packet extension.
*/
public static final String ELEMENT_NAME = "chat-sessions";
/**
* Namespace of the packet extension.
*/
public static final String NAMESPACE = "http://jivesoftware.com/protocol/workgroup";
public String getChildElementXML() {
StringBuilder buf = new StringBuilder();
buf.append("<").append(ELEMENT_NAME).append(" xmlns=");
buf.append('"');
buf.append(NAMESPACE);
buf.append('"');
buf.append(" agentJID=\"" + agentJID + "\"");
buf.append(" maxSessions=\"" + maxSessions + "\"");
buf.append(" startDate=\"" + startDate + "\"");
buf.append("></").append(ELEMENT_NAME).append("> ");
return buf.toString();
}
/**
* Packet extension provider for AgentHistory packets.
*/
public static class InternalProvider implements IQProvider {
public IQ parseIQ(XmlPullParser parser) throws Exception {
if (parser.getEventType() != XmlPullParser.START_TAG) {
throw new IllegalStateException("Parser not in proper position, or bad XML.");
}
AgentChatHistory agentChatHistory = new AgentChatHistory();
boolean done = false;
while (!done) {
int eventType = parser.next();
if ((eventType == XmlPullParser.START_TAG) && ("chat-session".equals(parser.getName()))) {
agentChatHistory.addChatSession(parseChatSetting(parser));
}
else if (eventType == XmlPullParser.END_TAG && ELEMENT_NAME.equals(parser.getName())) {
done = true;
}
}
return agentChatHistory;
}
private AgentChatSession parseChatSetting(XmlPullParser parser) throws Exception {
boolean done = false;
Date date = null;
long duration = 0;
String visitorsName = null;
String visitorsEmail = null;
String sessionID = null;
String question = null;
while (!done) {
int eventType = parser.next();
if ((eventType == XmlPullParser.START_TAG) && ("date".equals(parser.getName()))) {
String dateStr = parser.nextText();
long l = Long.valueOf(dateStr).longValue();
date = new Date(l);
}
else if ((eventType == XmlPullParser.START_TAG) && ("duration".equals(parser.getName()))) {
duration = Long.valueOf(parser.nextText()).longValue();
}
else if ((eventType == XmlPullParser.START_TAG) && ("visitorsName".equals(parser.getName()))) {
visitorsName = parser.nextText();
}
else if ((eventType == XmlPullParser.START_TAG) && ("visitorsEmail".equals(parser.getName()))) {
visitorsEmail = parser.nextText();
}
else if ((eventType == XmlPullParser.START_TAG) && ("sessionID".equals(parser.getName()))) {
sessionID = parser.nextText();
}
else if ((eventType == XmlPullParser.START_TAG) && ("question".equals(parser.getName()))) {
question = parser.nextText();
}
else if (eventType == XmlPullParser.END_TAG && "chat-session".equals(parser.getName())) {
done = true;
}
}
return new AgentChatSession(date, duration, visitorsName, visitorsEmail, sessionID, question);
}
}
}

View file

@ -0,0 +1,93 @@
/**
* $Revision$
* $Date$
*
* Copyright 2003-2007 Jive Software.
*
* All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jivesoftware.smackx.workgroup.ext.history;
import java.util.Date;
/**
* Represents one chat session for an agent.
*/
public class AgentChatSession {
public Date startDate;
public long duration;
public String visitorsName;
public String visitorsEmail;
public String sessionID;
public String question;
public AgentChatSession(Date date, long duration, String visitorsName, String visitorsEmail, String sessionID, String question) {
this.startDate = date;
this.duration = duration;
this.visitorsName = visitorsName;
this.visitorsEmail = visitorsEmail;
this.sessionID = sessionID;
this.question = question;
}
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
public long getDuration() {
return duration;
}
public void setDuration(long duration) {
this.duration = duration;
}
public String getVisitorsName() {
return visitorsName;
}
public void setVisitorsName(String visitorsName) {
this.visitorsName = visitorsName;
}
public String getVisitorsEmail() {
return visitorsEmail;
}
public void setVisitorsEmail(String visitorsEmail) {
this.visitorsEmail = visitorsEmail;
}
public String getSessionID() {
return sessionID;
}
public void setSessionID(String sessionID) {
this.sessionID = sessionID;
}
public void setQuestion(String question){
this.question = question;
}
public String getQuestion(){
return question;
}
}

View file

@ -0,0 +1,115 @@
/**
* $Revision$
* $Date$
*
* Copyright 2003-2007 Jive Software.
*
* All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jivesoftware.smackx.workgroup.ext.history;
import org.jivesoftware.smackx.workgroup.util.MetaDataUtils;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.provider.IQProvider;
import org.xmlpull.v1.XmlPullParser;
import java.util.HashMap;
import java.util.Map;
public class ChatMetadata extends IQ {
/**
* Element name of the packet extension.
*/
public static final String ELEMENT_NAME = "chat-metadata";
/**
* Namespace of the packet extension.
*/
public static final String NAMESPACE = "http://jivesoftware.com/protocol/workgroup";
private String sessionID;
public String getSessionID() {
return sessionID;
}
public void setSessionID(String sessionID) {
this.sessionID = sessionID;
}
private Map map = new HashMap();
public void setMetadata(Map metadata){
this.map = metadata;
}
public Map getMetadata(){
return map;
}
public String getChildElementXML() {
StringBuilder buf = new StringBuilder();
buf.append("<").append(ELEMENT_NAME).append(" xmlns=\"").append(NAMESPACE).append("\">");
buf.append("<sessionID>").append(getSessionID()).append("</sessionID>");
buf.append("</").append(ELEMENT_NAME).append("> ");
return buf.toString();
}
/**
* An IQProvider for Metadata packets.
*
* @author Derek DeMoro
*/
public static class Provider implements IQProvider {
public Provider() {
super();
}
public IQ parseIQ(XmlPullParser parser) throws Exception {
final ChatMetadata chatM = new ChatMetadata();
boolean done = false;
while (!done) {
int eventType = parser.next();
if (eventType == XmlPullParser.START_TAG) {
if (parser.getName().equals("sessionID")) {
chatM.setSessionID(parser.nextText());
}
else if (parser.getName().equals("metadata")) {
Map map = MetaDataUtils.parseMetaData(parser);
chatM.setMetadata(map);
}
}
else if (eventType == XmlPullParser.END_TAG) {
if (parser.getName().equals(ELEMENT_NAME)) {
done = true;
}
}
}
return chatM;
}
}
}

View file

@ -0,0 +1,68 @@
/**
* $Revision$
* $Date$
*
* Copyright 2003-2007 Jive Software.
*
* All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jivesoftware.smackx.workgroup.ext.macros;
/**
* Macro datamodel.
*/
public class Macro {
public static final int TEXT = 0;
public static final int URL = 1;
public static final int IMAGE = 2;
private String title;
private String description;
private String response;
private int type;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getResponse() {
return response;
}
public void setResponse(String response) {
this.response = response;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
}

View file

@ -0,0 +1,116 @@
/**
* $Revision$
* $Date$
*
* Copyright 2003-2007 Jive Software.
*
* All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jivesoftware.smackx.workgroup.ext.macros;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
/**
* MacroGroup datamodel.
*/
public class MacroGroup {
private List macros;
private List macroGroups;
// Define MacroGroup
private String title;
public MacroGroup() {
macros = new ArrayList();
macroGroups = new ArrayList();
}
public void addMacro(Macro macro) {
macros.add(macro);
}
public void removeMacro(Macro macro) {
macros.remove(macro);
}
public Macro getMacroByTitle(String title) {
Collection col = Collections.unmodifiableList(macros);
Iterator iter = col.iterator();
while (iter.hasNext()) {
Macro macro = (Macro)iter.next();
if (macro.getTitle().equalsIgnoreCase(title)) {
return macro;
}
}
return null;
}
public void addMacroGroup(MacroGroup group) {
macroGroups.add(group);
}
public void removeMacroGroup(MacroGroup group) {
macroGroups.remove(group);
}
public Macro getMacro(int location) {
return (Macro)macros.get(location);
}
public MacroGroup getMacroGroupByTitle(String title) {
Collection col = Collections.unmodifiableList(macroGroups);
Iterator iter = col.iterator();
while (iter.hasNext()) {
MacroGroup group = (MacroGroup)iter.next();
if (group.getTitle().equalsIgnoreCase(title)) {
return group;
}
}
return null;
}
public MacroGroup getMacroGroup(int location) {
return (MacroGroup)macroGroups.get(location);
}
public List getMacros() {
return macros;
}
public void setMacros(List macros) {
this.macros = macros;
}
public List getMacroGroups() {
return macroGroups;
}
public void setMacroGroups(List macroGroups) {
this.macroGroups = macroGroups;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}

View file

@ -0,0 +1,144 @@
/**
* $Revision$
* $Date$
*
* Copyright 2003-2007 Jive Software.
*
* All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jivesoftware.smackx.workgroup.ext.macros;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.provider.IQProvider;
import org.jivesoftware.smack.util.StringUtils;
import org.xmlpull.v1.XmlPullParser;
/**
* Macros iq is responsible for handling global and personal macros in the a Live Assistant
* Workgroup.
*/
public class Macros extends IQ {
private MacroGroup rootGroup;
private boolean personal;
private MacroGroup personalMacroGroup;
private static ClassLoader cl;
public static void setClassLoader(ClassLoader cloader) {
cl = cloader;
}
public MacroGroup getRootGroup() {
return rootGroup;
}
public void setRootGroup(MacroGroup rootGroup) {
this.rootGroup = rootGroup;
}
public boolean isPersonal() {
return personal;
}
public void setPersonal(boolean personal) {
this.personal = personal;
}
public MacroGroup getPersonalMacroGroup() {
return personalMacroGroup;
}
public void setPersonalMacroGroup(MacroGroup personalMacroGroup) {
this.personalMacroGroup = personalMacroGroup;
}
/**
* Element name of the packet extension.
*/
public static final String ELEMENT_NAME = "macros";
/**
* Namespace of the packet extension.
*/
public static final String NAMESPACE = "http://jivesoftware.com/protocol/workgroup";
public String getChildElementXML() {
StringBuilder buf = new StringBuilder();
buf.append("<").append(ELEMENT_NAME).append(" xmlns=\"").append(NAMESPACE).append("\">");
if (isPersonal()) {
buf.append("<personal>true</personal>");
}
// TODO: REMOVE XSTREAM
// if (getPersonalMacroGroup() != null) {
// final XStream xstream = new XStream();
// xstream.alias("macro", Macro.class);
// xstream.alias("macrogroup", MacroGroup.class);
//
// if (cl != null) {
// xstream.setClassLoader(cl);
// }
// String persitedGroup = StringUtils.escapeForXML(xstream.toXML(getPersonalMacroGroup()));
// buf.append("<personalMacro>").append(persitedGroup).append("</personalMacro>");
// }
buf.append("</").append(ELEMENT_NAME).append("> ");
return buf.toString();
}
/**
* An IQProvider for Macro packets.
*
* @author Derek DeMoro
*/
public static class InternalProvider implements IQProvider {
public InternalProvider() {
super();
}
public IQ parseIQ(XmlPullParser parser) throws Exception {
Macros macroGroup = new Macros();
boolean done = false;
while (!done) {
int eventType = parser.next();
if (eventType == XmlPullParser.START_TAG) {
if (parser.getName().equals("model")) {
String macros = parser.nextText();
// TODO: REMOVE XSTREAM
// XStream xstream = new XStream();
// if(cl != null){
// xstream.setClassLoader(cl);
// }
// xstream.alias("macro", Macro.class);
// xstream.alias("macrogroup", MacroGroup.class);
// MacroGroup group = (MacroGroup)xstream.fromXML(macros);
// macroGroup.setRootGroup(group);
}
}
else if (eventType == XmlPullParser.END_TAG) {
if (parser.getName().equals(ELEMENT_NAME)) {
done = true;
}
}
}
return macroGroup;
}
}
}

View file

@ -0,0 +1,155 @@
/**
* $Revision$
* $Date$
*
* Copyright 2003-2007 Jive Software.
*
* All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jivesoftware.smackx.workgroup.ext.notes;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.provider.IQProvider;
import org.xmlpull.v1.XmlPullParser;
/**
* IQ packet for retrieving and adding Chat Notes.
*/
public class ChatNotes extends IQ {
/**
* Element name of the packet extension.
*/
public static final String ELEMENT_NAME = "chat-notes";
/**
* Namespace of the packet extension.
*/
public static final String NAMESPACE = "http://jivesoftware.com/protocol/workgroup";
private String sessionID;
private String notes;
public String getSessionID() {
return sessionID;
}
public void setSessionID(String sessionID) {
this.sessionID = sessionID;
}
public String getNotes() {
return notes;
}
public void setNotes(String notes) {
this.notes = notes;
}
public String getChildElementXML() {
StringBuilder buf = new StringBuilder();
buf.append("<").append(ELEMENT_NAME).append(" xmlns=\"").append(NAMESPACE).append("\">");
buf.append("<sessionID>").append(getSessionID()).append("</sessionID>");
if (getNotes() != null) {
buf.append("<notes>").append(getNotes()).append("</notes>");
}
buf.append("</").append(ELEMENT_NAME).append("> ");
return buf.toString();
}
/**
* An IQProvider for ChatNotes packets.
*
* @author Derek DeMoro
*/
public static class Provider implements IQProvider {
public Provider() {
super();
}
public IQ parseIQ(XmlPullParser parser) throws Exception {
ChatNotes chatNotes = new ChatNotes();
boolean done = false;
while (!done) {
int eventType = parser.next();
if (eventType == XmlPullParser.START_TAG) {
if (parser.getName().equals("sessionID")) {
chatNotes.setSessionID(parser.nextText());
}
else if (parser.getName().equals("text")) {
String note = parser.nextText();
note = note.replaceAll("\\\\n", "\n");
chatNotes.setNotes(note);
}
}
else if (eventType == XmlPullParser.END_TAG) {
if (parser.getName().equals(ELEMENT_NAME)) {
done = true;
}
}
}
return chatNotes;
}
}
/**
* Replaces all instances of oldString with newString in string.
*
* @param string the String to search to perform replacements on
* @param oldString the String that should be replaced by newString
* @param newString the String that will replace all instances of oldString
* @return a String will all instances of oldString replaced by newString
*/
public static final String replace(String string, String oldString, String newString) {
if (string == null) {
return null;
}
// If the newString is null or zero length, just return the string since there's nothing
// to replace.
if (newString == null) {
return string;
}
int i = 0;
// Make sure that oldString appears at least once before doing any processing.
if ((i = string.indexOf(oldString, i)) >= 0) {
// Use char []'s, as they are more efficient to deal with.
char[] string2 = string.toCharArray();
char[] newString2 = newString.toCharArray();
int oLength = oldString.length();
StringBuilder buf = new StringBuilder(string2.length);
buf.append(string2, 0, i).append(newString2);
i += oLength;
int j = i;
// Replace all remaining instances of oldString with newString.
while ((i = string.indexOf(oldString, i)) > 0) {
buf.append(string2, j, i - j).append(newString2);
i += oLength;
j = i;
}
buf.append(string2, j, string2.length - j);
return buf.toString();
}
return string;
}
}