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.10.3-yb-2
Show newest version
/*
 *      Copyright (C) 2012-2015 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