001: /*
002: * Copyright 2001 Sun Microsystems, Inc. All rights reserved.
003: * PROPRIETARY/CONFIDENTIAL. Use of this product is subject to license terms.
004: */
005:
006: package com.sun.portal.search.robot;
007:
008: import java.util.*;
009: import java.net.*;
010: import com.sun.portal.search.util.PBlock;
011:
012: public class FilterRuleset {
013: public String id;
014: public boolean enable = false;
015: public boolean onMatch = false;
016: public boolean onExit = false;
017: public String nickname;
018: public ArrayList servers = null;
019: public ArrayList domains = null;
020: public String ports = "";
021: public ArrayList starting_points = null;
022: public ArrayList protocols = null;
023: public ArrayList rules = new ArrayList();
024: public ArrayList dns_cnames = null; //dns-alias-to-cname
025: public String database = null;
026: public ArrayList comments = null;
027: public ArrayList pre_comments = null;
028:
029: RobotConfig config = null;
030: public static final int TYPE_SERVERS = 1;
031: public static final int TYPE_DOMAINS = 2;
032: public static String Types[] = { "Site", "http", "https", "ftp",
033: "file", "domain" };
034: public static String ProtocolTypes[] = { "http", "file", "ftp",
035: "https" };
036: public static String ProtocolType_Labels[] = { "Web Server",
037: "File Server", "FTP Server", "Secure Web Server" };
038:
039: ArrayList stringToArrayList(String s, String delim) {
040: ArrayList ls = null;
041: if (s == null)
042: return null;
043: StringTokenizer st = new StringTokenizer(s, delim);
044: while (st.hasMoreTokens()) {
045: if (ls == null) {
046: ls = new ArrayList();
047: }
048: ls.add(st.nextToken().trim());
049: }
050: return ls;
051: }
052:
053: ArrayList stringToArrayList1(String s, String delim) {
054: if (s == null)
055: return null;
056: ArrayList ls = new ArrayList();
057: int ndx = -1;
058:
059: while ((ndx = s.indexOf(delim)) > 0) {
060: if (ls == null) {
061: }
062: ls.add(s.substring(0, ndx));
063: s = s.substring(ndx + delim.length());
064: }
065: if (s.trim().length() > 0) {
066: ls.add(s.trim());
067: }
068: return ls;
069: }
070:
071: String arrayListToString(ArrayList ls, String delim) {
072: StringBuffer sb = new StringBuffer();
073: for (int i = 0; i < ls.size(); i++) {
074: sb.append(ls.get(i));
075: if (i < ls.size() - 1)
076: sb.append(delim);
077: }
078: return sb.toString();
079: }
080:
081: public FilterRuleset(String tag) {
082: HashMap avs = new HashMap();
083: String valueText = null;
084: try {
085: PBlock.str2pblock(tag, avs);
086: } catch (Exception e) {
087: System.out.println("PBlockstr2pblock:Exception:"
088: + e.getMessage());
089: }
090: valueText = (String) avs.get("id");
091: if (valueText != null) {
092: id = valueText;
093: }
094: valueText = (String) avs.get("enable");
095: if (valueText != null
096: && valueText.compareToIgnoreCase("TRUE") == 0) {
097: enable = true;
098: }
099: valueText = (String) avs.get("onMatch");
100: if (valueText != null
101: && valueText.compareToIgnoreCase("ALLOW") == 0) {
102: onMatch = true;
103: }
104: valueText = (String) avs.get("onExit");
105: if (valueText != null
106: && valueText.compareToIgnoreCase("ALLOW") == 0) {
107: onExit = true;
108: }
109: valueText = (String) avs.get("nickname");
110: if (valueText != null) {
111: nickname = valueText;
112: }
113: valueText = (String) avs.get("servers");
114: if (valueText != null) {
115: servers = this .stringToArrayList(valueText, ",");
116: }
117: valueText = (String) avs.get("domains");
118: if (valueText != null) {
119: domains = this .stringToArrayList(valueText, ",");
120: }
121: valueText = (String) avs.get("ports");
122: if (valueText != null) {
123: ports = valueText;
124: }
125: valueText = (String) avs.get("protocols");
126: if (valueText != null) {
127: protocols = this .stringToArrayList(valueText, ",");
128: }
129: valueText = (String) avs.get("starting-points");
130: if (valueText != null) {
131: starting_points = this .stringToArrayList1(valueText, ", ");
132: }
133: valueText = (String) avs.get("dns-alias-to-cname");
134: if (valueText != null) {
135: dns_cnames = this .stringToArrayList(valueText, ",");
136: }
137: valueText = (String) avs.get("database");
138: if (valueText != null) {
139: database = valueText;
140: }
141: }
142:
143: FilterRuleset(String id, boolean en, boolean onmatch,
144: boolean onexit, String nick, String domain, String ports,
145: String portocols, String starting_point,
146: String targetDatabase) {
147: this .id = id;
148: enable = en;
149: onMatch = onmatch;
150: onExit = onexit;
151: nickname = nick;
152: domains = new ArrayList();
153: domains.add(domain);
154: this .ports = ports;
155: this .protocols = this .stringToArrayList(portocols, ",");
156: starting_points = new ArrayList();
157: starting_points.add(starting_point);
158: database = targetDatabase;
159: }
160:
161: FilterRuleset(String id, boolean en, boolean onmatch,
162: boolean onexit, String nick, String sname,
163: String starting_point, String targetDatabase) {
164: this .id = id;
165: enable = en;
166: onMatch = onmatch;
167: onExit = onexit;
168: nickname = nick;
169: servers = new ArrayList();
170: servers.add(sname);
171: starting_points = new ArrayList();
172: starting_points.add(starting_point);
173: database = targetDatabase;
174: }
175:
176: public String toXMLString() {
177: StringBuffer sb = new StringBuffer("<Ruleset id=\"" + id
178: + "\" enable=\"" + RobotConfig.BtoString(enable)
179: + "\" onMatch=\"" + RobotConfig.ADtoString(onMatch)
180: + "\" onExit=\"" + RobotConfig.ADtoString(onExit)
181: + "\" \nnickname=\"" + nickname + "\" servers=\""
182: + servers + "\" starting-points=\"" + starting_points
183: + "\">\n");
184: ListIterator it = rules.listIterator(0);
185: while (true) {
186: try {
187: RuleSet rs = (RuleSet) it.next();
188: sb.append(rs.toXMLString());
189: } catch (NoSuchElementException e) {
190: break;
191: }
192: }
193: return sb.toString();
194: }
195:
196: public String toConfigString() {
197: StringBuffer sb = new StringBuffer();
198: if (this .pre_comments != null) {
199: sb.append("#\n");
200: for (int i = 0; i < this .pre_comments.size(); i++) {
201: String comm = (String) this .pre_comments.get(i);
202: sb.append("# " + comm + "\n");
203: }
204: sb.append("#\n");
205: }
206: sb.append("<Ruleset id=" + id + " enable="
207: + RobotConfig.BtoString(enable) + " onMatch="
208: + RobotConfig.ADtoString(onMatch) + " onExit="
209: + RobotConfig.ADtoString(onExit) + "\n"
210: + " nickname=\"" + nickname + "\"\n");
211: if (servers != null) {
212: sb.append(" servers=\""
213: + servers.toString().substring(1,
214: servers.toString().length() - 1) + "\"\n");
215: } else if (domains != null) {
216: sb.append(" domains=\""
217: + domains.toString().substring(1,
218: domains.toString().length() - 1) + "\"\n");
219: if (ports.length() > 0) {
220: sb.append(" ports=\"" + ports + "\"\n");
221: }
222: if (protocols != null) {
223: sb.append(" protocols=\""
224: + protocols.toString().substring(1,
225: protocols.toString().length() - 1)
226: + "\"\n");
227: }
228: }
229: if (dns_cnames != null && dns_cnames.size() > 0) {
230: sb.append(" dns-alias-to-cname=\""
231: + dns_cnames.toString().substring(1,
232: dns_cnames.toString().length() - 1)
233: + "\"\n");
234: }
235: if (database != null) {
236: sb.append(" database=\"" + database + "\"\n");
237: }
238: if (starting_points != null) {
239: sb.append(" starting-points=\""
240: + arrayListToString(starting_points, ", ") + "\"");
241: }
242: sb.append(">\n");
243: if (this .comments != null) {
244: sb.append("#\n");
245: for (int i = 0; i < this .comments.size(); i++) {
246: String comm = (String) this .comments.get(i);
247: sb.append("# " + comm + "\n");
248: }
249: sb.append("#\n");
250: }
251: ListIterator it = rules.listIterator(0);
252: while (it.hasNext()) {
253: try {
254: RuleSet rs = (RuleSet) it.next();
255: sb.append(rs.toConfigString());
256: } catch (NoSuchElementException e) {
257: break;
258: }
259: }
260: sb.append("</Ruleset>\n");
261: return sb.toString();
262: }
263:
264: public void AddFilterbyString(String rules) {
265: HashMap avs = new HashMap();
266: String r_id = null;
267: boolean r_onMatch = false;
268: String valueText = null;
269: try {
270: PBlock.str2pblock(rules, avs);
271: } catch (Exception e) {
272: System.out
273: .println("[AddFilterbyString]PBlockstr2pblock:Exception:"
274: + e.getMessage());
275: }
276: valueText = (String) avs.get("id");
277: if (valueText != null) {
278: r_id = valueText;
279: }
280: valueText = (String) avs.get("onMatch");
281: if (valueText != null
282: && valueText.compareToIgnoreCase("ALLOW") == 0) {
283: r_onMatch = true;
284: }
285: if (id != null) {
286: AddFilter(r_id, r_onMatch);
287: }
288:
289: }
290:
291: public void AddFilter(String fid, boolean match) {
292: for (int i = 0; i < rules.size(); i++) {
293: RuleSet ors = (RuleSet) rules.get(i);
294: if (ors.rule_id.equals(fid)) {
295: return;
296: }
297: }
298: RuleSet rs = new RuleSet(fid, match);
299: rules.add(rs);
300: }
301:
302: public boolean Filter(String u) {
303: ListIterator it = rules.listIterator(0);
304: while (true) {
305: try {
306: RuleSet rs = (RuleSet) it.next();
307: FilterRule fr = config.GetRule(rs.rule_id);
308: if (fr.Match(u)) {
309: return rs.onMatch;
310: }
311:
312: } catch (NoSuchElementException e) {
313: break;
314: }
315: }
316: return !onExit;
317: }
318:
319: public boolean isEnabled() {
320: return this .enable;
321: }
322:
323: public void setEnabled(boolean enable) {
324: this .enable = enable;
325: }
326:
327: public void addDNSTranslations(String dnsTrans) {
328: ArrayList trans = stringToArrayList(dnsTrans, ",");
329: for (int i = 0; i < trans.size(); i++) {
330: String item = (String) trans.get(i);
331: if (item.trim().length() > 0) {
332: addDNSTranslation(item.trim());
333: }
334: }
335: }
336:
337: public void addDNSTranslation(String dnsTrans) {
338: if (dns_cnames == null) {
339: dns_cnames = new ArrayList();
340: }
341: dns_cnames.add(dnsTrans);
342: }
343:
344: /*
345: * Add multilines comment
346: */
347: public void addComments(String comm) {
348: if (comm == null) {
349: return;
350: }
351: StringTokenizer st = new StringTokenizer(comm, "\n");
352: while (st.hasMoreTokens()) {
353: String t = st.nextToken().trim();
354: if (t.length() > 0) {
355: addComment(t);
356: }
357: }
358: }
359:
360: /*
361: * Add single line comment
362: */
363: public void addComment(String comm) {
364: if (comments == null) {
365: comments = new ArrayList();
366: }
367: comments.add(comm);
368: }
369:
370: public void addPreComment(ArrayList comm) {
371: this .pre_comments = comm;
372: }
373:
374: public int numOfServers() {
375: if (this .servers == null) {
376: return 0;
377: }
378: return this .servers.size();
379: }
380:
381: public int numOfDomains() {
382: if (this .domains == null) {
383: return 0;
384: }
385: return this .domains.size();
386: }
387:
388: public String getDomainByIndex(int index) {
389: try {
390: String value = (String) this .domains.get(index);
391: return value;
392: } catch (java.lang.ArrayIndexOutOfBoundsException e) {
393: return null;
394: }
395: }
396:
397: public String getServerByIndex(int index) {
398: try {
399: String value = (String) this .servers.get(index);
400: return value;
401: } catch (java.lang.ArrayIndexOutOfBoundsException e) {
402: return null;
403: }
404: }
405:
406: public int numOfStartingPoints() {
407: return this .starting_points.size();
408: }
409:
410: public String getStartingPointByIndex(int index) {
411: // Object[] values = this.servers.toArray();
412: try {
413: String value = (String) this .starting_points.get(index);
414: return value;
415: } catch (java.lang.ArrayIndexOutOfBoundsException e) {
416: return null;
417: }
418: }
419:
420: public int numOfFilters() {
421: return this .rules.size();
422: }
423:
424: public String getFiltersIDByIndex(int index) {
425: try {
426: RuleSet rs = (RuleSet) this .rules.get(index);
427: return rs.rule_id;
428: } catch (java.lang.ArrayIndexOutOfBoundsException e) {
429: return null;
430: }
431: }
432:
433: public boolean isFilterInUsed(String id) {
434: try {
435: for (int i = 0; i < rules.size(); i++) {
436: RuleSet rs = (RuleSet) rules.get(i);
437: if (rs.rule_id.compareTo(id) == 0) {
438: return true;
439: }
440: }
441: } catch (java.lang.ArrayIndexOutOfBoundsException e) {
442: }
443: return false;
444: }
445:
446: public String getFiltersonMatchByIndex(int index) {
447: try {
448: RuleSet rs = (RuleSet) this .rules.get(index);
449: return RobotConfig.ADtoString(rs.onMatch);
450: } catch (java.lang.ArrayIndexOutOfBoundsException e) {
451: return null;
452: }
453: }
454:
455: public boolean deleteFilterByIndex(int index) {
456: boolean r = false;
457: try {
458: if (this .rules.remove(index) != null) {
459: r = true;
460: }
461: } catch (java.lang.ArrayIndexOutOfBoundsException e) {
462: }
463: return r;
464: }
465:
466: public boolean deleteFilterByID(String id) {
467: boolean r = false;
468: for (int i = 0; i < rules.size(); i++) {
469: RuleSet rs = (RuleSet) rules.get(i);
470: if (rs.rule_id.compareTo(id) == 0) {
471: rules.remove(i);
472: return true;
473: }
474: }
475: return false;
476: }
477:
478: public void removeFilters() {
479: rules = new ArrayList();
480: }
481:
482: public void addStartingPoint(URL url, int depth) {
483: String newUrlText = url.toString();
484: int dupIndex = -1;
485: if (starting_points == null) {
486: starting_points = new ArrayList();
487: }
488: for (int i = 0; i < starting_points.size(); i++) {
489: String sp = (String) starting_points.get(i);
490: String urlText = sp.substring(0, sp.indexOf(" depth="));
491: if (newUrlText.equalsIgnoreCase(urlText)) {
492: dupIndex = i;
493: break;
494: }
495: }
496: if (dupIndex >= 0) {
497: deleteStartingPointByIndex(dupIndex);
498: }
499:
500: String s_point = newUrlText + " depth=" + depth;
501: starting_points.add(s_point);
502: }
503:
504: public void removeStartingPoints() {
505: if (starting_points != null) {
506: starting_points = new ArrayList();
507: }
508: }
509:
510: public boolean deleteStartingPointByIndex(int index) {
511: boolean r = false;
512: try {
513: if (this .starting_points.remove(index) != null) {
514: r = true;
515: }
516: } catch (java.lang.ArrayIndexOutOfBoundsException e) {
517: }
518: return r;
519: }
520:
521: public void removeProtocol() {
522: this .protocols = new ArrayList();
523: }
524:
525: public void addProtocol(String proto) {
526: if (protocols == null) {
527: protocols = new ArrayList();
528: }
529: protocols.add(proto);
530: }
531:
532: public ArrayList getProtocol() {
533: return protocols;
534: }
535:
536: public boolean isProtocolChecked(String proto) {
537: if (this .protocols == null) {
538: return false;
539: }
540: for (int i = 0; i < this .protocols.size(); i++) {
541: String p = (String) this .protocols.get(i);
542: if (p.compareToIgnoreCase(proto) == 0) {
543: return true;
544: }
545: }
546: return false;
547: }
548:
549: void addStringToListUnique(ArrayList list, String entry) {
550: try {
551: for (int i = 0; i < list.size(); i++) {
552: String exist_entry = (String) list.get(i);
553: if (exist_entry.compareToIgnoreCase(entry) == 0) {
554: return;
555: }
556: }
557: list.add(entry);
558: } catch (Exception e) {
559: //ignore
560: }
561: }
562:
563: public void addServer(String server) {
564: if (this .servers == null) {
565: this .servers = new ArrayList();
566: }
567: addStringToListUnique(servers, server);
568: }
569:
570: public void removeServers() {
571: servers = new ArrayList();
572: }
573:
574: public boolean deleteServerByIndex(int index) {
575: boolean r = false;
576: try {
577: if (this .servers.remove(index) != null) {
578: r = true;
579: }
580: } catch (java.lang.ArrayIndexOutOfBoundsException e) {
581: }
582: return r;
583: }
584:
585: public void addDomain(String domain) {
586: if (domains == null) {
587: domains = new ArrayList();
588: }
589: addStringToListUnique(domains, domain);
590: }
591:
592: public void removeDomains() {
593: domains = new ArrayList();
594: }
595:
596: public void removeComment() {
597: comments = new ArrayList();
598: }
599:
600: public void removeDNSTranslation() {
601: dns_cnames = new ArrayList();
602: }
603:
604: public boolean deleteDomainByIndex(int index) {
605: boolean r = false;
606: try {
607: if (this .domains.remove(index) != null) {
608: r = true;
609: }
610: } catch (java.lang.ArrayIndexOutOfBoundsException e) {
611: }
612: return r;
613: }
614:
615: public int getType() {
616: if (this .servers != null) {
617: return TYPE_SERVERS;
618: } else {
619: return TYPE_DOMAINS;
620: }
621: }
622:
623: public boolean isForMe(URL url) {
624: if (servers != null) {
625: String serverStr = url.getProtocol()
626: + "://"
627: + url.getHost()
628: + (url.getPort() > 0 ? ":"
629: + Integer.toString(url.getPort()) : "")
630: + "/";
631: for (int i = 0; i < servers.size(); i++) {
632: String server = (String) servers.get(i);
633: if (serverStr.compareToIgnoreCase(server) == 0) {
634: return true;
635: }
636: }
637: } else {
638: for (int i = 0; domains != null && i < domains.size(); i++) {
639: String domain = (String) domains.get(i);
640: if (url.getHost().endsWith(domain)) {
641: return true;
642: }
643: }
644: }
645: return false;
646: }
647:
648: public String getComments() {
649: if (comments == null) {
650: return "";
651: }
652: StringBuffer sb = new StringBuffer();
653: for (int i = 0; i < comments.size(); i++) {
654: sb.append((String) comments.get(i) + "\n");
655: }
656: return sb.toString();
657: }
658:
659: public String getDNSTranslation() {
660: if (dns_cnames == null) {
661: return "";
662: }
663: StringBuffer sb = new StringBuffer();
664: for (int i = 0; i < dns_cnames.size(); i++) {
665: sb.append((String) dns_cnames.get(i));
666: if (i + 1 < dns_cnames.size()) {
667: sb.append(",\n");
668: }
669: }
670: return sb.toString();
671: }
672:
673: public String getDatabase() {
674: if (database == null) {
675: return "";
676: }
677: return database;
678: }
679:
680: public void setDatabase(String targetDatabase) {
681: database = targetDatabase;
682: }
683:
684: }
|