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

de.hasait.genesis.base.util.GenesisUtils Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (C) 2017 by Sebastian Hasait (sebastian at hasait dot de)
 *
 * 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 de.hasait.genesis.base.util;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.annotation.processing.Messager;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.PackageElement;
import javax.lang.model.type.TypeMirror;
import javax.tools.Diagnostic;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;

/**
 *
 */
public final class GenesisUtils {

	private static final List GETTER_PREFIXES = Collections.unmodifiableList(Arrays.asList("get", "is"));
	private static final String SETTER_PREFIX = "set";

	public static void assertNotNull(final Object pValue) {
		if (pValue == null) {
			throw new NullPointerException();
		}
	}

	public static void assertTrue(final boolean pTrue) {
		if (!pTrue) {
			throw new RuntimeException();
		}
	}

	public static String camelCaseToUpperUnderscore(final String pInput) {
		if (StringUtils.isEmpty(pInput)) {
			return pInput;
		}

		final Pattern camelPattern = Pattern.compile("\\p{Lower}\\p{Upper}");
		final Matcher camelMatcher = camelPattern.matcher(pInput);

		final StringBuilder result = new StringBuilder();

		int current = 0;
		while (camelMatcher.find(current)) {
			final int split = camelMatcher.start() + 1;
			result.append(pInput.substring(current, split).toUpperCase());
			result.append('_');
			current = split;
		}
		result.append(pInput.substring(current).toUpperCase());

		return result.toString();
	}

	public static String determinePropertyNameFromAccessor(final Element pElement) {
		for (final String prefix : GETTER_PREFIXES) {
			if (isGetter(pElement, prefix)) {
				return extractPropertyNameFromAccessor(pElement.getSimpleName().toString(), prefix);
			}
		}

		if (isSetter(pElement, SETTER_PREFIX)) {
			return extractPropertyNameFromAccessor(pElement.getSimpleName().toString(), SETTER_PREFIX);
		}

		return null;
	}

	public static TypeMirror determinePropertyTypeFromAccessor(final Element pElement) {
		if (isGetter(pElement)) {
			final ExecutableElement element = (ExecutableElement) pElement;
			return element.getReturnType();
		}

		if (isSetter(pElement)) {
			final ExecutableElement element = (ExecutableElement) pElement;
			return element.getParameters().get(0).asType();
		}

		return null;
	}

	public static String extractPropertyNameFromAccessor(final String pAccessorName, final String pPrefix) {
		final String upperCamelCase = pAccessorName.substring(pPrefix.length());
		return firstLetterToLowercase(upperCamelCase);
	}

	public static PackageElement findPackageElement(final Element pElement) {
		Element currentElement = pElement;
		while (currentElement != null && !(currentElement instanceof PackageElement)) {
			currentElement = currentElement.getEnclosingElement();
		}

		return (PackageElement) currentElement;
	}

	public static String firstLetterToLowercase(final String pInput) {
		return pInput.substring(0, 1).toLowerCase() + pInput.substring(1);
	}

	public static boolean isGetter(final Element pElement) {
		for (final String prefix : GETTER_PREFIXES) {
			if (isGetter(pElement, prefix)) {
				return true;
			}
		}

		return false;
	}

	public static boolean isGetter(final Element pElement, final String pPrefix) {
		GenesisUtils.assertNotNull(pPrefix);

		if (isPublicMemberMethod(pElement)) {
			final ExecutableElement element = (ExecutableElement) pElement;
			final String simpleName = element.getSimpleName().toString();
			return simpleName.startsWith(pPrefix) && simpleName.length() > pPrefix.length() //
					&& element.getReturnType() != null && element.getParameters().isEmpty() //
					;
		}

		return false;
	}

	public static boolean isPublicMemberMethod(final Element pElement) {
		if (pElement != null && pElement.getKind() == ElementKind.METHOD) {
			final Set modifiers = pElement.getModifiers();
			return modifiers.contains(Modifier.PUBLIC) && !modifiers.contains(Modifier.STATIC);
		}

		return false;
	}

	public static boolean isSetter(final Element pElement) {
		return isSetter(pElement, SETTER_PREFIX);
	}

	public static boolean isSetter(final Element pElement, final String pPrefix) {
		GenesisUtils.assertNotNull(pPrefix);

		if (isPublicMemberMethod(pElement)) {
			final ExecutableElement element = (ExecutableElement) pElement;
			final String simpleName = element.getSimpleName().toString();

			return simpleName.startsWith(pPrefix) && simpleName.length() > pPrefix.length() //
					&& element.getParameters().size() == 1 // no return type check to support fluent setters
					;
		}

		return false;
	}

	public static void printError(final Messager pMessager, final Element pElement, final String pFormat, final Object... pArgs) {
		final String message = String.format(pFormat, pArgs);
		pMessager.printMessage(Diagnostic.Kind.ERROR, message, pElement);
	}

	public static void printNote(final Messager pMessager, final Element pElement, final String pFormat, final Object... pArgs) {
		final String message = String.format(pFormat, pArgs);
		pMessager.printMessage(Diagnostic.Kind.NOTE, message, pElement);
	}

	public static void printStackTrace(final Messager pMessager, final Element pElement, final Throwable pThrowable, final String pFormat, final Object... pArgs) {
		final StringWriter sw = new StringWriter();
		final PrintWriter pw = new PrintWriter(sw);
		final String message = String.format(pFormat, pArgs);
		pw.println(message);
		pThrowable.printStackTrace(pw);
		pw.flush();
		pMessager.printMessage(Diagnostic.Kind.ERROR, sw.toString(), pElement);
	}

	public static String readFileToString(final File pFile) throws IOException {
		return pFile != null && pFile.isFile() ? FileUtils.readFileToString(pFile) : null;
	}

	public static boolean writeIfNonWhitespaceChanged(final String pContent, final File pFile) throws IOException {
		final String currentContent = readFileToString(pFile);
		final String content = StringUtils.defaultString(pContent);
		if (currentContent != null) {
			if (reduceWhitespacesToSpace(content).equals(reduceWhitespacesToSpace(currentContent))) {
				return false;
			}
		}
		FileUtils.write(pFile, content);
		return true;
	}

	private static String reduceWhitespacesToSpace(final String pString) {
		String result = pString;
		result = result.replaceAll("\\s+", " "); //$NON-NLS-1$ //$NON-NLS-2$
		return result;
	}


	private GenesisUtils() {
		super();
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy