blob: 6effbdfacd9ed2b0de1646f5f58bba858ef0c9f9 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.openjpa.reservedwords;
import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
import org.apache.openjpa.jdbc.sql.DBDictionary;
import org.apache.openjpa.lib.log.Log;
import org.apache.openjpa.persistence.OpenJPAEntityManagerFactory;
import org.apache.openjpa.persistence.test.AbstractPersistenceTestCase;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.io.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
/**
* Run this test manually or as part of the integration test suite to
* generate the list of reserved words for a specific Database
*/
public class ReservedWordsIT extends AbstractPersistenceTestCase {
private static OpenJPAEntityManagerFactory _emf;
@Override
public void setUp() throws Exception {
super.setUp();
_emf = createEMF(new Object[0]);
}
@Override
public void tearDown() throws Exception {
closeEMF(_emf);
_emf = null;
super.tearDown();
}
public void testReservedColumnWords() throws Exception {
List<String> reservedColumnWords = new ArrayList<>();
DBDictionary dict = ((JDBCConfiguration)_emf.getConfiguration()).getDBDictionaryInstance();
EntityManager em = null;
for (String word : getReservedWords()) {
try {
em = _emf.createEntityManager();
em.getTransaction().begin();
Query qryCreate = em.createNativeQuery("CREATE TABLE RESERVEDW_TST (" + word + " CHAR(2))");
qryCreate.executeUpdate();
em.getTransaction().commit();
em.getTransaction().begin();
Query qryDrop = em.createNativeQuery("DROP TABLE RESERVEDW_TST");
qryDrop.executeUpdate();
em.getTransaction().commit();
em.close();
} catch (Exception e) {
reservedColumnWords.add(word);
em.getTransaction().rollback();
}
finally {
if (em != null && em.isOpen()) {
em.close();
}
}
}
Log log = getLog();
try (OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("target/reserved_words_" +
dict.getClass().getSimpleName() + ".java"))) {
log.info("FOUND " + reservedColumnWords.size() + " RESERVED WORDS for Dictionary " + dict.getClass().getName());
osw.append(
"// reservedWordSet subset that CANNOT be used as valid column names\n" +
"// (i.e., without surrounding them with double-quotes)\n" +
"// generated at " + LocalDateTime.now() + " via " + ReservedWordsIT.class.getName() + "\n" +
"invalidColumnWordSet.addAll(Arrays.asList(new String[] {\n");
StringBuilder sb = new StringBuilder();
sb.append(" ");
for (String reservedColumnWord : reservedColumnWords) {
log.info(reservedColumnWord);
sb.append('"').append(reservedColumnWord).append("\", ");
if (sb.length() > 110) {
osw.append(sb.toString().trim()).append('\n');
sb.setLength(0);
}
}
// also add the rest if any
if (sb.length() > 0) {
osw.append(sb.toString().trim()).append('\n');
}
osw.append("}));");
osw.flush();
}
log.info("******* END RESERVED WORDS *******");
}
private List<String> getReservedWords() {
List<String> reservedWords = new ArrayList<>(2000);
try (InputStream is = this.getClass().getClassLoader().getResourceAsStream("org/apache/openjpa/reservedwords/sql_reserved_words.txt")) {
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line;
while ((line = br.readLine()) != null) {
line = line.trim();
if (line.startsWith("#") || line.isEmpty()) {
continue;
}
if (line.contains(" ")) {
throw new RuntimeException("only one reserved word per line please! got: " + line);
}
reservedWords.add(line);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
return reservedWords;
}
private Log getLog() {
return _emf.getConfiguration().getLog("Tests");
}
}