[Schmitzm-commits] r1781 - in trunk: schmitzm-adresses/src/main/java/de/schmitzm/adresses schmitzm-adresses/src/test/java/de/schmitzm/adresses schmitzm-core/src/main/java/de/schmitzm/postgres schmitzm-core/src/test/java/de/schmitzm/lang

scm-commit@wald.intevation.org scm-commit at wald.intevation.org
Wed Nov 16 19:24:22 CET 2011


Author: alfonx
Date: 2011-11-16 19:24:20 +0100 (Wed, 16 Nov 2011)
New Revision: 1781

Modified:
   trunk/schmitzm-adresses/src/main/java/de/schmitzm/adresses/AddrStringUtil.java
   trunk/schmitzm-adresses/src/test/java/de/schmitzm/adresses/AddrStringUtilTest.java
   trunk/schmitzm-core/src/main/java/de/schmitzm/postgres/PGUtil.java
   trunk/schmitzm-core/src/test/java/de/schmitzm/lang/TimedLimitedHashmapTest.java
Log:
Erste Aufr?\195?\164umanse?\195?\164tzt um Jregmatch 2.0-SNAPSHOT zu erstellen.

Modified: trunk/schmitzm-adresses/src/main/java/de/schmitzm/adresses/AddrStringUtil.java
===================================================================
--- trunk/schmitzm-adresses/src/main/java/de/schmitzm/adresses/AddrStringUtil.java	2011-11-16 15:34:45 UTC (rev 1780)
+++ trunk/schmitzm-adresses/src/main/java/de/schmitzm/adresses/AddrStringUtil.java	2011-11-16 18:24:20 UTC (rev 1781)
@@ -2,17 +2,16 @@
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
+import java.util.TreeSet;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.log4j.Logger;
 
-import com.sun.tools.internal.xjc.Language;
-
 import de.schmitzm.lang.LangUtil;
-import de.schmitzm.regex.RegexCache;
 
 /**
  * Diese Klasse bietete nützliche Methoden zur Bearbeitung von Addressschreibweisen. Zur Zeit werden nur Strings mit
@@ -50,7 +49,6 @@
 		return normalize(RuleRegistry.getRulesStr(), strasse);
 	}
 
-
 	/**
 	 * Normalisiert die Schreibweise einer Hausnummer, z.B. " 5   " -> "5"
 	 */
@@ -305,8 +303,21 @@
 	}
 
 	// TODO sauberes rewrite unter besserer Ausnutzung von Rekursion
