You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by jr...@apache.org on 2010/01/15 19:05:17 UTC
svn commit: r899738 - in /openjpa/trunk/openjpa-lib/src:
main/java/org/apache/openjpa/lib/identifier/
test/java/org/apache/openjpa/lib/identifier/
Author: jrbauer
Date: Fri Jan 15 18:05:14 2010
New Revision: 899738
URL: http://svn.apache.org/viewvc?rev=899738&view=rev
Log:
OPENJPA-1115 Base identifier support
Added:
openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/
openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/Identifier.java (with props)
openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/IdentifierConfiguration.java (with props)
openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/IdentifierImpl.java (with props)
openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/IdentifierRule.java (with props)
openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/IdentifierUtil.java (with props)
openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/IdentifierUtilImpl.java (with props)
openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/identifier/
openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/identifier/DefaultTestIdRule.java (with props)
openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/identifier/IdConfigurationTestImpl.java (with props)
openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/identifier/NewIdConfigurationTestImpl.java (with props)
openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/identifier/TestIdentifiers.java (with props)
Added: openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/Identifier.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/Identifier.java?rev=899738&view=auto
==============================================================================
--- openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/Identifier.java (added)
+++ openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/Identifier.java Fri Jan 15 18:05:14 2010
@@ -0,0 +1,29 @@
+/*
+ * 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.lib.identifier;
+
+/**
+ * Base interface for identifiers.
+ */
+public interface Identifier extends Comparable<Identifier>, Cloneable {
+
+ public String getName();
+ public void setName(String name);
+ public int length();
+}
Propchange: openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/Identifier.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/IdentifierConfiguration.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/IdentifierConfiguration.java?rev=899738&view=auto
==============================================================================
--- openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/IdentifierConfiguration.java (added)
+++ openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/IdentifierConfiguration.java Fri Jan 15 18:05:14 2010
@@ -0,0 +1,89 @@
+/*
+ * 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.lib.identifier;
+
+import java.util.Map;
+
+/**
+ * The IdentifierConfiguration interface. Implementers of this interface supply
+ * naming configuration information to consumers of names/identifiers.
+ */
+public interface IdentifierConfiguration {
+
+ /**
+ * Returns the leading delimiter value to use when delimiting a name.
+ */
+ public String getLeadingDelimiter();
+
+ /**
+ * Returns the trailing delimiter value to use when delimiting a name.
+ */
+ public String getTrailingDelimiter();
+
+ /**
+ * Returns true if global name delimiting is enabled.
+ */
+ public boolean delimitAll();
+
+ /**
+ * Returns true if delimiting is supported
+ */
+ public boolean getSupportsDelimitedIdentifiers();
+
+ /**
+ * Returns the value used to concatenate multiple names together.
+ * For example: "_" used in TABLE1_TABLE2
+ */
+ public String getIdentifierConcatenator();
+
+ /**
+ * Returns the value used to delimit between individual names.
+ * For example: "." used in MYSCHEMA.MYTABLE
+ */
+ public String getIdentifierDelimiter();
+
+ /**
+ * Gets the default naming rule
+ */
+ public IdentifierRule getDefaultIdentifierRule();
+
+ /**
+ * Returns all naming rules
+ * @return
+ */
+ public <T> Map<T, IdentifierRule> getIdentifierRules();
+
+ /**
+ * Returns a naming rule or null if the rule is
+ * not found.
+ */
+ public <T> IdentifierRule getIdentifierRule(T t);
+
+ /**
+ * Returns the case that is used when delimiting.
+ * @return upper, lower, or preserve
+ */
+ public String getDelimitedCase();
+
+ /**
+ * Returns the case that is used when delimiters are not used.
+ * @return upper, lower, or preserve
+ */
+ public String getSchemaCase();
+}
Propchange: openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/IdentifierConfiguration.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/IdentifierImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/IdentifierImpl.java?rev=899738&view=auto
==============================================================================
--- openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/IdentifierImpl.java (added)
+++ openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/IdentifierImpl.java Fri Jan 15 18:05:14 2010
@@ -0,0 +1,72 @@
+/*
+ * 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.lib.identifier;
+
+import java.io.Serializable;
+
+/**
+ * Base identifer implementation.
+ */
+public class IdentifierImpl implements Identifier, Serializable {
+
+ private String _name = null;
+
+ protected IdentifierImpl() {}
+
+ public IdentifierImpl(String name) {
+ setName(name);
+ }
+
+ public void setName(String name) {
+ _name = name;
+ }
+
+ public String getName() {
+ return _name;
+ }
+
+ public String toString() {
+ return getName();
+ }
+
+ public int hashCode() {
+ if (_name == null) {
+ return super.hashCode();
+ }
+ return _name.hashCode();
+ }
+
+ public int length() {
+ if (getName() == null) {
+ return 0;
+ }
+ return getName().length();
+ }
+
+ public int compareTo(Identifier o) {
+ if (_name == null && (o == null || o.getName() == null)) {
+ return 0;
+ }
+ if (_name == null)
+ return 1;
+ if (o == null || o.getName() == null)
+ return -1;
+ return _name.compareTo(o.getName());
+ }
+}
Propchange: openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/IdentifierImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/IdentifierRule.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/IdentifierRule.java?rev=899738&view=auto
==============================================================================
--- openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/IdentifierRule.java (added)
+++ openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/IdentifierRule.java Fri Jan 15 18:05:14 2010
@@ -0,0 +1,209 @@
+/*
+ * 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.lib.identifier;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.commons.lang.ArrayUtils;
+import org.apache.commons.lang.CharUtils;
+import org.apache.commons.lang.StringUtils;
+
+/**
+ * The standard identifier rule. Rules are used for specific configuration
+ * of identifier types. For example. A rule could be used to indicate that
+ * an identifier type should not be delimited or has a max length of 255
+ * characters.
+ *
+ */
+public class IdentifierRule {
+
+ public static final Set<String> EMPTY_SET = new HashSet<String>(0);
+ public static final String DEFAULT_RULE = "default";
+ public static char UNDERSCORE = '_';
+
+ private String _name;
+ private int _maxLength = 128;
+ private boolean _nullable = false;
+ private boolean _allowTruncation = false;
+ private boolean _allowCompaction = true;
+ private boolean _canDelimit = true;
+ private boolean _mustDelimit = false;
+ private boolean _mustBeginWithLetter = true;
+ private boolean _onlyLettersDigitsUnderscores = true;
+ private String _specialCharacters = "";
+ private Set<String> _reservedWords = null;
+ private boolean _delimitReservedWords = false;
+ private String _wildcard = "%";
+
+ public void setName(String name) {
+ _name = name;
+ }
+
+ public String getName() {
+ return _name;
+ }
+
+ public void setMaxLength(int maxLength) {
+ _maxLength = maxLength;
+ }
+
+ public int getMaxLength() {
+ return _maxLength;
+ }
+
+ public void setAllowTruncation(boolean allowTruncation) {
+ _allowTruncation = allowTruncation;
+ }
+
+ public boolean isAllowTruncation() {
+ return _allowTruncation;
+ }
+
+ public void setNullable(boolean nullable) {
+ _nullable = nullable;
+ }
+
+ public boolean isNullable() {
+ return _nullable;
+ }
+
+ public void setAllowCompaction(boolean allowCompaction) {
+ _allowCompaction = allowCompaction;
+ }
+
+ public boolean getAllowCompaction() {
+ return _allowCompaction;
+ }
+
+ public void setCanDelimit(boolean canDelimit) {
+ _canDelimit = canDelimit;
+ }
+
+ public boolean getCanDelimit() {
+ return _canDelimit;
+ }
+
+ public void setMustDelimit(boolean mustDelimit) {
+ _mustDelimit = mustDelimit;
+ }
+
+ public boolean getMustDelimit() {
+ return _mustDelimit;
+ }
+
+ public void setMustBeginWithLetter(boolean mustBeginWithLetter) {
+ _mustBeginWithLetter = mustBeginWithLetter;
+ }
+
+ public boolean isMustBeginWithLetter() {
+ return _mustBeginWithLetter;
+ }
+
+ public void setOnlyLettersDigitsUnderscores(boolean onlyLettersDigitsUnderscores) {
+ _onlyLettersDigitsUnderscores = onlyLettersDigitsUnderscores;
+ }
+
+ public boolean isOnlyLettersDigitsUnderscores() {
+ return _onlyLettersDigitsUnderscores;
+ }
+
+ public void setReservedWords(Set<String> reservedWords) {
+ _reservedWords = reservedWords;
+ }
+
+ public Set<String> getReservedWords() {
+ if (_reservedWords == null) {
+ _reservedWords = new HashSet<String>();
+ }
+ return _reservedWords;
+ }
+
+ public void setSpecialCharacters(String specialCharacters) {
+ _specialCharacters = specialCharacters;
+ }
+
+ public String getSpecialCharacters() {
+ return _specialCharacters;
+ }
+
+ public void setDelimitReservedWords(boolean delimitReservedWords) {
+ delimitReservedWords = _delimitReservedWords;
+ }
+
+ public boolean getDelimitReservedWords() {
+ return _delimitReservedWords;
+ }
+
+ /**
+ * SQL identifier rules:
+ * 1) Can be up to 128 characters long
+ * 2) Must begin with a letter
+ * 3) Can contain letters, digits, and underscores
+ * 4) Can't contain spaces or special characters such as #, $, &, %, or
+ * punctuation.
+ * 5) Can't be reserved words
+ */
+ public boolean requiresDelimiters(String identifier) {
+
+ // Do not delimit single valued wildcards or "?" or names that have method-type
+ // signatures (ex. getValue()). These are considered special values in OpenJPA
+ // and should not be delimited.
+ if (_wildcard.equals(identifier) || "?".equals(identifier) ||
+ identifier.endsWith("()")) {
+ return false;
+ }
+
+ if (getMustDelimit()) {
+ return true;
+ }
+
+ // Assert identifier begins with a letter
+ char[] chars = identifier.toCharArray();
+ if (isMustBeginWithLetter()) {
+ if (!CharUtils.isAsciiAlpha(chars[0])) {
+ return true;
+ }
+ }
+
+ // Iterate through chars, asserting delimiting rules
+ for (char ch : chars) {
+ if (isOnlyLettersDigitsUnderscores()) {
+ if (!CharUtils.isAsciiAlphanumeric(ch) && !(ch == UNDERSCORE)) {
+ return true;
+ }
+ }
+ // Look for special characters
+ if (StringUtils.contains(getSpecialCharacters(), ch)) {
+ return true;
+ }
+ }
+ // Finally, look for reserved words
+ if (getDelimitReservedWords()) {
+ if (isReservedWord(identifier)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean isReservedWord(String identifier) {
+ return _reservedWords.contains(identifier);
+ }
+}
Propchange: openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/IdentifierRule.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/IdentifierUtil.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/IdentifierUtil.java?rev=899738&view=auto
==============================================================================
--- openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/IdentifierUtil.java (added)
+++ openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/IdentifierUtil.java Fri Jan 15 18:05:14 2010
@@ -0,0 +1,319 @@
+/*
+ * 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.lib.identifier;
+
+/**
+ * Base IdentifierUtil interface. Defines many operations for operating
+ * on strings using identifier rules.
+ */
+public interface IdentifierUtil {
+ public static final String DOUBLE_QUOTE = "\"";
+ public static final String DOT = ".";
+ public static final String UNDERSCORE = "_";
+ public static final String SPACE = " ";
+ public static final String BAR = "|";
+ public static final String EMPTY = "";
+ public static final String PERCENT = "%";
+
+ public static final char DOLLAR_CHAR = '$';
+ public static final char UNDERSCORE_CHAR = '_';
+
+ public static final String CASE_UPPER = "upper";
+ public static final String CASE_LOWER = "lower";
+ public static final String CASE_PRESERVE = "preserve";
+ /**
+ * Get the naming configuration.
+ */
+ public IdentifierConfiguration getIdentifierConfiguration();
+
+ /**
+ * Set the naming configuration to use for naming operations. A naming
+ * configuration must be set before calling any other methods.
+ */
+ void setIdentifierConfiguration(IdentifierConfiguration config);
+
+ /**
+ * Delimit the name if it requires delimiters
+ * @param the rule to use for delimiting
+ * @param name the name to delimit
+ * @return the delimited name, if delimiting was necessary.
+ */
+ public String delimit(String rule, String name);
+
+ /**
+ * Delimit the name if it requires delimiters
+ * @param the rule to use for delimiting
+ * @param name the name to delimit
+ * @return the delimited name, if delimiting was necessary.
+ */
+ public String delimit(IdentifierRule rule, String name);
+
+ /**
+ * Delimit the string with the option to force delimiting. If force is
+ * true, the name will delimited without checking to see if it
+ * requires delimiters.
+ * @param the rule to use for delimiting
+ * @param name the name to delimit
+ * @param force add delimiters even if delimiting is not required
+ * @return the delimited name, if delimiting was necessary.
+ */
+ public String delimit(String rule, String name, boolean force);
+
+ /**
+ * Delimit the string with the option to force delimiting. If force is
+ * true, the name will delimited without checking to see if it
+ * requires delimiters.
+ * @param the rule to use for delimiting
+ * @param name the name to delimit
+ * @param force add delimiters even if delimiting is not required
+ * @return the delimited name, if delimiting was necessary.
+ */
+ public String delimit(IdentifierRule rule, String name, boolean force);
+
+
+ /**
+ * Remove delimiters from a delimited name
+ * @param the rule to use for removing delimiters
+ * @param name the name from which to remove delimiters
+ */
+ public String removeDelimiters(String rule, String name);
+
+ /**
+ * Remove delimiters from a delimited name
+ * @param the rule to use for removing delimiters
+ * @param name the name from which to remove delimiters
+ */
+ public String removeDelimiters(IdentifierRule rule, String name);
+
+ /**
+ * Determines whether a name is delimited.
+ * @param the rule to use for removing delimiters
+ * @param name the name to examine for delimiters
+ */
+ public boolean isDelimited(String rule, String name);
+
+ /**
+ * Determines whether a name is delimited.
+ * @param the rule to use for removing delimiters
+ * @param name the name to examine for delimiters
+ */
+ public boolean isDelimited(IdentifierRule rule, String name);
+
+ /**
+ * Determines whether a name requires delimiters based upon:
+ * <ul>
+ * <li> The SQL-92 Reference definition of a valid unquoted name</li>
+ * <li> The naming rule specified</li>
+ * </ul>
+ * @param the rule to use for removing delimiters
+ * @param name the name to examine for delimiting requirements
+ */
+ public boolean requiresDelimiters(String rule, String name);
+
+ /**
+ * Determines whether a name requires delimiters based upon:
+ * <ul>
+ * <li> The SQL-92 Reference definition of a valid unquoted name</li>
+ * <li> The naming rule specified</li>
+ * </ul>
+ * @param the rule to use for removing delimiters
+ * @param name the name to examine for delimiting requirements
+ */
+ public boolean requiresDelimiters(IdentifierRule rule, String name);
+
+ /**
+ * Combines names using delimiting rules and appropriate separators
+ * @return a combined name
+ * ex. {"TH IS", THAT} -> "TH IS_THAT"
+ */
+ public String combineNames(String rule, String[] rules, String[] names);
+
+ /**
+ * Combines names using delimiting rules and appropriate separators
+ * @return a combined name
+ * ex. {"TH IS", THAT} -> "TH IS_THAT"
+ */
+ public String combineNames(IdentifierRule rule, IdentifierRule[] rules, String[] names);
+
+ /**
+ * Combines names using the specified delimiting rule and appropriate separators
+ * @return a combined name
+ * ex. {"TH IS", THAT} -> "TH IS_THAT"
+ */
+ public String combineNames(String rule, String[] names);
+
+ /**
+ * Combines names using the specified delimiting rule and appropriate separators
+ * @return a combined name
+ * ex. {"TH IS", THAT} -> "TH IS_THAT"
+ */
+ public String combineNames(IdentifierRule rule, String[] names);
+
+ /**
+ * Combines two names using delimiting rules and appropriate separators
+ */
+ public String combineNames(String rule, String name1, String name2);
+
+ /**
+ * Combines two names using delimiting rules and appropriate separators
+ */
+ public String combineNames(IdentifierRule rule, String name1, String name2);
+
+ /**
+ * Joins several names with different naming rules into a single string
+ * using appropriate delimiters and separators
+ */
+ public String joinNames(String[] rules, String[] names);
+
+ /**
+ * Joins several names with different naming rules into a single string
+ * using appropriate delimiters and separators
+ */
+ public String joinNames(IdentifierRule[] rules, String[] names);
+
+ /**
+ * Joins several names with different naming rules into a single string
+ * using appropriate delimiters and separators
+ */
+ public String joinNames(String rule, String[] names);
+
+ /**
+ * Joins several names with different naming rules into a single string
+ * using appropriate delimiters and separators
+ */
+ public String joinNames(IdentifierRule rule, String[] names);
+
+ /**
+ * Joins several names with different naming rules into a single string
+ * using the specified delimiter
+ */
+ public String joinNames(IdentifierRule rule, String[] names, String delimiter);
+ /**
+ * Joins several names with different naming rules into a single string
+ * using the specified delimiter
+ */
+ public String joinNames(String rule, String[] names, String delimiter);
+
+ /**
+ * Splits a combined name name using the provided naming rule
+ * @param name the multi-value name
+ * @return individual components of the name
+ * ex. schema.table --> { schema, table }
+ */
+ public String[] splitName(String rule, String name);
+
+ /**
+ * Splits a combined name name using the provided naming rule
+ * @param name the multi-value name
+ * @return individual components of the name
+ * ex. schema.table --> { schema, table }
+ */
+ public String[] splitName(IdentifierRule rule, String name);
+
+ /**
+ * Splits a combined name name using the provided naming rule and
+ * delimiter.
+ * @param name the multi-value name
+ * @return individual components of the name
+ * ex. schema.table --> { schema, table }
+ */
+ public String[] splitName(String rule, String name, String delimiter);
+
+ /**
+ * Splits a combined name name using the provided naming rule and
+ * delimiter.
+ * @param name the multi-value name
+ * @return individual components of the name
+ * ex. schema.table --> { schema, table }
+ */
+ public String[] splitName(IdentifierRule rule, String name, String delimiter);
+
+ /**
+ * Returns whether a name is considered a reserved word
+ */
+ public boolean isReservedWord(String rule, String name);
+
+ /**
+ * Returns whether a name is considered a reserved word
+ */
+ public boolean isReservedWord(IdentifierRule rule, String name);
+
+ /**
+ * Convert the string using this naming configuration to the supplied
+ * naming configuration.
+ */
+ public String convert(IdentifierConfiguration config, String rule, String name);
+
+ /**
+ * Truncates a name while maintaining delimiters.
+ */
+ public String truncateName(String rule, String name, int length);
+
+ /**
+ * Truncates a name while maintaining delimiters.
+ */
+ public String truncateName(IdentifierRule rule, String name, int length);
+
+ /**
+ * Append the names together while maintaining delimiters.
+ */
+ public String appendNames(IdentifierRule rule, String name1, String name2);
+
+ /**
+ * Append the names together while maintaining delimiters.
+ */
+ public String appendNames(String rule, String name1, String name2);
+
+ /**
+ * Converts a qualified string-based name defined using the base configuration to the
+ * specified configuration. Returns the converted name.
+ */
+ public String convertFull(IdentifierConfiguration config, String rule, String fullName);
+
+ /**
+ * Removes Hungarian notation from the specified string.
+ */
+ public String removeHungarianNotation(String rule, String name);
+ /**
+ * Removes Hungarian notation from the specified string.
+ */
+ public String removeHungarianNotation(IdentifierRule rule, String name);
+
+ /**
+ * Determines whether a name can be split into multiple components.
+ */
+ public boolean canSplit(String rule, String name);
+
+ /**
+ * Determines whether a name can be split into multiple components.
+ */
+ public boolean canSplit(IdentifierRule rule, String name);
+
+ /**
+ * Determines whether a name can be split into multiple components, taking
+ * into account the specified delimiter.
+ */
+ public boolean canSplit(String rule, String name, String delim);
+
+ /**
+ * Determines whether a name can be split into multiple components, taking
+ * into account the specified delimiter.
+ */
+ public boolean canSplit(IdentifierRule rule, String name, String delim);
+}
Propchange: openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/IdentifierUtil.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/IdentifierUtilImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/IdentifierUtilImpl.java?rev=899738&view=auto
==============================================================================
--- openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/IdentifierUtilImpl.java (added)
+++ openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/IdentifierUtilImpl.java Fri Jan 15 18:05:14 2010
@@ -0,0 +1,548 @@
+/*
+ * 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.lib.identifier;
+
+import java.util.ArrayList;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.openjpa.lib.conf.Configurable;
+import org.apache.openjpa.lib.conf.Configuration;
+import org.apache.openjpa.lib.util.Localizer;
+
+/**
+ * Implementation class for the base identifier impl.
+ *
+ */
+public class IdentifierUtilImpl implements IdentifierUtil, Configurable {
+
+ private static final Localizer _loc = Localizer.forPackage
+ (IdentifierUtilImpl.class);
+
+ private IdentifierConfiguration _config = null;
+
+ public IdentifierUtilImpl() {
+
+ }
+
+ public IdentifierUtilImpl(IdentifierConfiguration config) {
+ _config = config;
+ }
+
+ public void setIdentifierConfiguration(IdentifierConfiguration config) {
+ _config = config;
+ }
+
+ public IdentifierConfiguration getIdentifierConfiguration() {
+ return _config;
+ }
+
+ public String combineNames(IdentifierRule rule, IdentifierRule[] rules, String[] names) {
+ boolean delimited = false;
+ String combined = null;
+ for (int i = 0; i < names.length; i++) {
+ String name = names[i];
+ if (isDelimited(rules[i], name)) {
+ delimited = true;
+ name = removeDelimiters(rules[i], name);
+ }
+ if (i == 0) {
+ combined = name;
+ }
+ else {
+ combined = combined + _config.getIdentifierConcatenator() + name;
+ }
+ }
+
+ if (delimited) {
+ combined = delimit(rule, combined.toString()).toString();
+ }
+
+ return combined;
+ }
+
+ public String combineNames(IdentifierRule rule, String name1, String name2) {
+ boolean delimit = false;
+ if (isDelimited(rule, name1)) {
+ name1 = removeDelimiters(rule, name1);
+ delimit = true;
+ }
+ if (isDelimited(rule, name2)) {
+ name2 = removeDelimiters(rule, name2);
+ delimit = true;
+ }
+ String name = name1 + _config.getIdentifierConcatenator() + name2;
+ return delimit(rule, name, delimit).toString();
+ }
+
+ public String combineNames(IdentifierRule namingRule, String[] names) {
+ boolean delimited = false;
+ String combined = null;
+ for (int i = 0; i < names.length; i++) {
+ String name = names[i];
+ if (isDelimited(namingRule, name)) {
+ delimited = true;
+ name = removeDelimiters(namingRule, name);
+ }
+ if (i == 0) {
+ combined = name;
+ }
+ else {
+ combined = combined + _config.getIdentifierConcatenator() + name;
+ }
+ }
+ if (delimited) {
+ combined = delimit(namingRule, combined.toString()).toString();
+ }
+
+ return combined;
+ }
+
+ public String appendNames(IdentifierRule rule, String name1, String name2) {
+ if (isDelimited(rule, name1)) {
+ name1 = removeDelimiters(rule, name1);
+ }
+ if (isDelimited(rule, name2)) {
+ name2 = removeDelimiters(rule, name2);
+ }
+ if (name1 == null) {
+ name1 = IdentifierUtil.EMPTY;
+ }
+ if (name2 == null) {
+ name2 = IdentifierUtil.EMPTY;
+ }
+ String name = name1 + name2;
+ return delimit(rule, name).toString();
+ }
+
+ /**
+ * Joins multiple names together using the standard delimiting rules
+ * ex. ( {"s", "t", "c"} --> "s"."t"."c" }
+ */
+ public String joinNames(IdentifierRule[] rules, String[] names) {
+
+ if (names == null || names.length == 0) {
+ return null;
+ }
+ StringBuilder combinedName = new StringBuilder();
+ for (int i = 0; i < names.length; i++) {
+ combinedName.append(delimit(rules[i], names[i]));
+ if (i < (names.length -1)) {
+ combinedName.append(_config.getIdentifierDelimiter());
+ }
+ }
+ return combinedName.toString();
+ }
+
+ public String joinNames(String rule, String[] names) {
+ return joinNames(_config, getNamingRule(rule), names, _config.getIdentifierDelimiter());
+ }
+
+ public String joinNames(IdentifierRule rule, String[] names) {
+ return joinNames(_config, rule, names, _config.getIdentifierDelimiter());
+ }
+
+ public String joinNames(IdentifierRule rule, String[] names, String delimiter) {
+ return joinNames(_config, rule, names, delimiter);
+ }
+
+ public String joinNames(String rule, String[] names, String delimiter) {
+ return joinNames(_config, getNamingRule(rule), names, delimiter);
+ }
+
+ /**
+ * Join names using a single naming rule and specified delimiter
+ * @param rule
+ * @param names
+ * @return
+ */
+ public String joinNames(IdentifierConfiguration config, IdentifierRule rule, String[] names, String delimiter) {
+
+ if (names == null || names.length == 0) {
+ return null;
+ }
+ StringBuilder combinedName = new StringBuilder();
+ for (int i = 0; i < names.length; i++) {
+ if (names[i] != null) {
+ combinedName.append(delimit(config, rule, names[i], false));
+ if (i < (names.length -1)) {
+ combinedName.append(delimiter);
+ }
+ }
+ }
+ return combinedName.toString();
+ }
+
+ public String[] splitName(IdentifierRule nrule, String name) {
+ return splitName(nrule, name, _config.getIdentifierDelimiter());
+ }
+
+
+ /**
+ * Splits names using single naming rule and appropriate separators
+ * @param name the multi-value name
+ * @return individual components of the name
+ * ex. schema.table --> { schema, table }
+ */
+ public String[] splitName(IdentifierRule nrule, String name, String nameDelim) {
+ if (!canSplit(nrule, name, nameDelim) || StringUtils.isEmpty(name)) {
+ return new String[] {name};
+ }
+ // "schema"."table"
+ // "sch.ma"."table"
+ // "sch""ma".table
+
+ // Split names by object delimiter not between name delimiters
+ ArrayList<String> names = new ArrayList<String>(2);
+ String pname = name;
+
+ // for each name
+ int ndLen = nameDelim.length();
+ while (!StringUtils.isEmpty(name)) {
+ pname = splitNameCharDelimiters(name, nameDelim);
+ names.add(pname);
+ if ((pname.length() + ndLen) >= name.length()) {
+ break;
+ }
+ name = name.substring(pname.length() + ndLen);
+ }
+ return names.toArray(new String[names.size()]);
+ }
+
+ /**
+ * Gets the first part of a name when single character delimiters are
+ * in use.
+ * @param pname
+ * @return
+ */
+ private String splitNameCharDelimiters(String name, String nameDelim) {
+ StringBuilder sname = new StringBuilder("");
+ char ld = _config.getLeadingDelimiter().charAt(0);
+ char td = _config.getTrailingDelimiter().charAt(0);
+ char nd = nameDelim.charAt(0);
+ int dlvl = 0;
+ boolean wasLd = false;
+ for (int i = 0; i < name.length(); i++) {
+ char c = name.charAt(i);
+ if (c == ld) {
+ // Handle case where delimiters are the same
+ if (td == ld && wasLd) {
+ dlvl--;
+ wasLd = false;
+ } else {
+ wasLd = true;
+ dlvl++;
+ }
+ } else if (c == td) {
+ dlvl--;
+ } else if (c == nd) {
+ if (dlvl == 0 && sname.length() > 0) {
+ return sname.toString();
+ }
+ }
+ sname.append(c);
+ }
+ return sname.toString();
+ }
+
+ /**
+ * Returns whether a name is double quoted
+ * @return
+ */
+ public static boolean isDoubleQuoted(String name) {
+ if (name == null || name.length() < 3) {
+ return false;
+ }
+ return name.startsWith(DOUBLE_QUOTE) &&
+ name.endsWith(DOUBLE_QUOTE);
+ }
+
+
+ public String delimit(IdentifierRule rule, String name) {
+ return delimit(_config, rule, name, false);
+ }
+
+ public String delimit(IdentifierRule rule, String name, boolean force) {
+ return delimit(_config, rule, name, force);
+ }
+
+ public String delimit(IdentifierConfiguration config, IdentifierRule rule, String name, boolean force) {
+ if (!rule.getCanDelimit() || StringUtils.isEmpty(name)) {
+ return name;
+ }
+
+ if ((force && !isDelimited(config, rule, name)) || requiresDelimiters(config, rule, name)) {
+ return config.getLeadingDelimiter() + name + config.getTrailingDelimiter();
+ }
+ return name;
+ }
+
+ public boolean isDelimited(IdentifierRule rule, String name) {
+ return isDelimited(_config, rule, name);
+ }
+
+ public boolean isDelimited(IdentifierConfiguration config, IdentifierRule rule, String name) {
+ if (name == null || name.length() <= 3) {
+ return false;
+ }
+ return name.startsWith(config.getLeadingDelimiter()) &&
+ name.endsWith(config.getTrailingDelimiter());
+ }
+
+ public String removeDelimiters(IdentifierRule rule, String name) {
+ return removeDelimiters(rule, name, _config.getLeadingDelimiter(),
+ _config.getTrailingDelimiter());
+ }
+
+ public boolean requiresDelimiters(IdentifierRule rule, String name) {
+ return requiresDelimiters(_config, rule, name);
+ }
+
+ public boolean requiresDelimiters(IdentifierConfiguration config, IdentifierRule rule, String name) {
+ if (rule == null) {
+ throw new IllegalArgumentException(_loc.get("no-rules-provided").getMessage());
+ }
+ if (rule.getCanDelimit() && !isDelimited(config, rule, name) && rule.requiresDelimiters(name)) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Returns whether a name is considered a reserved word.
+ */
+ public boolean isReservedWord(IdentifierRule rule, String name) {
+ if (rule == null) {
+ System.out.println("NAmingConfig: " + _config.getClass().getName());
+ throw new IllegalArgumentException("Naming rule is null!");
+ }
+ if (rule.getReservedWords() == null) {
+ return false;
+ }
+ if (!isDelimited(rule, name)) {
+ name = name.toUpperCase();
+ }
+ return rule.getReservedWords().contains(name);
+ }
+
+ public boolean isReservedWord(String rule, String name) {
+ return isReservedWord(_config.getIdentifierRule(rule), name);
+ }
+
+
+ protected String removeDelimiters(IdentifierRule rule, String name, String leading,
+ String trailing) {
+ if (name == null) {
+ return null;
+ }
+ if (isDelimited(rule, name)) {
+ String id = name.substring(leading.length(),
+ (name.length() - trailing.length()));
+ return id;
+ }
+ return name;
+ }
+
+ public String combineNames(String rule, String[] rules, String[] names) {
+ return combineNames(getNamingRule(rule), getNamingRules(rules), names);
+ }
+
+ public String truncateName(String rule, String name, int length) {
+ return truncateName(getNamingRule(rule), name, length);
+ }
+
+ public String truncateName(IdentifierRule namingRule, String name, int length) {
+ String tName = name;
+ boolean delimited = isDelimited(namingRule, name);
+ if (delimited) {
+ tName = removeDelimiters(namingRule, name);
+ }
+ if (tName.length() <= length) {
+ return name;
+ }
+ tName = tName.substring(0, tName.length() - length);
+ if (delimited) {
+ tName = delimit(namingRule, tName).toString();
+ }
+ return tName;
+ }
+
+ public String delimit(String rule, String name) {
+ return delimit(getNamingRule(rule), name);
+ }
+
+ public String delimit(String rule, String name, boolean force) {
+ return delimit(getNamingRule(rule), name, force);
+ }
+
+ public boolean isDelimited(String rule, String name) {
+ return isDelimited(getNamingRule(rule), name);
+ }
+
+ public String removeDelimiters(String rule, String name) {
+ return removeDelimiters(getNamingRule(rule), name);
+ }
+
+ public boolean requiresDelimiters(String rule, String name) {
+ return requiresDelimiters(getNamingRule(rule), name);
+ }
+
+ public String[] splitName(String rule, String name) {
+ return splitName(getNamingRule(rule), name);
+ }
+
+ public String joinNames(String[] rules, String[] names) {
+ return joinNames(getNamingRules(rules), names);
+ }
+
+ private IdentifierRule getNamingRule(String rule) {
+ return _config.getIdentifierRule(rule);
+ }
+
+ public String combineNames(String rule, String name1, String name2) {
+ return combineNames(getNamingRule(rule), name1, name2);
+ }
+
+ public String combineNames(String rule, String[] names) {
+ return combineNames(getNamingRule(rule), names);
+ }
+
+ public String appendNames(String rule, String name1, String name2) {
+ return appendNames(getNamingRule(rule), name1, name2);
+ }
+
+ public String removeHungarianNotation(IdentifierRule rule, String name) {
+ boolean delimited = isDelimited(rule, name);
+ if (delimited) {
+ name = removeDelimiters(rule, name);
+ }
+ char[] chname = name.toCharArray();
+ int newStart = 0;
+
+ for (int i = 0; i < chname.length; i++) {
+ if (Character.isUpperCase(chname[i]))
+ {
+ newStart = i;
+ break;
+ }
+ }
+
+ name = name.substring(newStart);
+ if (delimited) {
+ name = delimit(rule, name).toString();
+ }
+ return name;
+ }
+
+ public String removeHungarianNotation(String rule, String name) {
+ return removeHungarianNotation(getNamingRule(rule), name);
+ }
+
+ public String[] splitName(String nrule, String name, String nameDelim) {
+ return splitName(getNamingRule(nrule), name, nameDelim);
+ }
+
+ public String convert(IdentifierConfiguration config, String rule, String name) {
+ // Already using same delimiter, no need to convert
+ if (!needsConversion(config)) {
+ return name;
+ }
+ // Otherwise, remove delimiters and add appropriate delimiters
+ IdentifierRule orule = getIdentifierConfiguration().getIdentifierRule(rule);
+ IdentifierRule nrule = config.getIdentifierRule(rule);
+ boolean delimit = isDelimited(orule, name);
+ if (delimit) {
+ name = removeDelimiters(orule, name, config.getLeadingDelimiter(),
+ config.getTrailingDelimiter());
+ return delimit(config, nrule, name, delimit).toString();
+ }
+ return name;
+ }
+
+ public String convertFull(IdentifierConfiguration config, String rule, String fullName) {
+ if (!needsConversion(config)) {
+ return fullName;
+ }
+ // Split
+ String[] names = splitName(rule, fullName);
+ // Convert
+ for (int i = 0; i < names.length; i++) {
+ names[i] = convert(config, rule, names[i]);
+ }
+ // Join
+ return joinNames(config, config.getIdentifierRule(rule), names, config.getIdentifierDelimiter());
+ }
+
+ public String combineFull(IdentifierConfiguration config, String rule, String fullName) {
+ if (!needsConversion(config)) {
+ return fullName;
+ }
+ // Split
+ String[] names = splitName(rule, fullName);
+ // Convert
+ for (int i = 0; i < names.length; i++) {
+ names[i] = convert(config, rule, names[i]);
+ }
+ // Join
+ return joinNames(config, config.getIdentifierRule(rule), names, config.getIdentifierDelimiter());
+ }
+
+
+ private boolean needsConversion(IdentifierConfiguration config) {
+ return !(config.getLeadingDelimiter().equals(getIdentifierConfiguration().getLeadingDelimiter()) &&
+ config.getTrailingDelimiter().equals(getIdentifierConfiguration().getTrailingDelimiter()) &&
+ config.getIdentifierDelimiter().equals(getIdentifierConfiguration().getIdentifierDelimiter()));
+ }
+
+ private IdentifierRule[] getNamingRules(String[] rules) {
+ IdentifierRule[] nrules = new IdentifierRule[rules.length];
+ for (int i = 0; i < rules.length; i++) {
+ nrules[i] = _config.getIdentifierRule(rules[i]);
+ }
+ return nrules;
+ }
+
+ public void endConfiguration() {
+ }
+
+ public void setConfiguration(Configuration conf) {
+ }
+
+ public void startConfiguration() {
+ }
+
+ public boolean canSplit(String rule, String name) {
+ return canSplit(getNamingRule(rule), name, _config.getIdentifierDelimiter());
+ }
+
+ public boolean canSplit(IdentifierRule rule, String name) {
+ return canSplit(rule, name, _config.getIdentifierDelimiter());
+ }
+
+ public boolean canSplit(String rule, String name, String delim) {
+ return canSplit(getNamingRule(rule), name);
+ }
+
+ public boolean canSplit(IdentifierRule rule, String name, String delim) {
+ if (name == null || name.length() == 0) {
+ return false;
+ }
+ return name.contains(delim);
+ }
+
+}
Propchange: openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/identifier/IdentifierUtilImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/identifier/DefaultTestIdRule.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/identifier/DefaultTestIdRule.java?rev=899738&view=auto
==============================================================================
--- openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/identifier/DefaultTestIdRule.java (added)
+++ openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/identifier/DefaultTestIdRule.java Fri Jan 15 18:05:14 2010
@@ -0,0 +1,25 @@
+/*
+ * 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.lib.identifier;
+
+import org.apache.openjpa.lib.identifier.IdentifierRule;
+
+public class DefaultTestIdRule extends IdentifierRule {
+
+}
Propchange: openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/identifier/DefaultTestIdRule.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/identifier/IdConfigurationTestImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/identifier/IdConfigurationTestImpl.java?rev=899738&view=auto
==============================================================================
--- openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/identifier/IdConfigurationTestImpl.java (added)
+++ openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/identifier/IdConfigurationTestImpl.java Fri Jan 15 18:05:14 2010
@@ -0,0 +1,87 @@
+/*
+ * 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.lib.identifier;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.openjpa.lib.identifier.IdentifierConfiguration;
+import org.apache.openjpa.lib.identifier.IdentifierRule;
+import org.apache.openjpa.lib.identifier.IdentifierUtil;
+
+public class IdConfigurationTestImpl implements IdentifierConfiguration {
+
+ Map<String, IdentifierRule> _rules = new HashMap<String, IdentifierRule>();
+
+ public IdConfigurationTestImpl() {
+ _rules.put("DEFAULT", _defRule);
+ }
+
+ private IdentifierRule _defRule = new IdentifierRule();
+
+ public boolean delimitAll() {
+ return false;
+ }
+
+ public IdentifierRule getDefaultIdentifierRule() {
+ return _defRule;
+ }
+
+ public String getDelimitedCase() {
+ return IdentifierUtil.CASE_PRESERVE;
+ }
+
+ public String getLeadingDelimiter() {
+ return "`";
+ }
+
+ public String getIdentifierDelimiter() {
+ return ":";
+ }
+
+ public String getIdentifierConcatenator() {
+ return "-";
+ }
+
+ public <T> IdentifierRule getIdentifierRule(T t) {
+ IdentifierRule r = _rules.get(t);
+ if (r == null) {
+ return getDefaultIdentifierRule();
+ }
+ return r;
+ }
+
+ @SuppressWarnings("unchecked")
+ public <T> Map<T, IdentifierRule> getIdentifierRules() {
+ return (Map<T, IdentifierRule>) _rules;
+ }
+
+ public String getTrailingDelimiter() {
+ return "`";
+ }
+
+ public String getSchemaCase() {
+ return IdentifierUtil.CASE_UPPER;
+ }
+
+ public boolean getSupportsDelimitedIdentifiers() {
+ return true;
+ }
+
+}
Propchange: openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/identifier/IdConfigurationTestImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/identifier/NewIdConfigurationTestImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/identifier/NewIdConfigurationTestImpl.java?rev=899738&view=auto
==============================================================================
--- openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/identifier/NewIdConfigurationTestImpl.java (added)
+++ openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/identifier/NewIdConfigurationTestImpl.java Fri Jan 15 18:05:14 2010
@@ -0,0 +1,87 @@
+/*
+ * 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.lib.identifier;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.openjpa.lib.identifier.IdentifierConfiguration;
+import org.apache.openjpa.lib.identifier.IdentifierRule;
+import org.apache.openjpa.lib.identifier.IdentifierUtil;
+
+public class NewIdConfigurationTestImpl implements IdentifierConfiguration {
+
+ Map<String, IdentifierRule> _rules = new HashMap<String, IdentifierRule>();
+
+ public NewIdConfigurationTestImpl() {
+ _rules.put("DEFAULT", _defRule);
+ }
+
+ private IdentifierRule _defRule = new IdentifierRule();
+
+ public boolean delimitAll() {
+ return false;
+ }
+
+ public IdentifierRule getDefaultIdentifierRule() {
+ return _defRule;
+ }
+
+ public String getDelimitedCase() {
+ return IdentifierUtil.CASE_PRESERVE;
+ }
+
+ public String getLeadingDelimiter() {
+ return "\"";
+ }
+
+ public String getIdentifierDelimiter() {
+ return ".";
+ }
+
+ public String getIdentifierConcatenator() {
+ return "_";
+ }
+
+ public <T> IdentifierRule getIdentifierRule(T t) {
+ IdentifierRule r = _rules.get(t);
+ if (r == null) {
+ return getDefaultIdentifierRule();
+ }
+ return r;
+ }
+
+ @SuppressWarnings("unchecked")
+ public <T> Map<T, IdentifierRule> getIdentifierRules() {
+ return (Map<T, IdentifierRule>) _rules;
+ }
+
+ public String getTrailingDelimiter() {
+ return "\"";
+ }
+
+ public String getSchemaCase() {
+ return IdentifierUtil.CASE_UPPER;
+ }
+
+ public boolean getSupportsDelimitedIdentifiers() {
+ return true;
+ }
+
+}
Propchange: openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/identifier/NewIdConfigurationTestImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/identifier/TestIdentifiers.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/identifier/TestIdentifiers.java?rev=899738&view=auto
==============================================================================
--- openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/identifier/TestIdentifiers.java (added)
+++ openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/identifier/TestIdentifiers.java Fri Jan 15 18:05:14 2010
@@ -0,0 +1,58 @@
+/*
+ * 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.lib.identifier;
+
+import org.apache.openjpa.lib.identifier.IdentifierConfiguration;
+import org.apache.openjpa.lib.identifier.IdentifierUtil;
+import org.apache.openjpa.lib.identifier.IdentifierUtilImpl;
+import org.apache.openjpa.lib.test.AbstractTestCase;
+
+public class TestIdentifiers extends AbstractTestCase {
+
+ public void testIdentifierConversion() {
+
+ // Create a naming configs used for testing.
+ IdentifierConfiguration defConfig = new IdConfigurationTestImpl();
+ IdentifierConfiguration newConfig = new NewIdConfigurationTestImpl();
+
+ IdentifierUtil nu = new IdentifierUtilImpl(defConfig);
+
+ // Test basic name conversion with single name converter
+ String n0 = "`TABLE`";
+ String cn0 = nu.convert(newConfig, "DEFAULT", n0);
+ assertEquals("\"TABLE\"", cn0);
+
+ // Test basic name conversion with single name converter - no
+ // conversion
+ String n1 = "TABLE";
+ String cn1 = nu.convert(newConfig, "DEFAULT", n1);
+ assertEquals("TABLE", cn1);
+
+ // Test basic name separator conversion with compound name converter
+ String n2 = "TABLE:SCHEMA";
+ String cn2 = nu.convertFull(newConfig, "DEFAULT", n2);
+ assertEquals("TABLE.SCHEMA", cn2);
+
+ String n3 = "`TABLE`:`SCHEMA`";
+ String cn3 = nu.convertFull(newConfig, "DEFAULT", n3);
+ assertEquals("\"TABLE\".\"SCHEMA\"", cn3);
+ }
+
+
+}
Propchange: openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/identifier/TestIdentifiers.java
------------------------------------------------------------------------------
svn:eol-style = native