1
0
Fork 0
mirror of https://codeberg.org/Mercury-IM/Smack synced 2025-12-06 05:01:12 +01:00

SMACK-363 Applied code cleanup patches for many generics related issues.

git-svn-id: http://svn.igniterealtime.org/svn/repos/smack/trunk@13325 b35dd754-fafc-0310-a699-88a17e54d16e
This commit is contained in:
rcollier 2012-10-26 10:47:55 +00:00
parent 6dc64671e2
commit e08c8afe44
109 changed files with 577 additions and 605 deletions

View file

@ -19,6 +19,7 @@
package org.jivesoftware.smackx.workgroup;
import java.util.List;
import java.util.Map;
import org.jivesoftware.smackx.workgroup.util.MetaDataUtils;
@ -40,16 +41,16 @@ public class MetaData implements PacketExtension {
*/
public static final String NAMESPACE = "http://jivesoftware.com/protocol/workgroup";
private Map metaData;
private Map<String, List<String>> metaData;
public MetaData(Map metaData) {
public MetaData(Map<String, List<String>> metaData) {
this.metaData = metaData;
}
/**
* @return the Map of metadata contained by this instance
*/
public Map getMetaData() {
public Map<String, List<String>> getMetaData() {
return metaData;
}

View file

@ -19,6 +19,7 @@
package org.jivesoftware.smackx.workgroup;
import java.util.List;
import java.util.Map;
/**
@ -36,7 +37,7 @@ public class WorkgroupInvitation {
protected String issuingWorkgroupName;
protected String messageBody;
protected String invitationSender;
protected Map metaData;
protected Map<String, List<String>> metaData;
/**
* This calls the 5-argument constructor with a null MetaData argument value
@ -65,7 +66,7 @@ public class WorkgroupInvitation {
* @param metaData the metadata sent with the invitation
*/
public WorkgroupInvitation (String jid, String group, String workgroup, String sessID, String msgBody,
String from, Map metaData) {
String from, Map<String, List<String>> metaData) {
super();
this.uniqueID = jid;
@ -126,7 +127,7 @@ public class WorkgroupInvitation {
* @return the meta data associated with the invitation, or null if this instance was
* constructed with none
*/
public Map getMetaData () {
public Map<String, List<String>> getMetaData () {
return this.metaData;
}

View file

@ -318,8 +318,8 @@ public class AgentRoster {
}
// Fire an event.
synchronized (entries) {
for (Iterator i = entries.iterator(); i.hasNext();) {
String entry = (String)i.next();
for (Iterator<String> i = entries.iterator(); i.hasNext();) {
String entry = i.next();
if (entry.toLowerCase().equals(StringUtils.parseBareAddress(key).toLowerCase())) {
fireEvent(EVENT_PRESENCE_CHANGED, packet);
}
@ -358,8 +358,8 @@ public class AgentRoster {
public void processPacket(Packet packet) {
if (packet instanceof AgentStatusRequest) {
AgentStatusRequest statusRequest = (AgentStatusRequest)packet;
for (Iterator i = statusRequest.getAgents().iterator(); i.hasNext();) {
AgentStatusRequest.Item item = (AgentStatusRequest.Item)i.next();
for (Iterator<AgentStatusRequest.Item> i = statusRequest.getAgents().iterator(); i.hasNext();) {
AgentStatusRequest.Item item = i.next();
String agentJID = item.getJID();
if ("remove".equals(item.getType())) {

View file

@ -20,6 +20,7 @@
package org.jivesoftware.smackx.workgroup.agent;
import org.jivesoftware.smackx.workgroup.MetaData;
import org.jivesoftware.smackx.workgroup.QueueUser;
import org.jivesoftware.smackx.workgroup.WorkgroupInvitation;
import org.jivesoftware.smackx.workgroup.WorkgroupInvitationListener;
import org.jivesoftware.smackx.workgroup.ext.history.AgentChatHistory;
@ -60,7 +61,7 @@ public class AgentSession {
private boolean online = false;
private Presence.Mode presenceMode;
private int maxChats;
private final Map<String, String> metaData;
private final Map<String, List<String>> metaData;
private Map<String, WorkgroupQueue> queues;
@ -96,7 +97,7 @@ public class AgentSession {
this.maxChats = -1;
this.metaData = new HashMap<String, String>();
this.metaData = new HashMap<String, List<String>>();
this.queues = new HashMap<String, WorkgroupQueue>();
@ -199,10 +200,10 @@ public class AgentSession {
*/
public void setMetaData(String key, String val) throws XMPPException {
synchronized (this.metaData) {
String oldVal = (String)this.metaData.get(key);
List<String> oldVals = metaData.get(key);
if ((oldVal == null) || (!oldVal.equals(val))) {
metaData.put(key, val);
if ((oldVals == null) || (!oldVals.get(0).equals(val))) {
oldVals.set(0, val);
setStatus(presenceMode, maxChats);
}
@ -218,7 +219,7 @@ public class AgentSession {
*/
public void removeMetaData(String key) throws XMPPException {
synchronized (this.metaData) {
String oldVal = (String)metaData.remove(key);
List<String> oldVal = metaData.remove(key);
if (oldVal != null) {
setStatus(presenceMode, maxChats);
@ -233,8 +234,8 @@ public class AgentSession {
* @return the meta data value associated with the key or <tt>null</tt> if the meta-data
* doesn't exist..
*/
public String getMetaData(String key) {
return (String)metaData.get(key);
public List<String> getMetaData(String key) {
return metaData.get(key);
}
/**
@ -642,7 +643,7 @@ public class AgentSession {
}
private void fireInvitationEvent(String groupChatJID, String sessionID, String body,
String from, Map metaData) {
String from, Map<String, List<String>> metaData) {
WorkgroupInvitation invitation = new WorkgroupInvitation(connection.getUser(), groupChatJID,
workgroupJID, sessionID, body, from, metaData);
@ -654,7 +655,7 @@ public class AgentSession {
}
private void fireQueueUsersEvent(WorkgroupQueue queue, WorkgroupQueue.Status status,
int averageWaitTime, Date oldestEntry, Set users) {
int averageWaitTime, Date oldestEntry, Set<QueueUser> users) {
synchronized (queueUsersListeners) {
for (QueueUsersListener listener : queueUsersListeners) {
if (status != null) {
@ -754,7 +755,7 @@ public class AgentSession {
MUCUser.Invite invite = mucUser != null ? mucUser.getInvite() : null;
if (invite != null && workgroupJID.equals(invite.getFrom())) {
String sessionID = null;
Map metaData = null;
Map<String, List<String>> metaData = null;
SessionID sessionIDExt = (SessionID)message.getExtension(SessionID.ELEMENT_NAME,
SessionID.NAMESPACE);
@ -980,7 +981,7 @@ public class AgentSession {
* @return Map a map of all metadata associated with the sessionID.
* @throws XMPPException if an error occurs while getting information from the server.
*/
public Map getChatMetadata(String sessionID) throws XMPPException {
public Map<String, List<String>> getChatMetadata(String sessionID) throws XMPPException {
ChatMetadata request = new ChatMetadata();
request.setType(IQ.Type.GET);
request.setTo(workgroupJID);

View file

@ -24,6 +24,7 @@ import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.packet.Packet;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
@ -44,7 +45,7 @@ public class Offer {
private String userID;
private String workgroupName;
private Date expiresDate;
private Map metaData;
private Map<String, List<String>> metaData;
private OfferContent content;
private boolean accepted = false;
@ -66,7 +67,7 @@ public class Offer {
*/
Offer(Connection conn, AgentSession agentSession, String userID,
String userJID, String workgroupName, Date expiresDate,
String sessionID, Map metaData, OfferContent content)
String sessionID, Map<String, List<String>> metaData, OfferContent content)
{
this.connection = conn;
this.session = agentSession;
@ -155,7 +156,7 @@ public class Offer {
*
* @return the offer meta-data.
*/
public Map getMetaData() {
public Map<String, List<String>> getMetaData() {
return this.metaData;
}

View file

@ -22,6 +22,8 @@ package org.jivesoftware.smackx.workgroup.agent;
import java.util.Date;
import java.util.Set;
import org.jivesoftware.smackx.workgroup.QueueUser;
public interface QueueUsersListener {
/**
@ -54,5 +56,5 @@ public interface QueueUsersListener {
* @param queue the workgroup queue.
* @param users the list of users waiting in the queue.
*/
public void usersUpdated(WorkgroupQueue queue, Set users);
public void usersUpdated(WorkgroupQueue queue, Set<QueueUser> users);
}

View file

@ -21,6 +21,8 @@ package org.jivesoftware.smackx.workgroup.agent;
import java.util.*;
import org.jivesoftware.smackx.workgroup.QueueUser;
/**
* A queue in a workgroup, which is a pool of agents that are routed a specific type of
* chat request.
@ -32,7 +34,7 @@ public class WorkgroupQueue {
private int averageWaitTime = -1;
private Date oldestEntry = null;
private Set users = Collections.EMPTY_SET;
private Set<QueueUser> users = Collections.emptySet();
private int maxChats = 0;
private int currentChats = 0;
@ -87,14 +89,14 @@ public class WorkgroupQueue {
*
* @return an Iterator for the users waiting in the queue.
*/
public Iterator getUsers() {
public Iterator<QueueUser> getUsers() {
if (users == null) {
return Collections.EMPTY_SET.iterator();
return new HashSet<QueueUser>().iterator();
}
return Collections.unmodifiableSet(users).iterator();
}
void setUsers(Set users) {
void setUsers(Set<QueueUser> users) {
this.users = users;
}

View file

@ -37,7 +37,7 @@ public class AgentChatHistory extends IQ {
private int maxSessions;
private long startDate;
private List agentChatSessions = new ArrayList();
private List<AgentChatSession> agentChatSessions = new ArrayList<AgentChatSession>();
public AgentChatHistory(String agentJID, int maxSessions, Date startDate) {
this.agentJID = agentJID;
@ -58,7 +58,7 @@ public class AgentChatHistory extends IQ {
agentChatSessions.add(chatSession);
}
public Collection getAgentChatSessions() {
public Collection<AgentChatSession> getAgentChatSessions() {
return agentChatSessions;
}

View file

@ -25,6 +25,7 @@ import org.jivesoftware.smack.provider.IQProvider;
import org.xmlpull.v1.XmlPullParser;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ChatMetadata extends IQ {
@ -51,13 +52,13 @@ public class ChatMetadata extends IQ {
}
private Map map = new HashMap();
private Map<String, List<String>> map = new HashMap<String, List<String>>();
public void setMetadata(Map metadata){
public void setMetadata(Map<String, List<String>> metadata){
this.map = metadata;
}
public Map getMetadata(){
public Map<String, List<String>> getMetadata(){
return map;
}
@ -94,7 +95,7 @@ public class ChatMetadata extends IQ {
chatM.setSessionID(parser.nextText());
}
else if (parser.getName().equals("metadata")) {
Map map = MetaDataUtils.parseMetaData(parser);
Map<String, List<String>> map = MetaDataUtils.parseMetaData(parser);
chatM.setMetadata(map);
}
}

View file

@ -19,6 +19,7 @@
package org.jivesoftware.smackx.workgroup.packet;
import java.util.List;
import java.util.Map;
import org.jivesoftware.smackx.workgroup.MetaData;
@ -41,7 +42,7 @@ public class MetaDataProvider implements PacketExtensionProvider {
*/
public PacketExtension parseExtension (XmlPullParser parser)
throws Exception {
Map metaData = MetaDataUtils.parseMetaData(parser);
Map<String, List<String>> metaData = MetaDataUtils.parseMetaData(parser);
return new MetaData(metaData);
}

View file

@ -31,6 +31,7 @@ import org.jivesoftware.smack.util.PacketParserUtils;
import org.xmlpull.v1.XmlPullParser;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
@ -49,7 +50,7 @@ public class OfferRequestProvider implements IQProvider {
int timeout = -1;
OfferContent content = null;
boolean done = false;
Map metaData = new HashMap();
Map<String, List<String>> metaData = new HashMap<String, List<String>>();
if (eventType != XmlPullParser.START_TAG) {
// throw exception
@ -111,11 +112,11 @@ public class OfferRequestProvider implements IQProvider {
private int timeout;
private String userID;
private String userJID;
private Map metaData;
private Map<String, List<String>> metaData;
private String sessionID;
private OfferContent content;
public OfferRequestPacket(String userJID, String userID, int timeout, Map metaData,
public OfferRequestPacket(String userJID, String userID, int timeout, Map<String, List<String>> metaData,
String sessionID, OfferContent content)
{
this.userJID = userJID;
@ -174,7 +175,7 @@ public class OfferRequestProvider implements IQProvider {
*
* @return meta-data associated with the offer.
*/
public Map getMetaData() {
public Map<String, List<String>> getMetaData() {
return this.metaData;
}

View file

@ -45,12 +45,12 @@ public class ChatSettings extends IQ {
*/
public static final int BOT_SETTINGS = 2;
private List settings;
private List<ChatSetting> settings;
private String key;
private int type = -1;
public ChatSettings() {
settings = new ArrayList();
settings = new ArrayList<ChatSetting>();
}
public ChatSettings(String key) {
@ -69,16 +69,16 @@ public class ChatSettings extends IQ {
settings.add(setting);
}
public Collection getSettings() {
public Collection<ChatSetting> getSettings() {
return settings;
}
public ChatSetting getChatSetting(String key) {
Collection col = getSettings();
Collection<ChatSetting> col = getSettings();
if (col != null) {
Iterator iter = col.iterator();
Iterator<ChatSetting> iter = col.iterator();
while (iter.hasNext()) {
ChatSetting chatSetting = (ChatSetting)iter.next();
ChatSetting chatSetting = iter.next();
if (chatSetting.getKey().equals(key)) {
return chatSetting;
}

View file

@ -29,7 +29,7 @@ import java.util.Map;
public class GenericSettings extends IQ {
private Map map = new HashMap();
private Map<String, String> map = new HashMap<String, String>();
private String query;
@ -41,11 +41,11 @@ public class GenericSettings extends IQ {
this.query = query;
}
public Map getMap() {
public Map<String, String> getMap() {
return map;
}
public void setMap(Map map) {
public void setMap(Map<String, String> map) {
this.map = map;
}

View file

@ -58,9 +58,8 @@ public class Workgroup {
private String workgroupJID;
private Connection connection;
private boolean inQueue;
private List invitationListeners;
private List queueListeners;
private List siteInviteListeners;
private List<WorkgroupInvitationListener> invitationListeners;
private List<QueueListener> queueListeners;
private int queuePosition = -1;
private int queueRemainingTime = -1;
@ -84,9 +83,8 @@ public class Workgroup {
this.workgroupJID = workgroupJID;
this.connection = connection;
inQueue = false;
invitationListeners = new ArrayList();
queueListeners = new ArrayList();
siteInviteListeners = new ArrayList();
invitationListeners = new ArrayList<WorkgroupInvitationListener>();
queueListeners = new ArrayList<QueueListener>();
// Register as a queue listener for internal usage by this instance.
addQueueListener(new QueueListener() {
@ -378,7 +376,7 @@ public class Workgroup {
* that a connection failure occured or that the server explicitly rejected the
* request to join the queue.
*/
public void joinQueue(Map metadata, String userID) throws XMPPException {
public void joinQueue(Map<String,Object> metadata, String userID) throws XMPPException {
// If already in the queue ignore the join request.
if (inQueue) {
throw new IllegalStateException("Already in queue " + workgroupJID);
@ -386,10 +384,10 @@ public class Workgroup {
// Build dataform from metadata
Form form = new Form(Form.TYPE_SUBMIT);
Iterator iter = metadata.keySet().iterator();
Iterator<String> iter = metadata.keySet().iterator();
while (iter.hasNext()) {
String name = (String)iter.next();
String value = (String)metadata.get(name).toString();
String name = iter.next();
String value = metadata.get(name).toString();
String escapedName = StringUtils.escapeForXML(name);
String escapedValue = StringUtils.escapeForXML(value);
@ -489,8 +487,8 @@ public class Workgroup {
private void fireInvitationEvent(WorkgroupInvitation invitation) {
synchronized (invitationListeners) {
for (Iterator i = invitationListeners.iterator(); i.hasNext();) {
WorkgroupInvitationListener listener = (WorkgroupInvitationListener)i.next();
for (Iterator<WorkgroupInvitationListener> i = invitationListeners.iterator(); i.hasNext();) {
WorkgroupInvitationListener listener = i.next();
listener.invitationReceived(invitation);
}
}
@ -498,8 +496,8 @@ public class Workgroup {
private void fireQueueJoinedEvent() {
synchronized (queueListeners) {
for (Iterator i = queueListeners.iterator(); i.hasNext();) {
QueueListener listener = (QueueListener)i.next();
for (Iterator<QueueListener> i = queueListeners.iterator(); i.hasNext();) {
QueueListener listener = i.next();
listener.joinedQueue();
}
}
@ -507,8 +505,8 @@ public class Workgroup {
private void fireQueueDepartedEvent() {
synchronized (queueListeners) {
for (Iterator i = queueListeners.iterator(); i.hasNext();) {
QueueListener listener = (QueueListener)i.next();
for (Iterator<QueueListener> i = queueListeners.iterator(); i.hasNext();) {
QueueListener listener = i.next();
listener.departedQueue();
}
}
@ -516,8 +514,8 @@ public class Workgroup {
private void fireQueuePositionEvent(int currentPosition) {
synchronized (queueListeners) {
for (Iterator i = queueListeners.iterator(); i.hasNext();) {
QueueListener listener = (QueueListener)i.next();
for (Iterator<QueueListener> i = queueListeners.iterator(); i.hasNext();) {
QueueListener listener = i.next();
listener.queuePositionUpdated(currentPosition);
}
}
@ -525,8 +523,8 @@ public class Workgroup {
private void fireQueueTimeEvent(int secondsRemaining) {
synchronized (queueListeners) {
for (Iterator i = queueListeners.iterator(); i.hasNext();) {
QueueListener listener = (QueueListener)i.next();
for (Iterator<QueueListener> i = queueListeners.iterator(); i.hasNext();) {
QueueListener listener = i.next();
listener.queueWaitTimeUpdated(secondsRemaining);
}
}
@ -560,7 +558,7 @@ public class Workgroup {
MUCUser.Invite invite = mucUser != null ? mucUser.getInvite() : null;
if (invite != null && workgroupJID.equals(invite.getFrom())) {
String sessionID = null;
Map metaData = null;
Map<String, List<String>> metaData = null;
pe = msg.getExtension(SessionID.ELEMENT_NAME,
SessionID.NAMESPACE);

View file

@ -17,7 +17,8 @@
package org.jivesoftware.smackx.workgroup.util;
import java.lang.reflect.Method;
import java.util.*;
import java.util.ArrayList;
import java.util.ListIterator;
/**
* This class is a very flexible event dispatcher which implements Runnable so that it can
@ -34,7 +35,7 @@ import java.util.*;
public class ListenerEventDispatcher
implements Runnable {
protected transient ArrayList triplets;
protected transient ArrayList<TripletContainer> triplets;
protected transient boolean hasFinishedDispatching;
protected transient boolean isRunning;
@ -42,7 +43,7 @@ public class ListenerEventDispatcher
public ListenerEventDispatcher () {
super();
this.triplets = new ArrayList();
this.triplets = new ArrayList<TripletContainer>();
this.hasFinishedDispatching = false;
this.isRunning = false;
@ -81,13 +82,13 @@ public class ListenerEventDispatcher
}
public void run() {
ListIterator li = null;
ListIterator<TripletContainer> li = null;
this.isRunning = true;
li = this.triplets.listIterator();
while (li.hasNext()) {
TripletContainer tc = (TripletContainer)li.next();
TripletContainer tc = li.next();
try {
tc.getListenerMethod().invoke(tc.getListenerInstance(), tc.getMethodArguments());

View file

@ -40,14 +40,14 @@ public class MetaDataUtils {
* @throws XmlPullParserException if an error occurs while parsing the XML.
* @throws IOException if an error occurs while parsing the XML.
*/
public static Map parseMetaData(XmlPullParser parser) throws XmlPullParserException, IOException {
public static Map<String, List<String>> parseMetaData(XmlPullParser parser) throws XmlPullParserException, IOException {
int eventType = parser.getEventType();
// If correctly positioned on an opening meta-data tag, parse meta-data.
if ((eventType == XmlPullParser.START_TAG)
&& parser.getName().equals(MetaData.ELEMENT_NAME)
&& parser.getNamespace().equals(MetaData.NAMESPACE)) {
Map metaData = new Hashtable();
Map<String, List<String>> metaData = new Hashtable<String, List<String>>();
eventType = parser.nextTag();
@ -58,11 +58,11 @@ public class MetaDataUtils {
String value = parser.nextText();
if (metaData.containsKey(name)) {
List values = (List)metaData.get(name);
List<String> values = metaData.get(name);
values.add(value);
}
else {
List values = new ArrayList();
List<String> values = new ArrayList<String>();
values.add(value);
metaData.put(name, values);
}
@ -73,34 +73,26 @@ public class MetaDataUtils {
return metaData;
}
return Collections.EMPTY_MAP;
return Collections.emptyMap();
}
/**
* Serializes a Map of String name/value pairs into the meta-data XML format.
*
* @param metaData the Map of meta-data.
* @param metaData the Map of meta-data as Map&lt;String,List&lt;String>>
* @return the meta-data values in XML form.
*/
public static String serializeMetaData(Map metaData) {
public static String serializeMetaData(Map<String, List<String>> metaData) {
StringBuilder buf = new StringBuilder();
if (metaData != null && metaData.size() > 0) {
buf.append("<metadata xmlns=\"http://jivesoftware.com/protocol/workgroup\">");
for (Iterator i = metaData.keySet().iterator(); i.hasNext();) {
Object key = i.next();
Object value = metaData.get(key);
if (value instanceof List) {
List values = (List)metaData.get(key);
for (Iterator it = values.iterator(); it.hasNext();) {
String v = (String)it.next();
buf.append("<value name=\"").append(key).append("\">");
buf.append(StringUtils.escapeForXML(v));
buf.append("</value>");
}
}
else if (value instanceof String) {
for (Iterator<String> i = metaData.keySet().iterator(); i.hasNext();) {
String key = i.next();
List<String> value = metaData.get(key);
for (Iterator<String> it = value.iterator(); it.hasNext();) {
String v = it.next();
buf.append("<value name=\"").append(key).append("\">");
buf.append(StringUtils.escapeForXML((String)value));
buf.append(StringUtils.escapeForXML(v));
buf.append("</value>");
}
}

View file

@ -240,8 +240,6 @@ public final class ModelUtil {
final long MS_IN_AN_HOUR = 1000 * 60 * 60;
final long MS_IN_A_MINUTE = 1000 * 60;
final long MS_IN_A_SECOND = 1000;
Date currentTime = new Date();
long numDays = diff / MS_IN_A_DAY;
diff = diff % MS_IN_A_DAY;
long numHours = diff / MS_IN_AN_HOUR;
diff = diff % MS_IN_AN_HOUR;
@ -249,7 +247,6 @@ public final class ModelUtil {
diff = diff % MS_IN_A_MINUTE;
long numSeconds = diff / MS_IN_A_SECOND;
diff = diff % MS_IN_A_SECOND;
long numMilliseconds = diff;
StringBuilder buf = new StringBuilder();
if (numHours > 0) {
@ -270,8 +267,8 @@ public final class ModelUtil {
/**
* Build a List of all elements in an Iterator.
*/
public static List iteratorAsList(Iterator i) {
ArrayList list = new ArrayList(10);
public static <T> List<T> iteratorAsList(Iterator<T> i) {
ArrayList<T> list = new ArrayList<T>(10);
while (i.hasNext()) {
list.add(i.next());
}
@ -281,18 +278,18 @@ public final class ModelUtil {
/**
* Creates an Iterator that is the reverse of a ListIterator.
*/
public static Iterator reverseListIterator(ListIterator i) {
return new ReverseListIterator(i);
public static <T> Iterator<T> reverseListIterator(ListIterator<T> i) {
return new ReverseListIterator<T>(i);
}
}
/**
* An Iterator that is the reverse of a ListIterator.
*/
class ReverseListIterator implements Iterator {
private ListIterator _i;
class ReverseListIterator<T> implements Iterator<T> {
private ListIterator<T> _i;
ReverseListIterator(ListIterator i) {
ReverseListIterator(ListIterator<T> i) {
_i = i;
while (_i.hasNext())
_i.next();
@ -302,13 +299,14 @@ class ReverseListIterator implements Iterator {
return _i.hasPrevious();
}
public Object next() {
public T next() {
return _i.previous();
}
public void remove() {
_i.remove();
}
}