All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.datastax.driver.mapping.NamingConventions Maven / Gradle / Ivy

There is a newer version: 3.11.5.3
Show newest version
/*
 * Copyright DataStax, Inc.
 *
 * Licensed 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 com.datastax.driver.mapping;

import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Pattern;

/** Implementations of industry common naming conventions. */
public class NamingConventions {

  /**
   * Represents a naming convention where all letters are lower cased, and words are not separated
   * by any special character. E.g. "myxmlparser".
   */
  public static final NamingConvention LOWER_CASE = new SingleWordNamingConvention(false);

  /**
   * Represents a naming convention where all letters are upper cased, and words are not separated
   * by any special character. E.g. "MYXMLPARSER".
   */
  public static final NamingConvention UPPER_CASE = new SingleWordNamingConvention(true);

  /**
   * Represents snake case naming convention,
   * meaning all letters are lower cased, and words are separated by an underscore ("_"). E.g.
   * "my_xml_parser".
   */
  public static final NamingConvention LOWER_SNAKE_CASE =
      new CharDelimitedNamingConvention("_", false);

  /**
   * Represents snake case naming convention,
   * meaning all letters are upper cased, and words are separated by an underscore ("_"). E.g.
   * "MY_XML_PARSER".
   */
  public static final NamingConvention UPPER_SNAKE_CASE =
      new CharDelimitedNamingConvention("_", true);

  /**
   * Represents Lisp
   * case naming convention, meaning all letters are lower cased, and words are separated by a
   * dash sign ("-"). E.g. "my-xml-parser"
   */
  public static final NamingConvention LOWER_LISP_CASE =
      new CharDelimitedNamingConvention("-", false);

  /**
   * Represents Lisp
   * case naming convention, meaning all letters are upper cased, and words are separated by a
   * dash sign ("-"). E.g. "MY-XML-PARSER".
   */
  public static final NamingConvention UPPER_LISP_CASE =
      new CharDelimitedNamingConvention("-", true);

  /**
   * Represents the default Camel case naming
   * convention, with a lower cased first letter.
   *
   * @see LowerCamelCase
   */
  public static final NamingConvention LOWER_CAMEL_CASE = new LowerCamelCase();

  /**
   * Represents the default Camel case naming
   * convention, with an upper cased first letter.
   *
   * @see UpperCamelCase
   */
  public static final NamingConvention UPPER_CAMEL_CASE = new UpperCamelCase();

