From: hkhang Date: Fri, 5 Feb 2010 23:16:59 +0000 (+0000) Subject: *** empty log message *** X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=a6db7c36873c3300d794bf5ea52bd5b8d755534a;p=IRC.git *** empty log message *** --- diff --git a/Robust/src/Benchmarks/Recovery/Spider/QueryTask.java b/Robust/src/Benchmarks/Recovery/Spider/QueryTask.java index 70a5d7c3..7113e451 100644 --- a/Robust/src/Benchmarks/Recovery/Spider/QueryTask.java +++ b/Robust/src/Benchmarks/Recovery/Spider/QueryTask.java @@ -1,21 +1,21 @@ public class QueryTask extends Task { int maxDepth; int maxSearchDepth; - Queue toprocess; + GlobalQueue toprocess; DistributedHashMap results; DistributedLinkedList results_list; DistributedHashMap visitedList; GlobalString gTitle; GlobalString workingURL; - public QueryTask(Queue todoList, DistributedHashMap visitedList, int maxDepth, int maxSearchDepth, DistributedHashMap results, DistributedLinkedList results_list) { + public QueryTask(GlobalQueue todoList, DistributedHashMap visitedList, int maxDepth, int maxSearchDepth, DistributedHashMap results, DistributedLinkedList results_list) { this.todoList = todoList; this.visitedList = visitedList; this.maxDepth = maxDepth; this.maxSearchDepth = maxSearchDepth; this.results = results; this.results_list = results_list; - toprocess = global new Queue(); + toprocess = global new GlobalQueue(); } public void execute() { @@ -109,7 +109,7 @@ public class QueryTask extends Task { public void done(Object obj) { if ((gTitle != null) && (gTitle.length() > 0)) { - processList(); + processedList(); } int searchCnt = 0; @@ -248,7 +248,7 @@ public class QueryTask extends Task { } while(numchars > 0); } - public void processList() { + public void processedList() { LinkedList ll; GlobalString token = null; int mindex = 0; @@ -270,9 +270,9 @@ public class QueryTask extends Task { token = refine(token); } - Queue q = (Queue)results.get(token); + GlobalQueue q = (GlobalQueue)results.get(token); if (q == null) { - q = global new Queue(); + q = global new GlobalQueue(); } q.push(workingURL); results.put(token, q); @@ -350,17 +350,17 @@ public class QueryTask extends Task { return str; } - public static Queue processPage(LocalQuery lq) { + public static GlobalQueue processPage(LocalQuery lq) { int index = 0; String href = new String("href=\""); String searchstr = lq.response.toString(); int depth; boolean cont = true; - Queue toprocess; + GlobalQueue toprocess; depth = lq.getDepth() + 1; - toprocess = global new Queue(); + toprocess = global new GlobalQueue(); while(cont) { int mindex = searchstr.indexOf(href,index); if (mindex != -1) { diff --git a/Robust/src/Benchmarks/Recovery/Spider/Spider.java b/Robust/src/Benchmarks/Recovery/Spider/Spider.java index 5b8a3aee..93242493 100644 --- a/Robust/src/Benchmarks/Recovery/Spider/Spider.java +++ b/Robust/src/Benchmarks/Recovery/Spider/Spider.java @@ -56,7 +56,7 @@ public class Spider { GlobalQuery firstquery = global new GlobalQuery(firstmachine, firstpage); - Queue todoList = global new Queue(); + GlobalQueue todoList = global new GlobalQueue(); DistributedHashMap visitedList = global new DistributedHashMap(500, 500, 0.75f); DistributedHashMap results = global new DistributedHashMap(100, 100, 0.75f); DistributedLinkedList results_list = global new DistributedLinkedList(); diff --git a/Robust/src/Benchmarks/Recovery/Spider/java/LocalQuery.java b/Robust/src/Benchmarks/Recovery/Spider/java/LocalQuery.java new file mode 100644 index 00000000..1beeadbe --- /dev/null +++ b/Robust/src/Benchmarks/Recovery/Spider/java/LocalQuery.java @@ -0,0 +1,95 @@ +public class LocalQuery { + String hostname; + String path; + StringBuffer response; + int depth; + + public LocalQuery(String hostname, String path, int depth) { + this.hostname = new String(hostname); + this.path = new String(path); + response = new StringBuffer(); + this.depth = depth; + } + + public int getDepth() { + return depth; + } + + public String getHostName() { + return hostname; + } + + public String getPath() { + return path; + } + + public void outputFile() { + StringBuffer sb = new StringBuffer(hostname); + sb.append(path); + FileOutputStream fos = new FileOutputStream(sb.toString().replace('/','#')); + fos.write(response.toString().getBytes()); + fos.close(); + } + + public String makewebcanonical(String page) { + StringBuffer b = new StringBuffer(getHostName(page)); + b.append("/"); + b.append(getPathName(page)); + return b.toString(); + } + + public String getHostName(String page) { + String http = new String("http://"); + String https = new String("https://"); + int beginindex; + int endindex; + + if ((page.indexOf(http) == -1) && (page.indexOf(https) == -1)) { + return getHostName(); + } + else if (page.indexOf(https) != -1) { + beginindex = page.indexOf(https) + https.length(); + } + else { + beginindex = page.indexOf(http) + http.length(); + } + endindex = page.indexOf('/',beginindex+1); + + if ((beginindex == -1)) { + System.printString("ERROR"); + } + if (endindex == -1) + endindex = page.length(); + + return page.subString(beginindex, endindex); + } + + public String getPathName(String page) { + String http = new String("http://"); + String https = new String("https://"); + int beginindex; + int nextindex; + + if ((page.indexOf(http) == -1) && (page.indexOf(https) == -1)) { + String path = getPath(); + int lastindex = path.lastindexOf('/'); + if (lastindex == -1) + return page; + + StringBuffer sb = new StringBuffer(path.subString(0,lastindex+1)); + sb.append(page); + return sb.toString(); + } + else if (page.indexOf(https) != -1) { + beginindex = page.indexOf(https) + https.length(); + } + else { + beginindex = page.indexOf(http) + http.length(); + } + nextindex = page.indexOf('/',beginindex+1); + + if ((beginindex==-1) || (nextindex==-1)) + return new String("index.html"); + return page.subString(nextindex+1, page.length()); + } +} diff --git a/Robust/src/Benchmarks/Recovery/Spider/java/QueryTask.java b/Robust/src/Benchmarks/Recovery/Spider/java/QueryTask.java new file mode 100644 index 00000000..2703a164 --- /dev/null +++ b/Robust/src/Benchmarks/Recovery/Spider/java/QueryTask.java @@ -0,0 +1,382 @@ +public class QueryTask { + int maxDepth; + int maxSearchDepth; + Queue todoList; + HashMap results; + HashMap visitedList; + LinkedList results_list; + + String title; + String workingURL; + + public QueryTask(Queue todoList, HashMap visitedList, int maxDepth, int maxSearchDepth, HashMap results, LinkedList results_list) { + this.todoList = todoList; + this.visitedList = visitedList; + this.maxDepth = maxDepth; + this.maxSearchDepth = maxSearchDepth; + this.results = results; + this.results_list = results_list; + title = new String(); + workingURL = new String(); + } + + public void execute() { + int depth; + LocalQuery lq; + String hostname; + String path; + String title; + Queue toprocess; + + lq = (LocalQuery)(todoList.pop()); + depth = lq.getDepth(); + + while (depth < maxDepth) { + toprocess = new Queue(); + hostname = lq.getHostName(); + path = lq.getPath(); + + StringBuffer sb = new StringBuffer(hostname); + sb.append("/"); + sb.append(path); + workingURL = sb.toString(); + title = null; + + System.printString("["+lq.getDepth()+"] "); + System.printString("Processing - Hostname : "); + System.printString(hostname); + System.printString(", Path : "); + System.printString(path); + System.printString("\n"); + + if (isDocument(path)) { + lq = (LocalQuery)(todoList.pop()); + depth = lq.getDepth(); + continue; + } + + Socket s = new Socket(); + + if(s.connect(hostname, 80) == -1) { + lq = (LocalQuery)(todoList.pop()); + depth = lq.getDepth(); + continue; + } + +// System.out.println("AAA"); + requestQuery(hostname, path, s); +// System.out.println("BBB"); + readResponse(lq, s); + +// System.out.println("CCC"); + if ((title = grabTitle(lq)) != null) { + toprocess = processPage(lq); + } +// System.out.println("DDD"); + + s.close(); + done(toprocess); + lq = (LocalQuery)(todoList.pop()); + depth = lq.getDepth(); + } + } + + public static boolean isDocument(String str) { + int index = str.lastindexOf('.'); + + if (index != -1) { + if ((str.subString(index+1)).equals("pdf")) return true; + else if ((str.subString(index+1)).equals("ps")) return true; + else if ((str.subString(index+1)).equals("ppt")) return true; + else if ((str.subString(index+1)).equals("pptx")) return true; + else if ((str.subString(index+1)).equals("jpg")) return true; + else if ((str.subString(index+1)).equals("mp3")) return true; + else if ((str.subString(index+1)).equals("wmv")) return true; + else if ((str.subString(index+1)).equals("doc")) return true; + else if ((str.subString(index+1)).equals("docx")) return true; + else if ((str.subString(index+1)).equals("mov")) return true; + else if ((str.subString(index+1)).equals("flv")) return true; + else return false; + } + return false; + } + + public void done(Queue toprocess) { + if ((title != null) && (title.length() > 0)) { + processedList(); + } + + int searchCnt = 0; + while(!toprocess.isEmpty()) { + LocalQuery q = (LocalQuery)toprocess.pop(); + + String hostname = new String(q.getHostName()); + String path = new String(q.getPath()); + + StringBuffer sb = new StringBuffer(hostname); + sb.append("/"); + sb.append(path); + + if (!visitedList.containsKey(sb.toString()) && (searchCnt < maxSearchDepth)) { + todoList.push(q); + + String str = new String("1"); // dump data + visitedList.put(sb.toString(), str); // if URL is never visited, put in the list + results_list.add(sb.toString()); // the whole list that once visited + searchCnt++; + } + } + } + + public void output() { + String str; + Iterator iter = results_list.iterator(); + + while (iter.hasNext() == true) { + str = ((String)(iter.next())); + System.printString(str + "\n"); + } + } + + public static String grabTitle(LocalQuery lq) { + String sBrace = new String("<"); + String strTitle = new String("title>"); + String searchstr = lq.response.toString(); + String title = null; + char ch; + + int mindex = -1; + int endquote = -1; + int i, j; + String tmp; + + for (i = 0; i < searchstr.length(); i++) { + if (searchstr.charAt(i) == '<') { + i++; + if (searchstr.length() > (i+strTitle.length())) { + tmp = searchstr.subString(i, i+strTitle.length()); + if (tmp.equalsIgnoreCase("title>")) { + mindex = i + tmp.length(); + for (j = mindex; j < searchstr.length(); j++) { + if (searchstr.charAt(j) == '<') { + j++; + tmp = searchstr.subString(j, j+strTitle.length()+1); + if (tmp.equalsIgnoreCase("/title>")) { + endquote = j - 1; + break; + } + } + } + } + } + } + } + + if (mindex != -1) { + title = searchstr.subString(mindex, endquote); + if (Character.isWhitespace(title.charAt(0))){ + mindex=0; + while (Character.isWhitespace(title.charAt(mindex++))); + mindex--; + if (mindex >= title.length()) return null; + title = new String(title.subString(mindex)); + } + + if (Character.isWhitespace(title.charAt(title.length()-1))) { + endquote=title.length()-1; + while (Character.isWhitespace(title.charAt(endquote--))); + endquote += 2; + if (mindex >= endquote) return null; + title = new String(title.subString(0, endquote)); + } + + if (isErrorPage(title)) { // error page + return null; + } + } + + return title; + } + + public static boolean isErrorPage(String str) { // error msg list + if (str.equals("301 Moved Permanently")) + return true; + else if (str.equals("302 Found")) + return true; + else if (str.equals("404 Not Found")) + return true; + else if (str.equals("403 Forbidden")) + return true; + else if (str.equals("404 File Not Found")) + return true; + else + return false; + } + + public static void requestQuery(String hostname, String path, Socket sock) { + StringBuffer req = new StringBuffer("GET "); + req.append("/"); + req.append(path); + req.append(" HTTP/1.0\r\nHost: "); + req.append(hostname); + req.append("\r\n\r\n"); + sock.write(req.toString().getBytes()); + } + + public static void readResponse(LocalQuery lq, Socket sock) { + // state 0 - nothing + // state 1 - \r + // state 2 - \r\n + // state 3 - \r\n\r + // state 4 - \r\n\r\n + byte[] buffer = new byte[1024]; + int numchars; + + do { + numchars = sock.read(buffer); + + String curr = (new String(buffer)).subString(0, numchars); + + lq.response.append(curr); + buffer = new byte[1024]; + } while(numchars > 0); + } + + public void processedList() { + LinkedList ll; + String token = null; + int mindex = 0; + int endquote = 0; + + while (endquote != -1) { + endquote = title.indexOf(' ', mindex); + + if (endquote != -1) { + token = title.subString(mindex, endquote); + mindex = endquote + 1; + if (filter(token)) { + continue; + } + token = refine(token); + } + else { + token = title.subString(mindex); + token = refine(token); + } + + Queue q = (Queue)results.get(token); + if (q == null) { + q = new Queue(); + } + q.push(workingURL); + results.put(token, q); + } + } + + public boolean filter(String str) { + if (str.equals("of")) return true; + else if (str.equals("for")) return true; + else if (str.equals("a")) return true; + else if (str.equals("an")) return true; + else if (str.equals("the")) return true; + else if (str.equals("at")) return true; + else if (str.equals("and")) return true; + else if (str.equals("or")) return true; + else if (str.equals("but")) return true; + else if (str.equals("to")) return true; + else if (str.equals("The")) return true; + else if (str.length() == 1) { + if (str.charAt(0) == '.') return true; + else if (str.charAt(0) == '.') return true; + else if (str.charAt(0) == '-') return true; + else if (str.charAt(0) == '=') return true; + else if (str.charAt(0) == '_') return true; + else if (str.charAt(0) == ':') return true; + else if (str.charAt(0) == ';') return true; + else if (str.charAt(0) == '\'') return true; + else if (str.charAt(0) == '\"') return true; + else if (str.charAt(0) == '|') return true; + else if (str.charAt(0) == '@') return true; + else if (str.charAt(0) == '&') return true; + else if (str.charAt(0) == ' ') return true; + } + else return false; + } + + public String refine(String str) { // if title has some unnecessary prefix or postfix + str = refinePrefix(str); + str = refinePostfix(str); + return str; + } + + public String refinePrefix(String str) { + if (str.charAt(0) == '&') { // & + return str.subString(1); + } + else if (str.charAt(0) == '/') { // & + return str.subString(1); + } + return str; + } + + public String refinePostfix(String str) { + if (str.charAt(str.length()-1) == ',') { // , + return str.subString(0, str.length()-1); + } + else if (str.charAt(str.length()-1) == ':') { // : + return str.subString(0, str.length()-1); + } + else if (str.charAt(str.length()-1) == ';') { // ; + return str.subString(0, str.length()-1); + } + else if (str.charAt(str.length()-1) == '!') { // ! + return str.subString(0, str.length()-1); + } + else if (str.charAt(str.length()-1) == 's') { // 's + if (str.charAt(str.length()-2) == '\'') + return str.subString(0, str.length()-2); + } + else if (str.charAt(str.length()-1) == '-') { + int index = str.length()-2; + while (Character.isWhitespace(str.charAt(index--))); + return str.subString(0, index+2); + } + return str; + } + + public static Queue processPage(LocalQuery lq) { + int index = 0; + String href = new String("href=\""); + String searchstr = lq.response.toString(); + int depth; + boolean cont = true; + Queue toprocess; + + depth = lq.getDepth() + 1; + + toprocess = new Queue(); + while(cont) { + int mindex = searchstr.indexOf(href,index); + if (mindex != -1) { + int endquote = searchstr.indexOf('"', mindex+href.length()); + if (endquote != -1) { + String match = searchstr.subString(mindex+href.length(), endquote); + String match2 = lq.makewebcanonical(match); + + String hostname; + String path; + + hostname = new String(lq.getHostName(match)); + path = new String(lq.getPathName(match)); + + if (match2 != null) { + LocalQuery gq = new LocalQuery(hostname, path, depth); + toprocess.push(gq); + } + index = endquote; + } else cont = false; + } else cont = false; + } + return toprocess; + } +} diff --git a/Robust/src/Benchmarks/Recovery/Spider/java/Spider.java b/Robust/src/Benchmarks/Recovery/Spider/java/Spider.java new file mode 100644 index 00000000..229d2cb6 --- /dev/null +++ b/Robust/src/Benchmarks/Recovery/Spider/java/Spider.java @@ -0,0 +1,33 @@ +public class Spider { + public static void main(String[] args) { + int maxDepth = 3; + int maxSearchDepth = 10; + int i, j; + QueryTask qt; + + String firstmachine; + String firstpage; + + firstmachine = new String(args[0]); + if (args.length == 2) { + firstpage = new String(args[1]); + } + else + firstpage = new String("");; + + HashMap visitedList = new HashMap(500, 0.75f); + HashMap results = new HashMap(100, 0.75f); + LinkedList results_list = new LinkedList(); + + LocalQuery firstquery = new LocalQuery(firstmachine, firstpage, 0); + + Queue todoList = new Queue(); + todoList.push(firstquery); + + qt = new QueryTask(todoList, visitedList, maxDepth, maxSearchDepth, results, results_list); + + System.printString("Finished to create Objects\n"); + + qt.execute(); + } +} diff --git a/Robust/src/Benchmarks/Recovery/Spider/java/makefile b/Robust/src/Benchmarks/Recovery/Spider/java/makefile new file mode 100644 index 00000000..6c43c3d6 --- /dev/null +++ b/Robust/src/Benchmarks/Recovery/Spider/java/makefile @@ -0,0 +1,12 @@ +MAINCLASS=Spider +SUBCLASS=Query +SRC1=${MAINCLASS}.java +SRC2=Local${SUBCLASS}.java +SRC3=${SUBCLASS}Task.java +FLAGS= -32bit -nooptimize -mainclass ${MAINCLASS} +default: + ../../../../buildscript ${FLAGS} -o ${MAINCLASS} ${SRC2} ${SRC3} ${SRC1} + +clean: + rm -rf tmpbuilddirectory + rm *.bin diff --git a/Robust/src/ClassLibrary/JavaDSM/GlobalQueue.java b/Robust/src/ClassLibrary/JavaDSM/GlobalQueue.java new file mode 100644 index 00000000..275d9462 --- /dev/null +++ b/Robust/src/ClassLibrary/JavaDSM/GlobalQueue.java @@ -0,0 +1,187 @@ +/* ============================================================================= + * + * queue.java + * + * ============================================================================= + * + * Copyright (C) Stanford University, 2006. All Rights Reserved. + * Author: Chi Cao Minh + * + * Ported to Java + * Author:Alokika Dash + * University of California, Irvine + * + * ============================================================================= + * + * Unless otherwise noted, the following license applies to STAMP files: + * + * Copyright (c) 2007, Stanford University + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Stanford University nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY STANFORD UNIVERSITY ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD UNIVERSITY BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + * + * ============================================================================= + */ + +public class GlobalQueue{ + int pop; /* points before element to pop */ + int push; + int capacity; + int size; + int QUEUE_GROWTH_FACTOR; + Object[] elements; + + public GlobalQueue() { + GlobalQueue(10); + } + + /* ============================================================================= + * queue_alloc + * ============================================================================= + */ + public GlobalQueue (int initCapacity) + { + QUEUE_GROWTH_FACTOR = 2; + capacity = ((initCapacity < 2) ? 2 : initCapacity); + + elements = global new Object[capacity]; + size = 0; + pop = capacity - 1; + push = 0; + capacity = capacity; + } + + /* ============================================================================= + * queue_isEmpty + * ============================================================================= + */ + public boolean + isEmpty () + { + return (((pop + 1) % capacity == push) ? true : false); + } + + + /* ============================================================================= + * queue_clear + * ============================================================================= + */ + public void + queue_clear () + { + pop = capacity - 1; + push = 0; + } + + /* ============================================================================= + * queue_push + * ============================================================================= + */ + public boolean + push (Object dataPtr) + { + if(pop == push) { +// System.out.println("push == pop in Queue.java"); + return false; + } + + /* Need to resize */ + int newPush = (push + 1) % capacity; + if (newPush == pop) { + + int newCapacity = capacity * QUEUE_GROWTH_FACTOR; + Object[] newElements = global new Object[newCapacity]; + + if (newElements == null) { + return false; + } + + int dst = 0; + Object[] tmpelements = elements; + if (pop < push) { + int src; + for (src = (pop + 1); src < push; src++, dst++) { + newElements[dst] = elements[src]; + } + } else { + int src; + for (src = (pop + 1); src < capacity; src++, dst++) { + newElements[dst] = elements[src]; + } + for (src = 0; src < push; src++, dst++) { + newElements[dst] = elements[src]; + } + } + + //elements = null; + elements = newElements; + pop = newCapacity - 1; + capacity = newCapacity; + push = dst; + newPush = push + 1; /* no need modulo */ + } + size++; + elements[push] = dataPtr; + push = newPush; + + return true; + } + + + /* ============================================================================= + * queue_pop + * ============================================================================= + */ + public Object + pop () + { + int newPop = (pop + 1) % capacity; + if (newPop == push) { + return null; + } + + //Object dataPtr = queuePtr.elements[newPop]; + //queuePtr.pop = newPop; + Object dataPtr = elements[newPop]; + pop = newPop; + size--; + return dataPtr; + } + public int size() + { + return size; + } + +} +/* ============================================================================= + * + * End of queue.java + * + * ============================================================================= + */ diff --git a/Robust/src/ClassLibrary/JavaDSM/Task.java b/Robust/src/ClassLibrary/JavaDSM/Task.java index 17e25516..79fea7cd 100644 --- a/Robust/src/ClassLibrary/JavaDSM/Task.java +++ b/Robust/src/ClassLibrary/JavaDSM/Task.java @@ -1,6 +1,5 @@ public class Task { - Queue todoList; - DistributedHashMap doneList; + GlobalQueue todoList; Object myWork; Task() {} diff --git a/Robust/src/ClassLibrary/JavaDSM/Work.java b/Robust/src/ClassLibrary/JavaDSM/Work.java index d2a10d0f..daad9487 100644 --- a/Robust/src/ClassLibrary/JavaDSM/Work.java +++ b/Robust/src/ClassLibrary/JavaDSM/Work.java @@ -59,14 +59,13 @@ public class Work extends Thread { } } - /* for debugging purpose */ atomic { tasks.output(); } System.out.println("\n\n I'm done\n\n\n"); - RecoveryStat.printRecoveryStat(); + RecoveryStat.printRecoveryStat(); } public static int checkCurrentWorkList(Work mywork) { diff --git a/Robust/src/ClassLibrary/Queue.java b/Robust/src/ClassLibrary/Queue.java new file mode 100644 index 00000000..36cd9188 --- /dev/null +++ b/Robust/src/ClassLibrary/Queue.java @@ -0,0 +1,187 @@ +/* ============================================================================= + * + * queue.java + * + * ============================================================================= + * + * Copyright (C) Stanford University, 2006. All Rights Reserved. + * Author: Chi Cao Minh + * + * Ported to Java + * Author:Alokika Dash + * University of California, Irvine + * + * ============================================================================= + * + * Unless otherwise noted, the following license applies to STAMP files: + * + * Copyright (c) 2007, Stanford University + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Stanford University nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY STANFORD UNIVERSITY ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL STANFORD UNIVERSITY BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + * + * ============================================================================= + */ + +public class Queue { + int pop; /* points before element to pop */ + int push; + int capacity; + int size; + int QUEUE_GROWTH_FACTOR; + Object[] elements; + + public Queue() { + Queue(10); + } + + /* ============================================================================= + * queue_alloc + * ============================================================================= + */ + public Queue (int initCapacity) + { + QUEUE_GROWTH_FACTOR = 2; + capacity = ((initCapacity < 2) ? 2 : initCapacity); + + elements = new Object[capacity]; + size = 0; + pop = capacity - 1; + push = 0; + capacity = capacity; + } + + /* ============================================================================= + * queue_isEmpty + * ============================================================================= + */ + public boolean + isEmpty () + { + return (((pop + 1) % capacity == push) ? true : false); + } + + + /* ============================================================================= + * queue_clear + * ============================================================================= + */ + public void + queue_clear () + { + pop = capacity - 1; + push = 0; + } + + /* ============================================================================= + * queue_push + * ============================================================================= + */ + public boolean + push (Object dataPtr) + { + if(pop == push) { +// System.out.println("push == pop in Queue.java"); + return false; + } + + /* Need to resize */ + int newPush = (push + 1) % capacity; + if (newPush == pop) { + + int newCapacity = capacity * QUEUE_GROWTH_FACTOR; + Object[] newElements = new Object[newCapacity]; + + if (newElements == null) { + return false; + } + + int dst = 0; + Object[] tmpelements = elements; + if (pop < push) { + int src; + for (src = (pop + 1); src < push; src++, dst++) { + newElements[dst] = elements[src]; + } + } else { + int src; + for (src = (pop + 1); src < capacity; src++, dst++) { + newElements[dst] = elements[src]; + } + for (src = 0; src < push; src++, dst++) { + newElements[dst] = elements[src]; + } + } + + //elements = null; + elements = newElements; + pop = newCapacity - 1; + capacity = newCapacity; + push = dst; + newPush = push + 1; /* no need modulo */ + } + size++; + elements[push] = dataPtr; + push = newPush; + + return true; + } + + + /* ============================================================================= + * queue_pop + * ============================================================================= + */ + public Object + pop () + { + int newPop = (pop + 1) % capacity; + if (newPop == push) { + return null; + } + + //Object dataPtr = queuePtr.elements[newPop]; + //queuePtr.pop = newPop; + Object dataPtr = elements[newPop]; + pop = newPop; + size--; + return dataPtr; + } + public int size() + { + return size; + } + +} +/* ============================================================================= + * + * End of queue.java + * + * ============================================================================= + */ diff --git a/Robust/src/ClassLibrary/String.java b/Robust/src/ClassLibrary/String.java index 08458623..52147045 100644 --- a/Robust/src/ClassLibrary/String.java +++ b/Robust/src/ClassLibrary/String.java @@ -177,6 +177,11 @@ public class String { return -1; } + public int indexOfIgnoreCase(String str, int fromIndex) { + if (fromIndex < 0) + fromIndex = 0; + } + public int lastIndexOf(String str, int fromIndex) { int k=count-str.count; if (k>fromIndex)