Changed sql name strategy truncation to first remove vowels.
diff --git a/plugins/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/mapping/strategy/impl/TeneoSQLNameStrategy.java b/plugins/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/mapping/strategy/impl/TeneoSQLNameStrategy.java
index f82bcba..9cfb240 100644
--- a/plugins/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/mapping/strategy/impl/TeneoSQLNameStrategy.java
+++ b/plugins/org.eclipse.emf.teneo/src/org/eclipse/emf/teneo/mapping/strategy/impl/TeneoSQLNameStrategy.java
@@ -12,7 +12,7 @@
*
* </copyright>
*
- * $Id: TeneoSQLNameStrategy.java,v 1.1 2007/07/18 16:10:08 mtaal Exp $
+ * $Id: TeneoSQLNameStrategy.java,v 1.2 2007/07/18 18:57:16 mtaal Exp $
*/
package org.eclipse.emf.teneo.mapping.strategy.impl;
@@ -21,19 +21,21 @@
import org.apache.commons.logging.LogFactory;
/**
- * Differences between this implementation and the ClassicSQLNameStrategy are in the way: -
- * truncation: if a name needs to be truncated because of length constraints then this class tries
- * to truncate two parts of the name (separated by _) together, for example the name child_parent
- * will be truncated to c_p.
+ * Differences between this implementation and the ClassicSQLNameStrategy is the way truncation is
+ * done if a name is longer than the sql name length constraint. To truncate a name this class will
+ * first remove vowels (in the order: u, o, a, e, i) and if that is not enough it will truncate the
+ * different parts of a name (separated by _).
*
* @author <a href="mtaal@elver.org">Martin Taal</a>
- * @version $Revision: 1.1 $
+ * @version $Revision: 1.2 $
*/
public class TeneoSQLNameStrategy extends ClassicSQLNameStrategy {
// The logger
protected static final Log log = LogFactory.getLog(TeneoSQLNameStrategy.class);
+ private static String[] removables = new String[] { "u", "o", "a", "e", "i" };
+
/*
* (non-Javadoc)
*
@@ -41,18 +43,50 @@
* java.lang.String, boolean)
*/
@Override
- public String trunc(int optionMaximumSqlLength, String truncName, boolean truncPrefix) {
- final String correctedName = truncName.replace('.', '_');
+ public String trunc(int maxSqlLength, String truncName, boolean truncPrefix) {
+ String correctedName = truncName.replace('.', '_');
- if (optionMaximumSqlLength == -1) {
+ if (maxSqlLength == -1) {
return correctedName;
}
- if (correctedName.length() <= optionMaximumSqlLength) {
+ if (correctedName.length() <= maxSqlLength) {
return correctedName;
}
+
+ // first do some standard things
+ // truncate the standard e_id
+ correctedName = correctedName.replaceAll("e_id", "id");
+ if (correctedName.length() <= maxSqlLength) {
+ return correctedName;
+ }
+
+ // now do vowel truncation
+ for (String vowel : getRemovableCharacters()) {
+ while (correctedName.indexOf(vowel) != -1 || correctedName.indexOf(vowel.toUpperCase()) != -1) {
+ if (correctedName.indexOf(vowel) != -1) {
+ correctedName = correctedName.replaceFirst(vowel, "");
+ } else {
+ correctedName = correctedName.replaceFirst(vowel.toUpperCase(), "");
+ }
+ correctedName = correctedName.replaceAll("__", "_");
+ if (correctedName.startsWith("_")) {
+ correctedName = correctedName.substring(1);
+ }
+ if (correctedName.length() <= maxSqlLength) {
+ return correctedName;
+ }
+ }
+ }
+
+ // still failed do length truncation
+ return doLengthTruncation(maxSqlLength, correctedName);
+ }
+
+ private String doLengthTruncation(int maxSqlLength, String correctedName) {
+ // failed do length truncation with the remainder
final int underscore = correctedName.lastIndexOf('_');
if (underscore == -1) {
- return correctedName.substring(0, optionMaximumSqlLength);
+ return correctedName.substring(0, maxSqlLength);
}
// now do the complex logic to truncate different parts
@@ -66,7 +100,7 @@
// can this ever happen
int totalLength = correctedName.length();
- while (maxLength > 1 && totalLength > optionMaximumSqlLength) {
+ while (maxLength > 1 && totalLength > maxSqlLength) {
totalLength = 0;
int newMax = 0;
for (int i = 0; i < parts.length; i++) {
@@ -92,4 +126,12 @@
return result.toString();
}
+
+ /**
+ * Return the characters to remove, the character removal is done in order of the returned
+ * array. This method is provided to be overridden to pass a custom set of removable characters.
+ */
+ protected String[] getRemovableCharacters() {
+ return removables;
+ }
}
\ No newline at end of file