// Path: jackdaw-apt/src/main/java/com/github/vbauer/jackdaw/code/context/CodeGeneratorContext.java
// public final class CodeGeneratorContext {
// 
//     private final TypeElement typeElement;
//     private final String packageName;
// 
// 
//     private CodeGeneratorContext(final TypeElement typeElement, final String packageName) {
//         this.typeElement = typeElement;
//         this.packageName = packageName;
//     }
// 
// 
//     public static CodeGeneratorContext create(final TypeElement typeElement) {
//         Validate.notNull(typeElement, "Type element must be defined");
// 
//         final String packageName = ProcessorUtils.packageName(typeElement);
//         return new CodeGeneratorContext(typeElement, packageName);
//     }
// 
// 
//     public TypeElement getTypeElement() {
//         return typeElement;
//     }
// 
//     public String getPackageName() {
//         return packageName;
//     }
// 
//     public String getClassName(final Function<String, String> nameModifier) {
//         return nameModifier.apply(TypeUtils.getName(getTypeElement()));
//     }
// 
// }
// 
// Path: jackdaw-apt/src/main/java/com/github/vbauer/jackdaw/util/DateTimeUtils.java
// public final class DateTimeUtils {
// 
//     private static final String FORMAT_DD_MM_YYYY_1 = "dd-MM-yyyy";
//     private static final String FORMAT_DD_MM_YYYY_2 = "dd/MM/yyyy";
//     private static final String FORMAT_YYYY_MM_DD_1 = "yyyy-MM-dd";
//     private static final String FORMAT_YYYY_MM_DD_2 = "yyyy/MM/dd";
// 
//     private static final String[] DATE_FORMATS = {
//         FORMAT_DD_MM_YYYY_1,
//         FORMAT_DD_MM_YYYY_2,
//         FORMAT_YYYY_MM_DD_1,
//         FORMAT_YYYY_MM_DD_2,
//     };
// 
// 
//     private DateTimeUtils() {
//         throw new UnsupportedOperationException();
//     }
// 
// 
//     public static Collection<Format> createDefaultDateFormats() {
//         return createDateFormats(DATE_FORMATS);
//     }
// 
//     public static Collection<Format> createDateFormats(final String... formats) {
//         final ImmutableList.Builder<Format> builder = ImmutableList.builder();
//         for (final String format : formats) {
//             final FastDateFormat instance = FastDateFormat.getInstance(format);
//             builder.add(instance);
//         }
//         return builder.build();
//     }
// 
//     public static Date parseDate(final String rawDate, final Collection<Format> formats) {
//         final String date = StringUtils.trimToNull(rawDate);
//         if (date != null) {
//             for (final Format format : formats) {
//                 final Date parsedDate = parseDate(date, format);
//                 if (parsedDate != null) {
//                     return parsedDate;
//                 }
//             }
//         }
//         return null;
//     }
// 
//     public static Date parseDate(final String date, final Format format) {
//         try {
//             return (Date) format.parseObject(date);
//         } catch (final Exception ignored) {
//             return null;
//         }
//     }
// 
// }


import com.github.vbauer.jackdaw.annotation.JMessage;
import com.github.vbauer.jackdaw.code.base.BaseCodeGenerator;
import com.github.vbauer.jackdaw.code.context.CodeGeneratorContext;
import com.github.vbauer.jackdaw.util.DateTimeUtils;
import com.github.vbauer.jackdaw.util.MessageUtils;
import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic;
import java.text.Format;
import java.util.Collection;
import java.util.Date;
import java.util.List;
package com.github.vbauer.jackdaw.code.generator;



/**
 * @author Vladislav Bauer
 */

public class JMessageCodeGenerator extends BaseCodeGenerator {

    private static final Collection<Format> DATE_FORMATS =
        DateTimeUtils.createDefaultDateFormats();


    @Override
    public final Class<JMessage> getAnnotation() {
        return JMessage.class;
    }

