Gersis Test Tasks

2.1 Задание на алгоритмизацию code
2.2 Объектно-ориентированное задание code
2.3 Структуры данных code
2.4 Финансовые алгоритмы code
2.5 Комбинаторная задача code
3.1 Многопоточность code
3.2 Exceptions code
3.3 Singleton code
3.4 SQL code
Tests code

Description


* Main logic of the system:
   1) First init starts from client (AJAX with JQuery): onButtonClick() + /gersis/uiproxy?task=
   2) In UIProxy we are creating new Task and run it
   3) When we are creating new Task we are creating new TaskBox.
   This class has logic with java.lang.reflect
   4) Inside TaskBox we are creating some of the org.kropli.gersis.examples objects (Task2_1, Task2_2, etc)
   5) Then we invoke output() method from examples objects and get some string result
   6) Creating with this string result some xml data
   7) Transport this xml data to the client side by the servlet UIProxy
   8) Show result of example object in buffer window

** All solutions of task you can find in src code below (all accompanied with comments)

packages:
  org.kropli.gersis.action - additional classes for 3.1 task
  org.kropli.gersis.core - parts of system
     TestInit - servlet (/test) for run all tests
     UIBuffer - servlet (/uibuffer) for activate buffer
     UIProxy - servlet (/uiproxy) for connection from client JS to server Java logic
     UIConfig - class with all config params of the system
  org.kropli.gersis.examples - classes of all tasks (Task2_1, Task2_2, ...)
  org.kropli.gersis.exceptions - additional classes for 3.2 task
  org.kropli.gersis.gsingletons -additional classes for 3.3 task
  org.kropli.gersis.io -parts of system
     _buffer - static class for debuging and working 3.1 task where we need to get buffer logs from threads
     FileStreamURL - class for work with any file from URL
     XMLService - class for building xml datas
  org.kropli.gersis.task -parts of system
     Task - base object for task
     TaskBox - box where we can run task
     TaskInit - class of task for catching any exceptions
  org.kropli.gersis.tests - testing tasks
  org.kropli.gersis.tree - additional classes for 2.2 task
     Tree - building tree and other action with it
     TreeFactory - factory for getting tree class
     Node - node of the tree
     Value - base object with IValue type
  org.kropli.gersis.treemap - additional classes for 2.2 task
     TreeMapFactory - factory for getting some type of tree map (json type in our system)
     JSONTreeMap - in this class we are using com.google.gson.Gson for building our map form json file
     LinkTreeMap - building tree map
  org.kropli.gersis.util -parts of system


org.kropli.gersis.examples:

Task2_1.java
Task2_2.java
     tree.txt
     tree.json
     node1.json
     node2.json
     node3.json
     node4.json
Task2_3.java
     task2_3.jpg
Task2_4.java
Task2_5.java
Task3_1.java
Task3_2.java
Task3_3.java
Task3_4.java
ITask.java

org.kropli.gersis.action:

Action.java
ActionService.java.java
IAction.java.java
InitAction.java.java

org.kropli.gersis.core:

TestInit.java
UIBuffer.java
UIConfig.java
UIProxy.java

org.kropli.gersis.exceptions:

Exception1.java
Exception2.java
Exception3.java
ImportantException.java

org.kropli.gersis.gsingletons:

SingletonOne.java
SingletonThree.java
SingletonTwo.java

org.kropli.gersis.io:

_buffer.java
FileStreamURL.java
XMLService.java

org.kropli.gersis.task:

Task.java
TaskBox.java
TaskInit.java

org.kropli.gersis.tests:

Task2_1Test.java
Task2_2Test.java
Task2_4Test.java

org.kropli.gersis.tree:

IValue.java
Node.java
Tree.java
TreeFactory.java
Value.java

org.kropli.gersis.treemap:

ITreeMap.java
JSONTreeMap.java
LinkTreeMap.java
TreeMapFactory.java

org.kropli.gersis.util:

DateService.java
ModArrayList.java



org.kropli.gersis.examples:

Task2_1.java
Task2_2.java
     tree.txt
     tree.json
     node1.json
     node2.json
     node3.json
     node4.json
Task2_3.java
     task2_3.jsp
Task2_4.java
Task2_5.java
Task3_1.java
Task3_2.java
Task3_3.java
Task3_4.java
ITask.java

 > Task2_1.java
package org.kropli.gersis.examples;

import java.util.Collections;
import java.util.List;

import org.kropli.gersis.util.ModArrayList;

public class Task2_1 implements ITask {
  
  private int[] array = {278715, -4, -13, -305173256, -8, -19};
  
  private static final int ABSOLUTE_INDEX_COUNT = 5;
  
  private String output = new String();
  
  
  @Override
  public String output() {
    ModArrayList<Integer> modArray = new ModArrayList<Integer>(array);
    output += "original array: " + modArray + "\n";
    
    ModArrayList<Integer> minIndexes = new ModArrayList<Integer>(getAbsoluteIndexOfArray(false));
    ModArrayList<Integer> maxIndexes = new ModArrayList<Integer>(getAbsoluteIndexOfArray(true));
    
    
    output += "detected indexes of MAX numbers: " + maxIndexes + "\n";
    output += "detected indexes of MIN numbers: " + minIndexes + "\n";
    
    return output;
    
  /*
   * [output]:
   
   *  original array: [2, 78, 7, 15, -4, -13, -30, 5, 17, 32, 56, -8, -19]
   
   *  absolute array: [2, 78, 7, 15, 4, 13, 30, 5, 17, 32, 56, 8, 19] 
   *  sort array from min to max of numbers: [2, 4, 5, 7, 8, 13, 15, 17, 19, 30, 32, 56, 78] 
   
   *  absolute array: [2, 78, 7, 15, 4, 13, 30, 5, 17, 32, 56, 8, 19]
   *  sort array from max to min of numbers: [78, 56, 32, 30, 19, 17, 15, 13, 8, 7, 5, 4, 2]
   *
   *  detected indexes of MAX numbers: [1, 10, 9, 6, 12]
   *  detected indexes of MIN numbers: [0, 4, 7, 2, 11]
   
   */
    
  }
  

