com.fizzed.rocker.compiler.RockerUtil.java Source code

Java tutorial

Introduction

Here is the source code for com.fizzed.rocker.compiler.RockerUtil.java

Source

/*
 * Copyright 2015 Fizzed 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.fizzed.rocker.compiler;

import com.fizzed.rocker.ContentType;
import com.fizzed.rocker.model.JavaVersion;
import com.fizzed.rocker.model.TemplateModel;
//import org.apache.commons.lang3.text.translate.*;

import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;
//import javax.xml.bind.DatatypeConverter;
import org.apache.commons.lang3.text.translate.CharSequenceTranslator;
import org.apache.commons.lang3.text.translate.EntityArrays;
import org.apache.commons.lang3.text.translate.LookupTranslator;

public class RockerUtil {

    private static final Pattern VALID_JAVA_IDENTIFIER = Pattern
            .compile("\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*");

    static public boolean isJava8Plus(TemplateModel model) {
        return model.getOptions().isGreaterThanOrEqualToJavaVersion(JavaVersion.v1_8);
    }

    public static boolean isJavaIdentifier(String identifier) {
        return VALID_JAVA_IDENTIFIER.matcher(identifier).matches();
    }

    static public String pathToPackageName(Path path) {
        if (path == null) {
            return "";
        }
        // path.toString() uses File.seperator between components
        return path.toString().replace(File.separator, ".");
    }

    static public Path packageNameToPath(String packageName) {
        if (packageName == null || packageName.equals("")) {
            return null;
        }
        return Paths.get(packageName.replace('.', '/'));
    }

    static public boolean isRelativePath(Path baseDir, Path file) {
        return file.startsWith(baseDir);
    }

    public static int countChars(String value, char ch) {
        int count = 0;
        for (int i = 0; i < value.length(); i++) {
            if (value.charAt(i) == ch) {
                count++;
            }
        }
        return count;
    }

    static public boolean isWhitespaceNoLineBreak(char c) {
        // switch statements are always lightning fast
        switch (c) {
        case ' ':
        case '\t':
        case '\r':
            return true;
        default:
            return false;
        }
    }

    static public boolean isWhitespace(char c) {
        // switch statements are always lightning fast
        switch (c) {
        case ' ':
        case '\t':
        case '\r':
        case '\n':
            return true;
        default:
            return false;
        }
    }

    static public boolean isWhitespace(String s) {
        for (int i = 0; i < s.length(); i++) {
            if (!isWhitespace(s.charAt(i))) {
                return false;
            }
        }
        return true;
    }

    static public String consoleFriendlyText(String s) {
        if (s == null) {
            return "<NULL>";
        }
        s = s.replace("\n", "\\n");
        s = s.replace("\r", "\\r");
        return s;
    }

    static public String templateNameToName(String templateName) {
        int pos = templateName.indexOf('.');
        // must be at least 1 char
        if (pos < 1) {
            throw new IllegalArgumentException("Invalid template name format (unable find first dot character)");
        }
        return templateName.substring(0, pos);
    }

    static public ContentType templateNameToContentType(String templateName) {
        int pos = templateName.lastIndexOf('.');
        // must be at least 1 char
        if (pos < 0) {
            throw new IllegalArgumentException("Invalid template name format (unable find last dot character)");
        }

        String ext = templateName.substring(pos + 1);

        for (ContentType type : ContentType.values()) {
            if (type.toString().equalsIgnoreCase(ext)) {
                return type;
            }
        }

        throw new IllegalArgumentException(
                "Unsupported content type for extension [" + ext + "] for template name [" + templateName + "]");
    }

    public static Collection<File> listFileTree(File dir) {
        Set<File> fileTree = new HashSet<>();

        for (File entry : dir.listFiles()) {
            if (entry.isFile())
                fileTree.add(entry);
            else
                fileTree.addAll(listFileTree(entry));
        }

        return fileTree;
    }

    public static String qualifiedClassName(Object obj) {
        return qualifiedClassName(obj.getClass());
    }

    public static String qualifiedClassName(Class<?> type) {
        return type.getName().replace('$', '.');
    }

    public static String unqualifiedClassName(Object obj) {
        return unqualifiedClassName(obj.getClass());
    }

    public static String unqualifiedClassName(Class<?> type) {
        String name = type.getName();
        if (name != null && name.lastIndexOf('.') > 0) {
            name = name.substring(name.lastIndexOf('.') + 1); // Map$Entry
            name = name.replace('$', '.'); // Map.Entry
        }
        return name;
    }

    // removes " -> {" at end of string
    public static String chompClosureOpen(String expr) {
        if (!expr.endsWith("{")) {
            return expr;
        }

        int closurePos = expr.lastIndexOf("->");
        if (closurePos < 0) {
            return expr;
        }

        return expr.substring(0, closurePos).trim();
    }

    // removes " => {" at end of string
    public static String chompClosureAssignmentOpen(String expr) {
        if (!expr.endsWith("{")) {
            return expr;
        }

        int closureAssignmentPos = expr.lastIndexOf("=>");
        if (closureAssignmentPos < 0) {
            return expr;
        }

        return expr.substring(0, closureAssignmentPos).trim();
    }

    static public List<String> stringIntoChunks(String s, int chunkSize) {
        // most likely case
        if (s.length() <= chunkSize) {
            return Arrays.asList(s);
        }

        List<String> strings = new ArrayList<>();

        for (int offset = 0; offset < s.length();) {

            int chunkLength = chunkSize;

            if ((offset + chunkLength) > s.length()) {
                chunkLength = s.length() - offset;
            }

            String chunk = s.substring(offset, offset + chunkLength);

            strings.add(chunk);

            offset += chunkLength;
        }

        return strings;
    }

    static public List<String> getTextAsJavaByteArrayInitializer(String text, String charsetName, int maxArraySize)
            throws UnsupportedEncodingException {
        byte[] bytes = text.getBytes(charsetName);

        List<String> arrays = new ArrayList<>();

        for (int length = 0; length < bytes.length;) {

            StringBuilder sb = new StringBuilder();

            sb.append("new byte[] { ");

            for (int chunk = 0; length < bytes.length && chunk < maxArraySize; chunk++) {

                byte b = bytes[length];

                if (chunk != 0) {
                    sb.append(", ");
                }

                appendByteAsJavaByteInitializer(sb, b);

                chunk++;
                length++;
            }

            sb.append(" };");

            arrays.add(sb.toString());
        }

        return arrays;
    }

    static public void appendByteAsJavaByteInitializer(StringBuilder sb, byte b) {
        if (b >= 0 && b < 128) {
            if (Character.isAlphabetic(b)) {
                sb.append("'").append((char) b).append("'");
            } else {
                // no cast needed
                sb.append("0x").append(byteArrayToHex(new byte[] { b }));
            }
        } else {
            // cast needed
            sb.append("(byte)0x").append(byteArrayToHex(new byte[] { b }));
        }
    }

    static public String md5(File f) throws IOException {
        try {
            byte[] b = Files.readAllBytes(f.toPath());
            byte[] hash = MessageDigest.getInstance("MD5").digest(b);
            return byteArrayToHex(hash);
        } catch (NoSuchAlgorithmException e) {
            throw new IOException(e.getMessage(), e);
        }
    }

    static public String byteArrayToHex(byte[] a) {
        StringBuilder sb = new StringBuilder(a.length * 2);
        for (byte b : a) {
            sb.append(String.format("%02x", b & 0xff));
        }
        return sb.toString();
    }

    /**
     * copied from commons lang, but without Unicode escaper anyway whether you
     * have unicode in your template or not in last case you would like to have
     * a pretty-generated comments for debug
     */
    public static final CharSequenceTranslator ESCAPE_JAVA = new LookupTranslator(
            new String[][] { { "\"", "\\\"" }, { "\\", "\\\\" }, })
                    .with(new LookupTranslator(EntityArrays.JAVA_CTRL_CHARS_ESCAPE()));

}