  /**
   * Represents Camel case naming convention
   * with a lower cased first letter.
   *
   * 

E.g. "myXmlParser" and "myXMLParser". Note that both examples are valid lower camel case * forms. The first one takes abbreviations as any other words where the first letter is upper * case, and the rest are lower case (hence - "Xml"), while the latter upper cases all letters of * an abbreviation (hence - "XML"). * *

Additionally, many different Java naming conventions introduce prefixes for field naming, * some examples: * *

* * Those prefixes can be supported. For example, if this convention is configured with {@code * ignorablePrefixes} set to "_" then a field named "_myXmlParser" will be split in 3 words only: * "my", "Xml", "Parser". */ public static class LowerCamelCase extends CamelCase { private final boolean upperCaseAbbreviations; /** * @param upperCaseAbbreviations {@code true} to uppercase all abbreviations, {@code false} to * treat abbreviations as any other word * @param ignorablePrefixes string prefixes to trim if constant field name prefixes are used */ public LowerCamelCase(boolean upperCaseAbbreviations, String... ignorablePrefixes) { super(ignorablePrefixes); this.upperCaseAbbreviations = upperCaseAbbreviations; } /** @param ignorablePrefixes string prefixes to trim if constant field name prefixes are used */ public LowerCamelCase(String... ignorablePrefixes) { this(false, ignorablePrefixes); } /** * @param upperCaseAbbreviations {@code true} to uppercase all abbreviations, {@code false} to * treat abbreviations as any other word */ public LowerCamelCase(boolean upperCaseAbbreviations) { this(upperCaseAbbreviations, new String[0]); } @Override public String join(List input) { StringBuilder builder = new StringBuilder(); for (int i = 0; i < input.size(); i++) { Word word = input.get(i); String value; if (i == 0) { value = word.getValue().toLowerCase(); } else if (upperCaseAbbreviations && word.isAbbreviation()) { value = word.getValue().toUpperCase(); } else { value = word.getValue().substring(0, 1).toUpperCase() + word.getValue().substring(1).toLowerCase(); } builder.append(value); } return builder.toString(); } } /** * Represents Camel case naming convention * with an upper cased first letter. * *

E.g. "MyXmlParser" and "MyXMLParser". Note that both examples are valid upper camel case * forms. The first one takes abbreviations as any other words where the first letter is upper * case, and the rest are lower case (hence - "Xml"), while the latter upper cases all letters of * an abbreviation (hence - "XML"). * *

Additionally, many different Java naming conventions introduce prefixes for field naming, * some examples: * *

* * Those prefixes can be supported. For example, if this convention is configured with {@code * ignorablePrefixes} set to "_" then a field named "_MyXmlParser" will be split in 3 words only: * "My", "Xml", "Parser". */ public static class UpperCamelCase extends CamelCase { private final boolean upperCaseAbbreviations; /** * @param upperCaseAbbreviations {@code true} to uppercase all abbreviations, {@code false} to * treat abbreviations as any other word * @param ignorablePrefixes string prefixes to trim if constant field name prefixes are used */ public UpperCamelCase(boolean upperCaseAbbreviations, String... ignorablePrefixes) { super(ignorablePrefixes); this.upperCaseAbbreviations = upperCaseAbbreviations; } /** @param ignorablePrefixes string prefixes to trim if constant field name prefixes are used */ public UpperCamelCase(String... ignorablePrefixes) { this(false, ignorablePrefixes); } /** * @param upperCaseAbbreviations {@code true} to uppercase all abbreviations, {@code false} to * treat abbreviations as any other word */ public UpperCamelCase(boolean upperCaseAbbreviations) { this(upperCaseAbbreviations, new String[0]); } @Override public String join(List input) { StringBuilder builder = new StringBuilder(); for (Word word : input) { String value; if (upperCaseAbbreviations && word.isAbbreviation()) { value = word.getValue().toUpperCase(); } else { value = word.getValue().substring(0, 1).toUpperCase() + word.getValue().substring(1).toLowerCase(); } builder.append(value); } return builder.toString(); } } public abstract static class CamelCase implements NamingConvention { private static final Pattern SPLIT_PATTERN = Pattern.compile( String.format( "%s|%s|%s", "(?<=[A-Z])(?=[A-Z][a-z])", "(?<=[^A-Z])(?=[A-Z])", "(?<=[A-Za-z])(?=[^A-Za-z])")); private static final Pattern ALL_UPPERCASE_PATTERN = Pattern.compile("([A-Z])*"); private static final Comparator STRING_LENGTH_COMPARATOR = new Comparator() { @Override public int compare(String o1, String o2) { return o2.length() - o1.length(); } }; private final Pattern ignorablePrefixPattern; protected CamelCase(String... ignorablePrefixes) { Arrays.sort(ignorablePrefixes, STRING_LENGTH_COMPARATOR); StringBuilder builder = new StringBuilder(); for (int i = 0; i < ignorablePrefixes.length; i++) { if (i > 0) { builder.append("|"); } builder.append("^"); builder.append(ignorablePrefixes[i]); } ignorablePrefixPattern = Pattern.compile(builder.toString()); } @Override public List split(String input) { List result = new LinkedList(); // slice all ignorable prefixes, then split for (String value : SPLIT_PATTERN.split(ignorablePrefixPattern.matcher(input).replaceAll(""))) { // if all uppercase, mark as abbreviation (e.g. MyXMLParser) boolean isAbbreviation = ALL_UPPERCASE_PATTERN.matcher(value).matches(); Word word = new Word(value, isAbbreviation); result.add(word); } return result; } } public static class CharDelimitedNamingConvention implements NamingConvention { private final String delimiter; private final boolean isUpperCase; protected CharDelimitedNamingConvention(String delimiter, boolean isUpperCase) { this.delimiter = delimiter; this.isUpperCase = isUpperCase; } @Override public List split(String input) { List result = new LinkedList(); for (String value : input.split(delimiter)) { result.add(new Word(value)); } return result; } @Override public String join(List input) { StringBuilder builder = new StringBuilder(); for (int i = 0; i < input.size(); i++) { if (i > 0) { builder.append(delimiter); } builder.append(input.get(i).getValue()); } String result = builder.toString(); return isUpperCase ? result.toUpperCase() : result.toLowerCase(); } } public static class SingleWordNamingConvention implements NamingConvention { private final boolean isUpperCase; protected SingleWordNamingConvention(boolean isUpperCase) { this.isUpperCase = isUpperCase; } @Override public List split(String input) { List result = new LinkedList(); result.add(new Word(input)); return result; } @Override public String join(List input) { StringBuilder builder = new StringBuilder(); for (Word word : input) { builder.append(word.getValue()); } String result = builder.toString(); return isUpperCase ? result.toUpperCase() : result.toLowerCase(); } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy