/*--- formatted by Jindent 2.1, (www.c-lab.de/~jindent) ---*/
/**
* ***************************************************************
* The LEAP libraries, when combined with certain JADE platform components,
* provide a run-time environment for enabling FIPA agents to execute on
* lightweight devices running Java. LEAP and JADE teams have jointly
* designed the API for ease of integration and hence to take advantage
* of these dual developments and extensions so that users only see
* one development platform and a
* single homogeneous set of APIs. Enabling deployment to a wide range of
* devices whilst still having access to the full development
* environment and functionalities that JADE provides.
* Copyright (C) 2001 Telecom Italia LAB S.p.A.
*
* GNU Lesser General Public License
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation,
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
* **************************************************************
*/
package jade.imtp.leap.JICP;
//#MIDP_EXCLUDE_FILE
import jade.core.Profile;
import jade.core.ProfileException;
import jade.core.Specifier;
import jade.util.leap.*;
import jade.imtp.leap.*;
import jade.mtp.TransportAddress;
import java.util.Vector;
import java.util.Enumeration;
/**
* Class declaration
* @author Giovanni Caire - TILAB
*/
public class MaskableJICPPeer extends JICPPeer {
private Vector masks = new Vector();
/**
* Default constructor
*/
public MaskableJICPPeer() {
super();
}
/**
* Start listening for internal platform messages on the specified port
*/
public TransportAddress activate(ICP.Listener l, String peerID, Profile p) throws ICPException {
// Initialize masks
try {
StringBuffer sb = null;
int idLength;
if (peerID != null) {
sb = new StringBuffer(peerID);
sb.append('-');
idLength = sb.length();
}
else {
sb = new StringBuffer();
idLength = 0;
}
// Unreachable networks
sb.append(JICPProtocol.UNREACHABLE_KEY);
List ls = p.getSpecifiers(sb.toString());
if (ls != null) {
Iterator it = ls.iterator();
while (it.hasNext()) {
Specifier s = (Specifier) it.next();
// Note that in this case the className field of a specifier does
// not have anything to do with a class.
updateMask(s.getClassName());
}
}
}
catch (ProfileException pe) {
throw new ICPException("Profile error. "+pe.getMessage());
}
return super.activate(l, peerID, p);
}
/**
* deliver a serialized command to a given transport address
*/
public byte[] deliverCommand(TransportAddress ta, byte[] payload, boolean requireFreshConnection) throws ICPException {
if (!isMasked(ta.getHost())) {
return super.deliverCommand(ta, payload, requireFreshConnection);
}
else {
throw new ICPException("Destination masked");
}
}
/**
* Method declaration
*
* @param m
*
* @throws ICPException
*
* @see
*/
private void updateMask(String m) throws ICPException {
int[] mask = parseIP(m);
masks.addElement(mask);
}
/**
* Method declaration
*
* @param host
*
* @return
*
* @see
*/
private boolean isMasked(String host) {
try {
int[] ipAddr = parseIP(host);
Enumeration e = masks.elements();
// Loop on mask items
while (e.hasMoreElements()) {
int[] mask = (int[]) e.nextElement();
// Check whether the host is masked by this mask item
boolean masked = true;
for (int i = 0; i < mask.length; ++i) {
if (ipAddr[i] != mask[i]) {
masked = false;
break;
}
}
if (masked) {
return true;
}
}
return false;
}
catch (ICPException icpe) {
// If the host is not in the form a.b.c.d --> it cannot be masked
return false;
}
}
/**
* Method declaration
*
* @param addr
*
* @return
*
* @throws ICPException
*
* @see
*/
private int[] parseIP(String addr) throws ICPException {
int[] abcd = new int[4];
int first = 0;
int n = 0;
try {
boolean stop = false;
while (n < 3 &&!stop) {
int last = addr.indexOf('.', first);
if (last < 0) {
last = addr.length();
stop = true;
}
String tmp = addr.substring(first, last);
abcd[n] = Integer.parseInt(tmp);
first = last+1;
n++;
}
}
catch (NumberFormatException nfe) {
}
if (n == 0) {
throw new ICPException("Wrong mask");
}
int[] ipAddr = new int[n];
for (int i = 0; i < n; ++i) {
ipAddr[i] = abcd[i];
}
abcd = null;
return ipAddr;
}
}