-	public static List<String> getHausnummernInterpreted(final String hausnummern) {
-		final List<String> result = new ArrayList<String>();
+	public static TreeSet<String> getHausnummernInterpreted(final String hausnummern) {
+		final TreeSet<String> result = new TreeSet<String>(new Comparator<String>() {
+
+			@Override
+			public int compare(String o1, String o2) {
+				try {
+					Integer i1 = Integer.parseInt(o1);
+					Integer i2 = Integer.parseInt(o2);
+					return i1.compareTo(i2);
+				} catch (Exception e) {
+					return o1.compareTo(o2);
+				}
+			}
+		});
+
 		if (hausnummern != null) {
 			final Matcher m = Pattern.compile("(\\d)+\\s*([a-z]+)[,]([a-z]+)").matcher(hausnummern);
 			if (m.find()) {
@@ -422,8 +433,6 @@
 			return Ebene.BUNDESLAND;
 		return null;
 	}
-	
-	
 
 	/**
 	 * Normalisiert die Schreibweise eines Straßennamens, z.B. "Dr.-Vogeler-Str." -> "drvogelerstrasse"
@@ -440,8 +449,7 @@
 		strasse = strasse.replaceAll("\\s*s$", "strasse");
 		strasse = strasse.replaceAll("alle(\b|$)", "allee");
 		strasse = strasse.replaceAll("alee(\b|$)", "allee");
-		
-		
+
 		strasse = strasse.replaceAll("ü", "ue");
 		strasse = strasse.replaceAll("ö", "oe");
 		strasse = strasse.replaceAll("ä", "ae");
@@ -458,8 +466,6 @@
 
 		return strasse;
 	}
-	
-	
 
 	/**
 	 * Normalisiert die Schreibweise eines Straßennamens, z.B. "Dr.-Vogeler-Str." -> "drvogelerstrasse"
@@ -474,10 +480,10 @@
 		ort = ort.replaceAll("st(\\.|\\s)", "sankt");
 		ort = ort.replaceAll("sta(\\.|\\s)", "sankt");
 		ort = ort.replaceAll("im breisgau", "ib");
-		
+
 		ort = ort.replaceAll("a(\\.|\\s)d(\\.|\\s)", "an der");
 		ort = ort.replaceAll("i(\\.|\\s)", "im");
-		
+
 		ort = ort.replaceAll("ü", "ue");
 		ort = ort.replaceAll("ö", "oe");
 		ort = ort.replaceAll("ä", "ae");

Modified: trunk/schmitzm-adresses/src/test/java/de/schmitzm/adresses/AddrStringUtilTest.java
===================================================================
--- trunk/schmitzm-adresses/src/test/java/de/schmitzm/adresses/AddrStringUtilTest.java	2011-11-16 15:34:45 UTC (rev 1780)
+++ trunk/schmitzm-adresses/src/test/java/de/schmitzm/adresses/AddrStringUtilTest.java	2011-11-16 18:24:20 UTC (rev 1781)
@@ -3,8 +3,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-import java.util.Collections;
-import java.util.List;
+import java.util.Set;
 
 import org.junit.Test;
 
@@ -15,7 +14,7 @@
  *
  */
 public class AddrStringUtilTest {
-	
+
 	@Test
 	public void testXXX() {
 		final RegexCache rc = RegexCache.getInstance();
@@ -25,15 +24,15 @@
 
 	@Test
 	public void testGetHausnummernInterpreted() {
-		checkHausnummern("6 - 14", "6", "7", "8", "9", "10", "11", "12", "13",
-				"14");
+		checkHausnummern("6 - 14", "6", "7", "8", "9", "10", "11", "12", "13", "14");
 
 		checkHausnummern("0175-123456789");
 
 		checkHausnummern("1-", "1");
+		checkHausnummern("1/1", "1");
 
 		checkHausnummern("3/4", "3", "4");
-		
+
 		checkHausnummern(" 2, 2 a, 4,", "2", "2a", "4");
 
 		checkHausnummern("22 - 23", "22", "23");
@@ -43,7 +42,7 @@
 		checkHausnummern(" 23/24;77 ", "23", "24", "77");
 		checkHausnummern("1,2,3,8", "1", "2", "3", "8");
 		checkHausnummern("1,3a,3ab", "1", "3a", "3ab");
-		checkHausnummern("1a-c,3b,3a", "1a", "1b", "1c", "3b", "3a");
+		checkHausnummern("1a-c,3b,3a", "1a", "1b", "1c", "3a", "3b");
 		checkHausnummern(" 3/4/8 ", "3", "4", "8");
 
 		checkHausnummern("1 a-c", "1a", "1b", "1c");
@@ -67,109 +66,83 @@
 		checkHausnummern("2 a", "2a");
 		checkHausnummern("2     a", "2a");
 		checkHausnummern("2,3", "2", "3");
-		checkHausnummern("9a - 10d", "9a", "10d");
+		checkHausnummern("9a - 10d", "10d", "9a");
 		checkHausnummern(" 2 - 4 ", "2", "3", "4");
 		checkHausnummern(" 5 bis 8 ", "5", "6", "7", "8");
 	}
 
 	private void checkHausnummern(String ist, String... soll) {
-		List<String> check = AddrStringUtil.getHausnummernInterpreted(ist);
+		Set<String> check = AddrStringUtil.getHausnummernInterpreted(ist);
 		if (soll.length == 0)
-			assertEquals(Collections.EMPTY_LIST, check);
+			assertEquals(0, check.size());
 		String[] array = check.toArray(new String[] {});
-		assertEquals(LangUtil.stringConcatWithSep(";", soll),
-				LangUtil.stringConcatWithSep(";", array));
+		assertEquals(LangUtil.stringConcatWithSep(";", soll), LangUtil.stringConcatWithSep(";", array));
 	}
 
 	@Test
 	public void testSplit() {
-//		TODO 
-//		checkSplit("Strahlenberger Straße", "Strahlenberger Straße 11 13 15 und 17", "11 13 15 und 17", null,
-//				null, null);
-//		
-//		TODO 
-//		checkSplit("Olbrichtstr.", "Olbrichtstr. 2 (Seehaus 1)", "2", null,
-//				"(Seehaus 1)", null);
-		
-		checkSplit("Leypoldt Strasse", "Leypoldt Strasse 6,/10 8/1", "6", null,
-				",/10 8/1", null);
-		
-		
+		// TODO
+		// checkSplit("Strahlenberger Straße", "Strahlenberger Straße 11 13 15 und 17", "11 13 15 und 17", null,
+		// null, null);
+		//
+		// TODO
+		// checkSplit("Olbrichtstr.", "Olbrichtstr. 2 (Seehaus 1)", "2", null,
+		// "(Seehaus 1)", null);
+
+		checkSplit("Leypoldt Strasse", "Leypoldt Strasse 6,/10 8/1", "6", null, ",/10 8/1", null);
+
 		checkSplit("ander B2", "ander B2 5-6", "5-6", null, null, null);
 
-		checkSplit("Bettina Strasse", "Bettina Strasse 52-54 2.OG", "52-54",
-				null, "2.OG", null);
+		checkSplit("Bettina Strasse", "Bettina Strasse 52-54 2.OG", "52-54", null, "2.OG", null);
 
-		checkSplit("Dieselstr.", "Dieselstr .11 - 13", "11 - 13", null, null,
-				null);
+		checkSplit("Dieselstr.", "Dieselstr .11 - 13", "11 - 13", null, null, null);
 
-		checkSplit("Clarenbachstrasse", "Clarenbachstrasse 6 & 8", "6 & 8",
-				null, null, null);
+		checkSplit("Clarenbachstrasse", "Clarenbachstrasse 6 & 8", "6 & 8", null, null, null);
 
 		checkSplit(null, "Flurstück 3 a 2", null, null, null, null);
 
-		checkSplit("Ober-Ramstädter Str.", "Ober-Ramstädter Str .  96 G 1",
-				"96", null, "G 1", null);
+		checkSplit("Ober-Ramstädter Str.", "Ober-Ramstädter Str .  96 G 1", "96", null, "G 1", null);
 
-		checkSplit("Kocherstrasse", "Kocherstrasse ,  5 - 9 -", "5 - 9", null,
-				null, null);
+		checkSplit("Kocherstrasse", "Kocherstrasse ,  5 - 9 -", "5 - 9", null, null, null);
 
-		checkSplit("H.-Weigel-Str.", "H . -Weigel-Str .  5 b/ 0402 -", "5",
-				null, "b/0402", null);
+		checkSplit("H.-Weigel-Str.", "H . -Weigel-Str .  5 b/ 0402 -", "5", null, "b/0402", null);
 
-		checkSplit("Richard Strauss Straße", "Richard Strauss Straße 80 &",
-				"80", null, "&", null);
+		checkSplit("Richard Strauss Straße", "Richard Strauss Straße 80 &", "80", null, "&", null);
 
 		checkSplit(null, "'W 10 / 0170'", null, null, null, null);
 
 		checkSplit("Marder Weg", "Marder Weg", null, null, null, null);
 
-		checkSplit("Gänsepforte", "Gänsepforte 10a-12b", "10a-12b", null, null,
-				null);
+		checkSplit("Gänsepforte", "Gänsepforte 10a-12b", "10a-12b", null, null, null);
 
 		checkSplit("Marder Weg", "Marder Weg 2-4", "2-4", null, null, null);
 
-		checkSplit("Hochgericht", "Hochgericht 33,35", "33,35", null, null,
-				null);
-		checkSplit("Annenstr.", "Annenstr. 23, 25, 27, 29,", "23,25,27,29,",
-				null, null, null);
+		checkSplit("Hochgericht", "Hochgericht 33,35", "33,35", null, null, null);
+		checkSplit("Annenstr.", "Annenstr. 23, 25, 27, 29,", "23,25,27,29,", null, null, null);
 
-		checkSplit("Maternistraße", "Maternistraße 6 - 14", "6 - 14", null,
-				null, null);
+		checkSplit("Maternistraße", "Maternistraße 6 - 14", "6 - 14", null, null, null);
 
-		checkSplit("Berliner Str.", "Berliner Str. 2,2a,4", "2,2a,4", null,
-				null, null);
-		checkSplit("Berliner Str.", "Berliner Str. 2,2a,4,", "2,2a,4,", null,
-				null, null);
-		checkSplit("Berliner Str.", "Berliner Str. 2,2 a,4", "2,2 a,4", null,
-				null, null);
-		checkSplit("Berliner Str.", "Berliner Str. 2, 4", "2,4", null, null,
-				null);
-		checkSplit("Berliner Str.", "Berliner Str. 2, 4", "2,4", null, null,
-				null);
-		checkSplit("Berliner Str.", "Berliner Str. 2a,4", "2a,4", null, null,
-				null);
-		checkSplit("Berliner Str.", "Berliner Str. 2a, 4", "2a,4", null, null,
-				null);
-		checkSplit("Berliner Str.", "Berliner Str. 2,2a, 4", "2,2a,4", null,
-				null, null);
-		checkSplit("Berliner Str.", "Berliner Str. 2, 2 a, 4,", "2,2 a,4,",
-				null, null, null);
+		checkSplit("Berliner Str.", "Berliner Str. 2,2a,4", "2,2a,4", null, null, null);
+		checkSplit("Berliner Str.", "Berliner Str. 2,2a,4,", "2,2a,4,", null, null, null);
+		checkSplit("Berliner Str.", "Berliner Str. 2,2 a,4", "2,2 a,4", null, null, null);
+		checkSplit("Berliner Str.", "Berliner Str. 2, 4", "2,4", null, null, null);
+		checkSplit("Berliner Str.", "Berliner Str. 2, 4", "2,4", null, null, null);
+		checkSplit("Berliner Str.", "Berliner Str. 2a,4", "2a,4", null, null, null);
+		checkSplit("Berliner Str.", "Berliner Str. 2a, 4", "2a,4", null, null, null);
+		checkSplit("Berliner Str.", "Berliner Str. 2,2a, 4", "2,2a,4", null, null, null);
+		checkSplit("Berliner Str.", "Berliner Str. 2, 2 a, 4,", "2,2 a,4,", null, null, null);
 
 		checkSplit("Dammweg", "Dammweg 3/4", "3/4", null, null, null);
 
-		checkSplit("Hochgericht", "Hochgericht 33,35,66,78", "33,35,66,78",
-				null, null, null);
+		checkSplit("Hochgericht", "Hochgericht 33,35,66,78", "33,35,66,78", null, null, null);
 
-		checkSplit("Marder Weg", "Marder Weg 2/4/10", "2/4/10", null, null,
-				null);
+		checkSplit("Marder Weg", "Marder Weg 2/4/10", "2/4/10", null, null, null);
 
 		// checkSplit("Burgstr.", "Burgstr. 16,16A-B", "16,16A-B", null, null,
 		// null);
 
 		checkSplit("Marder Weg", "Marder Weg 2 - 4 ", "2 - 4", null, null, null);
-		checkSplit("Marder Weg", "Marder Weg 2 bis 4", "2 bis 4", null, null,
-				null);
+		checkSplit("Marder Weg", "Marder Weg 2 bis 4", "2 bis 4", null, null, null);
 		checkSplit("Marder Weg", "Marder Weg 2\\4", "2\\4", null, null, null);
 		checkSplit("Marder Weg", "Marder Weg 2/4", "2/4", null, null, null);
 
@@ -203,8 +176,8 @@
 		checkSplit(null, null, "2", "2", "blub", "blub");
 	}
 
-	private void checkSplit(String sollStrasse, String istStrasse,
-			String sollHn, String istHn, String sollZusatz, String istZusatz) {
+	private void checkSplit(String sollStrasse, String istStrasse, String sollHn, String istHn, String sollZusatz,
+			String istZusatz) {
 
 		String[] objects = AddrStringUtil.split(istStrasse, istHn, istZusatz);
 
@@ -267,18 +240,15 @@
 
 	@Test
 	public void testRemoveLeadingSpacesInfrontOfNumbers() {
-		assertEquals("2a,4",
-				AddrStringUtil.removeLeadingSpacesInfrontOfNumbers("2a, 4"));
+		assertEquals("2a,4", AddrStringUtil.removeLeadingSpacesInfrontOfNumbers("2a, 4"));
 
 	}
 
 	@Test
-	public void testNormalizeOrt()
-	{
-		assertEquals("sanktaugustin",AddrStringUtil.normalizeOrt("St. Augustin"));
-		assertEquals("freiburgib",AddrStringUtil.normalizeOrt("Freiburg im Breisgau"));
+	public void testNormalizeOrt() {
+		assertEquals("sanktaugustin", AddrStringUtil.normalizeOrt("St. Augustin"));
+		assertEquals("freiburgib", AddrStringUtil.normalizeOrt("Freiburg im Breisgau"));
 	}
-	
 
 	@Test
 	public void testNormalizeStrasse2() {
@@ -288,7 +258,7 @@
 		assertEquals("hatschiergasse", AddrStringUtil.normalizeStr(" hatschiergasse "));
 		assertEquals("eichendorfstrasse", AddrStringUtil.normalizeStr("Eichendorfstr."));
 		assertEquals("burgstrasse", AddrStringUtil.normalizeStr("Burgstr."));
-		assertEquals("burgstrasse",AddrStringUtil.normalizeStr( "Burg Straße"));
+		assertEquals("burgstrasse", AddrStringUtil.normalizeStr("Burg Straße"));
 		assertEquals("drosselweg", AddrStringUtil.normalizeStr("Drossel Weg"));
 		assertEquals("drvogelerstrasse", AddrStringUtil.normalizeStr("Dr.-Vogeler-Str."));
 		assertEquals("drvogelerstrasse", AddrStringUtil.normalizeStr("Dr. Vogeler Str."));

Modified: trunk/schmitzm-core/src/main/java/de/schmitzm/postgres/PGUtil.java
===================================================================
--- trunk/schmitzm-core/src/main/java/de/schmitzm/postgres/PGUtil.java	2011-11-16 15:34:45 UTC (rev 1780)
+++ trunk/schmitzm-core/src/main/java/de/schmitzm/postgres/PGUtil.java	2011-11-16 18:24:20 UTC (rev 1781)
@@ -13,15 +13,14 @@
 import de.schmitzm.lang.LangUtil;
 
 /**
- * Hilfsmethoden für PostgreSQL. Die Dependency soll nur {@link Connection}
- * sein. In Hibernate kann über #doWork eine {@link Connection} erhalten werden.
+ * Hilfsmethoden für PostgreSQL. Die Dependency soll nur {@link Connection} sein. In Hibernate kann über #doWork eine
+ * {@link Connection} erhalten werden.
  */
 public class PGUtil {
 	static final Logger log = Logger.getLogger(PGUtil.class);
 
 	/**
-	 * PostgreSQL Privilegien die per Grant einer Tabelle zugeordnet werden
-	 * können.<br/>
+	 * PostgreSQL Privilegien die per Grant einer Tabelle zugeordnet werden können.<br/>
 	 * 
 	 * @see http://www.postgresql.org/docs/9.1/static/sql-grant.html
 	 */
@@ -82,20 +81,26 @@
 
 	/**
 	 * Erstellt eine neue Rolle
-	 * @param rolename Name der neuen Rolle
-	 * @param inhRoles Rollen in denen die neue Rolle Mitglied ist
+	 * 
+	 * @param rolename
+	 *            Name der neuen Rolle
+	 * @param inhRoles
+	 *            Rollen in denen die neue Rolle Mitglied ist
 	 */
 	public static void createRole(Connection c, String rolename, String... inhRoles) throws SQLException {
 		String sql = "CREATE ROLE " + rolename;
 		c.createStatement().executeUpdate(sql);
 		for (String inhRole : inhRoles)
-		  c.createStatement().executeUpdate("GRANT "+inhRole+" TO "+rolename);
+			c.createStatement().executeUpdate("GRANT " + inhRole + " TO " + rolename);
 	}
 
 	/**
 	 * Erstellt eine neue Rolle, wenn diese noch nicht existiert.
-     * @param rolename Name der neuen Rolle
-     * @param inhRoles Rollen in denen die neue Rolle Mitglied ist
+	 * 
+	 * @param rolename
+	 *            Name der neuen Rolle
+	 * @param inhRoles
+	 *            Rollen in denen die neue Rolle Mitglied ist
 	 */
 	public static void createRoleIfNotExists(Connection c, String rolename, String... inhRoles) throws SQLException {
 		if (existsRole(c, rolename))
@@ -104,8 +109,8 @@
 	}
 
 	/**
-	 * Querys the <code>geometry_columns</code> table is part of every POSTGIS
-	 * installation and must/should describe the geometry columns and tables.
+	 * Querys the <code>geometry_columns</code> table is part of every POSTGIS installation and must/should describe the
+	 * geometry columns and tables.
 	 */
 	static public String[] getColumnsDescribedInGeometryColumnsTable(Statement s) {
 		String[] columns = new String[0];
@@ -147,8 +152,8 @@
 	/**
 	 * @param binding
 	 *            Eine "einfache" Javaklasse, die in PG abgebildet werden soll.
-	 * @return einen PG-spezifischen Datentypenamen für einen Javatyp zurück,
-	 *         z.b. "double precision" für <code>Double.class</code>
+	 * @return einen PG-spezifischen Datentypenamen für einen Javatyp zurück, z.b. "double precision" für
+	 *         <code>Double.class</code>
 	 */
 	public static String getColTypeName(Class<?> binding) {
 
@@ -179,8 +184,7 @@
 	}
 
 	/**
-	 * Liefert <code>true</code> wenn ein Schema mit dem Namen in der PG
-	 * Datenbank existiert.
+	 * Liefert <code>true</code> wenn ein Schema mit dem Namen in der PG Datenbank existiert.
 	 */
 	public static boolean existsSchema(Connection c, String schemaname) throws SQLException {
 		String sql = "select 1 from pg_catalog.pg_namespace where nspname = '" + schemaname.toLowerCase() + "'";
@@ -194,8 +198,7 @@
 	}
 
 	/**
-	 * Liefert eine Liste der Rollen in denen der Übergebenen USER (Login role)
-	 * ist. <br/>
+	 * Liefert eine Liste der Rollen in denen der Übergebenen USER (Login role) ist. <br/>
 	 * Tested with PG 8.4
 	 */
 	public static List<String> listRolesForUser(Connection c, String username) throws SQLException {
@@ -232,8 +235,8 @@
 	}
 
 	/**
-	 * Liste aller Tabellennamen in diesem Schema, ohne die Schemaangabe im
-	 * Namen. (Also 'anreden' und nicht 'public.anreden') <br/>
+	 * Liste aller Tabellennamen in diesem Schema, ohne die Schemaangabe im Namen. (Also 'anreden' und nicht
+	 * 'public.anreden') <br/>
 	 * Tested with PG 8.4
 	 * 
 	 * @param schemaname
@@ -311,9 +314,7 @@
 	 * @param name
 	 *            z.B.: keckformel wird dann zu keckformel()
 	 * @param plCommands
-	 *            z.B. NEW.kpk_kreis =
-	 *            NEW.risiko_soz+NEW.risiko_emo+NEW.risiko_moti
-	 *            +NEW.risiko_spr+NEW.risiko_wohl;
+	 *            z.B. NEW.kpk_kreis = NEW.risiko_soz+NEW.risiko_emo+NEW.risiko_moti +NEW.risiko_spr+NEW.risiko_wohl;
 	 * @throws SQLException
 	 */
 	public static void createOrReplaceFunction(Connection c, String name, String plCommands) throws SQLException {
@@ -349,8 +350,7 @@
 	 * @param idxNamePostfix
 	 *            e.g. 'idx1'
 	 * @param unique
-	 *            <code>true</code> if the columns are unique. A UNIQUE INDEX
-	 *            will be created.
+	 *            <code>true</code> if the columns are unique. A UNIQUE INDEX will be created.
 	 */
 	public static void addIndex(Connection c, final String tableName, final String columns, String idxPostfix,
 			final boolean unique) throws SQLException {
@@ -358,11 +358,10 @@
 	}
 
 	/**
-	 * Liefert eine Liste aller Indexnamen die für eine Tabelle existieren. Der
-	 * Tabellenname wird mit <code>like</code> verglichen, darf also
-	 * <code>%</code> enthalten.<br/>
-	 * Achtung: Diese abfrage ist nicht Schema-Spezifisch. Eine schema. Angabe
-	 * vor dem tabellennamen wird automatisch entfernt.
+	 * Liefert eine Liste aller Indexnamen die für eine Tabelle existieren. Der Tabellenname wird mit <code>like</code>
+	 * verglichen, darf also <code>%</code> enthalten.<br/>
+	 * Achtung: Diese abfrage ist nicht Schema-Spezifisch. Eine schema. Angabe vor dem tabellennamen wird automatisch
+	 * entfernt.
 	 */
 	public static List<String> listIndexesForTable(Connection c, String tableName) throws SQLException {
 		Statement s = c.createStatement();
@@ -397,21 +396,16 @@
 	 * @param idxNamePostfix
 	 *            e.g. 'idx1'
 	 * @param unique
-	 *            <code>true</code> if the columns are unique. A UNIQUE INDEX
-	 *            will be created.
+	 *            <code>true</code> if the columns are unique. A UNIQUE INDEX will be created.
 	 * @param tablespace
-	 *            <code>null</code> oder der name des tablespace in dem der
-	 *            Index liegen soll.
+	 *            <code>null</code> oder der name des tablespace in dem der Index liegen soll.
 	 * @param type
-	 *            <code>null</code> für DB default oder "hash" oder "btree" oder
-	 *            "gin" etc...
+	 *            <code>null</code> für DB default oder "hash" oder "btree" oder "gin" etc...
 	 * @param forceRecreationIfExistsAlready
-	 *            wenn <code>true</code> dann werden der Index vorher gedroppt
-	 *            falls er exisitert.
+	 *            wenn <code>true</code> dann werden der Index vorher gedroppt falls er exisitert.
 	 * @param fillFactor
-	 *            Wert von >0. -> 1. Bei .5 wird für den Index doppelt so viel
-	 *            Platz reserviert wie aktuell benötig, um auf weiteres Wachstum
-	 *            der Tabelle ohne Indexfragmentierung reagieren zu können.
+	 *            Wert von >0. -> 1. Bei .5 wird für den Index doppelt so viel Platz reserviert wie aktuell benötig, um
+	 *            auf weiteres Wachstum der Tabelle ohne Indexfragmentierung reagieren zu können.
 	 */
 	public static void addIndex(Connection c, final String tableName, final String columns, String idxPostfix,
 			final boolean unique, String tablespace, String type, boolean forceRecreationIfExistsAlready,
@@ -503,8 +497,8 @@
 	}
 
 	/**
-	 * Fügt einen Benutzer zu einer Rolle hinzu. Wenn der benutzer bereits in
-	 * der Rolle enthalten ist, wird keine Exception geschmisssen.
+	 * Fügt einen Benutzer zu einer Rolle hinzu. Wenn der benutzer bereits in der Rolle enthalten ist, wird keine
+	 * Exception geschmisssen.
 	 * 
 	 * @throws SQLException
 	 */
@@ -513,9 +507,8 @@
 	}
 
 	/**
-	 * Der : (Doppelpunkt) hat in PSQL eine besondere Bedeutung. Er wind mit
-	 * dieser methode escaped. Diese Methode sollte mit
-	 * <code>like E'"+PGUtil.escape(...)+"'</code> verwendet werden.
+	 * Der : (Doppelpunkt) hat in PSQL eine besondere Bedeutung. Er wind mit dieser methode escaped. Diese Methode
+	 * sollte mit <code>like E'"+PGUtil.escape(...)+"'</code> verwendet werden.
 	 */
 	public static String escape(String key) {
 		key = key.replaceAll(":", "\\:");
@@ -528,11 +521,9 @@
 	 * @param c
 	 *            DB-Verbindung
 	 * @param dbName
-	 *            Name der Datenbank fuer die die Sessions gezaehlt werden (kann
-	 *            {@code null} sein)
+	 *            Name der Datenbank fuer die die Sessions gezaehlt werden (kann {@code null} sein)
 	 * @param userName
-	 *            Name des Users fuer den die Sessions gezaehlt werden (kann
-	 *            {@code null} sein)
+	 *            Name des Users fuer den die Sessions gezaehlt werden (kann {@code null} sein)
 	 */
 	public static int getOpenSessionCount(Connection c, String dbName, String userName) throws SQLException {
 		return getOpenSessionCount(c, dbName, userName, null);
@@ -544,14 +535,11 @@
 	 * @param c
 	 *            DB-Verbindung
 	 * @param dbName
-	 *            Name der Datenbank fuer die die Sessions gezaehlt werden (kann
-	 *            {@code null} sein)
+	 *            Name der Datenbank fuer die die Sessions gezaehlt werden (kann {@code null} sein)
 	 * @param userName
-	 *            Name des Users fuer den die Sessions gezaehlt werden (kann
-	 *            {@code null} sein)
+	 *            Name des Users fuer den die Sessions gezaehlt werden (kann {@code null} sein)
 	 * @param queryLike
-	 *            like-Beindung auf die Query die in der Session ausgeführt
-	 *            wird, oder <code>null</code>
+	 *            like-Beindung auf die Query die in der Session ausgeführt wird, oder <code>null</code>
 	 */
 	public static int getOpenSessionCount(Connection c, String dbName, String userName, String queryLike)
 			throws SQLException {
@@ -586,6 +574,26 @@
 	}
 
 	/**
+	 * Liefert <code>true</code> wenn eine Spalte mit dem Namen in der angegebenen Tabelle existiert. Die Tablle darf
+	 * optional mit "schema." prefixiert werden.
+	 */
+	public static boolean existsColumn(Connection c, String tableName, String columnName) throws SQLException {
+
+		String schema = "public";
+
+		if (tableName.contains(".")) {
+			final String[] split = tableName.split("\\.");
+			schema = split[0];
+			tableName = split[1];
+		}
+
+		ResultSet nativeCheckExistsColumnQuery = c.createStatement().executeQuery(
+				"SELECT * FROM information_schema.COLUMNS WHERE COLUMN_NAME = '" + columnName.toLowerCase()
+						+ "' AND TABLE_NAME='" + tableName + "' AND TABLE_SCHEMA='" + schema + "';");
+		return nativeCheckExistsColumnQuery.next();
+	}
+
+	/**
 	 * Existiert ein relationsname als View?
 	 * 
 	 * @param viewName
@@ -619,18 +627,14 @@
 	}
 
 	/**
-	 * Liefert eine Liste der aktuell laufenden Queries und ihrere Laufzeiten
-	 * zurück. Der 2. Teil der Rückgabepaare ist ein String der einem PG
-	 * Interval entspricht. Dieses kann mit der Klasse PGInterval geparst
-	 * werden.<br/>
+	 * Liefert eine Liste der aktuell laufenden Queries und ihrere Laufzeiten zurück. Der 2. Teil der Rückgabepaare ist
+	 * ein String der einem PG Interval entspricht. Dieses kann mit der Klasse PGInterval geparst werden.<br/>
 	 * 
 	 * @param datName
-	 *            <code>null</code> oder der Datenbankname, auf den die Abfrage
-	 *            gefiltert werden soll.
+	 *            <code>null</code> oder der Datenbankname, auf den die Abfrage gefiltert werden soll.
 	 * 
 	 * @param minSecondsRunning
-	 *            <code>null</code> oder die zurückgegebenen Anfragen müssen
-	 *            mindestens soviele Sekunden schon laufen.
+	 *            <code>null</code> oder die zurückgegebenen Anfragen müssen mindestens soviele Sekunden schon laufen.
 	 */
 	static public List<String[]> listQueries(Connection c, String datName, Integer minSecondsRunning)
 			throws SQLException {
@@ -667,4 +671,219 @@
 		return result;
 	}
 
+	/**
+	 * Tablename der optinal als das Schema enthalten darf.
+	 */
+	public static boolean removeColumn(Connection c, String tableName, String columnName) throws SQLException {
+
+		// Das eigentliche erstellen der neuen Spalte
+		String queryString = "ALTER TABLE " + tableName + " DROP COLUMN " + columnName;
+
+		// System.out.println(queryString);
+
+		int result = c.createStatement().executeUpdate(queryString);
+
+		if (result != 0) {
+			// JRegDBUtils.log.error(queryString + " returned not 0 = " +
+			// result);
+			return false;
+		}
+		return true;
+	}
+
+	/**
+	 * Liefert die COLUMN-NAMES eines PKs einer Tabelle
+	 * 
+	 * @param dbc
+	 *            Connection to Postgressql Database
+	 * @param tableName
+	 *            darf Schemanamen enthalten.
+	 * 
+	 * @return Primary Key. <code>NULL</code> if empty
+	 */
+	public static String getPrimaryKey(Connection dbc, String tableName) throws SQLException {
+
+		String schema = "public";
+		if (tableName.contains(".")) {
+			final String[] split = tableName.split("\\.");
+			schema = split[0];
+			tableName = split[1];
+		}
+
+		Statement s = dbc.createStatement();
+		ResultSet rs = s
+				.executeQuery("select distinct(column_name) from INFORMATION_SCHEMA.KEY_COLUMN_USAGE a,INFORMATION_SCHEMA.TABLE_CONSTRAINTS b where constraint_type = 'PRIMARY KEY' and a.table_name='"
+						+ tableName + "' and a.table_schema='" + schema + "';");
+
+		String pk = "";
+		try {
+
+			while (rs.next()) {
+				pk += rs.getString("column_name");
+			}
+
+		} finally {
+			rs.close();
+		}
+
+		if (pk.endsWith(","))
+			pk = pk.substring(0, pk.length() - 1);
+
+		return pk.isEmpty() ? null : pk;
+
+	}
+
+	/**
+	 * Returns cardinality of column in table
+	 */
+	public long getCardinality(Connection dbc, String tableName, String column) throws SQLException {
+		String sql = "select count( DISTINCT " + "(" + column + ")" + ") " + "from " + tableName;
+		ResultSet countRs = dbc.createStatement().executeQuery(sql);
+		try {
+			countRs.next();
+			return ((Number) countRs.getLong(1)).longValue();
+		} finally {
+			countRs.close();
+		}
+	}
+
+	public static boolean isIntColumn(Connection c, String tableName, String columnName) throws SQLException {
+		String schema = "public";
+		if (tableName.contains(".")) {
+			final String[] split = tableName.split("\\.");
+			schema = split[0];
+			tableName = split[1];
+		}
+
+		Statement s = c.createStatement();
+		ResultSet rs = s.executeQuery("SELECT data_type FROM information_schema.COLUMNS WHERE COLUMN_NAME = '"
+				+ columnName.toLowerCase() + "' AND TABLE_NAME='" + tableName + "' AND TABLE_SCHEMA='" + schema + "';");
+		try {
+
+			rs.next();
+			String typeDef = rs.getString(1);
+			Boolean isNumeric = false;
+			isNumeric |= typeDef.startsWith("numeric");
+
+			return isNumeric;
+		} finally {
+			rs.close();
+		}
+	}
+
+	/**
+	 * Typischer Weise POSTGIS, wenn man sonst nichts anderen installiert hat.
+	 */
+	public static boolean isUserDefinedColumn(Connection c, String tableName, String columnName) throws SQLException {
+
+		String schema = "public";
+		if (tableName.contains(".")) {
+			final String[] split = tableName.split("\\.");
+			schema = split[0];
+			tableName = split[1];
+		}
+
+		Statement s = c.createStatement();
+		ResultSet rs = s.executeQuery("SELECT data_type FROM information_schema.COLUMNS WHERE COLUMN_NAME = '"
+				+ columnName.toLowerCase() + "' AND TABLE_NAME='" + tableName + "' AND TABLE_SCHEMA='" + schema + "';");
+		rs.next();
+		String typeDef = rs.getString(1);
+		return typeDef.toUpperCase().startsWith("USER-DEFINED");
+	}
+
+	public static boolean isTextColumn(Connection c, String tableName, String columnName) throws SQLException {
+
+		String schema = "public";
+		if (tableName.contains(".")) {
+			final String[] split = tableName.split("\\.");
+			schema = split[0];
+			tableName = split[1];
+		}
+
+		Statement s = c.createStatement();
+		ResultSet rs = s.executeQuery("SELECT data_type FROM information_schema.COLUMNS WHERE COLUMN_NAME = '"
+				+ columnName.toLowerCase() + "' AND TABLE_NAME='" + tableName + "' AND TABLE_SCHEMA='" + schema + "';");
+		try {
+			rs.next();
+			String typeDef = rs.getString(1);
+			Boolean isText = false;
+			isText |= typeDef.startsWith("text");
+			isText |= typeDef.startsWith("character");
+
+			return isText;
+		} finally {
+			rs.close();
+		}
+	}
+
+	/**
+	 * Creates a new Column.
+	 * 
+	 * @param dbc
+	 * @param tableName
+	 * @param columnName
+	 * @param colTypeName
+	 * @param comment
+	 * @return
+	 * @throws SQLException
+	 */
+	public static boolean addColumn(Connection dbc, String tableName, String columnName, String colTypeName,
+			String comment) throws SQLException {
+
+		if (dbc == null)
+			throw new IllegalStateException("Es besteht keine Datenbankverbindung!");
+
+		Statement s = dbc.createStatement();
+
+		if (existsColumn(dbc, tableName, columnName)) {
+			return false;
+		}
+
+		// Das eigentliche erstellen der neuen Spalte
+		String queryString = "ALTER TABLE " + tableName + " ADD " + columnName + " " + colTypeName;
+
+		// JRegDBUtils.log.debug(queryString);
+
+		int result = s.executeUpdate(queryString);
+
+		if (result != 0) {
+			return false;
+		}
+
+		if (comment != null && !comment.isEmpty()) {
+			queryString = "COMMENT ON COLUMN " + tableName + "." + columnName + " IS '" + comment + "';";
+		}
+
+		s.close();
+
+		return true;
+	}
+
+	/**
+	 * Liefert alle Spalten einer Tabelle
+	 */
+	public static ArrayList<String> getAllColumnsOf(Connection dbc, String tableName) throws SQLException {
+		String schema = "public";
+		if (tableName.contains(".")) {
+			final String[] split = tableName.split("\\.");
+			schema = split[0];
+			tableName = split[1];
+		}
+
+		ArrayList<String> cols = new ArrayList<String>();
+
+		// String tableName = PropertyUtils.getDbTableName(i);
+
+		String sql = "SELECT column_name FROM information_schema.COLUMNS WHERE TABLE_NAME = '" + tableName
+				+ "' and TABLE_SCHEMA = '" + schema + "';";
+
+		ResultSet colsRs = dbc.createStatement().executeQuery(sql);
+		try {
+			while (colsRs.next())
+				cols.add(colsRs.getString(1));
+		} finally {
+			colsRs.close();
+		}
+		return cols;
+	}
 }

Modified: trunk/schmitzm-core/src/test/java/de/schmitzm/lang/TimedLimitedHashmapTest.java
===================================================================
--- trunk/schmitzm-core/src/test/java/de/schmitzm/lang/TimedLimitedHashmapTest.java	2011-11-16 15:34:45 UTC (rev 1780)
+++ trunk/schmitzm-core/src/test/java/de/schmitzm/lang/TimedLimitedHashmapTest.java	2011-11-16 18:24:20 UTC (rev 1781)
@@ -1,6 +1,5 @@
 package de.schmitzm.lang;
 
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;



More information about the Schmitzm-commits mailing list