Sharin

##### Overview

- Introduction

##### Project Documentation

- Project Information
- Project Reports

## Introduction

Sharin is a Java library including these functions.

- SQL Generator
- SQL Formatter
- SQL Runner
- Doc Builder
- CSV Parser

### SQL Generator

Sample code:

    EntityInfo entityInfo = new EntityInfo(EmployeeEntity.class);
    SqlGenerator sqlGenerator = new BasicSqlGenerator(entityInfo);

    EmployeeEntity sample = new EmployeeEntity();
    sample.departmentId = 20;
    sample.job = "CLERK";

    Sql sql = sqlGenerator.selectBySample("*, -name", "id ASC", sample);

Input (EmployeeEntity):

    @Table(name = "emp")
    public class EmployeeEntity {

        @Id
        @Column(name = "empno")
        public Integer id;

        @Column(name = "ename")
        public String name;

        public String job;

        @Column(name = "deptno")
        public Integer departmentId;

        @ManyToOne
        @JoinColumn(name = "deptno")
        public transient DepartmentEntity department;
    }

Input (DepartmentEntity):

    @Table(name = "dept")
    public class DepartmentEntity {

        @Id
        @Column(name = "deptno")
        public Integer id;

        @Column(name = "dname")
        public String name;

        @Column(name = "loc")
        public String location;
    }

Output (sql.text):

    SELECT
    emp.deptno AS "departmentId",
    emp.empno AS "id",
    emp.job AS "job",
    department.deptno AS "department.id",
    department.loc AS "department.location",
    department.dname AS "department.name"
    FROM emp
    LEFT JOIN dept department ON emp.deptno = department.deptno
    WHERE emp.deptno = ? AND emp.job = ?
    ORDER BY "id" ASC

Output (sql.params):

    [20, CLERK]

### SQL Formatter

Sample code:

    BasicSqlFormatter sqlFormatter = new BasicSqlFormatter(template);

    Map<String, Object> context = new HashMap<String, Object>();
    context.put("deptno", new Integer[] { 20, 30 });
    context.put("job", new String[] { "MANAGER", "CLERK" });
    context.put("order", "empno");

    String result = sqlFormatter.format(context);

Input (template):

    SELECT *
    FROM emp
    -- #begin
        WHERE
        -- #begin
            ename LIKE
            '%A%' -- $ename
        -- #end
        -- #begin
            AND -- #prepend
            deptno IN (
            30 -- $deptno
            )
        -- #end
        -- #begin
            AND -- #prepend
            job IN (
            'SALESMAN' -- $job
            )
        -- #end
    -- #end
    ORDER BY
    ename -- &order
    ASC

Output (result):

    SELECT *
    FROM emp
    WHERE deptno IN ( 20, 30 ) AND job IN ( 'MANAGER', 'CLERK' )
    ORDER BY empno ASC

### SQL Runner

Sample code:

    ResultSetProcessor objectProcessor = new BeanResultSetProcessor(
            EmployeeEntity.class);
    SqlRunner sqlRunner = new BasicSqlRunner(dataSource, objectProcessor);

    Sql sql = new Sql(sqlText, "ANALYST", "S%");
    EmployeeEntity employee = sqlRunner.selectForObject(sql);

Input (sqlText):

    SELECT
    job AS "job",
    ename AS "name",
    dname AS "department.name"
    FROM emp
    INNER JOIN dept ON emp.deptno = dept.deptno
    WHERE job = ? AND ename LIKE ?

Output (employee):

    id=<null>
    name=SCOTT
    job=ANALYST
    departmentId=<null>

Output (employee.department):

    id=<null>
    name=RESEARCH
    location=<null>

### Doc Builder

Sample code:

    import static sharin.doc.builder.xhtml1.Xhtml1DocBuilder.Static.*;

    ...

    Elem elem = form().methodGet().action("search")._(
            input().typeText().name("q"), input().typeSubmit());
    String result = elem.toString();

Output (result):

    <form method="get" action="search">
    <input type="text" name="q" />
    <input type="submit" />
    </form>

### CSV Parser

Sample code (CsvPullParser):

    CsvPullParser csvParser = new BasicCsvPullParser();

    List<String[]> recordList = new ArrayList<String[]>();

    for (String[] record : csvParser.parse(reader)) {
        recordList.add(record);
    }

    String[][] records = recordList
            .toArray(new String[recordList.size()][]);

Sample code (CsvPushParser):

    CsvPushParser csvParser = new BasicCsvPushParser();

    BasicCsvHandler csvHandler = new BasicCsvHandler();
    csvParser.parse(reader, csvHandler);

    String[][] records = csvHandler.getRecords();

Input (reader):

    1,First
    2,"S,econd"
    3,"T""hird"
    4,"F
    ourth"

Output (records):

    [1, First]
    [2, S,econd]
    [3, T"hird]
    [4, F
    ourth]