List of usage examples for org.apache.commons.lang3 ArrayUtils indexOf
public static int indexOf(final boolean[] array, final boolean valueToFind, int startIndex)
Finds the index of the given value in the array starting at the given index.
This method returns #INDEX_NOT_FOUND ( -1 ) for a null input array.
A negative startIndex is treated as zero.
From source file:edu.fullerton.jspWebUtils.PageItem.java
public void addEvent(String evt, String call) throws WebUtilException { int idx = ArrayUtils.indexOf(events, evt, 0); if (idx == ArrayUtils.INDEX_NOT_FOUND) { throw new WebUtilException("Unknown event.(" + evt + ")"); } else {// w ww. j a va 2 s.c om if (event == null) { event = new TreeMap<String, String>(); } if (event.containsKey(evt)) { throw new WebUtilException("Event: " + evt + " already assigned"); } event.put(evt, call); } }
From source file:net.fenyo.mail4hotspot.dns.DnsListener.java
private byte[] handle(final byte query[], final Inet4Address address) throws GeneralException { boolean txt = false; boolean txtwithb64 = false; byte retvalues[] = null; if (query.length <= DNSFORMAT_DATAOFFSET) throw new GeneralException("datagram too short"); if ((query[DNSFORMAT_QDCOUNT_MSB] << 8) + query[DNSFORMAT_QDCOUNT_LSB] != 1) throw new GeneralException("invalid query count"); if ((query[DNSFORMAT_FLAGS_MSB] & 2) != 0) throw new GeneralException("truncated"); final VersionAndDomain vad = getVersionAndDomain(query); final String query_string = vad.domain; final String version_string = vad.version; // log.debug("version string: " + version_string); // log.debug("query string: " + query_string); // log.debug("label[0]: " + getLabel(query_string, 0)); final String label0 = getLabel(query_string, 0); if (label0.toLowerCase().equals("id-00000000")) { final String label1 = getLabel(query_string, 1); if (label1 != null && label1.toLowerCase().matches("^cn-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$")) { int cnt = new Integer(label1.substring(3)); if (cnt > 192) throw new GeneralException("ping request too long"); retvalues = new byte[cnt]; for (int i = 0; i < cnt; i++) retvalues[i] = (byte) i; } else//from w w w .ja va 2 s. c o m retvalues = new byte[] { 'E', 1 }; // 'E'rror 1 } else if (label0.toLowerCase().equals("id-00000001")) { final String label1 = getLabel(query_string, 1); if (label1 != null && label1.toLowerCase().matches("^rn-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$")) { final String label2 = getLabel(query_string, 2); if (label2 != null && label2.toLowerCase().matches("^sz-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$")) { int size = new Integer(label2.substring(3)); final int msg_id = MsgFactory.createMsg(size); retvalues = new byte[] { (byte) ((msg_id & 0x00ff0000) >> 16), (byte) ((msg_id & 0x0000ff00) >> 8), (byte) (msg_id & 0x000000ff) }; } else retvalues = new byte[] { 'E', 2 }; // 'E'rror 2 } else retvalues = new byte[] { 'E', 3 }; // 'E'rror 3 } else if (label0.toLowerCase().matches("^id-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$")) { final int msg_id = new Integer(label0.substring(3)); final String label1 = getLabel(query_string, 1); // requte max : 131 car : retry-001.rn-75706993.bf-00696e697469616c69c2a7436f6e6e656374536f636b6574c2a733313330.wr-00000000.id-00731058.v2.tun.vpnoverdns.com // longueur max d'un nom de domaine : 250 (certains softs vont plus loin mais pas tous - cf gethostname) // 2 car par octet de donnes // chaque bf cot 64 car (en incluant .bf-) // donc on met plusieurs bf // (250-131)/64 = 1,86 // on peut en mettre 1,8 de plus // a veut dire 3 bf au total mais pas 3 pleins : // 3 bf concurrence de 250 car // 0 bf : 67 car // 250 = 131-64 + 2*64 + 55 // 55 impair => remplac par 54 // Donc deux de 64 (2x30 octets) et 1 de 54 (25 octets) // donc 85 octets au lieu de 30 // donc 2,8 fois plus rapide if (label1 != null && label1.toLowerCase().matches("^wr-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$")) { final int pos = new Integer(label1.substring(3)); final String label2 = getLabel(query_string, 2); if (label2 != null && label2.toLowerCase().matches("^bf-([0-9a-f][0-9a-f])+$")) { final String content = label2.substring(3); if (MsgFactory.msgExists(msg_id) == false) { retvalues = new byte[] { 'E', 8 }; // 'E'rror 8; // log.info("Error 8-1: msg_id=" + msg_id); } else retvalues = MsgFactory.getMsg(msg_id).write(pos, content, advancedServices, address); } else retvalues = new byte[] { 'E', 4 }; // 'E'rror 4 if (retvalues != null) { final String label3 = getLabel(query_string, 3); if (label3 != null && label3.toLowerCase().matches("^bf-([0-9a-f][0-9a-f])+$")) { final String content = label3.substring(3); if (MsgFactory.msgExists(msg_id) == false) { retvalues = new byte[] { 'E', 8 }; // 'E'rror 8; // log.info("Error 8-2: msg_id=" + msg_id); } else retvalues = MsgFactory.getMsg(msg_id).write(pos + 30, content, advancedServices, address); } } if (retvalues != null) { final String label4 = getLabel(query_string, 4); if (label4 != null && label4.toLowerCase().matches("^bf-([0-9a-f][0-9a-f])+$")) { final String content = label4.substring(3); if (MsgFactory.msgExists(msg_id) == false) { retvalues = new byte[] { 'E', 8 }; // 'E'rror 8; // log.info("Error 8-3: msg_id=" + msg_id); } else retvalues = MsgFactory.getMsg(msg_id).write(pos + 60, content, advancedServices, address); } } } else if (label1 != null && label1.toLowerCase().matches("^ck-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$")) { if (MsgFactory.msgExists(msg_id) == false) retvalues = new byte[] { 'E', 9 }; // 'E'rror 9; else { final Msg msg = MsgFactory.getMsg(msg_id); if (msg.isProcessed() == false) { // message pas encore trait, on demande au client de refaire un ck (check) // log.debug(msg.debugContent() + " - " + version_string + "." + query_string); retvalues = new byte[] { 'E', 10 }; // 'E'rror 10 } else { final byte len0 = (byte) (msg.outputLength() >> 16); final byte len1 = (byte) ((msg.outputLength() >> 8) & 255); final byte len2 = (byte) (msg.outputLength() & 255); retvalues = new byte[] { 'L', len0, len1, len2 }; // 'L'ength fournie en rponse } } } else if (label1 != null && label1.toLowerCase().matches("^r[dxy]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$")) { if (label1.toLowerCase().startsWith("rx") || label1.toLowerCase().startsWith("ry")) txt = true; if (label1.toLowerCase().startsWith("ry")) txtwithb64 = true; final String label2 = getLabel(query_string, 2); final int pos = new Integer(label1.substring(3)); if (label2 != null && label2.toLowerCase().matches("^ln-[0-9][0-9][0-9]$")) { final int size = new Integer(label2.substring(3)); if (MsgFactory.msgExists(msg_id) == false) retvalues = new byte[] { 'E', 11 }; // 'E'rror 11 else { final Msg msg = MsgFactory.getMsg(msg_id); if (msg.isProcessed() == false) retvalues = new byte[] { 'E', 12 }; // 'E'rror 12 // bug dans le protocole v0 corrig dans les versions suivantes : si on lit 2 octets de la partie compresse (typiquement les 2 derniers du buffer compress) et que le premier des deux est E, on signale une erreur involontairement else { if (version_string.toLowerCase().equals("v0") || version_string.toLowerCase().equals("v1")) retvalues = msg.read(pos, size); else { byte[] content = msg.read(pos, size); if (txtwithb64) { // avec Java8 // content = Base64.getEncoder().encode(content); // avec apache commons-codec content = org.apache.commons.codec.binary.Base64.encodeBase64(content); retvalues = new byte[content.length + 1]; // put a '0' (48) instead of 0 if base64 encoding, since base64 encoding means non-char bytes (like 0) are not handled retvalues[0] = '0'; for (int i = 0; i < content.length; i++) retvalues[i + 1] = content[i]; } else { retvalues = new byte[size + 1]; // add a 0 to the beginning of the returned byte array to be sure it can not start with 'E', so it can be distinguished from any error message on the client side retvalues[0] = 0; for (int i = 0; i < size; i++) retvalues[i + 1] = content[i]; } } } // pour tester l'erreur involontaire, dcommenter : // retvalues = new byte [] { 'E', 12 }; // Ca cre une erreur dans perl la ligne 'die " remote error for $names[$i]: try $tries[$i]: ".chr($msgbytes[0]).$msgbytes[1]."\n"' } } else retvalues = new byte[] { 'E', 13 }; // 'E'rror 13 } else if (label1 != null && label1.toLowerCase().matches("^ac$")) { if (MsgFactory.msgExists(msg_id) == false) retvalues = new byte[] { 'E', 14 }; // 'E'rror 14 else { MsgFactory.removeMsg(msg_id); retvalues = new byte[] { 'E', 0 }; // 'E'rror 0 == OK } } else retvalues = new byte[] { 'E', 5 }; // 'E'rror 5 } else retvalues = new byte[] { 'E', 6 }; // 'E'rror 6 if (retvalues == null) retvalues = new byte[] { 'E', 7 }; // 'E'rror 7 if (txt) { final int ntxtstrings = 1 + (retvalues.length - 1) / 255; final int rr_length = 2 /* pointeur sur le nom de domaine de la query */ + 10 /* TYPE + CLASS + TTL + RDLENGTH */ + ntxtstrings + retvalues.length; final int answer_length = ArrayUtils.indexOf(query, (byte) 0, DNSFORMAT_DATAOFFSET) /* nom de domaine de la query */ + 1 /* '\0' */ + 2 /* QTYPE */ + 2 /* QCLASS */ + rr_length; byte answer[] = new byte[answer_length]; answer[DNSFORMAT_ID_MSB] = query[DNSFORMAT_ID_MSB]; answer[DNSFORMAT_ID_LSB] = query[DNSFORMAT_ID_LSB]; answer[DNSFORMAT_FLAGS_LSB] = 0; answer[DNSFORMAT_FLAGS_MSB] = (byte) (((byte) (query[DNSFORMAT_FLAGS_MSB] | 128 /* QR: response */ | 4 /* AA */)) & (byte) ~2 /* TC */); answer[DNSFORMAT_QDCOUNT_MSB] = 0; answer[DNSFORMAT_QDCOUNT_LSB] = 1; answer[DNSFORMAT_ANCOUNT_MSB] = 0; answer[DNSFORMAT_ANCOUNT_LSB] = 1; answer[DNSFORMAT_NSCOUNT_MSB] = 0; answer[DNSFORMAT_NSCOUNT_LSB] = 0; answer[DNSFORMAT_ARCOUNT_MSB] = 0; answer[DNSFORMAT_ARCOUNT_LSB] = 0; for (int i = DNSFORMAT_DATAOFFSET; i < DNSFORMAT_DATAOFFSET + 1 /* octet de longueur du premier label */ + version_string.length() + 1 /* '.' */ + query_string.length() + 1 /* '.' */ + DNSDOMAIN.length() + 1 /* '\0' */ + 4 /* TYPE + CLASS */; i++) answer[i] = query[i]; int current_offset = DNSFORMAT_DATAOFFSET + 1 /* octet de longueur du premier label */ + version_string.length() + 1 /* '.' */ + query_string.length() + 1 /* '.' */ + DNSDOMAIN.length() + 1 /* '\0' */ + 4 /* QTYPE + QCLASS */; answer[current_offset++] = (DNSFORMAT_DATAOFFSET >> 8) + (byte) 0xc0; answer[current_offset++] = DNSFORMAT_DATAOFFSET & 0xff; answer[current_offset++] = 0x00; answer[current_offset++] = 0x10 /* TYPE */; answer[current_offset++] = 0x00; answer[current_offset++] = 0x01 /* CLASS */; answer[current_offset++] = 0x00; answer[current_offset++] = 0x00; answer[current_offset++] = 0x00; answer[current_offset++] = 0x00 /* TTL */; answer[current_offset++] = (byte) ((ntxtstrings + retvalues.length) >> 8); answer[current_offset++] = (byte) ((ntxtstrings + retvalues.length) & 0xff); for (int i = 0; i < retvalues.length; i++) { if ((i % 255) == 0) answer[current_offset++] = (byte) (Math.min(255, retvalues.length - i)); answer[current_offset++] = retvalues[i]; } return answer; } else { // calculer la taille de la section requtes // retvalues length: 1 2 3 4 5 6 7 8 9 10 ... // nombre de in a: 1 1 1 2 2 2 3 3 3 4 ... // retvalues.length vaut au max optmaxread (ou optmaxread + 1 partir de la v2) dans perl - il faut trouver l'optimal de optmaxread et le positionner dans perl // Par dfaut, c'est 48 donc ((48 + 1 /* v2 */) + 2) / 3 == 17 RR par rponse max. final int nanswers = (retvalues.length + 2) / 3; // 192 (3 * 64) bytes max per answer if (nanswers > 64) throw new GeneralException("too many answers (" + nanswers + ")"); final int rr_length = 2 /* pointeur sur le nom de domaine de la query */ + 10 /* TYPE + CLASS + TTL + RDLENGTH */ + 4 /* taille de l'adresse IP rsultante */; final int answer_length = ArrayUtils.indexOf(query, (byte) 0, DNSFORMAT_DATAOFFSET) /* nom de domaine de la query */ + 1 /* '\0' */ + 2 /* QTYPE */ + 2 /* QCLASS */ + rr_length * nanswers; byte answer[] = new byte[answer_length]; answer[DNSFORMAT_ID_MSB] = query[DNSFORMAT_ID_MSB]; answer[DNSFORMAT_ID_LSB] = query[DNSFORMAT_ID_LSB]; answer[DNSFORMAT_FLAGS_LSB] = 0; answer[DNSFORMAT_FLAGS_MSB] = (byte) (((byte) (query[DNSFORMAT_FLAGS_MSB] | 128 /* QR: response */ | 4 /* AA */)) & (byte) ~2 /* TC */); answer[DNSFORMAT_QDCOUNT_MSB] = 0; answer[DNSFORMAT_QDCOUNT_LSB] = 1; answer[DNSFORMAT_ANCOUNT_MSB] = 0; answer[DNSFORMAT_ANCOUNT_LSB] = (byte) nanswers; answer[DNSFORMAT_NSCOUNT_MSB] = 0; answer[DNSFORMAT_NSCOUNT_LSB] = 0; answer[DNSFORMAT_ARCOUNT_MSB] = 0; answer[DNSFORMAT_ARCOUNT_LSB] = 0; for (int i = DNSFORMAT_DATAOFFSET; i < DNSFORMAT_DATAOFFSET + 1 /* octet de longueur du premier label */ + version_string.length() + 1 /* '.' */ + query_string.length() + 1 /* '.' */ + DNSDOMAIN.length() + 1 /* '\0' */ + 4 /* TYPE + CLASS */; i++) answer[i] = query[i]; byte rr[] = { (DNSFORMAT_DATAOFFSET >> 8) + (byte) 0xc0, DNSFORMAT_DATAOFFSET & 0xff, 0x00, 0x01 /* TYPE */, 0x00, 0x01 /* CLASS */, 0, 0, 0, 0 /* TTL */, 0, 4 /* RDLENGTH */, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff /* IP address */ }; int current_offset = DNSFORMAT_DATAOFFSET + 1 /* octet de longueur du premier label */ + version_string.length() + 1 /* '.' */ + query_string.length() + 1 /* '.' */ + DNSDOMAIN.length() + 1 /* '\0' */ + 4 /* QTYPE + QCLASS */; int retindex = 0; for (int ans_idx = 0; ans_idx < nanswers; ans_idx++) { int ncar = 0; if (retindex < retvalues.length) { rr[rr.length - 3] = retvalues[retindex]; ncar++; } retindex++; if (retindex < retvalues.length) { rr[rr.length - 2] = retvalues[retindex]; ncar++; } retindex++; if (retindex < retvalues.length) { rr[rr.length - 1] = retvalues[retindex]; ncar++; } retindex++; rr[rr.length - 4] = (byte) (((byte) ans_idx) | (byte) (ncar << 6)); for (int i = 0; i < rr.length; i++) answer[current_offset++] = rr[i]; } return answer; } }
From source file:com.gargoylesoftware.htmlunit.util.EncodingSniffer.java
/** * Extracts an encoding from the specified <tt>Content-Type</tt> value using * <a href="http://ietfreport.isoc.org/idref/draft-abarth-mime-sniff/">the IETF algorithm</a>; if * no encoding is found, this method returns {@code null}. * * @param s the <tt>Content-Type</tt> value to search for an encoding * @return the encoding found in the specified <tt>Content-Type</tt> value, or {@code null} if no * encoding was found/*from www . j a va2s. com*/ */ static String extractEncodingFromContentType(final String s) { if (s == null) { return null; } final byte[] bytes = s.getBytes(Charsets.US_ASCII); int i; for (i = 0; i < bytes.length; i++) { if (matches(bytes, i, CHARSET_START)) { i += CHARSET_START.length; break; } } if (i == bytes.length) { return null; } while (bytes[i] == 0x09 || bytes[i] == 0x0A || bytes[i] == 0x0C || bytes[i] == 0x0D || bytes[i] == 0x20) { i++; if (i == bytes.length) { return null; } } if (bytes[i] != '=') { return null; } i++; if (i == bytes.length) { return null; } while (bytes[i] == 0x09 || bytes[i] == 0x0A || bytes[i] == 0x0C || bytes[i] == 0x0D || bytes[i] == 0x20) { i++; if (i == bytes.length) { return null; } } if (bytes[i] == '"') { if (bytes.length <= i + 1) { return null; } final int index = ArrayUtils.indexOf(bytes, (byte) '"', i + 1); if (index == -1) { return null; } final String charset = new String(ArrayUtils.subarray(bytes, i + 1, index), Charsets.US_ASCII); return isSupportedCharset(charset) ? charset : null; } if (bytes[i] == '\'') { if (bytes.length <= i + 1) { return null; } final int index = ArrayUtils.indexOf(bytes, (byte) '\'', i + 1); if (index == -1) { return null; } final String charset = new String(ArrayUtils.subarray(bytes, i + 1, index), Charsets.US_ASCII); return isSupportedCharset(charset) ? charset : null; } int end = skipToAnyOf(bytes, i, new byte[] { 0x09, 0x0A, 0x0C, 0x0D, 0x20, 0x3B }); if (end == -1) { end = bytes.length; } final String charset = new String(ArrayUtils.subarray(bytes, i, end), Charsets.US_ASCII); return isSupportedCharset(charset) ? charset : null; }
From source file:com.gargoylesoftware.htmlunit.util.EncodingSniffer.java
/** * Searches the specified XML content for an XML declaration and returns the encoding if found, * otherwise returns {@code null}.//from ww w .j a v a 2 s. c o m * * @param bytes the XML content to sniff * @return the encoding of the specified XML content, or {@code null} if it could not be determined */ static String sniffEncodingFromXmlDeclaration(final byte[] bytes) { String encoding = null; if (bytes.length > 5 && XML_DECLARATION_PREFIX[0] == bytes[0] && XML_DECLARATION_PREFIX[1] == bytes[1] && XML_DECLARATION_PREFIX[2] == bytes[2] && XML_DECLARATION_PREFIX[3] == bytes[3] && XML_DECLARATION_PREFIX[4] == bytes[4] && XML_DECLARATION_PREFIX[5] == bytes[5]) { final int index = ArrayUtils.indexOf(bytes, (byte) '?', 2); if (index + 1 < bytes.length && bytes[index + 1] == '>') { final String declaration = new String(bytes, 0, index + 2, Charsets.US_ASCII); int start = declaration.indexOf("encoding"); if (start != -1) { start += 8; char delimiter; outer: while (true) { switch (declaration.charAt(start)) { case '"': case '\'': delimiter = declaration.charAt(start); start = start + 1; break outer; default: start++; } } final int end = declaration.indexOf(delimiter, start); encoding = declaration.substring(start, end); } } } if (encoding != null && !isSupportedCharset(encoding)) { encoding = null; } if (encoding != null && LOG.isDebugEnabled()) { LOG.debug("Encoding found in XML declaration: '" + encoding + "'."); } return encoding; }