Sharin

##### Overview

- Introduction
- Download

##### 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
- Unintegrated LINQ

### SQL Generator

Usage:

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

    Employee example = new Employee();
    example.departmentId = 20;
    example.job = "ANALYST";

    Sql sql = sqlGenerator.selectByExample("*, -department.location",
            "id ASC", example);
    String sqlText = sql.getText();
    Object[] sqlParams = sql.getParams();

Input (Employee):

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

        @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 Department department;
    }

Input (Department):

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

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

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

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

Output (sqlText):

    SELECT
    emp.deptno AS "departmentId",
    emp.empno AS "id",
    emp.job AS "job",
    emp.ename AS "name",
    department.deptno AS "department.id",
    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 (sqlParams):

    [20, ANALYST]

### SQL Formatter

Usage:

    BasicSqlFormatter sqlFormatter = new BasicSqlFormatter(template);

    Map<String, Object> context = new HashMap<String, Object>();
    context.put("ename", null);
    context.put("deptno", 20);
    context.put("jobs", new String[] { "ANALYST", "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 =
            30 -- $deptno
        -- #end
        -- #begin
            AND -- #prepend
            job IN (
            'SALESMAN' -- $jobs
            )
        -- #end
    -- #end
    ORDER BY
    ename -- &order
    ASC

Output (result):

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

### SQL Runner

Usage:

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

    Sql sql = new Sql(sqlText, sqlParams);
    Employee employee = sqlRunner.selectForObject(sql);

Input (sqlText):

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

Input (sqlParams):

    [20, ANALYST]

Output (employee):

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

Output (employee.department):

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

### Doc Builder

Usage:

    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

Usage (CsvPullParser):

    CsvPullParser csvPullParser = new BasicCsvPullParser();

    for (String[] record : csvPullParser.parse(reader)) {
        /* do something */
    }

Usage (CsvPushParser):

    CsvPushParser csvPushParser = new BasicCsvPushParser();

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

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

Input (reader):

    1,One
    2,"T,wo"
    3,"T""hree"
    4,"F
    our"

Output (records):

    [1, One]
    [2, T,wo]
    [3, T"hree]
    [4, F
    our]

### Unintegrated LINQ

Usage:

    import static sharin.unlinq.BasicEnumerable.*;

    ...

    Func<Integer, Boolean> whereFunc = new Func<Integer, Boolean>() {
        public Boolean call(Integer arg1) {
            return arg1 % 3 == 1;
        }
    };
    Func<Integer, Character> selectFunc = new Func<Integer, Character>() {
        public Character call(Integer arg1) {
            return (char) ('A' + arg1 - 1);
        }
    };
    List<Character> result = from(10, 21, 14, 12, 1, 22, 9, 14, 1, 17)
            .where(whereFunc).select(selectFunc).toList();
    System.out.println(result);

Output (result):

    [J, A, V, A]