    /* interface of project that call open interface */
    private int[] getAbsoluteIndexOfArray(boolean isMaxAdsoluteIndex){
      return getAbsoluteIndexOfArray(array, ABSOLUTE_INDEX_COUNT, isMaxAdsoluteIndex);
    }
  
  
  /* open interface */
  public int[] getAbsoluteIndexOfArray(int[] array, int N, boolean isMaxAdsoluteIndex){
    output += "\n";
    
    int[] absoluteArray = new int[array.length];
    
    // make absolute from original array - all numbers > 0
    for(int i = 0; i < absoluteArray.length; i++){
      absoluteArray[i= Math.abs(array[i])
    }
    
    List<Integer> listAbsoluteArray = new ModArrayList<Integer>(absoluteArray);
    List<Integer> listAbsoluteArrayBuffer = new ModArrayList<Integer>(absoluteArray);
    
    
    output += "absolute array: " + listAbsoluteArray + "\n";
    
    // sort array from min to max of indexes
    Collections.sort(listAbsoluteArray);
    if(isMaxAdsoluteIndex){
      // sort array from max to min of indexes
      Collections.reverse(listAbsoluteArray);
      
      output += "sort array from max to min of numbers: " + listAbsoluteArray + "\n";
    }else{
      output += "sort array from min to max of numbers: " + listAbsoluteArray + "\n";
    }
    
    
    // cutting array to N count of element and find indexes
    int[] buffer = new int[N];
    for(int i = 0; i < N; i++ ){
      buffer[i= listAbsoluteArrayBuffer.indexOf(listAbsoluteArray.get(i));
    }
    
    output += "\n";
    
    return buffer;
  }
  
}
top

 > Task2_2.java
/*
 *   package *.treemap:
 *    TreeMapFactory - singleton/factory, where you can get JSONTreeMap or other ITreeMap object
 *    LinkTreeMap - base skeleton(link) of TreeMap
 *
 *      .. with map you can build tree, find in tree any node/nodes and other work with tree
 *      .. project used JSON type of input file, so all maps of tree/nodes must be in JSON type 
 *      .. project can use not only JSON, but XML/HTML/TXT and other types 
 *        - to do it, you can realize, for example, XMLTreeMap 
 *          and use TreeMapFactory.getTreeMapObj(XMLTreeMap.class) with some adding in getTreeMapObj()
 *                
 *           
 *    
 *    package *.tree:
 *     TreeFactory - singleton/factory, where you can get Tree object
 *     Tree - main class, where you can build tree and do with it all you want
 *     Node - node of tree
 *     Value - object with IValue type 
 
 *   package *.core:
 *     UIConfig - simple object, where you cat get all configure data of this project
 
 */


/*

[print Tree Map form json file: ..html/task2_2/tree.json ]

name: (root)

links of [root]:
name: (test1)
desc: some desc from test1



links of [test1]:
name: (test5)
desc: some desc from test5



links of [root]:
name: (test2)
desc: some desc from test2



links of [test2]:
name: (test6)
desc: some desc from test6



links of [test2]:
name: (test7)
desc: some desc from test7



links of [test7]:
name: (test8)
desc: some desc from test8



links of [test7]:
name: (test9)
desc: some desc from test9



links of [root]:
name: (test3)
desc: some desc from test3



links of [root]:
name: (test4)
desc: some desc from test4



[print Result Tree]

name: root
object: null
location: root
links:
[  name: test1
  desc: some desc from test1
  parent: {root}
  object: null
  location: root->test1
  links:
[    name: test5
    desc: some desc from test5
    parent: {test1}
    object: null
    location: root->test1->test5

]
,   name: test2
  desc: some desc from test2
  parent: {root}
  object: null
  location: root->test2
  links:
[    name: test6
    desc: some desc from test6
    parent: {test2}
    object: null
    location: root->test2->test6

,     name: test7
    desc: some desc from test7
    parent: {test2}
    object: null
    location: root->test2->test7
    links:
[      name: test8
      desc: some desc from test8
      parent: {test7}
      object: null
      location: root->test2->test7->test8

,       name: test9
      desc: some desc from test9
      parent: {test7}
      object: null
      location: root->test2->test7->test9

]
]
,   name: test3
  desc: some desc from test3
  parent: {root}
  object: null
  location: root->test3

,   name: test4
  desc: some desc from test4
  parent: {root}
  object: null
  location: root->test4

]


[print Result Tree after adding ( +test11 ): ..html/task2_2/node1.json ]

name: root
object: null
location: root
links:
[  name: test1
  desc: some desc from test1
  parent: {root}
  object: null
  location: root->test1
  links:
[    name: test5
    desc: some desc from test5
    parent: {test1}
    object: null
    location: root->test1->test5

]
,   name: test2
  desc: some desc from test2
  parent: {root}
  object: null
  location: root->test2
  links:
[    name: test6
    desc: some desc from test6
    parent: {test2}
    object: null
    location: root->test2->test6

,     name: test7
    desc: some desc from test7
    parent: {test2}
    object: null
    location: root->test2->test7
    links:
[      name: test8
      desc: some desc from test8
      parent: {test7}
      object: null
      location: root->test2->test7->test8

,       name: test9
      desc: some desc from test9
      parent: {test7}
      object: null
      location: root->test2->test7->test9

]
]
,   name: test3
  desc: some desc from test3
  parent: {root}
  object: null
  location: root->test3

,   name: test4
  desc: some desc from test4
  parent: {root}
  object: null
  location: root->test4

,   name: test11
  desc: some desc from test11
  parent: {root}
  object: null
  location: root->test11

]


[print Result Tree after adding ( +test12 ): ..html/task2_2/node2.json ]

name: root
object: null
location: root
links:
[  name: test1
  desc: some desc from test1
  parent: {root}
  object: null
  location: root->test1
  links:
[    name: test5
    desc: some desc from test5
    parent: {test1}
    object: null
    location: root->test1->test5

]
,   name: test2
  desc: some desc from test2
  parent: {root}
  object: null
  location: root->test2
  links:
[    name: test6
    desc: some desc from test6
    parent: {test2}
    object: null
    location: root->test2->test6

,     name: test7
    desc: some desc from test7
    parent: {test2}
    object: null
    location: root->test2->test7
    links:
[      name: test8
      desc: some desc from test8
      parent: {test7}
      object: null
      location: root->test2->test7->test8

,       name: test9
      desc: some desc from test9
      parent: {test7}
      object: null
      location: root->test2->test7->test9

,       name: test12
      desc: some desc from test12
      parent: {test7}
      object: null
      location: root->test2->test7->test12

]
]
,   name: test3
  desc: some desc from test3
  parent: {root}
  object: null
  location: root->test3

,   name: test4
  desc: some desc from test4
  parent: {root}
  object: null
  location: root->test4

]


[print Result Tree after adding ( +test13,test14,test15 ): ../html/task2_2/node3.json ]

name: root
object: null
location: root
links:
[  name: test1
  desc: some desc from test1
  parent: {root}
  object: null
  location: root->test1
  links:
[    name: test5
    desc: some desc from test5
    parent: {test1}
    object: null
    location: root->test1->test5

]
,   name: test2
  desc: some desc from test2
  parent: {root}
  object: null
  location: root->test2
  links:
[    name: test6
    desc: some desc from test6
    parent: {test2}
    object: null
    location: root->test2->test6

,     name: test7
    desc: some desc from test7
    parent: {test2}
    object: null
    location: root->test2->test7
    links:
[      name: test8
      desc: some desc from test8
      parent: {test7}
      object: null
      location: root->test2->test7->test8

,       name: test9
      desc: some desc from test9
      parent: {test7}
      object: null
      location: root->test2->test7->test9

,       name: test13
      desc: some desc from test13
      parent: {test7}
      object: null
      location: root->test2->test7->test13
      links:
[        name: test14
        desc: some desc from test14
        parent: {test13}
        object: null
        location: root->test2->test7->test13->test14

,         name: test15
        desc: some desc from test15
        parent: {test13}
        object: null
        location: root->test2->test7->test13->test15

]
]
]
,   name: test3
  desc: some desc from test3
  parent: {root}
  object: null
  location: root->test3

,   name: test4
  desc: some desc from test4
  parent: {root}
  object: null
  location: root->test4

]


[print Node of Tree (test7): ..html/task2_2/node4.json ]

    name: test7
    desc: some desc from test7
    parent: {test2}
    object: null
    location: root->test2->test7
    links:
[      name: test8
      desc: some desc from test8
      parent: {test7}
      object: null
      location: root->test2->test7->test8

,       name: test9
      desc: some desc from test9
      parent: {test7}
      object: null
      location: root->test2->test7->test9

]


[print Nodes of Node (test7): ..html/task2_2/node4.json ]

[      name: test8
      desc: some desc from test8
      parent: {test7}
      object: null
      location: root->test2->test7->test8

,       name: test9
      desc: some desc from test9
      parent: {test7}
      object: null
      location: root->test2->test7->test9

]

[print Parent of Node (test7): ../html/task2_2/node4.json ]

  name: test2
  desc: some desc from test2
  parent: {root}
  object: null
  location: root->test2
  links:
[    name: test6
    desc: some desc from test6
    parent: {test2}
    object: null
    location: root->test2->test6

,     name: test7
    desc: some desc from test7
    parent: {test2}
    object: null
    location: root->test2->test7
    links:
[      name: test8
      desc: some desc from test8
      parent: {test7}
      object: null
      location: root->test2->test7->test8

,       name: test9
      desc: some desc from test9
      parent: {test7}
      object: null
      location: root->test2->test7->test9

]
]


[print Result Tree after adding object (to test7): ../html/task2_2/node4.json ]

name: root
object: null
location: root
links:
[  name: test1
  desc: some desc from test1
  parent: {root}
  object: null
  location: root->test1
  links:
[    name: test5
    desc: some desc from test5
    parent: {test1}
    object: null
    location: root->test1->test5

]
,   name: test2
  desc: some desc from test2
  parent: {root}
  object: null
  location: root->test2
  links:
[    name: test6
    desc: some desc from test6
    parent: {test2}
    object: null
    location: root->test2->test6

,     name: test7
    desc: some desc from test7
    parent: {test2}
    object: org.kropli.gersis.tree.Value@1560af9
    location: root->test2->test7
    links:
[      name: test8
      desc: some desc from test8
      parent: {test7}
      object: null
      location: root->test2->test7->test8

,       name: test9
      desc: some desc from test9
      parent: {test7}
      object: null
      location: root->test2->test7->test9

]
]
,   name: test3
  desc: some desc from test3
  parent: {root}
  object: null
  location: root->test3

,   name: test4
  desc: some desc from test4
  parent: {root}
  object: null
  location: root->test4

]


[print Result Object from Node (to test7): ../html/task2_2/node4.json ]

org.kropli.gersis.tree.Value@1560af9

*/



package org.kropli.gersis.examples;

import org.kropli.gersis.core.UIConfig;
import org.kropli.gersis.io.FileStreamURL;
import org.kropli.gersis.tree.IValue;
import org.kropli.gersis.tree.Tree;
import org.kropli.gersis.tree.TreeFactory;
import org.kropli.gersis.tree.Value;
import org.kropli.gersis.treemap.JSONTreeMap;
import org.kropli.gersis.treemap.LinkTreeMap;
import org.kropli.gersis.treemap.TreeMapFactory;

public class Task2_2 implements ITask {

  private String jsonURL = UIConfig.getHost() "/html/task2_2/tree.json";
  
  private String jsonURLNode1 = UIConfig.getHost() "/html/task2_2/node1.json";
  private String jsonURLNode2 = UIConfig.getHost() "/html/task2_2/node2.json";
  private String jsonURLNode3 = UIConfig.getHost() "/html/task2_2/node3.json";
  
  private String jsonURLNode4 = UIConfig.getHost() "/html/task2_2/node4.json";
  
  String output = new String();
  
  @Override
  public String output() {
    
    /* read file from url */
    FileStreamURL jsonFile = new FileStreamURL(jsonURL);
    
    /* create map form the file ( LinkTreeMap ) */ 
    JSONTreeMap jsonTreeMapObj = (JSONTreeMapTreeMapFactory.getTreeMapObj(JSONTreeMap.class);
    LinkTreeMap linkTreeMap = jsonTreeMapObj.getTreeMap(jsonFile.read());
    jsonTreeMapObj.clear();
    
  /*
   *   Other case of getting ListTreeMap cad be done with one type of TreeMap class 
   *  (no any ITreeMap classes) and calling ...FromJSONFile() function:
   *  
   *  TreeMap treeMapObj = TreeMapFactory.getTreeMapObj();
   *  (if we have json file)
   *  ListTreeMap listTreeMap = treeMapObj.getTreeMapFromJSONFile(jsonFile.read());
   *  or (if we have xml file)
   *  ListTreeMap listTreeMap = treeMapObj.getTreeMapFromXMLFile(xmlFile.read());
   *  
   *  May be, it's more easily...
   
   */
    
    output += "[print Tree Map form json file: " + jsonURL + " ]\n\n" + linkTreeMap + "\n\n";
    
    
    Tree treeObj = TreeFactory.get();
    treeObj.buildTree(linkTreeMap);
    
    Tree treeObj1 = treeObj.clone();
    treeObj1.buildTree(linkTreeMap);
    
    Tree treeObj2 = treeObj.clone();
    treeObj2.buildTree(linkTreeMap);
    
    Tree treeObj3 = treeObj.clone();
    treeObj3.buildTree(linkTreeMap);
    
    
    output += "[print Result Tree]\n\n" + treeObj + "\n\n";

    
    FileStreamURL jsonFileNode1 = new FileStreamURL(jsonURLNode1);
    LinkTreeMap listTreeMapNode1 = jsonTreeMapObj.getTreeMap(jsonFileNode1.read());
    jsonTreeMapObj.clear();
    
    
    FileStreamURL jsonFileNode2 = new FileStreamURL(jsonURLNode2);
    LinkTreeMap listTreeMapNode2 = jsonTreeMapObj.getTreeMap(jsonFileNode2.read());
    jsonTreeMapObj.clear();
    
    FileStreamURL jsonFileNode3 = new FileStreamURL(jsonURLNode3);
    LinkTreeMap listTreeMapNode3 = jsonTreeMapObj.getTreeMap(jsonFileNode3.read());
    jsonTreeMapObj.clear();
    
    FileStreamURL jsonFileNode4 = new FileStreamURL(jsonURLNode4);
    LinkTreeMap listTreeMapNode4 = jsonTreeMapObj.getTreeMap(jsonFileNode4.read());
    jsonTreeMapObj.clear();
    
    
    treeObj1.add(listTreeMapNode1);
    output += "[print Result Tree after adding ( +test11 ): " + jsonURLNode1 + " ]\n\n" 
                                    treeObj1 + "\n\n";

    treeObj2.add(listTreeMapNode2);
    output += "[print Result Tree after adding ( +test12 ): " + jsonURLNode2 + " ]\n\n" 
                                    treeObj2 + "\n\n";

    treeObj3.add(listTreeMapNode3);
    output += "[print Result Tree after adding ( +test13,test14,test15 ): " + jsonURLNode3 + " ]\n\n" 
                                    treeObj3 + "\n\n";

    
    output += "[print Node of Tree (test7): " + jsonURLNode4 + " ]\n\n" 
                          treeObj.getNode(listTreeMapNode4"\n\n";
    
    output += "[print Nodes of Node (test7): " + jsonURLNode4 + " ]\n\n" 
                          treeObj.getNodesOfNode(listTreeMapNode4"\n\n";    
    
    output += "[print Parent of Node (test7): " + jsonURLNode4 + " ]\n\n" 
                          treeObj.getParentOfNode(listTreeMapNode4"\n\n";
    
    
    IValue object = (IValuenew Value();
    treeObj.addObjectToNode(listTreeMapNode4, object);
    output += "[print Result Tree after adding object (to test7): " 
                          jsonURLNode4 + " ]\n\n" + treeObj + "\n\n";
    
    
    IValue objectOut = treeObj.getObjectFromNode(listTreeMapNode4);
    output += "[print Result Object from Node (to test7): " 
                          jsonURLNode4 + " ]\n\n" + objectOut + "\n\n";
    
    
    
    treeObj.clear();
    
    return output;
  }

}
top

 > tree.txt
top

 > tree.json
top

 > node1.json
top

 > node2.json
top

 > node3.json
top

 > node4.json
top

 > Task2_3.java
package org.kropli.gersis.examples;

public class Task2_3 implements ITask {

  private String output = new String();
  
  public String output() {
    
/*    
    mysql> CREATE table Groupp (
          id int(5) not null auto_increment, 
          name varchar(10), 
          PRIMARY KEY(id)
         );
    
    mysql> CREATE table Subject (
          id int(5) not null auto_increment, 
          name varchar(10), 
          PRIMARY KEY(id)
         );
    
    mysql> CREATE table Lecturer (
          id int(5) not null auto_increment,
          name varchar(10), 
          PRIMARY KEY(id)
         );
    
    mysql> CREATE table Lesson (
          id int(5) not null auto_increment, 
          subject int(10), 
          groupp int(10), 
          lecturer int(10), 
          PRIMARY KEY(id)
        );
    
    
    mysql> select * from Groupp;
    +----+---------+
    | id | name    |
    +----+---------+
    |  1 | Group 1 |
    |  2 | Group 2 |
    |  3 | Group 3 |
    |  4 | Group 4 |
    +----+---------+

    mysql> select * from Subject;
    +----+-----------+
    | id | name      |
    +----+-----------+
    |  1 | Subject 1 |
    |  2 | Subject 2 |
    |  3 | Subject 3 |
    |  4 | Subject 4 |
    +----+-----------+

    mysql> select * from Lecturer;
    +----+------------+
    | id | name       |
    +----+------------+
    |  1 | Lecturer 1 |
    |  2 | Lecturer 2 |
    |  3 | Lecturer 3 |
    |  4 | Lecturer 4 |
    +----+------------+

    
    mysql> select * from Lesson;
    +----+--------+---------+----------+
    | id | subject | groupp | lecturer |
    +----+--------+---------+----------+
    |  1 |      1 |       1 |        1 |
    |  2 |      2 |       1 |        2 |
    |  3 |      3 |       1 |        3 |
    |  4 |      2 |       2 |        3 |
    |  5 |      3 |       2 |        1 |
    |  6 |      3 |       3 |        2 |
    |  7 |      4 |       3 |        1 |
    +----+--------+---------+----------+

    
    
    mysql> SELECT name FROM Subject 
         INNER JOIN Lesson on Lesson.subject = Subject.id 
         WHERE Lesson.lecturer = (
              SELECT id FROM Lecturer WHERE name = "Lecturer 1"
           
         AND Lesson.groupp = (
             SELECT id FROM Groupp WHERE name = "Group 2"
          );
    
    +-----------+
    | name      |
    +-----------+
    | Subject 3 |
    +-----------+

    mysql> SELECT name FROM Lecturer 
         JOIN Lesson on Lesson.lecturer = Lecturer.id 
         WHERE Lesson.subject = (
               SELECT id FROM Subject WHERE name = "Subject 2"
              
        AND Lesson.groupp = (
            SELECT id FROM Groupp WHERE name = "Group 2"
          );
    
    +------------+
    | name       |
    +------------+
    | Lecturer 3 |
    +------------+


    mysql> SELECT name FROM Groupp 
         JOIN Lesson on Lesson.groupp = Groupp.id 
         WHERE Lesson.lecturer = (
               SELECT id FROM Lecturer WHERE name = "Lecturer 1"
          );
    
    +---------+
    | name    |
    +---------+
    | Group 1 |
    | Group 2 |
    | Group 3 |
    +---------+

*/    

    
    
    
    return output = "see src code";
  }

}
top

 > task2_3.jpg
top

 > Task2_4.java
package org.kropli.gersis.examples;

import java.util.ArrayList;
import java.util.List;

public class Task2_4 implements ITask {

  private String output = new String();
  
  
  public String output() {
    
    Finance fin = new Finance();
    
    fin.setDiscountValue(0.3);
    fin.setLimitValue(500);
    fin.setCountAfterPoint(3);
    
    fin.addCharge(153);
    fin.addCharge(336);
    fin.addCharge(454);
    

    fin.calculateCharges();
    
    output += fin.toString();
    
/*    
    [131.437, 288.646, 390.016]: 810.099
*/
    
    return output;
  }
  
    public class Finance {
      
      private double limitValue;
      private double discountValue;
      
      /* set default count = 2 */
      private int countAfterPoint = 2;
      
      private List<Double> charges;
      
      private double sumResult = 0;
      
      public void setLimitValue(double limitValue){
        this.limitValue = limitValue;
      }
      
      public double getLimitValue(){
        return limitValue;
      }
      
      public void setDiscountValue(double discountValue){
        if(discountValue > && discountValue < 1){
          this.discountValue = discountValue;
        }
      }
      
      public double getDiscountValue(){
        return discountValue;
      }
      
      
      public void setCountAfterPoint(int countAfterPoint){
        this.countAfterPoint = countAfterPoint;
      }
      
      public double getCountAfterPoint(){
        return countAfterPoint;
      }
      
      public double getSumResult(){
        return sumResult;
      }
      
      
      public void addCharge(double charge){
        if(charges == null){
          charges = new ArrayList<Double>();
        }
        
        charges.add(makeCountAfterPoint(charge));
      }
      
        private double makeCountAfterPoint(double value){
          String str = new String();
          
          for(int i = 0; i < countAfterPoint; i++){
            str += "0";
          }
          
          Double inn = new Double("1" + str);
          Double inr = new Double("1" + str + "." + str);
          
          value = Math.round(value * inn/ inr;
          
          return value;
        }
      
      
      public double calculateCharges(){
        for(int i = 0; i < charges.size(); i++){
          double tmp = makeCountAfterPoint(charges.get(i));
          sumResult += tmp;
        }
        
        if(sumResult > limitValue){
          calculateChargesWithDiscount();
        }
        
        return sumResult;
      }
      
      
        private void calculateChargesWithDiscount(){
          double discount = 0;
          discount = discountValue * (sumResult - limitValue);
            
          List<Double> chargeWithDiscount = new ArrayList<Double>();
          for(Double charge : charges){
            double tmp = charge - charge / sumResult * discount);
            
            chargeWithDiscount.add(makeCountAfterPoint(tmp));
          }
          
          sumResult = 0;
          for(int i = 0; i < chargeWithDiscount.size(); i++){
            sumResult += chargeWithDiscount.get(i);
          }
          
          sumResult = makeCountAfterPoint(sumResult);
          
          charges = chargeWithDiscount;
        }
      
        
      public String toString(){
        String res = new String();
        
        res += charges + ": " + sumResult + "\n";
        
        return res;
      }
      
    }
  
  
}
top

 > Task2_5.java
package org.kropli.gersis.examples;

public class Task2_5 implements ITask {

  private String output = new String();
  
  public String output() {
    
/*    
    we have:
      - first and second coast 
      - on the first coast 1, 2, 7, 10 numbers
      - one river
      - one boat
      
    task: 
      move all numbers to the second coast 
    
    solution:
      (1,2) - (1) - (7,10) - (2) - (1,2) = 17
      
      1) 1 with 2 go to second coast = 2 speed
      2) 1 return to first coast = 1 speed
      3) 7 with 10 go to the second coast = 10 speed
      4) 2 return to the first coast = 2 speed
      5) 1 with 2 go to the sesond coast = 2 speed
      
      result (speed): 2 + 1 + 10 + 2 + 2 = 17 speed  
*/    
    
    
    return output = "see src code";
  }

  
}
top

 > Task3_1.java
package org.kropli.gersis.examples;

import org.kropli.gersis.action.Action;
import org.kropli.gersis.action.ActionService;
import org.kropli.gersis.io._buffer;

public class Task3_1 implements ITask {

  
   /* set output flag for JS client to start buffer servlet */
  private String output = "__BUFFER__";
  
  @Override
  public String output() {
    
    _buffer.clear();
    _buffer.add("Running threads \n");
    
    
    Action act1 = new Action("Action 1");
    Action act2 = new Action("Action 2");
    
    ActionService actService = new ActionService();
    
    actService.addAction(act1, 33000);
    actService.addAction(act2, 34000);
    
    actService.runActions();

/*    
    13:44:05.833: Running threads 
    13:44:05.834: Creating new thread of : Action 1
    13:44:05.834: Creating new thread of : Action 2
    
    13:44:08.835: Count / time interval: 1 / 3000ms
    13:44:08.835: [Action 1] running.. 
    13:44:11.835: Count / time interval: 2 / 3000ms
    13:44:11.835: [Action 1] running.. 
    
    13:44:14.835: life of main init... 
    
    13:44:14.835: Count / time interval: 3 / 3000ms
    13:44:14.835: [Action 1] running.. 
    13:44:14.835: Thread of: Action 1 stopping.. 
    13:44:18.835: Count / time interval: 1 / 4000ms
    13:44:18.835: [Action 2] running.. 
    13:44:22.835: Count / time interval: 2 / 4000ms
    13:44:22.835: [Action 2] running.. 
    
    13:44:26.835: life of main init...
     
    13:44:26.835: Count / time interval: 3 / 4000ms
    13:44:26.835: [Action 2] running.. 
    13:44:26.835: Thread of: Action 2 stopping.. 
*/

    
    return output;
  }
  
  
}
top

 > Task3_2.java
package org.kropli.gersis.examples;

import org.kropli.gersis.exceptions.Exception1;
import org.kropli.gersis.exceptions.Exception2;
import org.kropli.gersis.exceptions.Exception3;
import org.kropli.gersis.exceptions.ExceptionTypes;
import org.kropli.gersis.exceptions.ImportantException;

public class Task3_2 implements ITask {

  private String output = new String();
  
  public String output() {
    
    try {
      
      output += new Calc().runCalculate();

    catch (ImportantException e) {
      output += "catch skiped ImportantException";
    }
    
    return output;
  }

   public class Calc {
     
     /* 
      * Catching Exception1, Exception2, Exception3 and all RuntimeException, 
      * but not ImportantException.
      *  
      * ImportantException skipping to catching in other methods ( in output() ) 
     */
     public String runCalculate() throws ImportantException{
       
       ExceptionTypes[] exps = new ExceptionTypes[5];
       exps[0= ExceptionTypes.EXCEPTION1;
       exps[1= ExceptionTypes.EXCEPTION2;
       exps[2= ExceptionTypes.EXCEPTION3;
       exps[3= ExceptionTypes.RUNTIME_EXCEPTION;
       exps[4= ExceptionTypes.IMPORTANT_EXCEPTION;
       
       
       for(int i = 0; i < exps.length; i++){
         try {
           
           output += "" + calculate(exps[i]);
           
         catch (Exception1 e) {
           output += e;
         catch (Exception2 e) {
           output += e;
         catch (Exception3 e) {
           output += e;
        catch (RuntimeException e) {
          output += "catch RuntimeException: " + e + "\n";
         }
       }
       
       
      return output;
     }
     
     public int calculate(ExceptionTypes typeExceptionthrows 
                   ImportantException, Exception1, Exception2, Exception3 
                 {

      if(typeException == ExceptionTypes.EXCEPTION1){
        throw new Exception1();
      }
          
      if(typeException == ExceptionTypes.EXCEPTION2){
        throw new Exception2();
      }
          
      if(typeException == ExceptionTypes.EXCEPTION3){
        throw new Exception3();
      }
      
      if(typeException == ExceptionTypes.RUNTIME_EXCEPTION){
        int b = 10 0;
      }
          
      if(typeException == ExceptionTypes.IMPORTANT_EXCEPTION){
        throw new ImportantException();
      }
      
      return 0;
     }
       
   }
  

}
top

 > Task3_3.java
package org.kropli.gersis.examples;

import org.kropli.gersis.gsingletons.*;

public class Task3_3 implements ITask {
  
  String output = new String();

  @Override
  public String output(){
    SingletonOne oneSingleton = SingletonOne.getInstance();
    SingletonTwo twoSingleton = SingletonTwo.getInstance();
    SingletonThree threeSingleton = SingletonThree.getInstance();
      
    output += "SingletonOne: " + oneSingleton.toString() "\n";
    output += "SingletonTwo: " + twoSingleton.toString() "\n";
    output += "SingletonThree: " + threeSingleton.toString();
      
    return output;
  }
  
}
top

 > Task3_4.java
package org.kropli.gersis.examples;

public class Task3_4 implements ITask {

  private String output = new String();
  
  public String output() {

/*
    mysql> CREATE table Customer (
          id int(5) not null auto_increment, 
          Customer_code int(10), 
          Name varchar(25), 
          VIP varchar(5),
          PRIMARY KEY(id)
         );
    
    mysql> CREATE table Contract (
          id int(5) not null auto_increment, 
          Number int(20), 
          Customer_code int(10), 
          Saldo int(20), 
          PRIMARY KEY(id)
         );

    mysql> insert into Customer values(null, 1, "Customer1", "true");
    mysql> insert into Customer values(null, 2, "Customer2", "false");
    mysql> insert into Customer values(null, 3, "Customer3", "false");
    mysql> insert into Customer values(null, 4, "Customer4", "true");

    mysql> insert into Contract values(null, 1, "1", 12);
    mysql> insert into Contract values(null, 1, "1", -1);
    mysql> insert into Contract values(null, 1, "1", -34);
    mysql> insert into Contract values(null, 1, "2", -56);
    mysql> insert into Contract values(null, 1, "2", 53);
    mysql> insert into Contract values(null, 1, "3", 55);
    mysql> insert into Contract values(null, 2, "3", -55);
    mysql> insert into Contract values(null, 2, "3", -55);
    mysql> insert into Contract values(null, 2, "4", 55);
    mysql> insert into Contract values(null, 3, "4", -4);
    mysql> insert into Contract values(null, 3, "4", -12000000);
    
    
    mysql> select * from Customer;
    +----+---------------+-----------+-------+
    | id | Customer_code | Name      | VIP   |
    +----+---------------+-----------+-------+
    |  1 |             1 | Customer1 | true  |
    |  2 |             2 | Customer2 | false |
    |  3 |             3 | Customer3 | false |
    |  4 |             4 | Customer4 | true  |
    +----+---------------+-----------+-------+
    
    mysql> select * from Contract;
    +----+--------+---------------+-----------+
    | id | Number | Customer_code | Saldo     |
    +----+--------+---------------+-----------+
    |  1 |      1 |             1 |        12 |
    |  2 |      1 |             1 |        -1 |
    |  3 |      1 |             1 |       -34 |
    |  4 |      1 |             2 |       -56 |
    |  5 |      1 |             2 |        53 |
    |  6 |      1 |             3 |        55 |
    |  7 |      2 |             3 |       -55 |
    |  8 |      2 |             3 |       -55 |
    |  9 |      2 |             4 |        55 |
    | 10 |      3 |             4 |        -4 |
    | 11 |      3 |             4 | -12000000 |
    +----+--------+---------------+-----------+

    
    mysql> SELECT Name,VIP,Contract.Saldo,Contract.Number 
         FROM Customer 
         INNER JOIN Contract on Contract.Customer_code = Customer.Customer_code 
         WHERE Customer.VIP = "false" AND Contract.Saldo < 0 
             OR Customer.VIP = "true" AND Contract.Saldo < -1000000;
    
    +-----------+-------+-----------+--------+
    | Name      | VIP   | Saldo     | Number |
    +-----------+-------+-----------+--------+
    | Customer2 | false |       -56 |      1 |
    | Customer3 | false |       -55 |      2 |
    | Customer3 | false |       -55 |      2 |
    | Customer4 | true  | -12000000 |      3 |
    +-----------+-------+-----------+--------+
*/
    
    output += "see src code";
    
    return output;
  }

  
}
top

org.kropli.gersis.action:

Action.java
ActionService.java.java
IAction.java.java
InitAction.java.java

 > Action.java
package org.kropli.gersis.action;

import org.kropli.gersis.io._buffer;

public class Action implements IAction {

  private String name;

  public Action(String name){
    this.name = name;
  }
  
  
  public void setName(String name){
    this.name = name;
  }

  public String getName(){
    return name;
  }
  
  
  public void run(){
    _buffer.add("[" + name + "] running.. \n");
  }

}
top

 > ActionService.java
package org.kropli.gersis.action;

import java.util.ArrayList;
import java.util.List;

import org.kropli.gersis.io._buffer;

public class ActionService {
  
  private List<InitAction> initActions = new ArrayList<InitAction>();
  
  public void addAction(IAction action, int count, int timeInterval){
    initActions.add(new InitAction(action, count, timeInterval));
  }
  
  
  public void runActions(){
    for(InitAction action : initActions){
      int sleepTime = action.getCount() * action.getTimeInterval() ;
      
      action.start();
      
      try{
        Thread.sleep(sleepTime);
      catch (InterruptedException e){
    
      }
      
      runMethodFromMainInit();
    }
  }
  
    private void runMethodFromMainInit(){
      _buffer.add("life of main init... \n");
    }
  
}
top

 >IAction.java
package org.kropli.gersis.action;

public interface IAction {

  public void setName(String name);
  public String getName();
  
  public void run();
  
}
top

 > InitAction.java
package org.kropli.gersis.action;

import java.lang.Thread;

import org.kropli.gersis.io._buffer;

public class InitAction implements Runnable {
  
  private IAction action;
  
  private String actionName;
  private int timeInterval;
  private int count;
  
  private Thread thread;
  
  public InitAction(IAction action, int count, int timeInterval){
    this.actionName = action.getName();
    this.timeInterval = timeInterval;
    this.count = count;
    
    thread = new Thread(this, "Thread of " + actionName);
    _buffer.add("Creating new thread of : " + actionName + "\n");
    
    this.action = action;  
  }

  public void run() {
    for(int i = 0; i < count; i++){
      
      try {
        Thread.sleep(timeInterval);
      catch (InterruptedException e) {
        
      }
      
      _buffer.add("Count / time interval: " (i + 1" / " + timeInterval + "ms\n");
      action.run();
      
    }
    
    _buffer.add("Thread of: " + actionName + " stopping.. \n");
  }
  
  public void start(){
    thread.start();
  }
  
  
  public void setTimeInterval(int timeInterval){
    this.timeInterval = timeInterval;
  }
  
  public int getTimeInterval(){
    return timeInterval;
  }
  
  
  public void setCount(int count){
    this.count = count;
  }

  public int getCount(){
    return count;
  }
}
top

org.kropli.gersis.core:

TestInit.java
UIBuffer.java
UIConfig.java
UIProxy.java

 > TestInit.java
package org.kropli.gersis.core;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import junit.framework.TestSuite;
import junit.textui.TestRunner;

import org.kropli.gersis.tests.Task2_1Test;
import org.kropli.gersis.tests.Task2_2Test;
import org.kropli.gersis.tests.Task2_4Test;

public class TestInit extends HttpServlet {
  
  private static final long serialVersionUID = 2644524168506468773L;

  private PrintWriter wr;
  
  public void doGet (HttpServletRequest req, HttpServletResponse res)
                          throws ServletException, IOException
              {
    
    wr = res.getWriter();
    
    String s = new String();
    
    
    TestSuite suite = new TestSuite();
    suite.addTestSuite(Task2_1Test.class);
    suite.addTestSuite(Task2_2Test.class);
    suite.addTestSuite(Task2_4Test.class);
    TestRunner.run(suite);
    

    
    wr.close();
  }
}
top

 > UIBuffer.java
package org.kropli.gersis.core;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.kropli.gersis.io._buffer;

public class UIBuffer extends HttpServlet {
  
  private static final long serialVersionUID = -3809199978727734890L;
  
  private PrintWriter wr;
  
  
  
  public void doGet (HttpServletRequest req, HttpServletResponse res)
                          throws ServletException, IOException
              {
    
    wr = res.getWriter();
    
    
    wr.println(_buffer.get());
    
        
    wr.close();
  }
}
top

 >UIConfig.java
package org.kropli.gersis.core;

public class UIConfig {
  
  private static String HOST;
  
  public static void setHost(String host){
    HOST = host;
  }
  
  public static String getHost(){
    return HOST;
  }
}
top

 > UIProxy.java
package org.kropli.gersis.core;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.kropli.gersis.task.Task;


public class UIProxy extends HttpServlet {
  
  private static final long serialVersionUID = -4753083687288281735L;
  
  private PrintWriter wr;
  
  public void doGet (HttpServletRequest req, HttpServletResponse res)
                          throws ServletException, IOException
              {
    
    UIConfig.setHost("http://" + req.getLocalName() ":" +req.getLocalPort());
    
    
    wr = res.getWriter();
    
    String taskName = req.getParameter("task");
    Task task = new Task(taskName);
    
    String result = task.run();
    
    wr.println(result);
    
    wr.close();
  }
  
}
top

org.kropli.gersis.exceptions:

Exception1.java
Exception2.java
Exception3.java
ImportantException.java

 > Exception1.java
package org.kropli.gersis.exceptions;

public class Exception1 extends Exception {
  
  private static final long serialVersionUID = 3833625241180558721L;

  public String toString(){
    return "catch Exception1 \n";
  }
}
top

 > Exception2.java
package org.kropli.gersis.exceptions;

public class Exception2 extends Exception{
  
  private static final long serialVersionUID = -3020254492386145198L;

  public String toString(){
    return "catch Exception2 \n";
  }
}
top

 > Exception3.java
package org.kropli.gersis.exceptions;

public class Exception3 extends Exception{
  
  private static final long serialVersionUID = 5559133223476777808L;

  public String toString(){
    return "catch Exception3 \n";
  }
}
top

 > ImportantException.java
package org.kropli.gersis.exceptions;

public class ImportantException extends Exception{
  
  private static final long serialVersionUID = -6825082871196729037L;

  public String toString(){
    return "catch ImportantException \n";
  }
}
top

org.kropli.gersis.gsingletons:

SingletonOne.java
SingletonThree.java
SingletonTwo.java

 > SingletonOne.java
package org.kropli.gersis.gsingletons;

public final class SingletonOne {
  
  private static SingletonOne instance;
  
  private SingletonOne(){}
  
  public static SingletonOne getInstance(){
    if(instance == null){
      instance = new SingletonOne();
    }
    
    return instance;
  }
}


top

 > SingletonThree.java
package org.kropli.gersis.gsingletons;

public final class SingletonThree {
  
  private SingletonThree(){}
  
  private static class SingletonDemandHolder {
    private final static SingletonThree instanse = new SingletonThree();
  }
  
  public static SingletonThree getInstance(){
    return SingletonDemandHolder.instanse;
  }
}
top

 > SingletonTwo.java
package org.kropli.gersis.gsingletons;

public final class SingletonTwo {
  
  private static SingletonTwo instance = new SingletonTwo();
  
  private SingletonTwo(){}
  
  public static SingletonTwo getInstance(){
    return instance;
  }
}
top

org.kropli.gersis.io:

_buffer.java
FileStreamURL.java
XMLService.java

 > _buffer.java
package org.kropli.gersis.io;

import java.util.List;

import org.kropli.gersis.util.DateService;

public final class _buffer {
  
  private static String BUFFER = new String();
  private static DateService DS = new DateService();
  
  public static void add(String str){
    BUFFER +=  DS.getTimeStamp() ": " + str;
  }
  
  public static void add(int str){
    BUFFER +=  DS.getTimeStamp() ": " + str;
  }
  
  public static void add(List<?> list){
    BUFFER +=  DS.getTimeStamp() ": " + list.toString();
  }
  
  public static void addn(){
    BUFFER += "\n";
  }
  
  public static String get(){
    return BUFFER;
  
  
  public static void clear(){
    BUFFER = "";
  }
}
top

 > FileStreamURL.java
package org.kropli.gersis.io;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;

public class FileStreamURL {
  
  private BufferedReader fileStream;
  
  public FileStreamURL(String urlStream){
    openStream(urlStream);
    
  }
    private void openStream(String urlStream){
      try {
        
        URL url = new URL(urlStream);
        fileStream = new BufferedReader(new InputStreamReader(url.openStream()));
        
      catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  
  
  public StringBuffer read(){
    StringBuffer buffer = null;
      try {
        
        String inputLine = new String();
        buffer = new StringBuffer();
        while ((inputLine = fileStream.readLine()) != null) {
          buffer.append(inputLine);
        }
        
      catch (IOException e) {
        e.printStackTrace();
      }
      
      return buffer;
  }
  
  public void clear(){
    try {
      
      fileStream.close();
      
    catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
}
top

 > XMLService.java
package org.kropli.gersis.io;

public class XMLService {
  
  public String createXML(String key, String value){
    String strXML = new String();
    
    strXML += "<" + key + ">";
    strXML += value;
    strXML += "</" + key + ">";
    
    return strXML;
  }
  
  public String createRootXML(String xmlBody){
    String strXML = new String();
    
    strXML += "<?xml version='1.0' ?>";
    strXML += "<root>";
    strXML += xmlBody;
    strXML += "</root>";
    
    
    return strXML;
  }
}
top

org.kropli.gersis.task:

Task.java
TaskBox.java
TaskInit.java

 > Task.java
package org.kropli.gersis.task;


public final class Task extends TaskInit {
  
  private TaskBox taskBox;
  
  public Task(String taskName){
    taskBox = new TaskBox(taskName);
  }
  
  public String run(){
    return super.run(taskBox);
  }
  
  public void clear(){
    taskBox.clear();
  }
}
top

 > TaskBox.java
package org.kropli.gersis.task;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.kropli.gersis.examples.ITask;
import org.kropli.gersis.io.XMLService;

public final class TaskBox {
  
  private String taskName;
  
  private Class<ITask> pointClass;
  
  private Method pointOutputMethod;
  
  private Constructor<ITask> pointConstructor;
  
  private XMLService xml;
  private String xmlResults;
  
  public TaskBox(String name){
    taskName = name;
  }
  
  public String getName(){
    return taskName;
  }
  
  public String run() 
        throws ClassNotFoundException, SecurityException, NoSuchMethodException, 
             IllegalArgumentException, InstantiationException, IllegalAccessException, 
             InvocationTargetException
         {
    
    createClassPoint(taskName);
    createConstructorPoint();
    createMethodsPoint();
    invokeMethods();
    
    return xmlResults;
  }
  
  
    private void createClassPoint(String taskNamethrows ClassNotFoundException{
      String packageName = ITask.class.getPackage().getName();
      pointClass = (Class<ITask>Class.forName(packageName + "." + taskName);
    }
  
    private void createConstructorPoint() throws SecurityException, NoSuchMethodException{
      pointConstructor = pointClass.getConstructor();
    }
  
    
    private void createMethodsPoint() throws SecurityException, NoSuchMethodException{
      pointOutputMethod = pointClass.getMethod("output"new Class[]{});
    }
    
    
    private void invokeMethods() throws IllegalArgumentException, InstantiationException, 
                      IllegalAccessException, InvocationTargetException
                  {
      xml = new XMLService();
      xmlResults = new String();
      
      Object obj = pointConstructor.newInstance();
        
      String output = (StringpointOutputMethod.invoke(obj, new Object[]{});
      xmlResults += xml.createXML("output", output);
        
        
      xmlResults = xml.createRootXML(xmlResults);
    }
    
  public void clear(){
    taskName = null;

    pointClass = null;

    pointOutputMethod = null;
    
    pointConstructor = null;
    
    xml = null;
    xmlResults = null;    
  }
}
top

 > TaskInit.java
package org.kropli.gersis.task;

import java.lang.reflect.InvocationTargetException;

public class TaskInit {
  
  private String result = new String();
  
  protected String run(TaskBox taskBox){
    runTaskWithExceptions(taskBox);
    
    return result;
  }
    
    private void runTaskWithExceptions(TaskBox taskBox){
      try {
        
        result = taskBox.run();
        
      catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      catch (NoSuchMethodException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      catch (InstantiationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      catch (InvocationTargetException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  
}
top

org.kropli.gersis.tests:

Task2_1Test.java
Task2_2Test.java
Task2_4Test.java

 > Task2_1Test.java
/*
  ...E
  Time: 0,003
  There was 1 error:
  1) testGetAbsoluteIndexOfArrayWithOtherCase(org.kropli.gersis.tests.Task2_1Test)java.lang.IndexOutOfBoundsException: Index: 6, Size: 6
          at java.util.ArrayList.RangeCheck(ArrayList.java:547)
          at java.util.ArrayList.get(ArrayList.java:322)
          at org.kropli.gersis.examples.Task2_1.getAbsoluteIndexOfArray(Task2_1.java:88)
          at org.kropli.gersis.tests.Task2_1Test.testGetAbsoluteIndexOfArrayWithOtherCase(Task2_1Test.java:45)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at org.kropli.gersis.core.TestInit.doGet(TestInit.java:37)
          at javax.servlet.http.HttpServlet.service(Unknown Source)
          at javax.servlet.http.HttpServlet.service(Unknown Source)
          at com.caucho.server.dispatch.ServletFilterChain.doFilter(Unknown Source)
          at com.caucho.server.webapp.WebAppFilterChain.doFilter(Unknown Source)
          at com.caucho.server.dispatch.ServletInvocation.service(Unknown Source)
          at com.caucho.server.http.HttpRequest.handleRequest(Unknown Source)
          at com.caucho.server.port.TcpConnection.run(Unknown Source)
          at com.caucho.util.ThreadPool$Item.runTasks(Unknown Source)
          at com.caucho.util.ThreadPool$Item.run(Unknown Source)
          at java.lang.Thread.run(Thread.java:619)

  FAILURES!!!
  Tests run: 3,  Failures: 0,  Errors: 1

*/  

package org.kropli.gersis.tests;

import static org.junit.Assert.*;

import junit.framework.TestCase;

import org.kropli.gersis.examples.Task2_1;

public class Task2_1Test extends TestCase {
  
  Task2_1 task2_1 = new Task2_1();
  
  
  public void testGetAbsoluteIndexOfArrayWithMaxIndexes() throws Exception {
    int[] array = {278715, -4, -13, -305173256, -8, -19};
    int absoluteIndexCount = 5;
    
    int[] resultOfMaxIndexes = task2_1.getAbsoluteIndexOfArray(array, absoluteIndexCount, true);
    int[] assertArrayOfMaxIndexes = {1109612};
    
    assertArrayEquals(assertArrayOfMaxIndexes, resultOfMaxIndexes);
  }
  
  
  public void testGetAbsoluteIndexOfArrayWithMinIndexes() throws Exception {
    int[] array = {278715, -4, -13, -305173256, -8, -19};
    int absoluteIndexCount = 5;
    
    int[] resultOfMinIndexes = task2_1.getAbsoluteIndexOfArray(array, absoluteIndexCount, false);
    int[] assertArrayOfMinIndexes = {047211};
    
    assertArrayEquals(assertArrayOfMinIndexes, resultOfMinIndexes);
  }
  
  
  public void testGetAbsoluteIndexOfArrayWithOtherCase() throws Exception {
    int[] arrayOther = {278715, -4, -13};
    int absoluteIndexCountOther = 100;
    int[] resultOther = task2_1.getAbsoluteIndexOfArray(arrayOther, absoluteIndexCountOther, true);
    
    assertTrue(resultOther.length > 0);
  }
   
  
}
top

 > Task2_2Test.java
/*

.E..F.F.F.
Time: 0,109
There was 1 error:
1) testBuildTree(org.kropli.gersis.tests.Task2_2Test)java.lang.NullPointerException
        at org.kropli.gersis.tree.Tree.buildNodes(Tree.java:39)
        at org.kropli.gersis.tree.Tree.buildTree(Tree.java:32)
        at org.kropli.gersis.tests.Task2_2Test.testBuildTree(Task2_2Test.java:50)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at org.kropli.gersis.core.TestInit.doGet(TestInit.java:40)
        at javax.servlet.http.HttpServlet.service(Unknown Source)
        at javax.servlet.http.HttpServlet.service(Unknown Source)
        at com.caucho.server.dispatch.ServletFilterChain.doFilter(Unknown Source)
        at com.caucho.server.webapp.WebAppFilterChain.doFilter(Unknown Source)
        at com.caucho.server.dispatch.ServletInvocation.service(Unknown Source)
        at com.caucho.server.http.HttpRequest.handleRequest(Unknown Source)
        at com.caucho.server.port.TcpConnection.run(Unknown Source)
        at com.caucho.util.ThreadPool$Item.runTasks(Unknown Source)
        at com.caucho.util.ThreadPool$Item.run(Unknown Source)
        at java.lang.Thread.run(Thread.java:619)
There were 3 failures:
1) testGetNode(org.kropli.gersis.tests.Task2_2Test)junit.framework.AssertionFailedError: expected:<name: test7
desc: some desc from test7
parent: {test2}
object: null
location: test2->test7

> but was:<             name: test7
                desc: some desc from test7
                parent: {test2}
                object: null
                location: root->test2->test7
                links:
[                       name: test8
                        desc: some desc from test8
                        parent: {test7}
                        object: null
                        location: root->test2->test7->test8

,                       name: test9
                        desc: some desc from test9
                        parent: {test7}
                        object: null
                        location: root->test2->test7->test9

]
>
        at org.kropli.gersis.tests.Task2_2Test.testGetNode(Task2_2Test.java:109)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at org.kropli.gersis.core.TestInit.doGet(TestInit.java:40)
        at javax.servlet.http.HttpServlet.service(Unknown Source)
        at javax.servlet.http.HttpServlet.service(Unknown Source)
        at com.caucho.server.dispatch.ServletFilterChain.doFilter(Unknown Source)
        at com.caucho.server.webapp.WebAppFilterChain.doFilter(Unknown Source)
        at com.caucho.server.dispatch.ServletInvocation.service(Unknown Source)
        at com.caucho.server.http.HttpRequest.handleRequest(Unknown Source)
        at com.caucho.server.port.TcpConnection.run(Unknown Source)
        at com.caucho.util.ThreadPool$Item.runTasks(Unknown Source)
        at com.caucho.util.ThreadPool$Item.run(Unknown Source)
        at java.lang.Thread.run(Thread.java:619)
2) testGetNodesOfNode(org.kropli.gersis.tests.Task2_2Test)junit.framework.AssertionFailedError: expected:<[name: test8
desc: some desc from test8
parent: {test7}
object: null
location: test7->test8

, name: test9
desc: some desc from test9
object: null
location: test9

]> but was:<[                   name: test8
                        desc: some desc from test8
                        parent: {test7}
                        object: null
                        location: root->test2->test7->test8

,                       name: test9
                        desc: some desc from test9
                        parent: {test7}
                        object: null
                        location: root->test2->test7->test9

]>
        at org.kropli.gersis.tests.Task2_2Test.testGetNodesOfNode(Task2_2Test.java:151)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at org.kropli.gersis.core.TestInit.doGet(TestInit.java:40)
        at javax.servlet.http.HttpServlet.service(Unknown Source)
        at javax.servlet.http.HttpServlet.service(Unknown Source)
        at com.caucho.server.dispatch.ServletFilterChain.doFilter(Unknown Source)
        at com.caucho.server.webapp.WebAppFilterChain.doFilter(Unknown Source)
        at com.caucho.server.dispatch.ServletInvocation.service(Unknown Source)
        at com.caucho.server.http.HttpRequest.handleRequest(Unknown Source)
        at com.caucho.server.port.TcpConnection.run(Unknown Source)
        at com.caucho.util.ThreadPool$Item.runTasks(Unknown Source)
        at com.caucho.util.ThreadPool$Item.run(Unknown Source)
        at java.lang.Thread.run(Thread.java:619)
3) testGetParentOfNode(org.kropli.gersis.tests.Task2_2Test)junit.framework.AssertionFailedError: expected:<name: test2
desc: some desc from test2
parent: {root}
object: null
location: root->test2

> but was:<     name: test2
        desc: some desc from test2
        parent: {root}
        object: null
        location: root->test2
        links:
[               name: test6
                desc: some desc from test6
                parent: {test2}
                object: null
                location: root->test2->test6

,               name: test7
                desc: some desc from test7
                parent: {test2}
                object: null
                location: root->test2->test7
                links:
[                       name: test8
                        desc: some desc from test8
                        parent: {test7}
                        object: null
                        location: root->test2->test7->test8

,                       name: test9
                        desc: some desc from test9
                        parent: {test7}
                        object: null
                        location: root->test2->test7->test9

]
]
>
        at org.kropli.gersis.tests.Task2_2Test.testGetParentOfNode(Task2_2Test.java:182)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at org.kropli.gersis.core.TestInit.doGet(TestInit.java:40)
        at javax.servlet.http.HttpServlet.service(Unknown Source)
        at javax.servlet.http.HttpServlet.service(Unknown Source)
        at com.caucho.server.dispatch.ServletFilterChain.doFilter(Unknown Source)
        at com.caucho.server.webapp.WebAppFilterChain.doFilter(Unknown Source)
        at com.caucho.server.dispatch.ServletInvocation.service(Unknown Source)
        at com.caucho.server.http.HttpRequest.handleRequest(Unknown Source)
        at com.caucho.server.port.TcpConnection.run(Unknown Source)
        at com.caucho.util.ThreadPool$Item.runTasks(Unknown Source)
        at com.caucho.util.ThreadPool$Item.run(Unknown Source)
        at java.lang.Thread.run(Thread.java:619)

FAILURES!!!
Tests run: 6,  Failures: 3,  Errors: 1

*/


package org.kropli.gersis.tests;

import java.util.ArrayList;
import java.util.List;

import org.kropli.gersis.core.UIConfig;
import org.kropli.gersis.io.FileStreamURL;
import org.kropli.gersis.tree.IValue;
import org.kropli.gersis.tree.Node;
import org.kropli.gersis.tree.Tree;
import org.kropli.gersis.tree.Value;
import org.kropli.gersis.treemap.JSONTreeMap;
import org.kropli.gersis.treemap.LinkTreeMap;
import org.kropli.gersis.treemap.TreeMapFactory;

import junit.framework.TestCase;

public class Task2_2Test extends TestCase {
/*
  testing only Tree class interfaces

*/  
  
  private Tree tree = new Tree();
  JSONTreeMap jsonTreeMapObj = (JSONTreeMapTreeMapFactory.getTreeMapObj(JSONTreeMap.class);
  
  public void setUp(){
    UIConfig.setHost("http://localhost:8080/");

  }
  
  public void testBuildTree() throws Exception {
    String jsonURL = UIConfig.getHost() "/gersis/html/task2_2/tree.json";
    FileStreamURL jsonFile = new FileStreamURL(jsonURL);
    
    LinkTreeMap linkTreeMap = jsonTreeMapObj.getTreeMap(jsonFile.read());
    jsonTreeMapObj.clear();
    
    tree.buildTree(linkTreeMap);
    Node resultTree = tree.getTree();
    
    assertNotNull(resultTree);
    
    LinkTreeMap linkTreeMapEmpty = new LinkTreeMap();
    tree.buildTree(linkTreeMapEmpty);
    Node resultTree2 = tree.getTree();
    
    assertNotNull(resultTree2);
  }
  
  public void testAdd() throws Exception {
    String jsonURL = UIConfig.getHost() "/gersis/html/task2_2/tree.json";
    FileStreamURL jsonFile = new FileStreamURL(jsonURL);
    
    LinkTreeMap linkTreeMap = jsonTreeMapObj.getTreeMap(jsonFile.read());
    jsonTreeMapObj.clear();
    
    tree.buildTree(linkTreeMap);
    
    String jsonURLNode1 = UIConfig.getHost() "/gersis/html/task2_2/node1.json";
    FileStreamURL jsonFileNode1 = new FileStreamURL(jsonURLNode1);
    LinkTreeMap listTreeMapNode1 = jsonTreeMapObj.getTreeMap(jsonFileNode1.read());
    jsonTreeMapObj.clear();
    
    tree.add(listTreeMapNode1);
    
    assertNotNull(tree.getTree());
  }
  
  
  public void testGetNode() throws Exception {
    String jsonURL = UIConfig.getHost() "/gersis/html/task2_2/tree.json";
    FileStreamURL jsonFile = new FileStreamURL(jsonURL);
    
    LinkTreeMap linkTreeMap = jsonTreeMapObj.getTreeMap(jsonFile.read());
    jsonTreeMapObj.clear();
    
    tree.buildTree(linkTreeMap);
    
    
    String jsonURLNode4 = UIConfig.getHost() "/gersis/html/task2_2/node4.json";
    FileStreamURL jsonFileNode4 = new FileStreamURL(jsonURLNode4);
    LinkTreeMap listTreeMapNode4 = jsonTreeMapObj.getTreeMap(jsonFileNode4.read());
    jsonTreeMapObj.clear();
    
    Node node = tree.getNode(listTreeMapNode4);
    
    Node nodeTest = new Node();
    nodeTest.setName("test7");
    nodeTest.setDesc("some desc from test7");
    Node nodeTestParent = new Node();
    nodeTestParent.setName("test2");
    nodeTest.setParentPoint(nodeTestParent);
    
/*    
   nodeTest:
    name: test7
    desc: some desc from test7
    parent: {test2}
    object: null

*/  
    
    assertEquals(nodeTest, node);
  }
  
  
  
  public void testGetNodesOfNode() throws Exception {
    String jsonURL = UIConfig.getHost() "/gersis/html/task2_2/tree.json";
    FileStreamURL jsonFile = new FileStreamURL(jsonURL);
    
    LinkTreeMap linkTreeMap = jsonTreeMapObj.getTreeMap(jsonFile.read());
    jsonTreeMapObj.clear();
    
    tree.buildTree(linkTreeMap);
    
    
    String jsonURLNode4 = UIConfig.getHost() "/gersis/html/task2_2/node4.json";
    FileStreamURL jsonFileNode4 = new FileStreamURL(jsonURLNode4);
    LinkTreeMap listTreeMapNode4 = jsonTreeMapObj.getTreeMap(jsonFileNode4.read());
    jsonTreeMapObj.clear();
    
    
    List<Node> nodes = tree.getNodesOfNode(listTreeMapNode4);
    
    Node nodeTest = new Node();
    nodeTest.setName("test8");
    nodeTest.setDesc("some desc from test8");
    Node nodeTestParent = new Node();
    nodeTestParent.setName("test7");
    nodeTest.setParentPoint(nodeTestParent);
    
    Node nodeTest2 = new Node();
    nodeTest2.setName("test9");
    nodeTest2.setDesc("some desc from test9");
    Node nodeTestParent2 = new Node();
    nodeTestParent2.setName("test7");
    nodeTest.setParentPoint(nodeTestParent2);
    
    List<Node> nodesTest = new ArrayList<Node>();
    nodesTest.add(nodeTest);
    nodesTest.add(nodeTest2);
    
    
    assertEquals(nodesTest, nodes);
  }
  
  
  
  public void testGetParentOfNode() throws Exception {
    String jsonURL = UIConfig.getHost() "/gersis/html/task2_2/tree.json";
    FileStreamURL jsonFile = new FileStreamURL(jsonURL);
    
    LinkTreeMap linkTreeMap = jsonTreeMapObj.getTreeMap(jsonFile.read());
    jsonTreeMapObj.clear();
    
    tree.buildTree(linkTreeMap);
    
    
    String jsonURLNode4 = UIConfig.getHost() "/gersis/html/task2_2/node4.json";
    FileStreamURL jsonFileNode4 = new FileStreamURL(jsonURLNode4);
    LinkTreeMap listTreeMapNode4 = jsonTreeMapObj.getTreeMap(jsonFileNode4.read());
    jsonTreeMapObj.clear();
    
    
    Node nodeTest = new Node();
    nodeTest.setName("test2");
    nodeTest.setDesc("some desc from test2");
    Node nodeTestParent = new Node();
    nodeTestParent.setName("root");
    nodeTest.setParentPoint(nodeTestParent);
    
    Node node = tree.getParentOfNode(listTreeMapNode4);
    
    
    assertEquals(nodeTest, node);
  }
  
  
  
  public void testAddObjectToNodeAndGetObjectFromNode() throws Exception {
    String jsonURL = UIConfig.getHost() "/gersis/html/task2_2/tree.json";
    FileStreamURL jsonFile = new FileStreamURL(jsonURL);
    
    LinkTreeMap linkTreeMap = jsonTreeMapObj.getTreeMap(jsonFile.read());
    jsonTreeMapObj.clear();
    
    tree.buildTree(linkTreeMap);
    
    String jsonURLNode4 = UIConfig.getHost() "/gersis/html/task2_2/node4.json";
    FileStreamURL jsonFileNode4 = new FileStreamURL(jsonURLNode4);
    LinkTreeMap listTreeMapNode4 = jsonTreeMapObj.getTreeMap(jsonFileNode4.read());
    jsonTreeMapObj.clear();
    
    IValue object = (IValuenew Value();
    tree.addObjectToNode(listTreeMapNode4, object);
    
    
    Object objectTest = tree.getObjectFromNode(listTreeMapNode4);
    
    
    assertEquals(objectTest, object);
  }
  
  
}
top

 > Task2_4Test.java
/*
 
.
Time: 0,001

OK (1 test)

*/

package org.kropli.gersis.tests;

import org.kropli.gersis.examples.Task2_4;

import junit.framework.TestCase;

public class Task2_4Test extends TestCase {

  private Task2_4.Finance fin = new Task2_4()new Finance();
  
  
  public void testCalculateCharges() throws Exception {
    fin.setDiscountValue(0.3);
    fin.setLimitValue(500);
    fin.setCountAfterPoint(3);
    
    fin.addCharge(153);
    fin.addCharge(336);
    fin.addCharge(454);
    
    double result = fin.calculateCharges();
    double resultTest = 810.099;
    
    assertEquals(resultTest, result);
  }
}
top

org.kropli.gersis.tree:

IValue.java
Node.java
Tree.java
TreeFactory.java
Value.java

 > IValue.java
package org.kropli.gersis.tree;

public interface IValue {

}
top

 > Node.java
package org.kropli.gersis.tree;

import java.util.ArrayList;
import java.util.List;

public class Node {

  private String name;
  private String desc;
  private int level;
  
  private Node parentPoint;
  
  private List<String> nodeLocation;
  
  private List<Node> links;
  
  private IValue object;
  
  
  public void setName(String name){
    this.name = name;
  }
      
  public String getName(){
       return name;
  }
  
    public void setDesc(String desc){
      this.desc = desc;
    }
    
    public String getDesc() {
      return desc;
    }
  
    public void setLevel(int level){
      this.level = level;
    }
    
    public int getLevel() {
      return level;
    }
    

  public void setParentPoint(Node point){
    parentPoint = point;
  }
  
  public Node getParentPoint(){
       return parentPoint;
  }
  
  public List<String> getNodeLocation(){
    if(parentPoint == null){
      nodeLocation = new ArrayList<String>();
    }else{
      nodeLocation = parentPoint.getNodeLocation();
    }
    
    nodeLocation.add(name);
    
       return nodeLocation;
  }
  
  public void setNodeLocation(List<String> location){
    nodeLocation = location;
  }
  
  public String getStringNodeLocation(){
    String res = new String();
      
    List<String> list = getNodeLocation();
    
    for(int i = 0; i < list.size(); i++){
      res += list.get(i);
      
      if(i != list.size() 1){
        res += "->";
      }
    }
    return res;
  }
  

  public void setNodes(List<Node> nodes){
    links = nodes;
  }
  
  public List<Node> getNodes(){
    return links;
  }
  
  public void addNode(Node node){
    if(links != null){
      links.add(node);
    }
  }
  
  
  public void setObject(IValue object){
    this.object = object;
  }
  
  public IValue getObject(){
    return object;
  }
  
  
  public String toString(){
    String res = new String();
    
    res += getLevelString() "name: " + name + "\n";
    
    if(desc != null){
      res += getLevelString() "desc: " + desc + "\n";
    }
    
    if(parentPoint != null){
      res += getLevelString() "parent: {" + parentPoint.getName() "}\n";
    }
    
    res += getLevelString() "object: " + object + "\n";
    
    res += getLevelString() "location: " + getStringNodeLocation() "\n";
    
    if(links != null){
      res += getLevelString() "links:\n" + links.toString() "\n";
    }else{
      res += "\n";
    }
    
    return res;
  }
    
    private String getLevelString(){
      String str = new String();

      for(int i = 0; i < level; i++){
        str += "  ";
      }
      
      return str;
    }

}
top

 > Tree.java
package org.kropli.gersis.tree;

import java.util.ArrayList;
import java.util.List;

import org.kropli.gersis.treemap.LinkTreeMap;


public class Tree {
  
  private Node tree;

  /* found node in map of tree */
  private LinkTreeMap nodeSearchInMap;
  
  /* found location of node in map */
  private List<String> nodeSearchLocationInMap;
  
  /* found node in tree */
  private Node nodeSearchInTree;
  
  /* level of left tabulation in printing */
  private int bufLevel = 0;
  
  public void buildTree(LinkTreeMap map){
    String name = map.getName();
    
    tree = new Node();
    tree.setName(name);
    
    bufLevel++;
    tree.setNodes(buildNodes(map.getLinks(), tree));
    bufLevel--;
  }
  
    private List<Node> buildNodes(LinkTreeMap[] links, Node prPoint){
      List<Node> nodes = new ArrayList<Node>();
      
      for(LinkTreeMap li : links){
        Node node = new Node();
        node.setName(li.getName());
        node.setDesc(li.getDesc());
        node.setLevel(bufLevel);
        
        if(li.getLinks() != null){
          bufLevel++;
          node.setNodes(buildNodes(li.getLinks(), node));
          bufLevel--;
        }
          
        if(prPoint != null){
          node.setParentPoint(prPoint);
        }
        
        nodes.add(node);
      }
      
      return nodes;
    }
  
  
  public Node getTree(){
    return tree;
  }  
  
  
  public void add(LinkTreeMap mapNode){
    if(tree.getName().compareTo(mapNode.getName()) == 0){
      bufLevel++;
      
      nodeSearchLocationInMap = new ArrayList<String>();
      
      searchNodeInMap(mapNode.getLinks());
      searchNodeInTree(tree.getNodes());
      
      bufLevel++;
      addNode();
      bufLevel--;
    }
  }
  
    private void searchNodeInMap(LinkTreeMap[] mapNode){
      for(int i = 0; i < mapNode.length; i++){
        if(mapNode[i].getPoint() == null){
          
          nodeSearchLocationInMap.add(mapNode[i].getName());
          LinkTreeMap[] links = mapNode[i].getLinks()
          
          if(links != null){
            searchNodeInMap(links);
          }
        }else{
          nodeSearchInMap = mapNode[i];
        }
      }
    }
    
    private void searchNodeInTree(List<Node> nodes){
      for(int i = 0; i < nodes.size(); i++ ){
        if(nodeSearchLocationInMap.contains(nodes.get(i).getName())){
          nodeSearchInTree = nodes.get(i);
          
          searchNodeInTree(nodes.get(i).getNodes());
        }else{
          
        }
      }
      
      if(nodeSearchInTree == null){
        nodeSearchInTree = tree;
      }
    }
    
    private void addNode(){
      if(nodeSearchInTree.getName().compareTo(tree.getName()) == 0){
        bufLevel--;
        bufLevel--;
      }
      
      bufLevel++;
      Node node = makeNode();
      bufLevel--;
      
      if(nodeSearchInMap.getLinks() != null){
        bufLevel++;
        bufLevel++;
        List<Node> nodes = buildNodes(nodeSearchInMap.getLinks(), node);
        bufLevel--;
        bufLevel--;
        
        node.setNodes(nodes);
      }
      
      node.setParentPoint(nodeSearchInTree);
      nodeSearchInTree.addNode(node);
    }
    
      private Node makeNode(){
        Node node = new Node();
        node.setName(nodeSearchInMap.getName());
        node.setDesc(nodeSearchInMap.getDesc());
        node.setNodeLocation(null);
        node.setLevel(bufLevel);
        
        return node;
      }
  
  
  public Node getNode(LinkTreeMap mapNode){
    Node node = null;
    
    if(tree.getName().compareTo(mapNode.getName()) == 0){
      nodeSearchLocationInMap = new ArrayList<String>();
      
      searchNodeInMap(mapNode.getLinks());
      searchNodeInTree(tree.getNodes());
      
      for(Node no : nodeSearchInTree.getNodes()){
        if(nodeSearchInMap.getName().compareTo(no.getName()) == 0){
          node = no;
        }
      }
    }
    
    return node;
  }  
  
  
  public List<Node> getNodesOfNode(LinkTreeMap mapNode){
    Node node = getNode(mapNode);
    
    return node.getNodes();
  }
  
  public Node getParentOfNode(LinkTreeMap mapNode){
    Node node = getNode(mapNode);
    
    return node.getParentPoint();
  }
  
  public void addObjectToNode(LinkTreeMap mapNode, IValue object){
    Node node = getNode(mapNode);
    node.setObject(object);
  }
  
  public IValue getObjectFromNode(LinkTreeMap mapNode){
    Node node = getNode(mapNode);
    IValue object = node.getObject();
    
    return object;
  }
      
  
  
  public String toString(){
    return tree.toString();
  }
  
  public Tree clone(){
    return new Tree();
  }
  
  public void clear(){
    tree = null;
    
    nodeSearchInMap = null;
    nodeSearchLocationInMap = null;
    
    nodeSearchInTree = null;
    
    bufLevel = 0;
  }
  
  /* only for testing */
  
  
  public void fortestSearchNodeInMap(LinkTreeMap[] mapNode){
    searchNodeInMap(mapNode);
  }
  
  public void fortestSearchNodeInTree(List<Node> nodes){
    searchNodeInTree(nodes);
  }
  
  public void fortestAddNode(){
    addNode();
  }
  
  public Node fortestMakeNode(){
    return makeNode();
  }
  
}
top

 > TreeFactory.java
package org.kropli.gersis.tree;

public final class TreeFactory{
  
  private static Tree instanceOfTree;
  
  private TreeFactory(){}
  
  public static Tree get(){
    if(instanceOfTree == null){
      instanceOfTree = new Tree();
    }
    
    return instanceOfTree;
  }
  
}
top

 > Value.java
package org.kropli.gersis.tree;

public class Value implements IValue {

}
top

org.kropli.gersis.treemap:

ITreeMap.java
JSONTreeMap.java
LinkTreeMap.java
TreeMapFactory.java

 > ITreeMap.java
package org.kropli.gersis.treemap;

public interface ITreeMap<E> {

  public E getTreeMap(StringBuffer scheme);
  
  public String toString();
}
top

 > JSONTreeMap.java
package org.kropli.gersis.treemap;


import com.google.gson.Gson;

public class JSONTreeMap implements ITreeMap<LinkTreeMap> {

  private LinkTreeMap map;
  
  public LinkTreeMap getTreeMap(StringBuffer scheme){
    if(map == null){
      buildJSONTree(scheme);
    }
    
    return map;
  }
  
    private void buildJSONTree(StringBuffer scheme){
      map = new Gson().fromJson(scheme.toString(), LinkTreeMap.class);
    
  
    
  public String toString(){
    return map.toString();
  }
  
  public void clear(){
    map = null;
  }
}
top

 > LinkTreeMap.java
package org.kropli.gersis.treemap;

public class LinkTreeMap {
  
    private String name;
    private String desc;
    
    private String point;
    
    private LinkTreeMap[] links;

    
    public void setName(String name) {
      this.name = name;
    }
    
    public String getName() {
      return name;
    }


    public void setDesc(String desc) {
      this.desc = desc;
    }
    
    public String getDesc() {
      return desc;
    }
    
    
    public void setPoint(String point) {
      this.point = point;
    }
    
    public String getPoint() {
      return point;
    }

    
    public void setLinks(LinkTreeMap[] links) {
        this.links = links;
    }
    
    public LinkTreeMap[] getLinks() {
        return links;
    }
    
    
    public String toString() {
      String res = new String();
      
      res += "name: (" + name + ")";
      
      if(desc != null){
        res += "\n"  "desc: " + desc + "\n\n";
      }
      
      if(links != null){
        for(int i = 0; i < links.length; i++){
          res += "\n\nlinks of [" + name +"]:\n" + links[i].toString();
        }
        
      }
      
      return res;
    }
    
  }
top

 > TreeMapFactory.java
package org.kropli.gersis.treemap;

public final class TreeMapFactory {
  
  private static ITreeMap<?> instanceOfTreeMap;
  
  private TreeMapFactory(){}
  
  public static ITreeMap<?> getTreeMapObj(Class<?> clazz){
    if(instanceOfTreeMap == null){
      if(clazz.equals(JSONTreeMap.class)){
        instanceOfTreeMap = new JSONTreeMap();
      }
      
      /*
        or you can:
        
          if(clazz.equals(XMLTreeMap.class)){
          instanceOfTreeMap = new XMLTreeMap();
        }
        
        or other types...
      */
    }
    
    return instanceOfTreeMap;
  }
}
top

org.kropli.gersis.util:

DateService.java
ModArrayList.java

 > DateService.java
package org.kropli.gersis.util;

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;


public class DateService {
  
  public String getTimeStamp(){
    Timestamp st = new Timestamp(Calendar.getInstance().getTimeInMillis());
    return st.toString().substring(st.toString().indexOf(" ")).trim()
  }
  
  public String getDateStamp(){
    DateFormat df = new SimpleDateFormat("dd.MM.yyyy");
    return df.format(new java.util.Date());
  }
}
top

 > ModArrayList.java
package org.kropli.gersis.util;

import java.util.ArrayList;

public class ModArrayList<E> extends ArrayList<E> {
  
  private static final long serialVersionUID = -5594061077431106647L;

  public ModArrayList(){}
  
  public ModArrayList(int[] array){
    add(array);
  }
  
  public void add(int[] array){
    for(Integer in : array){
      super.add((E)in);
    }
  }
}
top