-/*******************************************************************************\r
- * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
- * in Industry THTH ry.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.utils.threads.logger;\r
-\r
-import java.io.DataInput;\r
-import java.io.DataInputStream;\r
-import java.io.EOFException;\r
-import java.io.FileInputStream;\r
-import java.io.FileNotFoundException;\r
-import java.io.IOException;\r
-import java.io.PrintStream;\r
-import java.util.ArrayList;\r
-import java.util.Collections;\r
-import java.util.HashMap;\r
-import java.util.Locale;\r
-import java.util.Map;\r
-\r
-public class ThreadLogVisualizer {\r
- \r
- // Do not show tasks shorter than 5ms\r
- final public static long DISCARD_LIMIT = 0;\r
- // 1s columns\r
- final public static long COLUMN_WIDTH = 1000000000;\r
- \r
- class Task implements Comparable<Task> {\r
- String name;\r
- long beginTime;\r
- long endTime;\r
- long threadId;\r
- \r
- public Task(String name, long threadId, long beginTime, long endTime) {\r
- this.name = name;\r
- this.threadId = threadId;\r
- this.beginTime = beginTime;\r
- this.endTime = endTime;\r
- }\r
-\r
- @Override\r
- // Differences will not fit into int\r
- public int compareTo(Task o) {\r
- if(beginTime > o.beginTime) return 1;\r
- else if(beginTime == o.beginTime) return -1;\r
- else return -1;\r
- } \r
- }\r
- \r
- ArrayList<Task> tasks = new ArrayList<Task>();\r
- \r
- public void read(DataInput input) {\r
- try {\r
- while(true) {\r
- try {\r
- String taskName = input.readUTF();\r
- long threadId = input.readLong();\r
- long beginTime = input.readLong();\r
- long endTime = input.readLong();\r
- if((endTime-beginTime) > DISCARD_LIMIT)\r
- tasks.add(new Task(taskName, threadId, beginTime, endTime));\r
- } catch(EOFException e) { \r
- break;\r
- }\r
- } \r
- } catch(IOException e) { \r
- }\r
- \r
- Collections.sort(tasks);\r
- }\r
- \r
- class Lane {\r
- ArrayList<Task> tasks = new ArrayList<Task>();\r
- long nextTime = 0;\r
- }\r
- \r
- public void visualize3(PrintStream s) {\r
- \r
- long minTime = Long.MAX_VALUE;\r
- long maxTime = Long.MIN_VALUE;\r
- \r
- ArrayList<Lane> lanes = new ArrayList<Lane>();\r
- \r
- int laneId = 0;\r
- for(Task task : tasks) {\r
-\r
- Lane lane;\r
- \r
- minTime = Math.min(minTime, task.beginTime);\r
- maxTime = Math.max(maxTime, task.endTime);\r
- \r
- for(int seek = laneId-1; seek >= 0; --seek) {\r
- if(lanes.get(seek).nextTime < task.beginTime) {\r
- laneId = seek;\r
- } else {\r
- break;\r
- }\r
- }\r
-\r
- if(laneId < lanes.size())\r
- lane = lanes.get(laneId);\r
- else {\r
- lane = new Lane();\r
- lanes.add(lane);\r
- }\r
- \r
- lane.tasks.add(task);\r
- lane.nextTime = Math.max(task.endTime, task.beginTime+COLUMN_WIDTH);\r
- System.out.println(task.name + " -> " + laneId + "[" + task.beginTime + "-" + task.endTime + "]");\r
- \r
- laneId++;\r
- \r
- }\r
- \r
- double timeScale = 1e-6;\r
- double rowHeight = 30.0;\r
- Locale locale = Locale.US;\r
- int row = lanes.size();\r
- \r
- s.println("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>");\r
- s.println("<svg xmlns=\"http://www.w3.org/2000/svg\" overflow=\"visible\" version=\"1.1\">");\r
- for(long time = minTime ; time < maxTime ; time += 1000000000) {\r
- s.printf(locale,\r
- "<line x1=\"%f\" y1=\"%f\" x2=\"%f\" y2=\"%f\" stroke=\"grey\"/>\n",\r
- (time-minTime)*timeScale,\r
- 0.0,\r
- (time-minTime)*timeScale,\r
- row*rowHeight);\r
- } \r
- for(int r = 0;r<lanes.size();++r) {\r
- Lane lane = lanes.get(r);\r
- for(Task task : lane.tasks) {\r
- s.printf(locale,\r
- "<line x1=\"%f\" y1=\"%f\" x2=\"%f\" y2=\"%f\" stroke=\"black\"/>\n",\r
- (task.beginTime-minTime)*timeScale,\r
- r*rowHeight,\r
- (task.beginTime-minTime)*timeScale,\r
- (r+1)*rowHeight);\r
- s.printf(locale,\r
- "<rect x=\"%f\" y=\"%f\" width=\"%f\" height=\"%f\" fill=\"green\"/>\n",\r
- (task.beginTime-minTime)*timeScale,\r
- r*rowHeight,\r
- (task.endTime-task.beginTime)*timeScale,\r
- rowHeight);\r
- }\r
- for(Task task : lane.tasks) {\r
- s.printf(locale,\r
- "<text x=\"%f\" y=\"%f\">%s</text>\n",\r
- (task.endTime-minTime)*timeScale,\r
- (r+0.8)*rowHeight,\r
- task.name);\r
- }\r
- } \r
- s.println("</svg>");\r
- }\r
-\r
- public void visualize2(PrintStream s) {\r
- long minTime = Long.MAX_VALUE;\r
- long maxTime = Long.MIN_VALUE;\r
- ArrayList<Lane> lanes = new ArrayList<Lane>();\r
- \r
- for(Task task : tasks) {\r
- minTime = Math.min(minTime, task.beginTime);\r
- maxTime = Math.max(maxTime, task.endTime);\r
- int laneId;\r
- for(laneId=0;laneId<lanes.size();++laneId)\r
- if(lanes.get(laneId).nextTime < task.beginTime) \r
- break;\r
- Lane lane;\r
- if(laneId < lanes.size())\r
- lane = lanes.get(laneId);\r
- else {\r
- lane = new Lane();\r
- lanes.add(lane);\r
- }\r
- lane.tasks.add(task);\r
- lane.nextTime = Math.max(task.endTime, task.beginTime+COLUMN_WIDTH);\r
- System.out.println(task.name + " -> " + laneId + "[" + task.beginTime + "-" + task.endTime + "]");\r
- }\r
- \r
- double timeScale = 1e-7*5;\r
- double rowHeight = 30.0;\r
- Locale locale = Locale.US;\r
- int row = lanes.size();\r
- \r
- s.println("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>");\r
- s.println("<svg xmlns=\"http://www.w3.org/2000/svg\" overflow=\"visible\" version=\"1.1\">");\r
- for(long time = minTime ; time < maxTime ; time += 1000000000) {\r
- s.printf(locale,\r
- "<line x1=\"%f\" y1=\"%f\" x2=\"%f\" y2=\"%f\" stroke=\"grey\"/>\n",\r
- (time-minTime)*timeScale,\r
- 0.0,\r
- (time-minTime)*timeScale,\r
- row*rowHeight);\r
- } \r
- for(int r = 0;r<lanes.size();++r) {\r
- Lane lane = lanes.get(r);\r
- for(Task task : lane.tasks) {\r
- s.printf(locale,\r
- "<line x1=\"%f\" y1=\"%f\" x2=\"%f\" y2=\"%f\" stroke=\"black\"/>\n",\r
- (task.beginTime-minTime)*timeScale,\r
- r*rowHeight,\r
- (task.beginTime-minTime)*timeScale,\r
- (r+1)*rowHeight);\r
- s.printf(locale,\r
- "<rect x=\"%f\" y=\"%f\" width=\"%f\" height=\"%f\" fill=\"green\"/>\n",\r
- (task.beginTime-minTime)*timeScale,\r
- r*rowHeight,\r
- (task.endTime-task.beginTime)*timeScale,\r
- rowHeight);\r
- }\r
- for(Task task : lane.tasks) {\r
- s.printf(locale,\r
- "<text x=\"%f\" y=\"%f\">%s</text>\n",\r
- (task.endTime-minTime)*timeScale,\r
- (r+0.8)*rowHeight,\r
- task.name);\r
- }\r
- } \r
- s.println("</svg>");\r
- }\r
- \r
- public void visualize(PrintStream s) {\r
- long minTime = Long.MAX_VALUE;\r
- long maxTime = Long.MIN_VALUE;\r
- Map<Long, Integer> threads = new HashMap<Long, Integer>(); \r
- int row = 0;\r
- \r
- for(Task task : tasks) {\r
- minTime = Math.min(minTime, task.beginTime);\r
- maxTime = Math.max(maxTime, task.endTime);\r
- if(!threads.containsKey(task.threadId))\r
- threads.put(task.threadId, row++);\r
- }\r
- \r
- double timeScale = 1e-7*0.8;\r
- double rowHeight = 60.0;\r
- Locale locale = Locale.US;\r
- int textPos[] = new int[row];\r
- \r
- s.println("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>");\r
- s.println("<svg xmlns=\"http://www.w3.org/2000/svg\" overflow=\"visible\" version=\"1.1\">");\r
- for(long time = minTime ; time < maxTime ; time += 1000000000) {\r
- s.printf(locale,\r
- "<line x1=\"%f\" y1=\"%f\" x2=\"%f\" y2=\"%f\" stroke=\"grey\"/>\n",\r
- (time-minTime)*timeScale,\r
- 0.0,\r
- (time-minTime)*timeScale,\r
- row*rowHeight);\r
- } \r
- for(Task task : tasks) {\r
- int r = threads.get(task.threadId);\r
- s.printf(locale,\r
- "<line x1=\"%f\" y1=\"%f\" x2=\"%f\" y2=\"%f\" stroke=\"black\"/>\n",\r
- (task.beginTime-minTime)*timeScale,\r
- r*rowHeight,\r
- (task.beginTime-minTime)*timeScale,\r
- (r+1)*rowHeight);\r
- s.printf(locale,\r
- "<rect x=\"%f\" y=\"%f\" width=\"%f\" height=\"%f\" fill=\"green\"/>\n",\r
- (task.beginTime-minTime)*timeScale,\r
- r*rowHeight,\r
- (task.endTime-task.beginTime)*timeScale,\r
- rowHeight);\r
- }\r
- for(Task task : tasks) {\r
- int r = threads.get(task.threadId);\r
- s.printf(locale,\r
- "<text x=\"%f\" y=\"%f\">%s</text>\n",\r
- (task.endTime-minTime)*timeScale,\r
- (r*3+(textPos[r]++)%2+0.5)*rowHeight/3,\r
- task.name);\r
- }\r
- s.println("</svg>");\r
- }\r
- \r
- public static void main(String[] args) {\r
- try {\r
- ThreadLogVisualizer visualizer = new ThreadLogVisualizer();\r
- visualizer.read(new DataInputStream(new FileInputStream(ThreadLogger.LOG_FILE)));\r
- visualizer.visualize3(new PrintStream(ThreadLogger.LOG_FILE + ".svg"));\r
- } catch (FileNotFoundException e) {\r
- // TODO Auto-generated catch block\r
- e.printStackTrace();\r
- }\r
- }\r
- \r
-}\r
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management
+ * in Industry THTH ry.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VTT Technical Research Centre of Finland - initial API and implementation
+ *******************************************************************************/
+package org.simantics.utils.threads.logger;
+
+import java.io.DataInput;
+import java.io.DataInputStream;
+import java.io.EOFException;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
+public class ThreadLogVisualizer {
+
+ // Do not show tasks shorter than 5ms
+ final public static long DISCARD_LIMIT = 2 * 1000 * 1000;
+ // 1s columns
+ final public static long COLUMN_WIDTH = 1000000000;
+
+ final int onlyOneThread = -1;
+
+ final String colors[] = {
+ "#53c0a7",
+ "#ca49a1",
+ "#64b74e",
+ "#a159ca",
+ "#b6b345",
+ "#656bc5",
+ "#da943b",
+ "#5e99d3",
+ "#d1592b",
+ "#418a53",
+ "#e16182",
+ "#777d34",
+ "#ca89ca",
+ "#b7754c",
+ "#9e4b6b",
+ "#cb4347"
+ };
+
+ class Task implements Comparable<Task> {
+ String name;
+ long beginTime;
+ long endTime;
+ long threadId;
+ long combined = 0;
+
+ public Task(String name, long threadId, long beginTime, long endTime) {
+ if(name.length() > 100) name = name.substring(0, 99);
+ this.name = name;
+ this.threadId = threadId;
+ this.beginTime = beginTime;
+ this.endTime = endTime;
+ }
+
+ @Override
+ // Differences will not fit into int
+ public int compareTo(Task o) {
+ if(beginTime > o.beginTime) return 1;
+ else if(beginTime == o.beginTime) return -1;
+ else return -1;
+ }
+ }
+
+ ArrayList<Task> tasks = new ArrayList<Task>();
+
+ private boolean acceptThread(long threadId) {
+ if(onlyOneThread == -1) return true;
+ else return (threadId&15) == onlyOneThread;
+ }
+
+ private Map<Long, Task> compositeTasks = new HashMap<>();
+
+ public void read(DataInput input) {
+ try {
+ while(true) {
+ try {
+ String taskName = input.readUTF();
+ long threadId = input.readLong();
+ long beginTime = input.readLong();
+ long endTime = input.readLong();
+ if(!acceptThread(threadId)) continue;
+ if((endTime-beginTime) > DISCARD_LIMIT) {
+ tasks.add(new Task(taskName, threadId, beginTime, endTime));
+ Task t = compositeTasks.remove(threadId);
+ if(t != null) {
+ if((t.endTime-t.beginTime) > DISCARD_LIMIT) {
+ tasks.add(new Task(t.combined + " small tasks", t.threadId, t.beginTime, t.endTime));
+ }
+ }
+ } else {
+ Task t = compositeTasks.get(threadId);
+ if(t == null) {
+ t = new Task("", threadId, beginTime, endTime);
+ compositeTasks.put(threadId, t);
+ }
+ if(beginTime - t.endTime > DISCARD_LIMIT) {
+ tasks.add(new Task(t.combined + " small tasks", t.threadId, t.beginTime, t.endTime));
+ t = new Task("", threadId, beginTime, endTime);
+ compositeTasks.put(threadId, t);
+ }
+ t.endTime = endTime;
+ t.combined++;
+ if((t.endTime-t.beginTime) > DISCARD_LIMIT) {
+ tasks.add(new Task(t.combined + " small tasks", t.threadId, t.beginTime, t.endTime));
+ compositeTasks.remove(threadId);
+ }
+ }
+ } catch(EOFException e) {
+ break;
+ }
+ }
+ } catch(IOException e) {
+ }
+
+ Collections.sort(tasks);
+ }
+
+ class Lane {
+ ArrayList<Task> tasks = new ArrayList<Task>();
+ long nextTime = 0;
+ }
+
+ public void visualize3(PrintStream s) {
+
+ long minTime = Long.MAX_VALUE;
+ long maxTime = Long.MIN_VALUE;
+
+ ArrayList<Lane> lanes = new ArrayList<Lane>();
+
+ int laneId = 0;
+ for(Task task : tasks) {
+
+ Lane lane;
+
+ minTime = Math.min(minTime, task.beginTime);
+ maxTime = Math.max(maxTime, task.endTime);
+
+ for(int seek = laneId-1; seek >= 0; --seek) {
+ if(lanes.get(seek).nextTime < task.beginTime) {
+ laneId = seek;
+ } else {
+ break;
+ }
+ }
+
+ if(laneId < lanes.size())
+ lane = lanes.get(laneId);
+ else {
+ lane = new Lane();
+ lanes.add(lane);
+ }
+
+ lane.tasks.add(task);
+ lane.nextTime = Math.max(task.endTime, task.beginTime+COLUMN_WIDTH);
+ System.out.println(task.name + " -> " + laneId + "[" + task.beginTime + "-" + task.endTime + "]");
+
+ laneId++;
+
+ }
+
+ double timeScale = 1e-6;
+ double rowHeight = 30.0;
+ Locale locale = Locale.US;
+ int row = lanes.size();
+
+ s.println("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>");
+ s.println("<svg xmlns=\"http://www.w3.org/2000/svg\" overflow=\"visible\" version=\"1.1\">");
+ for(long time = minTime ; time < maxTime ; time += 1000000000) {
+ s.printf(locale,
+ "<line x1=\"%f\" y1=\"%f\" x2=\"%f\" y2=\"%f\" stroke=\"grey\"/>\n",
+ (time-minTime)*timeScale,
+ 0.0,
+ (time-minTime)*timeScale,
+ row*rowHeight);
+ }
+ for(int r = 0;r<lanes.size();++r) {
+ Lane lane = lanes.get(r);
+ for(Task task : lane.tasks) {
+ s.printf(locale,
+ "<line x1=\"%f\" y1=\"%f\" x2=\"%f\" y2=\"%f\" stroke=\"black\"/>\n",
+ (task.beginTime-minTime)*timeScale,
+ r*rowHeight,
+ (task.beginTime-minTime)*timeScale,
+ (r+1)*rowHeight);
+ s.printf(locale,
+ "<rect x=\"%f\" y=\"%f\" width=\"%f\" height=\"%f\" fill=\"" + colors[(int)task.threadId & 15] + "\"/>\n",
+ (task.beginTime-minTime)*timeScale,
+ r*rowHeight,
+ (task.endTime-task.beginTime)*timeScale,
+ rowHeight);
+ }
+ for(Task task : lane.tasks) {
+ int time = (int)(1e-6 * (task.endTime-task.beginTime));
+ s.printf(locale,
+ "<text x=\"%f\" y=\"%f\">%s</text>\n",
+ (task.endTime-minTime)*timeScale,
+ (r+0.8)*rowHeight,
+ Integer.toString(time) + "ms: " + task.name);
+ }
+ }
+ s.println("</svg>");
+ }
+
+ public void visualize2(PrintStream s) {
+ long minTime = Long.MAX_VALUE;
+ long maxTime = Long.MIN_VALUE;
+ ArrayList<Lane> lanes = new ArrayList<Lane>();
+
+ for(Task task : tasks) {
+ minTime = Math.min(minTime, task.beginTime);
+ maxTime = Math.max(maxTime, task.endTime);
+ int laneId;
+ for(laneId=0;laneId<lanes.size();++laneId)
+ if(lanes.get(laneId).nextTime < task.beginTime)
+ break;
+ Lane lane;
+ if(laneId < lanes.size())
+ lane = lanes.get(laneId);
+ else {
+ lane = new Lane();
+ lanes.add(lane);
+ }
+ lane.tasks.add(task);
+ lane.nextTime = Math.max(task.endTime, task.beginTime+COLUMN_WIDTH);
+ System.out.println(task.name + " -> " + laneId + "[" + task.beginTime + "-" + task.endTime + "]");
+ }
+
+ double timeScale = 1e-7*5;
+ double rowHeight = 30.0;
+ Locale locale = Locale.US;
+ int row = lanes.size();
+
+ s.println("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>");
+ s.println("<svg xmlns=\"http://www.w3.org/2000/svg\" overflow=\"visible\" version=\"1.1\">");
+ for(long time = minTime ; time < maxTime ; time += 1000000000) {
+ s.printf(locale,
+ "<line x1=\"%f\" y1=\"%f\" x2=\"%f\" y2=\"%f\" stroke=\"grey\"/>\n",
+ (time-minTime)*timeScale,
+ 0.0,
+ (time-minTime)*timeScale,
+ row*rowHeight);
+ }
+ for(int r = 0;r<lanes.size();++r) {
+ Lane lane = lanes.get(r);
+ for(Task task : lane.tasks) {
+ s.printf(locale,
+ "<line x1=\"%f\" y1=\"%f\" x2=\"%f\" y2=\"%f\" stroke=\"black\"/>\n",
+ (task.beginTime-minTime)*timeScale,
+ r*rowHeight,
+ (task.beginTime-minTime)*timeScale,
+ (r+1)*rowHeight);
+ s.printf(locale,
+ "<rect x=\"%f\" y=\"%f\" width=\"%f\" height=\"%f\" fill=\"" + colors[(int)task.threadId & 15] + "\"/>\n",
+ (task.beginTime-minTime)*timeScale,
+ r*rowHeight,
+ (task.endTime-task.beginTime)*timeScale,
+ rowHeight);
+ }
+ for(Task task : lane.tasks) {
+ s.printf(locale,
+ "<text x=\"%f\" y=\"%f\">%s</text>\n",
+ (task.endTime-minTime)*timeScale,
+ (r+0.8)*rowHeight,
+ task.name);
+ }
+ }
+ s.println("</svg>");
+ }
+
+ public void visualize(PrintStream s) {
+ long minTime = Long.MAX_VALUE;
+ long maxTime = Long.MIN_VALUE;
+ Map<Long, Integer> threads = new HashMap<Long, Integer>();
+ int row = 0;
+
+ for(Task task : tasks) {
+ minTime = Math.min(minTime, task.beginTime);
+ maxTime = Math.max(maxTime, task.endTime);
+ if(!threads.containsKey(task.threadId))
+ threads.put(task.threadId, row++);
+ }
+
+ double timeScale = 1e-7*0.8;
+ double rowHeight = 60.0;
+ Locale locale = Locale.US;
+ int textPos[] = new int[row];
+
+ s.println("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>");
+ s.println("<svg xmlns=\"http://www.w3.org/2000/svg\" overflow=\"visible\" version=\"1.1\">");
+ for(long time = minTime ; time < maxTime ; time += 1000000000) {
+ s.printf(locale,
+ "<line x1=\"%f\" y1=\"%f\" x2=\"%f\" y2=\"%f\" stroke=\"grey\"/>\n",
+ (time-minTime)*timeScale,
+ 0.0,
+ (time-minTime)*timeScale,
+ row*rowHeight);
+ }
+ for(Task task : tasks) {
+ int r = threads.get(task.threadId);
+ s.printf(locale,
+ "<line x1=\"%f\" y1=\"%f\" x2=\"%f\" y2=\"%f\" stroke=\"black\"/>\n",
+ (task.beginTime-minTime)*timeScale,
+ r*rowHeight,
+ (task.beginTime-minTime)*timeScale,
+ (r+1)*rowHeight);
+ s.printf(locale,
+ "<rect x=\"%f\" y=\"%f\" width=\"%f\" height=\"%f\" fill=\"" + colors[(int)task.threadId & 15] + "\"/>\n",
+ (task.beginTime-minTime)*timeScale,
+ r*rowHeight,
+ (task.endTime-task.beginTime)*timeScale,
+ rowHeight);
+ }
+ for(Task task : tasks) {
+ int r = threads.get(task.threadId);
+ s.printf(locale,
+ "<text x=\"%f\" y=\"%f\">%s</text>\n",
+ (task.endTime-minTime)*timeScale,
+ (r*3+(textPos[r]++)%2+0.5)*rowHeight/3,
+ task.name);
+ }
+ s.println("</svg>");
+ }
+
+ public static void main(String[] args) {
+ try {
+ ThreadLogVisualizer visualizer = new ThreadLogVisualizer();
+ visualizer.read(new DataInputStream(new FileInputStream(ThreadLogger.LOG_FILE)));
+ visualizer.visualize3(new PrintStream(ThreadLogger.LOG_FILE + ".svg"));
+ } catch (FileNotFoundException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+}