Project

General

Profile

« Previous | Next » 

Revision 50759

[maven-release-plugin] copy for tag cnr-enabling-database-service-3.2.3

View differences:

modules/cnr-enabling-database-service/tags/cnr-enabling-database-service-3.2.3/deploy.info
1
{"type_source": "SVN", "goal": "package -U -T 4C source:jar", "url": "http://svn-public.driver.research-infrastructures.eu/driver/dnet45/modules/cnr-enabling-database-service/trunk/", "deploy_repository": "dnet45-snapshots", "version": "4", "mail": "sandro.labruzzo@isti.cnr.it,michele.artini@isti.cnr.it, claudio.atzori@isti.cnr.it, alessia.bardi@isti.cnr.it", "deploy_repository_url": "http://maven.research-infrastructures.eu/nexus/content/repositories/dnet45-snapshots", "name": "cnr-enabling-database-service"}
modules/cnr-enabling-database-service/tags/cnr-enabling-database-service-3.2.3/src/test/java/eu/dnetlib/enabling/database/utils/DatabaseUtilsTest.java
1
package eu.dnetlib.enabling.database.utils;
2

  
3
import java.io.StringReader;
4
import java.sql.Connection;
5
import java.sql.Date;
6
import java.util.Arrays;
7
import java.util.HashMap;
8
import java.util.List;
9
import java.util.Map;
10
import javax.sql.DataSource;
11

  
12
import com.google.common.collect.Lists;
13
import com.google.common.collect.Maps;
14
import eu.dnetlib.enabling.database.DataSourceFactory;
15
import eu.dnetlib.enabling.database.TransactionTemplateFactory;
16
import eu.dnetlib.enabling.database.objects.DnetDatabase;
17
import org.apache.velocity.app.VelocityEngine;
18
import org.dom4j.Document;
19
import org.dom4j.DocumentHelper;
20
import org.dom4j.Element;
21
import org.dom4j.io.SAXReader;
22
import org.junit.Before;
23
import org.junit.Ignore;
24
import org.junit.Test;
25
import org.junit.runner.RunWith;
26
import org.mockito.Mock;
27
import org.mockito.runners.MockitoJUnitRunner;
28
import org.springframework.jdbc.core.JdbcTemplate;
29
import org.springframework.transaction.support.TransactionTemplate;
30

  
31
import static org.junit.Assert.*;
32
import static org.mockito.Matchers.any;
33
import static org.mockito.Matchers.anyString;
34
import static org.mockito.Mockito.*;
35

  
36
@RunWith(MockitoJUnitRunner.class)
37
public class DatabaseUtilsTest {
38

  
39
	private static final String DB = "THE_DB";
40
	private static final String TABLE = "THE_TABLE";
41
	private static final String QUERY = "SELECT age FROM persons";
42
	private static final String RESOURCE_ID = "id1234";
43
	private static final String DB_PREFIX = "THE_";
44
	public static final String DNET_RESOURCE_ID_FIELD = "_dnet_resource_identifier_";
45
	private static final String DEFAULT_DB = "postgres";
46

  
47
	// Class Under Test
48
	private DatabaseUtils dbUtils;
49

  
50
	private final List<Map<String, Object>> RESULTS = Lists.newArrayList();
51

  
52
	private Map<String, Object> MAP;
53

  
54
	private final DnetDatabase DNET_DB = new DnetDatabase();
55

  
56
	@Mock
57
	private JdbcTemplateFactory jdbcTemplateFactory;
58
	@Mock
59
	private JdbcTemplate jdbcTemplate;
60
	@Mock
61
	private DataSource dataSource;
62
	@Mock
63
	private VelocityEngine velocityEngine;
64
	@Mock
65
	private DataSourceFactory dataSourceFactory;
66
	@Mock
67
	private TransactionTemplateFactory transactionTemplateFactory;
68
	@Mock
69
	private TransactionTemplate transactionTemplate;
70
	@Mock
71
	private Connection connection;
72

  
73
	@SuppressWarnings("unchecked")
74
	@Before
75
	public void setUp() throws Exception {
76
		dbUtils = new DatabaseUtils();
77

  
78
		DNET_DB.setDbName(DB);
79

  
80
		MAP = new HashMap<String, Object>();
81
		MAP.put("k1", "v1");
82
		MAP.put("k2", "v2");
83
		MAP.put("k3", "v3");
84

  
85
		dbUtils.setJdbcTemplateFactory(jdbcTemplateFactory);
86
		dbUtils.setDataSourceFactory(dataSourceFactory);
87
		dbUtils.setTransactionTemplateFactory(transactionTemplateFactory);
88
		dbUtils.setVelocityEngine(velocityEngine);
89
		dbUtils.setDbPrefix(DB_PREFIX);
90
		dbUtils.setNumbersOfRecordsForTransaction(20);
91

  
92
		//when(jdbcTemplate.getDataSource()).thenReturn(dataSource);
93
		when(dataSourceFactory.createDataSource(anyString())).thenReturn(dataSource);
94
		//when(dataSource.getConnection()).thenReturn(connection);
95

  
96
		when(transactionTemplateFactory.createTransactionTemplate(dataSource)).thenReturn(transactionTemplate);
97

  
98
		when(jdbcTemplateFactory.createJdbcTemplate(DB)).thenReturn(jdbcTemplate);
99
		when(jdbcTemplate.queryForList(QUERY, Integer.class)).thenReturn(Arrays.asList(1, 2, 3, 4));
100

  
101
		for (int i = 0; i < 4; i++) {
102
			RESULTS.add(MAP);
103
		}
104

  
105
		when(jdbcTemplate.queryForList(QUERY)).thenReturn(RESULTS);
106
		when(jdbcTemplate.queryForList("SELECT * FROM " + TABLE)).thenReturn(Arrays.asList(MAP, MAP, MAP));
107

  
108
		when(jdbcTemplate.queryForList("SELECT * FROM information_schema.columns WHERE table_name = ?", new Object[] { TABLE })).thenReturn(
109
				Arrays.asList(MAP, MAP, MAP));
110
		//when(jdbcTemplate.queryForList("SELECT profileid FROM dnet_tables WHERE table_name='THE_TABLE' AND database_db_name='THE_DB'", String.class))
111
		//		.thenReturn(Arrays.asList("1234"));
112

  
113
	}
114

  
115
	@Test
116
	public void testListCommonDBTables() throws Exception {
117
		dbUtils.listCommonDBTables(DB);
118
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
119
		verify(jdbcTemplate).queryForList(
120
				"SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' AND table_type != 'VIEW' AND table_name NOT LIKE '%_log'",
121
				String.class);
122
	}
123

  
124
	@Test
125
	public void testListCommonDBViews() throws Exception {
126
		dbUtils.listCommonDBViews(DB);
127
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
128
		verify(jdbcTemplate).queryForList(
129
				"SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' AND table_type = 'VIEW' AND table_name NOT LIKE '%_log'",
130
				String.class);
131
	}
132

  
133
	@Ignore
134
	@Test
135
	public void testListAllDatabases() throws Exception {
136
		dbUtils.listAllDatabases();
137
		verify(jdbcTemplateFactory).createJdbcTemplate(DEFAULT_DB);
138
		verify(jdbcTemplate).queryForList("SELECT datname FROM pg_database WHERE datname LIKE '" + DB_PREFIX + "%'", String.class);
139
	}
140

  
141
	@Test
142
	public void testGetTypedListFromSql() throws Exception {
143
		List<Integer> list = dbUtils.getTypedListFromSql(DB, QUERY, Integer.class);
144
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
145
		verify(jdbcTemplate).queryForList(QUERY, Integer.class);
146
		assertEquals(4, list.size());
147
	}
148

  
149
	@Test
150
	public void testGetSimpleListFromSql() throws Exception {
151
		List<String> list = dbUtils.getSimpleListFromSql(DB, QUERY);
152
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
153
		verify(jdbcTemplate).queryForList(QUERY);
154
		assertEquals(4, list.size());
155
	}
156

  
157
	@Test
158
	public void testExecuteSql() throws Exception {
159
		dbUtils.executeSql(DB, QUERY, null);
160
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
161
		verify(jdbcTemplate).update(QUERY);
162
	}
163

  
164
	@Test
165
	public void testDescribeTable() throws Exception {
166
		List<Map<?, ?>> res = dbUtils.describeTable(DB, TABLE);
167
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
168
		assertEquals(3, res.size());
169
		assertEquals(3, res.get(0).size());
170
		assertEquals(3, res.get(1).size());
171
		assertEquals(3, res.get(2).size());
172
	}
173

  
174
	@Test
175
	public void testDumpTableAsXML() throws Exception {
176
		String xml = dbUtils.dumpTableAsXML(DB, TABLE);
177

  
178
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
179
		assertNotNull(xml);
180
		assertTrue(xml.contains(TABLE));
181
		assertTrue(xml.contains(DB));
182
		assertTrue(xml.contains("ROW"));
183
	}
184

  
185
	@Test
186
	public void testDumpTableAsList() throws Exception {
187
		List<Document> list = dbUtils.dumpTableAsList(DB, TABLE);
188

  
189
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
190
		verify(jdbcTemplate).queryForList("SELECT * FROM " + TABLE);
191
		assertTrue(list.size() > 0);
192
	}
193

  
194
	@Test
195
	public void testGetRowByResourceId() throws Exception {
196
		dbUtils.getRowByResourceId(DB, TABLE, RESOURCE_ID);
197
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
198
		verify(jdbcTemplate).queryForMap("SELECT * FROM " + TABLE + " WHERE " + DatabaseUtils.DNET_RESOURCE_ID_FIELD + "=?", new Object[] { RESOURCE_ID });
199
	}
200

  
201
	@SuppressWarnings({ "unchecked", "rawtypes" })
202
	@Test
203
	public void testImportFromIterable() throws Exception {
204
		List<String> iterable = Lists.newArrayList("<ROWS><ROW table='t1' /></ROWS>", "<ROWS><ROW table='t2' /></ROWS>");
205

  
206
		GenericRow row1 = new GenericRow(TABLE, MAP, true);
207
		GenericRow row2 = new GenericRow(TABLE, MAP, false);;
208

  
209
		when(transactionTemplate.execute(any())).thenReturn(Lists.newArrayList(row1, row2, row1, row2));
210

  
211
		dbUtils.importFromIterable(DB, iterable);
212

  
213
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
214
		verify(transactionTemplateFactory).createTransactionTemplate(dataSource);
215

  
216
		verify(transactionTemplate, times(1)).execute(any());
217
	}
218

  
219
	@Test
220
	public void testDeleteRowByResourceId() throws Exception {
221
		dbUtils.deleteRowByResourceId(DB, TABLE, RESOURCE_ID);
222
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
223
		verify(jdbcTemplate).update("DELETE FROM " + TABLE + " WHERE " + DatabaseUtils.DNET_RESOURCE_ID_FIELD + "=?", new Object[] { RESOURCE_ID });
224
	}
225

  
226
	@Test
227
	public void testClearTable() throws Exception {
228
		dbUtils.clearTable(DB, TABLE);
229
		verify(jdbcTemplateFactory).createJdbcTemplate(DB);
230
		verify(jdbcTemplate).update("DELETE FROM " + TABLE);
231
	}
232

  
233
	@Ignore
234
	@SuppressWarnings("unchecked")
235
	@Test
236
	public void testPrepareManagementOfTable() throws Exception {
237
		when(jdbcTemplate.queryForObject(anyString(), any(Class.class), (Object[]) any())).thenReturn(1);
238

  
239
		dbUtils.prepareManagementOfTable(DB, TABLE);
240
		verify(jdbcTemplateFactory, atLeastOnce()).createJdbcTemplate(DB);
241
		verify(jdbcTemplate, atLeastOnce()).queryForObject(anyString(), Integer.class, (Object[]) any());
242
		verify(jdbcTemplate, never()).update(anyString());
243
	}
244

  
245
	@Ignore
246
	@SuppressWarnings("unchecked")
247
	@Test
248
	public void testPrepareManagementOfTable_2() throws Exception {
249
		when(jdbcTemplate.queryForObject(anyString(), any(Class.class), (Object[]) any())).thenReturn(0);
250

  
251
		dbUtils.prepareManagementOfTable(DB, TABLE);
252
		verify(jdbcTemplateFactory, atLeastOnce()).createJdbcTemplate(DB);
253
		verify(jdbcTemplate, atLeastOnce()).queryForObject(anyString(), Integer.class, (Object[]) any());
254
		verify(jdbcTemplate, atLeastOnce()).update(anyString());
255
	}
256

  
257
	@Ignore
258
	@SuppressWarnings("unchecked")
259
	@Test
260
	public void testClearManagementOfTable() throws Exception {
261
		when(jdbcTemplate.queryForObject(anyString(), any(Class.class), (Object[]) any())).thenReturn(0);
262

  
263
		dbUtils.removeManagementOfTable(DB, TABLE);
264
		verify(jdbcTemplateFactory, atLeastOnce()).createJdbcTemplate(DB);
265

  
266
		verify(jdbcTemplate, never()).update(anyString());
267
	}
268

  
269
	@Ignore
270
	@Test
271
	public void testClearManagementOfTable_2() throws Exception {
272
		when(jdbcTemplate.queryForObject(anyString(), any(Class.class), (Object[]) any())).thenReturn(1);
273
		dbUtils.removeManagementOfTable(DB, TABLE);
274
		verify(jdbcTemplateFactory, atLeastOnce()).createJdbcTemplate(DB);
275

  
276
		verify(jdbcTemplate, atLeastOnce()).update(anyString());
277
	}
278

  
279
	@Test
280
	public void testParseDate() throws Exception {
281
		Date d = dbUtils.parseDate("31-05-2011", "dd-MM-yyyy");
282
		assertEquals("2011-05-31", d.toString());
283
	}
284

  
285
	@Test
286
	public void testEscape() throws Exception {
287
		Map<String, String> m = Maps.newHashMap();
288

  
289
		m.put("url", "http://www.google.com/set?a=val1&b=val2");
290
		m.put("title", "My favourite movie title");
291

  
292
		Document doc = dbUtils.rowToDocument(m);
293
		assertNotNull(doc);
294

  
295
		Document doc2 = DocumentHelper.createDocument();
296
		Element elem = doc2.addElement("a");
297
		elem.setText(doc.asXML());
298
		doc2.setRootElement(elem);
299

  
300
		String tempXML = doc2.asXML();
301

  
302
		SAXReader reader = new SAXReader();
303
		Document doc3 = reader.read(new StringReader(tempXML));
304

  
305
		System.out.println(doc.asXML());;
306
		System.out.println(doc3.getRootElement().getText());;
307

  
308
		assertEquals(doc.asXML(), doc3.getRootElement().getText());
309

  
310
	}
311

  
312
	@Test
313
	public void testParseBoolean() throws Exception {
314
		assertEquals(dbUtils.parseBoolean("TRUE"), true);
315
		assertEquals(dbUtils.parseBoolean("true"), true);
316
		assertEquals(dbUtils.parseBoolean("T"), true);
317
		assertEquals(dbUtils.parseBoolean("Yes"), true);
318
		assertEquals(dbUtils.parseBoolean("false"), false);
319
		assertEquals(dbUtils.parseBoolean("F"), false);
320
		assertEquals(dbUtils.parseBoolean("No"), false);
321
		assertEquals(dbUtils.parseBoolean("N/A"), false);
322
		assertEquals(dbUtils.parseBoolean("XYZ"), false);
323
	}
324
}
modules/cnr-enabling-database-service/tags/cnr-enabling-database-service-3.2.3/src/test/java/eu/dnetlib/enabling/database/utils/JdbcTemplateFactoryTest.java
1
package eu.dnetlib.enabling.database.utils;
2

  
3
import static org.junit.Assert.assertEquals;
4
import static org.mockito.Mockito.verify;
5
import static org.mockito.Mockito.when;
6

  
7
import javax.sql.DataSource;
8

  
9
import org.junit.Before;
10
import org.junit.Test;
11
import org.junit.runner.RunWith;
12
import org.mockito.Mock;
13
import org.mockito.runners.MockitoJUnitRunner;
14
import org.springframework.jdbc.core.JdbcTemplate;
15

  
16
import eu.dnetlib.enabling.database.DataSourceFactory;
17

  
18
@RunWith(MockitoJUnitRunner.class)
19
public class JdbcTemplateFactoryTest {
20

  
21
	private static final String VALID_DB = "db01";
22

  
23
	// Class under test
24
	private JdbcTemplateFactory factory;
25

  
26
	@Mock
27
	private DataSourceFactory dataSourceFactory;
28

  
29
	@Mock
30
	private DataSource dataSource;
31

  
32
	@Before
33
	public void setUp() throws Exception {
34
		factory = new JdbcTemplateFactory();
35
		factory.setDataSourceFactory(dataSourceFactory);
36
		when(dataSourceFactory.createDataSource(VALID_DB)).thenReturn(dataSource);
37
	}
38

  
39
	@Test
40
	public void testCreateJdbcTemplate() {
41
		JdbcTemplate t = factory.createJdbcTemplate(VALID_DB);
42
		verify(dataSourceFactory).createDataSource(VALID_DB);
43
		assertEquals(dataSource, t.getDataSource());
44
	}
45

  
46
}
modules/cnr-enabling-database-service/tags/cnr-enabling-database-service-3.2.3/src/test/java/eu/dnetlib/enabling/database/DataSourceFactoryImplTest.java
1
package eu.dnetlib.enabling.database;
2

  
3
import static org.junit.Assert.assertNotNull;
4

  
5
import java.sql.SQLException;
6

  
7
import javax.sql.DataSource;
8

  
9
import org.junit.Before;
10
import org.junit.Ignore;
11
import org.junit.Test;
12
import org.junit.runner.RunWith;
13
import org.mockito.runners.MockitoJUnitRunner;
14

  
15
@RunWith(MockitoJUnitRunner.class)
16
@Ignore
17
public class DataSourceFactoryImplTest {
18

  
19
	// Class under test
20
	private DataSourceFactoryImpl factory;
21

  
22
	@Before
23
	public void setUp() throws Exception {
24
		factory = new DataSourceFactoryImpl();
25
		factory.setBaseUrl("jdbc:postgresql://localhost:5432");
26
		factory.setDriverClassName("org.postgresql.Driver");
27
		factory.setUsername("dnet");
28
		factory.setPassword("dnetPwd");
29
	}
30

  
31
	@Test
32
	public void testCreateDataSource_1() throws SQLException {
33
		DataSource ds = factory.createDataSource("");
34
		assertNotNull(ds);
35
		assertNotNull(ds.getConnection());
36
	}
37

  
38
	@Test
39
	public void testCreateDataSource_2() throws SQLException {
40
		DataSource ds = factory.createDataSource("postgres");
41
		assertNotNull(ds);
42
		assertNotNull(ds.getConnection());
43
	}
44

  
45
	@Test(expected = SQLException.class)
46
	public void testCreateDataSource_error() throws SQLException {
47
		DataSource ds = factory.createDataSource("_INVALID_DATABASE_");
48
		assertNotNull(ds);
49
		assertNotNull(ds.getConnection());
50
	}
51
}
modules/cnr-enabling-database-service/tags/cnr-enabling-database-service-3.2.3/src/test/java/eu/dnetlib/enabling/database/DatabaseServiceImplTest.java
1
package eu.dnetlib.enabling.database;
2

  
3
import java.util.Date;
4

  
5
import eu.dnetlib.enabling.database.rmi.DatabaseException;
6
import org.junit.Before;
7
import org.junit.Test;
8
import org.junit.runner.RunWith;
9
import org.mockito.Mock;
10
import org.mockito.runners.MockitoJUnitRunner;
11

  
12
import static org.mockito.Mockito.verify;
13

  
14
@RunWith(MockitoJUnitRunner.class)
15
public class DatabaseServiceImplTest {
16

  
17
	private static final String DBNAME = "THE_DB";
18
	private static final String TABLENAME = "THE_TABLE";
19

  
20
	// Class under test
21
	private DatabaseServiceImpl impl;
22
	@Mock
23
	private DatabaseServiceCore core;
24

  
25
	@Before
26
	public void setUp() throws Exception {
27
		impl = new DatabaseServiceImpl();
28
		impl.setCore(core);
29
	}
30

  
31
	@Test
32
	public void testDumpTable() throws DatabaseException {
33
		impl.dumpTable(DBNAME, TABLENAME);
34
		verify(core).generateResultSet(DBNAME, TABLENAME, null);
35
	}
36

  
37
	@Test
38
	public void testDumpTableAndLogs() throws DatabaseException {
39
		Date d1 = new Date(100000);
40
		Date d2 = new Date(200000);
41
		impl.dumpTableAndLogs(DBNAME, TABLENAME, d1, d2);
42
		verify(core).generateResultSet(DBNAME, TABLENAME, d1, d2);
43
	}
44
}
modules/cnr-enabling-database-service/tags/cnr-enabling-database-service-3.2.3/src/test/java/eu/dnetlib/enabling/database/resultset/SQLResultSetListenerTest.java
1
package eu.dnetlib.enabling.database.resultset;
2

  
3
import static org.junit.Assert.assertEquals;
4
import static org.mockito.Matchers.anyMap;
5
import static org.mockito.Matchers.anyString;
6
import static org.mockito.Matchers.eq;
7
import static org.mockito.Mockito.times;
8
import static org.mockito.Mockito.verify;
9
import static org.mockito.Mockito.when;
10

  
11
import java.util.List;
12

  
13
import org.dom4j.Document;
14
import org.junit.Before;
15
import org.junit.Test;
16
import org.junit.runner.RunWith;
17
import org.mockito.Mock;
18
import org.mockito.runners.MockitoJUnitRunner;
19
import org.springframework.jdbc.support.rowset.SqlRowSet;
20
import org.springframework.jdbc.support.rowset.SqlRowSetMetaData;
21

  
22
import eu.dnetlib.enabling.database.rmi.DatabaseException;
23
import eu.dnetlib.enabling.database.utils.DatabaseUtils;
24

  
25
@RunWith(MockitoJUnitRunner.class)
26
public class SQLResultSetListenerTest {
27

  
28
	// Class under test
29
	private SQLResultSetListener listener;
30

  
31
	private static final int SIZE = 123;
32
	private static final int FROM = 10;
33
	private static final int TO = 12;
34
	private static final String DB = "THE_DB";
35
	private static final String SQL = "SELECT * FROM test";
36
	private static final String SQL_FROM_TO = SQL + " OFFSET " + (FROM - 1);
37
	private static final String XML = "<AAAA />";
38

  
39
	@Mock
40
	private DatabaseUtils dbUtils;
41

  
42
	@Mock
43
	private Document simpleResponseDoc;
44
	@Mock
45
	private SqlRowSet ROWSET;
46
	@Mock
47
	private SqlRowSetMetaData ROWMETADATA;
48

  
49
	@Before
50
	public void setUp() throws Exception {
51
		listener = new SQLResultSetListener();
52
		listener.setDb(DB);
53
		listener.setDbUtils(dbUtils);
54
		listener.setSql(SQL);
55

  
56
		when(dbUtils.executeSql(eq(DB), anyString(), eq(Integer.class))).thenReturn(SIZE);
57
		when(dbUtils.executeSql(DB, SQL, SqlRowSet.class)).thenReturn(ROWSET);
58
		when(dbUtils.executeSql(DB, SQL_FROM_TO, SqlRowSet.class)).thenReturn(ROWSET);
59
		when(ROWSET.next()).thenReturn(true);
60
		when(ROWSET.getMetaData()).thenReturn(ROWMETADATA);
61
		when(ROWMETADATA.getColumnNames()).thenReturn(new String[] { "col1,col2,col3" });
62
		when(ROWSET.getObject(anyString())).thenReturn("val_XXX");
63
		when(dbUtils.rowToDocument(anyMap())).thenReturn(simpleResponseDoc);
64
		when(simpleResponseDoc.asXML()).thenReturn(XML);
65
	}
66

  
67
	@Test
68
	public void testGetResult_1() throws DatabaseException {
69
		listener.getResult(1, FROM - 1);
70
		listener.getResult(FROM, TO);
71

  
72
		verify(dbUtils).executeSql(DB, SQL, SqlRowSet.class);
73
		verify(ROWSET, times(TO + 2)).next();
74
		verify(ROWSET, times(1)).previous();
75
	}
76

  
77
	@Test
78
	public void testGetResult_3() throws DatabaseException {
79
		List<String> response = listener.getResult(FROM, TO);
80

  
81
		verify(dbUtils).executeSql(DB, SQL_FROM_TO, SqlRowSet.class);
82

  
83
		assertEquals(3, response.size());
84
		for (String s : response) {
85
			assertEquals(XML, s);
86
		}
87
	}
88

  
89
	@Test(expected = IllegalArgumentException.class)
90
	public void testGetResult_err1() {
91
		listener.getResult(0, 0);
92
	}
93

  
94
	@Test(expected = IllegalArgumentException.class)
95
	public void testGetResult_err2() {
96
		listener.getResult(-4, 2);
97
	}
98

  
99
	@Test(expected = IllegalArgumentException.class)
100
	public void testGetResult_err3() {
101
		listener.getResult(1, -1);
102
	}
103

  
104
	@Test(expected = IllegalArgumentException.class)
105
	public void testGetResult_err4() {
106
		listener.getResult(10, 4);
107
	}
108

  
109
	@Test
110
	public void testGetSize() {
111
		assertEquals(SIZE, listener.getSize());
112
	}
113

  
114
}
modules/cnr-enabling-database-service/tags/cnr-enabling-database-service-3.2.3/src/test/java/eu/dnetlib/enabling/database/resultset/SQLResultSetListenerFactoryTest.java
1
package eu.dnetlib.enabling.database.resultset;
2

  
3
import static org.junit.Assert.assertEquals;
4
import static org.junit.Assert.assertNotNull;
5
import static org.mockito.Matchers.anyMap;
6
import static org.mockito.Matchers.eq;
7
import static org.mockito.Mockito.when;
8

  
9
import java.util.Date;
10
import java.util.Map;
11
import java.util.concurrent.BlockingQueue;
12

  
13
import org.junit.Before;
14
import org.junit.Test;
15
import org.junit.runner.RunWith;
16
import org.mockito.Mock;
17
import org.mockito.runners.MockitoJUnitRunner;
18

  
19
import eu.dnetlib.enabling.database.rmi.DatabaseException;
20
import eu.dnetlib.enabling.database.utils.DatabaseUtils;
21
import eu.dnetlib.enabling.resultset.ResultSetListener;
22

  
23
@RunWith(MockitoJUnitRunner.class)
24
public class SQLResultSetListenerFactoryTest {
25

  
26
	// Class under test.
27
	private SQLResultSetListenerFactory factory;
28

  
29
	private static final String DB = "THE_DB";
30
	private static final String TABLE = "THE_TABLE";
31

  
32
	@Mock
33
	private DatabaseUtils dbUtils;
34

  
35
	@Mock
36
	private BlockingQueue<Map<String, Object>> queue;
37

  
38
	@Mock
39
	private Date fromDATE;
40
	@Mock
41
	private Date untilDATE;
42

  
43
	@Before
44
	public void setUp() throws Exception {
45
		factory = new SQLResultSetListenerFactory();
46
		factory.setDbUtils(dbUtils);
47
	}
48

  
49
	@Test
50
	public void testCreateSQLListener() throws DatabaseException {
51
		String query = "SELECT * FROM test ";
52
		String countquery = "SELECT 100";
53

  
54
		when(dbUtils.executeSql(DB, countquery, Integer.class)).thenReturn(100);
55
		when(dbUtils.executeSql(DB, query, BlockingQueue.class)).thenReturn(queue);
56

  
57
		ResultSetListener listener = factory.createSQLListenerWithSize(DB, query, countquery);
58

  
59
		assertNotNull(listener);
60
	}
61

  
62
	@Test
63
	public void testCreateTableListener() {
64
		SQLResultSetListener listener = (SQLResultSetListener) factory.createTableListener(DB, TABLE);
65

  
66
		assertEquals(listener.getSql(), "SELECT * FROM " + TABLE);
67
		assertEquals(dbUtils, listener.getDbUtils());
68
		assertEquals(DB, listener.getDb());
69
	}
70

  
71
	@Test
72
	public void testCreateCondTableListener() {
73
		String cond = "title='XYZ'";
74

  
75
		SQLResultSetListener listener = (SQLResultSetListener) factory.createCondTableListener(DB, TABLE, cond);
76

  
77
		assertEquals(listener.getSql(), "SELECT * FROM " + TABLE + " WHERE " + cond);
78
		assertEquals(dbUtils, listener.getDbUtils());
79
		assertEquals(DB, listener.getDb());
80
	}
81

  
82
	@SuppressWarnings("unchecked")
83
	@Test
84
	public void testCreateLoggedTableListener() {
85
		String sql = "SELECT * FROM ...";
86

  
87
		when(dbUtils.getSQLFromTemplate(eq("loggedTable"), eq(DB), eq(TABLE), anyMap())).thenReturn(sql);
88

  
89
		SQLResultSetListener listener = (SQLResultSetListener) factory.createLoggedTableListener(DB, TABLE, fromDATE, untilDATE);
90

  
91
		assertEquals(listener.getSql(), sql);
92
		assertEquals(dbUtils, listener.getDbUtils());
93
		assertEquals(DB, listener.getDb());
94
	}
95

  
96
}
modules/cnr-enabling-database-service/tags/cnr-enabling-database-service-3.2.3/src/test/java/eu/dnetlib/enabling/database/DatabaseServiceCoreTest.java
1
package eu.dnetlib.enabling.database;
2

  
3
import static org.junit.Assert.assertEquals;
4
import static org.junit.Assert.assertFalse;
5
import static org.junit.Assert.assertTrue;
6
import static org.mockito.Mockito.verify;
7
import static org.mockito.Mockito.when;
8

  
9
import java.util.Arrays;
10
import java.util.Date;
11
import java.util.HashMap;
12
import java.util.List;
13
import java.util.Map;
14

  
15
import org.junit.Before;
16
import org.junit.Ignore;
17
import org.junit.Test;
18
import org.junit.runner.RunWith;
19
import org.mockito.Mock;
20
import org.mockito.runners.MockitoJUnitRunner;
21

  
22
import eu.dnetlib.enabling.database.objects.DnetDatabase;
23
import eu.dnetlib.enabling.database.resultset.SQLResultSetListenerFactory;
24
import eu.dnetlib.enabling.database.utils.DatabaseUtils;
25
import eu.dnetlib.enabling.database.utils.GenericRow;
26
import eu.dnetlib.enabling.resultset.ResultSetFactory;
27
import eu.dnetlib.enabling.resultset.ResultSetListener;
28

  
29
@RunWith(MockitoJUnitRunner.class)
30
public class DatabaseServiceCoreTest {
31

  
32
	private static final String DB_NAME = "cinema";
33
	private static final String TABLE_NAME = "films";
34
	private static final String TABLE_WHERE = "year=1980";
35
	private static final Date TABLE_FROM = new Date(100000);
36
	private static final Date TABLE_UNTIL = new Date(200000);
37
	private static final String SQL = "SELECT * from films";
38

  
39
	// Class under test
40
	private DatabaseServiceCore core;
41

  
42
	@Mock
43
	private DatabaseUtils dbUtils;
44

  
45
	@Mock
46
	private ResultSetFactory resultSetFactory;
47
	@Mock
48
	private SQLResultSetListenerFactory resultSetListenerFactory;
49
	@Mock
50
	private ResultSetListener listener_where;
51
	@Mock
52
	private ResultSetListener listener_from_until;
53
	@Mock
54
	private ResultSetListener listener_sql;
55
	@Mock
56
	private GenericRow ROW;
57

  
58
	private final Map<String, Object> ROW_FIELDS = new HashMap<String, Object>();
59

  
60
	@Before
61
	public void setUp() throws Exception {
62
		core = new DatabaseServiceCore();
63
		core.setDbUtils(dbUtils);
64

  
65
		core.setResultSetFactory(resultSetFactory);
66
		core.setResultSetListenerFactory(resultSetListenerFactory);
67

  
68
		ROW_FIELDS.put("name", "Pippo");
69
		ROW_FIELDS.put("age", 36);
70

  
71
		when(dbUtils.listCommonDBTables(DB_NAME)).thenReturn(Arrays.asList("T1", "T2", "T3"));;
72

  
73
		when(resultSetListenerFactory.createCondTableListener(DB_NAME, TABLE_NAME, TABLE_WHERE)).thenReturn(listener_where);
74
		when(resultSetListenerFactory.createLoggedTableListener(DB_NAME, TABLE_NAME, TABLE_FROM, TABLE_UNTIL)).thenReturn(listener_from_until);
75
		when(resultSetListenerFactory.createSQLListener(DB_NAME, SQL)).thenReturn(listener_sql);
76

  
77
		//when(ROW.getTable()).thenReturn(TABLE_NAME);
78
		//when(ROW.getFields()).thenReturn(ROW_FIELDS);
79
	}
80

  
81
	@Ignore
82
	@Test
83
	public void testListDatabases() throws Exception {
84
		List<DnetDatabase> list = core.listDatabases();
85
		verify(dbUtils).listAllDatabases();
86
		assertEquals("List size invalid", 5, list.size());
87

  
88
		for (DnetDatabase db : list) {
89
			if (db.getDbName().startsWith("M")) {
90
				assertTrue("Db should be managed", db.isManaged());
91
			} else {
92
				assertFalse("Db should be not managed", db.isManaged());
93
			}
94
		}
95

  
96
	}
97

  
98
	@Test
99
	public void testChangeDatabaseStatus_manage() throws Exception {
100
		core.changeDatabaseStatus(DB_NAME, true);
101
		verify(dbUtils).listCommonDBTables(DB_NAME);
102
		verify(dbUtils).setManaged(DB_NAME, true);
103
	}
104

  
105
	@Test
106
	public void testChangeDatabaseStatus_unmanage() throws Exception {
107
		core.changeDatabaseStatus(DB_NAME, false);
108
		verify(dbUtils).listCommonDBTables(DB_NAME);
109
		verify(dbUtils).setManaged(DB_NAME, false);
110
	}
111

  
112
	@Test
113
	public void testGenerateResultSet_1() throws Exception {
114
		core.generateResultSet(DB_NAME, SQL);
115
		verify(resultSetFactory).createResultSet(listener_sql);
116
	}
117

  
118
	@Test
119
	public void testGenerateResultSet_2() throws Exception {
120
		core.generateResultSet(DB_NAME, TABLE_NAME, TABLE_WHERE);
121
		verify(resultSetFactory).createResultSet(listener_where);
122
	}
123

  
124
	@Test
125
	public void testGenerateResultSet_3() throws Exception {
126
		core.generateResultSet(DB_NAME, TABLE_NAME, TABLE_FROM, TABLE_UNTIL);
127
		verify(resultSetFactory).createResultSet(listener_from_until);
128
	}
129

  
130
}
modules/cnr-enabling-database-service/tags/cnr-enabling-database-service-3.2.3/src/main/java/eu/dnetlib/enabling/database/utils/GenericRow.java
1
package eu.dnetlib.enabling.database.utils;
2

  
3
import java.util.Map;
4

  
5
public class GenericRow {
6
	private String table;
7
	private Map<String, Object> fields;
8
	private boolean toDelete = false;
9
	
10
	
11
	public GenericRow(String table, Map<String, Object> fields, boolean toDelete) {
12
		super();
13
		this.table = table;
14
		this.fields = fields;
15
		this.toDelete = toDelete;
16
	}
17
	
18
	public String getTable() {
19
		return table;
20
	}
21
	
22
	public void setTable(String table) {
23
		this.table = table;
24
	}
25
	
26
	public Map<String, Object> getFields() {
27
		return fields;
28
	}
29
	
30
	public void setFields(Map<String, Object> fields) {
31
		this.fields = fields;
32
	}
33

  
34
	public boolean isToDelete() {
35
		return toDelete;
36
	}
37

  
38
	public void setToDelete(boolean toDelete) {
39
		this.toDelete = toDelete;
40
	}
41
	
42
}
modules/cnr-enabling-database-service/tags/cnr-enabling-database-service-3.2.3/src/main/java/eu/dnetlib/enabling/database/utils/DatabaseUtils.java
1
package eu.dnetlib.enabling.database.utils;
2

  
3
import java.io.StringReader;
4
import java.sql.*;
5
import java.sql.Date;
6
import java.text.ParseException;
7
import java.text.SimpleDateFormat;
8
import java.util.*;
9
import java.util.concurrent.ArrayBlockingQueue;
10
import java.util.concurrent.BlockingQueue;
11
import java.util.concurrent.Executors;
12
import java.util.concurrent.TimeUnit;
13
import java.util.concurrent.atomic.AtomicReference;
14
import java.util.regex.Pattern;
15
import javax.sql.DataSource;
16

  
17
import com.google.common.collect.Lists;
18
import com.google.common.collect.Queues;
19
import com.google.common.collect.Sets;
20
import eu.dnetlib.enabling.database.DataSourceFactory;
21
import eu.dnetlib.enabling.database.TransactionTemplateFactory;
22
import eu.dnetlib.enabling.database.objects.DnetDatabase;
23
import eu.dnetlib.enabling.database.rmi.DatabaseException;
24
import eu.dnetlib.miscutils.datetime.DateUtils;
25
import eu.dnetlib.miscutils.functional.string.Sanitizer;
26
import org.apache.commons.lang.BooleanUtils;
27
import org.apache.commons.logging.Log;
28
import org.apache.commons.logging.LogFactory;
29
import org.apache.velocity.app.VelocityEngine;
30
import org.dom4j.Document;
31
import org.dom4j.DocumentHelper;
32
import org.dom4j.Element;
33
import org.dom4j.Node;
34
import org.dom4j.io.SAXReader;
35
import org.joda.time.DateTime;
36
import org.joda.time.format.ISODateTimeFormat;
37
import org.springframework.beans.factory.annotation.Required;
38
import org.springframework.dao.DataAccessException;
39
import org.springframework.jdbc.core.JdbcTemplate;
40
import org.springframework.jdbc.support.rowset.SqlRowSet;
41
import org.springframework.transaction.support.TransactionTemplate;
42
import org.springframework.ui.velocity.VelocityEngineUtils;
43

  
44
public class DatabaseUtils {
45

  
46
	public static final String DNET_RESOURCE_ID_FIELD = "_dnet_resource_identifier_";
47
	public static final int BLOCKING_QUEUE_TIMEOUT = 300;
48
	private static final String SQL_DATE_FORMAT = "yyyy-MM-dd";
49
	private static final Log log = LogFactory.getLog(DatabaseUtils.class); // NOPMD by marko on 11/24/08 5:02 PM
50
	private static final int BLOCKING_QUEUE_SIZE = 200;
51
	private static final Set<String> TRUE_VALUES = Sets.newHashSet("true", "t", "yes", "y", "vero", "v");
52
	private static final Set<String> FALSE_VALUES = Sets.newHashSet("false", "f", "no", "n", "falso");
53
	private DataSourceFactory dataSourceFactory;
54
	private JdbcTemplateFactory jdbcTemplateFactory;
55
	private TransactionTemplateFactory transactionTemplateFactory;
56
	private String defaultDB;
57
	private VelocityEngine velocityEngine;
58
	private String dbPrefix;
59
	private int numbersOfRecordsForTransaction;
60
	private int fetchSize = 100;
61

  
62
	public List<String> listCommonDBTables(final String database) throws DatabaseException {
63
		String query =
64
				"SELECT table_name FROM information_schema.tables " + "WHERE table_schema = 'public' " + "AND table_type != 'VIEW' "
65
						+ "AND table_name NOT LIKE '%_log'";
66
		return getTypedListFromSql(database, query, String.class);
67
	}
68

  
69
	public List<String> listCommonDBViews(final String database) throws DatabaseException {
70
		String query =
71
				"SELECT table_name FROM information_schema.tables " + "WHERE table_schema = 'public' " + "AND table_type = 'VIEW' "
72
						+ "AND table_name NOT LIKE '%_log'";
73
		return getTypedListFromSql(database, query, String.class);
74
	}
75

  
76
	public Map<String, TableDates> getTableDatesForDB(final String db) throws DatabaseException {
77
		Map<String, TableDates> res = new HashMap<String, TableDates>();
78

  
79
		for (String table : listCommonDBTables(db)) {
80
			try {
81
				TableDates dates = new TableDates();
82

  
83
				String query =
84
						"select lastinsert, lastupdate, lastdelete from " + "(select max(date) as lastinsert from " + table
85
								+ "_log where operation='insert') as t1, " + "(select max(date) as lastupdate from " + table
86
								+ "_log where operation='update') as t2, " + "(select max(date) as lastdelete from " + table
87
								+ "_log where operation='delete') as t3";
88

  
89
				SqlRowSet srs = executeSql(db, query, SqlRowSet.class);
90
				if (srs.next()) {
91
					dates.setLastInsert(srs.getDate("lastinsert"));
92
					dates.setLastUpdate(srs.getDate("lastupdate"));
93
					dates.setLastDelete(srs.getDate("lastdelete"));
94
				}
95
				res.put(table, dates);
96
			} catch (Exception e) {
97
				log.warn("Error obtaing dates for table " + table, e);
98
			}
99
		}
100
		return res;
101
	}
102

  
103
	public List<DnetDatabase> listAllDatabases() throws DatabaseException {
104
		final String query =
105
				"SELECT d.datname AS db, COALESCE(dsc.description,'')='isManaged' AS managed FROM pg_database d LEFT OUTER JOIN pg_shdescription dsc ON (d.oid = dsc.objoid) WHERE d.datname LIKE '"
106
						+ dbPrefix + "%' ORDER BY d.datname DESC";
107
		final JdbcTemplate jdbcTemplate = getJdbcTemplate(defaultDB);
108

  
109
		final List<DnetDatabase> list = Lists.newArrayList();
110
		for (Map<String, Object> map : jdbcTemplate.queryForList(query)) {
111
			list.add(new DnetDatabase(map.get("db").toString(), Boolean.parseBoolean(map.get("managed").toString())));
112
		}
113
		return list;
114

  
115
	}
116

  
117
	public <T> List<T> getTypedListFromSql(final String dbName, final String query, final Class<T> clazz) throws DatabaseException {
118
		try {
119
			List<T> list = new ArrayList<T>();
120
			for (Object obj : getJdbcTemplate(dbName).queryForList(query, clazz)) {
121
				list.add(clazz.cast(obj));
122
			}
123
			return list;
124
		} catch (DataAccessException e) {
125
			throw new DatabaseException(e);
126
		}
127
	}
128

  
129
	public List<String> getSimpleListFromSql(final String dbName, final String query) throws DatabaseException {
130

  
131
		JdbcTemplate jdbcTemplate = getJdbcTemplate(dbName);
132

  
133
		try {
134
			List<String> list = new ArrayList<>();
135
			for (Object obj : jdbcTemplate.queryForList(query)) {
136
				list.add(obj.toString());
137
			}
138
			return list;
139
		} catch (DataAccessException e) {
140
			throw new DatabaseException(e);
141
		}
142
	}
143

  
144
	public void executeSql(final String db, final String query) throws DatabaseException {
145
		executeSql(db, query, Void.class);
146
	}
147

  
148
	@SuppressWarnings("unchecked")
149
	public <T> T executeSql(final String dbName, final String query, final Class<T> clazz) throws DatabaseException {
150

  
151
		if (clazz == BlockingQueue.class) {
152
			log.debug("Creating Queue");
153

  
154
			final ArrayBlockingQueue<Map<String, Object>> queue = Queues.newArrayBlockingQueue(BLOCKING_QUEUE_SIZE);
155
			Executors.newSingleThreadExecutor().submit(() -> {
156
				final DataSource ds = dataSourceFactory.createDataSource(dbName);
157
				try (final Connection con = getConnection(ds);
158
						final PreparedStatement stm = getStm(query, con);
159
						final ResultSet rs = stm.executeQuery()) {
160

  
161
					rs.setFetchSize(getFetchSize());
162
					boolean timeout = false;
163
					log.info(String.format("[Thread Id %s] starting to populate queue", Thread.currentThread().getId()));
164
					while (rs.next()) {
165
						ResultSetMetaData md = rs.getMetaData();
166
						Map<String, Object> row = new HashMap<>();
167
						for (int i = 1; i <= md.getColumnCount(); i++) {
168
							row.put(md.getColumnName(i), rs.getObject(i));
169
						}
170
						if (!enqueue(queue, row)) {
171
							timeout = true;
172
							break;
173
						}
174
					}
175
					if (timeout) {
176
						log.warn(String.format("[Thread Id %s] queue full, consumer did not consume for %s seconds, I give up",
177
								Thread.currentThread().getId(), BLOCKING_QUEUE_TIMEOUT));
178
						return;
179
					}
180
					// An empty Map indicates the end of the resultset
181
					enqueue(queue, new HashMap<>());
182
				} catch (SQLException e) {
183
					throw new RuntimeException(e);
184
				}
185
			});
186

  
187
			log.debug("Returned Queue");
188

  
189
			return (T) queue;
190
		}
191

  
192
		final JdbcTemplate jdbcTemplate = jdbcTemplateFactory.createJdbcTemplate(dbName);
193
		if (clazz == Integer.class) return (T) jdbcTemplate.queryForObject(query, Integer.class);
194
		else if (clazz == List.class) return (T) jdbcTemplate.queryForList(query);
195
		else if (clazz == Map.class) return (T) jdbcTemplate.queryForMap(query);
196
		else if (clazz == SqlRowSet.class) return (T) jdbcTemplate.queryForRowSet(query);
197
		else {
198
			jdbcTemplate.update(query);
199
			return null;
200
		}
201
	}
202

  
203
	private boolean enqueue(final ArrayBlockingQueue<Map<String, Object>> q, final Map<String, Object> row) {
204
		try {
205
			return q.offer(row, BLOCKING_QUEUE_TIMEOUT, TimeUnit.SECONDS);
206
		} catch (InterruptedException e) {
207
			log.error("Error putting element in queue");
208
			throw new RuntimeException(e);
209
		}
210
	}
211

  
212
	private PreparedStatement getStm(final String query, final Connection con) throws SQLException {
213
		final PreparedStatement stm = con.prepareStatement(query, ResultSet.TYPE_FORWARD_ONLY);
214
		stm.setFetchSize(getFetchSize());
215
		return stm;
216
	}
217

  
218
	private Connection getConnection(final DataSource dataSource) throws SQLException {
219
		final Connection conn = dataSource.getConnection();
220
		conn.setAutoCommit(false);
221
		return conn;
222
	}
223

  
224
	public boolean contains(final String db, final String table, final String column, final String value) throws DatabaseException {
225
		String query = "";
226
		try {
227
			verifyParameters(db, table, column);
228
			query = "SELECT " + column + " FROM " + table + " WHERE " + column + " = '" + value + "'";
229
			List<String> res = getSimpleListFromSql(db, query);
230
			return res != null && res.size() > 0;
231
		} catch (Throwable e) {
232
			throw new DatabaseException("Error performing SQL: " + query, e);
233
		}
234
	}
235

  
236
	public List<Map<?, ?>> describeTable(final String database, final String table) throws DatabaseException {
237
		verifyParameters(database, table);
238

  
239
		try {
240
			final JdbcTemplate jdbcTemplate = getJdbcTemplate(database);
241
			List<Map<?, ?>> response = new ArrayList<Map<?, ?>>();
242
			String query = "SELECT * FROM information_schema.columns WHERE table_name = ?";
243

  
244
			for (Object o : jdbcTemplate.queryForList(query, new Object[] { table })) {
245
				if (o instanceof Map<?, ?>) {
246
					response.add((Map<?, ?>) o);
247
				}
248
			}
249
			return response;
250
		} catch (DataAccessException e) {
251
			throw new DatabaseException(e);
252
		}
253
	}
254

  
255
	public String dumpTableAsXML(final String db, final String t) throws DatabaseException {
256
		return dumpTableAsDoc(db, t).asXML();
257
	}
258

  
259
	public Document dumpTableAsDoc(final String db, final String t) throws DatabaseException {
260
		Document doc = DocumentHelper.createDocument();
261

  
262
		Element root = doc.addElement("DB_TABLE");
263
		Element head = root.addElement("HEADER");
264

  
265
		head.addElement("DATABASE").addAttribute("value", db);
266
		head.addElement("TABLE").addAttribute("value", t);
267
		head.addElement("DATE").addAttribute("value", DateUtils.now_ISO8601());
268

  
269
		Element body = root.addElement("BODY");
270
		for (Document d : dumpTableAsList(db, t)) {
271
			body.add(d.getRootElement());
272
		}
273
		return doc;
274
	}
275

  
276
	public List<Document> dumpTableAsList(final String db, final String t) throws DatabaseException {
277
		final JdbcTemplate jdbcTemplate = getJdbcTemplate(db);
278

  
279
		List<Document> list = new ArrayList<Document>();
280
		for (Object o : jdbcTemplate.queryForList("SELECT * FROM " + t)) {
281
			if (o instanceof Map<?, ?>) {
282
				list.add(rowToDocument((Map<?, ?>) o));
283
			}
284
		}
285
		return list;
286
	}
287

  
288
	public Document rowToDocument(final Map<?, ?> map) throws DatabaseException {
289
		Document doc = DocumentHelper.createDocument();
290

  
291
		Element row = doc.addElement("ROW");
292
		for (Map.Entry<?, ?> entry : map.entrySet()) {
293
			Element col = row.addElement("FIELD");
294
			col.addAttribute("name", "" + entry.getKey());
295
			addValue(col, entry.getValue());
296
		}
297
		return doc;
298
	}
299

  
300
	public Document getRowByResourceId(final String database, final String table, final String resourceId) throws DatabaseException {
301
		verifyParameters(database, table);
302

  
303
		JdbcTemplate jdbcTemplate = getJdbcTemplate(database);
304
		String query = "SELECT * FROM " + table + " WHERE " + DNET_RESOURCE_ID_FIELD + "=?";
305

  
306
		Map<?, ?> map = jdbcTemplate.queryForMap(query, resourceId);
307
		Document doc = DocumentHelper.createDocument();
308

  
309
		Element root = doc.addElement("DB_RECORD");
310
		Element head = root.addElement("HEADER");
311
		head.addElement("RESOURCE_IDENTIFIER").addAttribute("value", resourceId);
312
		head.addElement("DATABASE").addAttribute("value", database);
313
		head.addElement("TABLE").addAttribute("value", table);
314
		head.addElement("DATE").addAttribute("value", DateUtils.now_ISO8601());
315

  
316
		Element body = root.addElement("BODY");
317

  
318
		Element row = body.addElement("ROW");
319

  
320
		for (Map.Entry<?, ?> entry : map.entrySet()) {
321
			Element col = row.addElement("FIELD");
322
			col.addAttribute("name", "" + entry.getKey());
323
			addValue(col, entry.getValue());
324
		}
325

  
326
		return doc;
327
	}
328

  
329
	private void addValue(final Element elem, final Object value) throws DatabaseException {
330
		if (value instanceof Array) {
331
			try {
332
				for (Object o : (Object[]) ((Array) value).getArray()) {
333
					addValue(elem.addElement("ITEM"), o);
334
				}
335
			} catch (Exception e) {
336
				throw new DatabaseException("Error procsessing a Array", e);
337
			}
338
		} else if (value != null) {
339
			elem.addText(Sanitizer.sanitize(value.toString()));
340
		} else {
341
			elem.addAttribute("isNull", "true");
342
		}
343
	}
344

  
345
	private void verifyParameters(final String... params) throws DatabaseException {
346
		Pattern pattern = Pattern.compile("\\w{1,128}");
347

  
348
		for (String p : params) {
349
			log.debug("TESTING SQL PARAM:" + p);
350
			if (p == null) throw new DatabaseException("Parameter is null");
351
			else if (!pattern.matcher(p).matches()) throw new DatabaseException("Parameter [" + p + "] contains an invalid character");
352
			else {
353
				log.debug("TEST OK");
354
			}
355
		}
356
	}
357

  
358
	public void importFromIterable(final String db, final Iterable<String> iterable) throws DatabaseException {
359
		verifyParameters(db);
360

  
361
		final DataSource dataSource = dataSourceFactory.createDataSource(db);
362
		final JdbcTemplate jdbcTemplate = getJdbcTemplate(db);
363
		final TransactionTemplate transactionTemplate = transactionTemplateFactory.createTransactionTemplate(dataSource);
364

  
365
		int counterTotal = 0;
366

  
367
		long start = DateUtils.now();
368

  
369
		List<GenericRow> rows = new ArrayList<GenericRow>();
370
		for (String prof : iterable) {
371
			rows.addAll(obtainListOfRows(prof));
372
			if (rows.size() > numbersOfRecordsForTransaction) {
373
				counterTotal += rows.size();
374
				importTransaction(jdbcTemplate, transactionTemplate, rows);
375
				rows.clear();
376
			}
377
		}
378
		counterTotal += rows.size();
379
		importTransaction(jdbcTemplate, transactionTemplate, rows);
380

  
381
		long end = DateUtils.now();
382

  
383
		log.info("**********************************************************");
384
		log.info("Processed " + counterTotal + " rows in " + ((end - start) / 1000) + " seconds");
385
		log.info("**********************************************************");
386
	}
387

  
388
	private void importTransaction(final JdbcTemplate jdbcTemplate, final TransactionTemplate transactionTemplate, List<GenericRow> rows)
389
			throws DatabaseException {
390
		if (rows != null && rows.size() > 0) {
391
			importTransactionInternal(jdbcTemplate, transactionTemplate, rows);
392
		}
393
	}
394

  
395
	private List<GenericRow> importTransactionInternal(final JdbcTemplate jdbcTemplate,
396
			final TransactionTemplate transactionTemplate,
397
			final List<GenericRow> rows) throws DatabaseException {
398

  
399
		final AtomicReference<DatabaseException> error = new AtomicReference<DatabaseException>();
400

  
401
		try {
402
			return transactionTemplate.execute(status -> {
403
				final List<GenericRow> ok = Lists.newArrayList();
404
				try {
405
					for (GenericRow row : rows) {
406
						if (row.isToDelete()) {
407
							deleteRow(jdbcTemplate, row.getTable(), row.getFields());
408
						} else {
409
							addOrUpdateRow(jdbcTemplate, row.getTable(), row.getFields());
410
						}
411
						ok.add(row);
412
					}
413
				} catch (DatabaseException e) {
414
					log.warn("Transaction failed", e);
415
					status.setRollbackOnly();
416
					error.set(e);
417
				}
418
				return ok;
419
			});
420
		} finally {
421
			if (error.get() != null) {
422
				throw error.get();
423
			}
424
		}
425
	}
426

  
427
	protected void addOrUpdateRow(final JdbcTemplate jdbcTemplate, final String table, final Map<String, Object> rowFields) throws DatabaseException {
428
		try {
429

  
430
			if (log.isDebugEnabled()) {
431
				log.debug("Adding or updating element to table " + table);
432
			}
433
			verifyParameters(table);
434
			verifyParameters(rowFields.keySet().toArray(new String[rowFields.size()]));
435

  
436
			String fields = "";
437
			String values = "";
438
			List<Object> list = new ArrayList<Object>();
439

  
440
			for (Map.Entry<String, Object> e : rowFields.entrySet()) {
441
				if (!fields.isEmpty()) {
442
					fields += ",";
443
				}
444
				fields += e.getKey();
445
				if (!values.isEmpty()) {
446
					values += ",";
447
				}
448
				values += "?";
449
				list.add(e.getValue());
450
			}
451

  
452
			int count = 0;
453
			if (rowFields.containsKey(DNET_RESOURCE_ID_FIELD)) {
454
				List<Object> list2 = new ArrayList<Object>();
455
				list2.addAll(list);
456
				list2.add(rowFields.get(DNET_RESOURCE_ID_FIELD));
457
				count =
458
						jdbcTemplate.update("UPDATE " + table + " SET (" + fields + ") = (" + values + ") WHERE " + DNET_RESOURCE_ID_FIELD + "=?",
459
								list2.toArray());
460
			}
461
			if (count == 0) {
462
				jdbcTemplate.update("INSERT INTO " + table + " (" + fields + ") VALUES (" + values + ")", list.toArray());
463
			}
464
		} catch (final Exception e) {
465
			throw new DatabaseException("Error adding or updating record", e);
466
		}
467
	}
468

  
469
	protected void deleteRow(final JdbcTemplate jdbcTemplate, final String table, final Map<String, Object> rowFields) throws DatabaseException {
470
		if (log.isDebugEnabled()) {
471
			log.debug("Deleting element from table " + table);
472
		}
473
		verifyParameters(table);
474
		verifyParameters(rowFields.keySet().toArray(new String[rowFields.size()]));
475

  
476
		List<Object> list = new ArrayList<Object>();
477

  
478
		String where = "";
479

  
480
		for (Map.Entry<String, Object> e : rowFields.entrySet()) {
481
			if (!where.isEmpty()) {
482
				where += " AND ";
483
			}
484
			where += e.getKey() + "=?";
485
			list.add(e.getValue());
486
		}
487

  
488
		if (where.isEmpty()) throw new DatabaseException("Delete condition is empty");
489
		int n = jdbcTemplate.update("DELETE FROM " + table + " WHERE " + where, list.toArray());
490

  
491
		if (log.isDebugEnabled()) {
492
			log.debug("Number of Deleted records: " + n);
493
		}
494
	}
495

  
496
	public void deleteRowByResourceId(final String database, final String table, final String resourceIdentifier) throws DatabaseException {
497
		verifyParameters(database, table, resourceIdentifier);
498
		final JdbcTemplate jdbcTemplate = getJdbcTemplate(database);
499
		jdbcTemplate.update("DELETE FROM " + table + " WHERE " + DNET_RESOURCE_ID_FIELD + "=?", resourceIdentifier);
500
	}
501

  
502
	public void clearTable(final String database, final String table) throws DatabaseException {
503
		verifyParameters(database, table);
504

  
505
		final JdbcTemplate jdbcTemplate = getJdbcTemplate(database);
506
		jdbcTemplate.update("DELETE FROM " + table);
507
	}
508

  
509
	public void prepareManagementOfTable(final String database, final String table) throws DatabaseException {
510
		verifyParameters(database, table);
511
		final JdbcTemplate jdbcTemplate = getJdbcTemplate(database);
512

  
513
		if (!isManagedTable(jdbcTemplate, table)) {
514
			jdbcTemplate.update(getSQLFromTemplate("manageTable", database, table, null));
515
			log.info("Added management of table " + table);
516
		}
517
	}
518

  
519
	public void removeManagementOfTable(final String database, final String table) throws DatabaseException {
520
		verifyParameters(database, table);
521
		final JdbcTemplate jdbcTemplate = getJdbcTemplate(database);
522

  
523
		if (isManagedTable(jdbcTemplate, table)) {
524
			jdbcTemplate.update(getSQLFromTemplate("unmanageTable", database, table, null));
525
			log.info("Removed management of table " + table);
526
		}
527
	}
528

  
529
	public boolean isManagedTable(final String database, final String table) throws DatabaseException {
530
		verifyParameters(database, table);
531
		final JdbcTemplate jdbcTemplate = getJdbcTemplate(database);
532
		return isManagedTable(jdbcTemplate, table);
533
	}
534

  
535
	private boolean isManagedTable(final JdbcTemplate jdbcTemplate, final String table) {
536
		return jdbcTemplate.queryForObject("SELECT count(*) FROM information_schema.columns WHERE table_name = ? AND column_name = ?", Integer.class,
537
				table, DNET_RESOURCE_ID_FIELD) == 1;
538
	}
539

  
540
	public boolean isLoggedTable(final String database, final String table) throws DatabaseException {
541
		verifyParameters(database, table);
542
		final JdbcTemplate jdbcTemplate = getJdbcTemplate(database);
543
		return isLoggedTable(jdbcTemplate, table);
544
	}
545

  
546
	private boolean isLoggedTable(final JdbcTemplate jdbcTemplate, final String table) {
547
		return jdbcTemplate.queryForObject("SELECT count(*) FROM information_schema.tables WHERE table_name = ?", Integer.class,
548
				table + "_log") == 1;
549
	}
550

  
551
	public String getDefaultDnetIdentifier(final String database, final String table) throws DatabaseException {
552
		verifyParameters(database, table);
553
		final JdbcTemplate jdbcTemplate = getJdbcTemplate(database);
554
		if (isManagedTable(jdbcTemplate, table)) return jdbcTemplate.queryForObject(
555
				"SELECT column_default FROM information_schema.columns WHERE table_name = ? AND column_name = ?", new Object[] {
556
						table, DNET_RESOURCE_ID_FIELD }, String.class);
557
		return "";
558
	}
559

  
560
	public void reassignDefaultDnetIdentifiers(final String db) throws DatabaseException {
561
		for (String t : listCommonDBTables(db)) {
562
			reassignDefaultDnetIdentifiers(db, t);
563
		}
564
	}
565

  
566
	public void reassignDefaultDnetIdentifiers(final String db, final String t) throws DatabaseException {
567
		if (!isManagedTable(db, t)) return;
568

  
569
		SqlRowSet rows =
570
				executeSql(db, "SELECT pg_attribute.attname as pkey FROM pg_index, pg_class, pg_attribute " + "WHERE pg_class.oid = '" + t + "'::regclass "
571
						+ "AND indrelid = pg_class.oid " + "AND pg_attribute.attrelid = pg_class.oid "
572
						+ "AND pg_attribute.attnum = any(pg_index.indkey) AND indisprimary " + "ORDER BY pkey", SqlRowSet.class);
573

  
574
		String defaultValue = "";
575
		while (rows.next()) {
576
			if (!defaultValue.isEmpty()) {
577
				defaultValue += "||'@@'||";
578
			}
579
			defaultValue += rows.getString("pkey");
580
		}
581
		executeSql(db, "UPDATE " + t + " SET " + DatabaseUtils.DNET_RESOURCE_ID_FIELD + " = " + defaultValue);
582
		log.info("Reassigned dnetId for table " + t);
583
	}
584

  
585
	public String getSQLFromTemplate(final String sqlTemplate, final String db, final String table, Map<String, Object> map) {
586
		if (map == null) {
587
			map = new HashMap<String, Object>();
588
		}
589

  
590
		map.put("mainDB", defaultDB);
591
		map.put("db", db);
592
		map.put("table", table);
593
		map.put("idField", DNET_RESOURCE_ID_FIELD);
594

  
595
		return VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "eu/dnetlib/enabling/database/velocity/" + sqlTemplate + ".sql.vm", "UTF-8", map);
596
	}
597

  
598
	public List<GenericRow> obtainListOfRows(final String xml) throws DatabaseException {
599
		try {
600
			Document doc = new SAXReader().read(new StringReader(xml));
601

  
602
			List<GenericRow> list = new ArrayList<GenericRow>();
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff