// Path: src/main/java/com/github/easyjsonapi/adapters/EasyJsonApiTypeToken.java
// public enum EasyJsonApiTypeToken {
// 
//     TOKEN_ATTR("TOKEN_ATTR"), TOKEN_DEFAULT("TOKEN_DEFAULT"), TOKEN_LINKS("TOKEN_LINKS"), TOKEN_META("TOKEN_META"), TOKEN_META_RELATIONSHIP(
//             "TOKEN_META_RELATIONSHIP");
// 
//     private String key;
// 
//     private EasyJsonApiTypeToken(String key) {
//         this.key = key;
//     }
// 
//     /**
//      * @return the key
//      */
//     public String getKey() {
//         return key;
//     }
// 
// }
// 
// Path: src/main/java/com/github/easyjsonapi/asserts/Assert.java
// public class Assert {
// 
//     /**
//      * Check if string is null or empty
//      * 
//      * @param value the string value
//      * @return true if string is null or empty and false when occur the opposite
//      */
//     public static boolean isEmpty(String value) {
// 
//         if (value != null && !value.isEmpty()) {
//             return false;
//         }
//         return true;
//     }
// 
//     /**
//      * Check if object is null
//      * 
//      * @param value the object value
//      * @return true if object is null and false when occur the opposite
//      */
//     public static boolean isNull(Object value) {
//         if (value == null) {
//             return true;
//         }
// 
//         return false;
//     }
// 
//     /**
//      * Check if list of objects are null
//      * 
//      * @param values the list with objects
//      * @return true if list with objects are null and false when occur the
//      *         opposite
//      */
//     public static boolean isNull(Object... values) {
// 
//         boolean anyNotNullable = false;
// 
//         int index = 0;
// 
//         while (index < values.length && !anyNotNullable) {
//             if (notNull(values[index])) {
//                 anyNotNullable = true;
//             }
//             index++;
//         }
// 
//         return !anyNotNullable;
//     }
// 
//     /**
//      * Check if string is not null or empty
//      * 
//      * @param value the string value
//      * @return true if string has value and false when string is null or empty
//      */
//     public static boolean notEmpty(String value) {
//         return !isEmpty(value);
//     }
// 
//     /**
//      * Check if object is null
//      * 
//      * @param value the object value
//      * @return true if object has value and false when object is null
//      */
//     public static boolean notNull(Object value) {
//         return !isNull(value);
//     }
// 
// }
// 
// Path: src/main/java/com/github/easyjsonapi/exceptions/EasyJsonApiInvalidPackageException.java
// public class EasyJsonApiInvalidPackageException extends EasyJsonApiException {
// 
//     /**
//      * UID Generated
//      */
//     private static final long serialVersionUID = -1850836160599521183L;
// 
//     public EasyJsonApiInvalidPackageException(String message) {
//         super(message);
//     }
// 
//     public EasyJsonApiInvalidPackageException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
// }


import com.github.easyjsonapi.exceptions.EasyJsonApiInvalidPackageException;
import com.google.common.reflect.ClassPath;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.github.easyjsonapi.adapters.EasyJsonApiTypeToken;
import com.github.easyjsonapi.annotations.Attributes;
import com.github.easyjsonapi.annotations.Meta;
import com.github.easyjsonapi.annotations.MetaRelationship;
import com.github.easyjsonapi.asserts.Assert;
/*
 * #%L
 * EasyJsonApi
 * %%
 * Copyright (C) 2016 EasyJsonApi
 * %%
 * 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.
 * #L%
 */
package com.github.easyjsonapi.core;



/**
 * The EasyJsonApiConfig it is necessary to configure the {@link EasyJsonApi}.
 * This class allows to parsing the packages defined into the
 * {@link EasyJsonApiConfig#packagesSearched} inside the class
 * 
 * @author Nuno Bento (nbento.neves@gmail.com)
 * @version %I%, %G%
 */
public class EasyJsonApiConfig {

    private Map<EasyJsonApiTypeToken, List<Class<?>>> classesParsed = new HashMap<>();

    private String[] packagesSearched;

    /**
     * The default constructor
     */
    public EasyJsonApiConfig() {}

    /**
     * The constructor with packages attributes
     * 
     * @param packages
     *            the packages needs to be search and parsing
     * @throws EasyJsonApiInvalidPackageException
     */
// Path: src/main/java/com/github/easyjsonapi/adapters/EasyJsonApiTypeToken.java
// public enum EasyJsonApiTypeToken {
// 
//     TOKEN_ATTR("TOKEN_ATTR"), TOKEN_DEFAULT("TOKEN_DEFAULT"), TOKEN_LINKS("TOKEN_LINKS"), TOKEN_META("TOKEN_META"), TOKEN_META_RELATIONSHIP(
//             "TOKEN_META_RELATIONSHIP");
// 
//     private String key;
// 
//     private EasyJsonApiTypeToken(String key) {
//         this.key = key;
//     }
// 
//     /**
//      * @return the key
//      */
//     public String getKey() {
//         return key;
//     }
// 
// }
// 
// Path: src/main/java/com/github/easyjsonapi/asserts/Assert.java
// public class Assert {
// 
//     /**
//      * Check if string is null or empty
//      * 
//      * @param value the string value
//      * @return true if string is null or empty and false when occur the opposite
//      */
//     public static boolean isEmpty(String value) {
// 
//         if (value != null && !value.isEmpty()) {
//             return false;
//         }
//         return true;
//     }
// 
//     /**
//      * Check if object is null
//      * 
//      * @param value the object value
//      * @return true if object is null and false when occur the opposite
//      */
//     public static boolean isNull(Object value) {
//         if (value == null) {
//             return true;
//         }
// 
//         return false;
//     }
// 
//     /**
//      * Check if list of objects are null
//      * 
//      * @param values the list with objects
//      * @return true if list with objects are null and false when occur the
//      *         opposite
//      */
//     public static boolean isNull(Object... values) {
// 
//         boolean anyNotNullable = false;
// 
//         int index = 0;
// 
//         while (index < values.length && !anyNotNullable) {
//             if (notNull(values[index])) {
//                 anyNotNullable = true;
//             }
//             index++;
//         }
// 
//         return !anyNotNullable;
//     }
// 
//     /**
//      * Check if string is not null or empty
//      * 
//      * @param value the string value
//      * @return true if string has value and false when string is null or empty
//      */
//     public static boolean notEmpty(String value) {
//         return !isEmpty(value);
//     }
// 
//     /**
//      * Check if object is null
//      * 
//      * @param value the object value
//      * @return true if object has value and false when object is null
//      */
//     public static boolean notNull(Object value) {
//         return !isNull(value);
//     }
// 
// }
// 
// Path: src/main/java/com/github/easyjsonapi/exceptions/EasyJsonApiInvalidPackageException.java
// public class EasyJsonApiInvalidPackageException extends EasyJsonApiException {
// 
//     /**
//      * UID Generated
//      */
//     private static final long serialVersionUID = -1850836160599521183L;
// 
//     public EasyJsonApiInvalidPackageException(String message) {
//         super(message);
//     }
// 
//     public EasyJsonApiInvalidPackageException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
// }


// Path: src/main/java/com/github/easyjsonapi/core/EasyJsonApiConfig.java
import com.github.easyjsonapi.exceptions.EasyJsonApiInvalidPackageException;
import com.google.common.reflect.ClassPath;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.github.easyjsonapi.adapters.EasyJsonApiTypeToken;
import com.github.easyjsonapi.annotations.Attributes;
import com.github.easyjsonapi.annotations.Meta;
import com.github.easyjsonapi.annotations.MetaRelationship;
import com.github.easyjsonapi.asserts.Assert;

/*
 * #%L
 * EasyJsonApi
 * %%
 * Copyright (C) 2016 EasyJsonApi
 * %%
 * 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.
 * #L%
 */
package com.github.easyjsonapi.core;



/**
 * The EasyJsonApiConfig it is necessary to configure the {@link EasyJsonApi}.
 * This class allows to parsing the packages defined into the
 * {@link EasyJsonApiConfig#packagesSearched} inside the class
 * 
 * @author Nuno Bento (nbento.neves@gmail.com)
 * @version %I%, %G%
 */
public class EasyJsonApiConfig {

    private Map<EasyJsonApiTypeToken, List<Class<?>>> classesParsed = new HashMap<>();

    private String[] packagesSearched;

    /**
     * The default constructor
     */
    public EasyJsonApiConfig() {}

    /**
     * The constructor with packages attributes
     * 
     * @param packages
     *            the packages needs to be search and parsing
     * @throws EasyJsonApiInvalidPackageException
     */
    public EasyJsonApiConfig(String... packages) throws EasyJsonApiInvalidPackageException {