Added Android code
[wl-app.git] / Android / folioreader / src / main / java / com / folioreader / model / sqlite / HighLightTable.java
1 package com.folioreader.model.sqlite;
2
3 import android.content.ContentValues;
4 import android.database.Cursor;
5 import android.text.TextUtils;
6 import android.util.Log;
7
8 import com.folioreader.Constants;
9 import com.folioreader.model.HighLight;
10 import com.folioreader.model.HighlightImpl;
11
12 import java.text.ParseException;
13 import java.text.SimpleDateFormat;
14 import java.util.ArrayList;
15 import java.util.Date;
16 import java.util.List;
17 import java.util.Locale;
18 import java.util.UUID;
19
20 @SuppressWarnings("PMD.AvoidDuplicateLiterals")
21 public class HighLightTable {
22     public static final String TABLE_NAME = "highlight_table";
23
24     public static final String ID = "_id";
25     public static final String COL_BOOK_ID = "bookId";
26     private static final String COL_CONTENT = "content";
27     private static final String COL_DATE = "date";
28     private static final String COL_TYPE = "type";
29     private static final String COL_PAGE_NUMBER = "page_number";
30     private static final String COL_PAGE_ID = "pageId";
31     private static final String COL_RANGY = "rangy";
32     private static final String COL_NOTE = "note";
33     private static final String COL_UUID = "uuid";
34
35     public static final String SQL_CREATE = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " ( " + ID
36             + " INTEGER PRIMARY KEY AUTOINCREMENT" + ","
37             + COL_BOOK_ID + " TEXT" + ","
38             + COL_CONTENT + " TEXT" + ","
39             + COL_DATE + " TEXT" + ","
40             + COL_TYPE + " TEXT" + ","
41             + COL_PAGE_NUMBER + " INTEGER" + ","
42             + COL_PAGE_ID + " TEXT" + ","
43             + COL_RANGY + " TEXT" + ","
44             + COL_UUID + " TEXT" + ","
45             + COL_NOTE + " TEXT" + ")";
46
47     public static final String SQL_DROP = "DROP TABLE IF EXISTS " + TABLE_NAME;
48
49     public static final String TAG = HighLightTable.class.getSimpleName();
50
51     public static ContentValues getHighlightContentValues(HighLight highLight) {
52         ContentValues contentValues = new ContentValues();
53         contentValues.put(COL_BOOK_ID, highLight.getBookId());
54         contentValues.put(COL_CONTENT, highLight.getContent());
55         contentValues.put(COL_DATE, getDateTimeString(highLight.getDate()));
56         contentValues.put(COL_TYPE, highLight.getType());
57         contentValues.put(COL_PAGE_NUMBER, highLight.getPageNumber());
58         contentValues.put(COL_PAGE_ID, highLight.getPageId());
59         contentValues.put(COL_RANGY, highLight.getRangy());
60         contentValues.put(COL_NOTE, highLight.getNote());
61         contentValues.put(COL_UUID, highLight.getUUID());
62         return contentValues;
63     }
64
65
66     public static ArrayList<HighlightImpl> getAllHighlights(String bookId) {
67         ArrayList<HighlightImpl> highlights = new ArrayList<>();
68         Cursor highlightCursor = DbAdapter.getHighLightsForBookId(bookId);
69         while (highlightCursor.moveToNext()) {
70             highlights.add(new HighlightImpl(highlightCursor.getInt(highlightCursor.getColumnIndex(ID)),
71                     highlightCursor.getString(highlightCursor.getColumnIndex(COL_BOOK_ID)),
72                     highlightCursor.getString(highlightCursor.getColumnIndex(COL_CONTENT)),
73                     getDateTime(highlightCursor.getString(highlightCursor.getColumnIndex(COL_DATE))),
74                     highlightCursor.getString(highlightCursor.getColumnIndex(COL_TYPE)),
75                     highlightCursor.getInt(highlightCursor.getColumnIndex(COL_PAGE_NUMBER)),
76                     highlightCursor.getString(highlightCursor.getColumnIndex(COL_PAGE_ID)),
77                     highlightCursor.getString(highlightCursor.getColumnIndex(COL_RANGY)),
78                     highlightCursor.getString(highlightCursor.getColumnIndex(COL_NOTE)),
79                     highlightCursor.getString(highlightCursor.getColumnIndex(COL_UUID))));
80         }
81         return highlights;
82     }
83
84     public static HighlightImpl getHighlightId(int id) {
85         Cursor highlightCursor = DbAdapter.getHighlightsForId(id);
86         HighlightImpl highlightImpl = new HighlightImpl();
87         while (highlightCursor.moveToNext()) {
88             highlightImpl = new HighlightImpl(highlightCursor.getInt(highlightCursor.getColumnIndex(ID)),
89                     highlightCursor.getString(highlightCursor.getColumnIndex(COL_BOOK_ID)),
90                     highlightCursor.getString(highlightCursor.getColumnIndex(COL_CONTENT)),
91                     getDateTime(highlightCursor.getString(highlightCursor.getColumnIndex(COL_DATE))),
92                     highlightCursor.getString(highlightCursor.getColumnIndex(COL_TYPE)),
93                     highlightCursor.getInt(highlightCursor.getColumnIndex(COL_PAGE_NUMBER)),
94                     highlightCursor.getString(highlightCursor.getColumnIndex(COL_PAGE_ID)),
95                     highlightCursor.getString(highlightCursor.getColumnIndex(COL_RANGY)),
96                     highlightCursor.getString(highlightCursor.getColumnIndex(COL_NOTE)),
97                     highlightCursor.getString(highlightCursor.getColumnIndex(COL_UUID)));
98
99         }
100         return highlightImpl;
101     }
102
103     public static long insertHighlight(HighlightImpl highlightImpl) {
104         highlightImpl.setUUID(UUID.randomUUID().toString());
105         return DbAdapter.saveHighLight(getHighlightContentValues(highlightImpl));
106     }
107
108     public static boolean deleteHighlight(String rangy) {
109         String query = "SELECT " + ID + " FROM " + TABLE_NAME + " WHERE " + COL_RANGY + " = '" + rangy + "'";
110         int id = DbAdapter.getIdForQuery(query);
111         return id != -1 && deleteHighlight(id);
112     }
113
114     public static boolean deleteHighlight(int highlightId) {
115         return DbAdapter.deleteById(TABLE_NAME, ID, String.valueOf(highlightId));
116     }
117
118     public static List<String> getHighlightsForPageId(String pageId) {
119         String query = "SELECT " + COL_RANGY + " FROM " + TABLE_NAME + " WHERE " + COL_PAGE_ID + " = '" + pageId + "'";
120         Cursor c = DbAdapter.getHighlightsForPageId(query, pageId);
121         List<String> rangyList = new ArrayList<>();
122         while (c.moveToNext()) {
123             rangyList.add(c.getString(c.getColumnIndex(COL_RANGY)));
124         }
125         c.close();
126         return rangyList;
127     }
128
129     public static boolean updateHighlight(HighlightImpl highlightImpl) {
130         return DbAdapter.updateHighLight(getHighlightContentValues(highlightImpl), String.valueOf(highlightImpl.getId()));
131     }
132
133     public static String getDateTimeString(Date date) {
134         SimpleDateFormat dateFormat = new SimpleDateFormat(
135                 Constants.DATE_FORMAT, Locale.getDefault());
136         return dateFormat.format(date);
137     }
138
139     public static Date getDateTime(String date) {
140         SimpleDateFormat dateFormat = new SimpleDateFormat(
141                 Constants.DATE_FORMAT, Locale.getDefault());
142         Date date1 = new Date();
143         try {
144             date1 = dateFormat.parse(date);
145         } catch (ParseException e) {
146             Log.e(TAG, "Date parsing failed", e);
147         }
148         return date1;
149     }
150
151     public static HighlightImpl updateHighlightStyle(String rangy, String style) {
152         String query = "SELECT " + ID + " FROM " + TABLE_NAME + " WHERE " + COL_RANGY + " = '" + rangy + "'";
153         int id = DbAdapter.getIdForQuery(query);
154         if (id != -1 && update(id, updateRangy(rangy, style), style.replace("highlight_", ""))) {
155             return getHighlightId(id);
156         }
157         return null;
158     }
159
160     public static HighlightImpl getHighlightForRangy(String rangy) {
161         String query = "SELECT " + ID + " FROM " + TABLE_NAME + " WHERE " + COL_RANGY + " = '" + rangy + "'";
162         return getHighlightId(DbAdapter.getIdForQuery(query));
163     }
164
165     private static String updateRangy(String rangy, String style) {
166         /*Pattern p = Pattern.compile("\\highlight_\\w+");
167         Matcher m = p.matcher(rangy);
168         return m.replaceAll(style);*/
169         String[] s = rangy.split("\\$");
170         StringBuilder builder = new StringBuilder();
171         for (String p : s) {
172             if (TextUtils.isDigitsOnly(p)) {
173                 builder.append(p);
174                 builder.append('$');
175             } else {
176                 builder.append(style);
177                 builder.append('$');
178             }
179         }
180         return builder.toString();
181     }
182
183     private static boolean update(int id, String s, String color) {
184         HighlightImpl highlightImpl = getHighlightId(id);
185         highlightImpl.setRangy(s);
186         highlightImpl.setType(color);
187         return DbAdapter.updateHighLight(getHighlightContentValues(highlightImpl), String.valueOf(id));
188     }
189
190     public static void saveHighlightIfNotExists(HighLight highLight) {
191         String query = "SELECT " + ID + " FROM " + TABLE_NAME + " WHERE " + COL_UUID + " = '" + highLight.getUUID() + "'";
192         int id = DbAdapter.getIdForQuery(query);
193         if (id == -1) {
194             DbAdapter.saveHighLight(getHighlightContentValues(highLight));
195         }
196     }
197 }
198
199
200