    @Override
// Path: jackdaw-apt/src/main/java/com/github/vbauer/jackdaw/code/context/CodeGeneratorContext.java
// public final class CodeGeneratorContext {
// 
//     private final TypeElement typeElement;
//     private final String packageName;
// 
// 
//     private CodeGeneratorContext(final TypeElement typeElement, final String packageName) {
//         this.typeElement = typeElement;
//         this.packageName = packageName;
//     }
// 
// 
//     public static CodeGeneratorContext create(final TypeElement typeElement) {
//         Validate.notNull(typeElement, "Type element must be defined");
// 
//         final String packageName = ProcessorUtils.packageName(typeElement);
//         return new CodeGeneratorContext(typeElement, packageName);
//     }
// 
// 
//     public TypeElement getTypeElement() {
//         return typeElement;
//     }
// 
//     public String getPackageName() {
//         return packageName;
//     }
// 
//     public String getClassName(final Function<String, String> nameModifier) {
//         return nameModifier.apply(TypeUtils.getName(getTypeElement()));
//     }
// 
// }
// 
// Path: jackdaw-apt/src/main/java/com/github/vbauer/jackdaw/util/DateTimeUtils.java
// public final class DateTimeUtils {
// 
//     private static final String FORMAT_DD_MM_YYYY_1 = "dd-MM-yyyy";
//     private static final String FORMAT_DD_MM_YYYY_2 = "dd/MM/yyyy";
//     private static final String FORMAT_YYYY_MM_DD_1 = "yyyy-MM-dd";
//     private static final String FORMAT_YYYY_MM_DD_2 = "yyyy/MM/dd";
// 
//     private static final String[] DATE_FORMATS = {
//         FORMAT_DD_MM_YYYY_1,
//         FORMAT_DD_MM_YYYY_2,
//         FORMAT_YYYY_MM_DD_1,
//         FORMAT_YYYY_MM_DD_2,
//     };
// 
// 
//     private DateTimeUtils() {
//         throw new UnsupportedOperationException();
//     }
// 
// 
//     public static Collection<Format> createDefaultDateFormats() {
//         return createDateFormats(DATE_FORMATS);
//     }
// 
//     public static Collection<Format> createDateFormats(final String... formats) {
//         final ImmutableList.Builder<Format> builder = ImmutableList.builder();
//         for (final String format : formats) {
//             final FastDateFormat instance = FastDateFormat.getInstance(format);
//             builder.add(instance);
//         }
//         return builder.build();
//     }
// 
//     public static Date parseDate(final String rawDate, final Collection<Format> formats) {
//         final String date = StringUtils.trimToNull(rawDate);
//         if (date != null) {
//             for (final Format format : formats) {
//                 final Date parsedDate = parseDate(date, format);
//                 if (parsedDate != null) {
//                     return parsedDate;
//                 }
//             }
//         }
//         return null;
//     }
// 
//     public static Date parseDate(final String date, final Format format) {
//         try {
//             return (Date) format.parseObject(date);
//         } catch (final Exception ignored) {
//             return null;
//         }
//     }
// 
// }


// Path: jackdaw-apt/src/main/java/com/github/vbauer/jackdaw/code/generator/JMessageCodeGenerator.java
import com.github.vbauer.jackdaw.annotation.JMessage;
import com.github.vbauer.jackdaw.code.base.BaseCodeGenerator;
import com.github.vbauer.jackdaw.code.context.CodeGeneratorContext;
import com.github.vbauer.jackdaw.util.DateTimeUtils;
import com.github.vbauer.jackdaw.util.MessageUtils;
import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic;
import java.text.Format;
import java.util.Collection;
import java.util.Date;
import java.util.List;

package com.github.vbauer.jackdaw.code.generator;



/**
 * @author Vladislav Bauer
 */

public class JMessageCodeGenerator extends BaseCodeGenerator {

    private static final Collection<Format> DATE_FORMATS =
        DateTimeUtils.createDefaultDateFormats();


    @Override
    public final Class<JMessage> getAnnotation() {
        return JMessage.class;
    }

    @Override
    public final void generate(final CodeGeneratorContext context) {