// Path: services/google/api/src/main/java/eu/hlavki/identity/services/google/ResourceNotFoundException.java
// public class ResourceNotFoundException extends RuntimeException {
// 
//     private static final long serialVersionUID = 1L;
// 
// 
//     public ResourceNotFoundException() {
//     }
// 
// 
//     public ResourceNotFoundException(String message) {
//         super(message);
//     }
// 
// 
//     public ResourceNotFoundException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
// 
//     public ResourceNotFoundException(Throwable cause) {
//         super(cause);
//     }
// 
// 
//     public ResourceNotFoundException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
//         super(message, cause, enableSuppression, writableStackTrace);
//     }
// }
// 
// Path: services/ldap/api/src/main/java/eu/hlavki/identity/services/ldap/LdapSystemException.java
// public class LdapSystemException extends RuntimeException {
// 
//     private static final long serialVersionUID = 1L;
// 
// 
//     public LdapSystemException(String message) {
//         super(message);
//     }
// 
// 
//     public LdapSystemException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
// 
//     public LdapSystemException(Throwable cause) {
//         super(cause);
//     }
// 
// 
//     public LdapSystemException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
//         super(message, cause, enableSuppression, writableStackTrace);
//     }
// }
// 
// Path: services/google/push/src/main/java/eu/hlavki/identity/services/push/config/Configuration.java
// public interface Configuration {
// 
//     public static final String TOPIC_CHANGE = "eu/hlavki/identity/push/Configuration/CHANGED";
// 
//     boolean isEnabled();
// }
// 
// Path: services/google/push/src/main/java/eu/hlavki/identity/services/push/model/AuditRecord.java
// @Getter
// @Setter
// @NoArgsConstructor
// @XmlAccessorType(XmlAccessType.FIELD)
// @XmlRootElement
// public class AuditRecord {
// 
//     private String kind;
//     private Id id;
//     private String etag;
//     private String ipAddress;
//     private List<Event> events;
// 
//     @Getter
//     @Setter
//     @NoArgsConstructor
//     @XmlAccessorType(XmlAccessType.FIELD)
//     public static class Id {
// 
//         @XmlJavaTypeAdapter(ZonedDateTimeAdapter.class)
//         private ZonedDateTime time;
//         private Long uniqueQualifier;
//         private String applicationName;
//         private String customerId;
//     }
// 
//     @Getter
//     @Setter
//     @NoArgsConstructor
//     @XmlAccessorType(XmlAccessType.FIELD)
//     public static class Actor {
// 
//         private String callerType;
//         private String email;
//         private String profileId;
//     }
// 
//     @Getter
//     @Setter
//     @NoArgsConstructor
//     @ToString
//     @XmlAccessorType(XmlAccessType.FIELD)
//     public static class Event {
// 
//         private EventType type;
//         private String name;
//         private Long profileId;
//         private List<Parameter> parameters;
//     }
// 
//     @Getter
//     @Setter
//     @NoArgsConstructor
//     @ToString
//     @XmlAccessorType(XmlAccessType.FIELD)
//     public static class Parameter {
// 
//         private String name;
//         private String value;
//         private Integer intValue;
//         private Boolean boolValue;
//     }
// }
// 
// Path: services/google/push/src/main/java/eu/hlavki/identity/services/push/model/AuditRecord.java
// @Getter
// @Setter
// @NoArgsConstructor
// @ToString
// @XmlAccessorType(XmlAccessType.FIELD)
// public static class Event {
// 
//     private EventType type;
//     private String name;
//     private Long profileId;
//     private List<Parameter> parameters;
// }
// 
// Path: services/synchronize/api/src/main/java/eu/hlavki/identity/services/sync/AccountSyncService.java
// public interface AccountSyncService {
// 
//     void synchronizeUserGroups(UserInfo userInfo);
// 
// 
//     void synchronizeGroup(String groupEmail) throws ResourceNotFoundException;
// 
// 
//     void removeGroup(String groupEmail);
// 
// 
//     void synchronizeAllGroups();
// 
// 
//     void synchronizeGSuiteUser(String email);
// 
// 
//     void synchronizeGSuiteUsers();
// 
// 
//     void removeUserByEmail(String email);
// 
// 
//     void cleanExternalUsers();
// }


import eu.hlavki.identity.services.google.ResourceNotFoundException;
import eu.hlavki.identity.services.ldap.LdapSystemException;
import eu.hlavki.identity.services.push.config.Configuration;
import eu.hlavki.identity.services.push.model.AuditRecord;
import eu.hlavki.identity.services.push.model.AuditRecord.Event;
import eu.hlavki.identity.services.sync.AccountSyncService;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
        }
    }

    private void syncGroup(Event evt) {
        try {
            syncService.synchronizeGroup(getGroupEmail(evt));
            syncService.cleanExternalUsers();
        } catch (LdapSystemException | ResourceNotFoundException e) {
            log.error("Cannot process event " + evt + " because of error!", e);
        }
    }

    private void syncUser(Event evt) {
        try {
            syncService.synchronizeGSuiteUser(getUserEmail(evt));
        } catch (LdapSystemException | ResourceNotFoundException e) {
            log.error("Cannot process event " + evt + " because of error!", e);
        }
    }

    private void deleteGroup(Event evt) {
        try {
            syncService.removeGroup(getGroupEmail(evt));
        } catch (LdapSystemException e) {
            log.error("Cannot remove group from event " + evt + " because of error!", e);
        }
    }

    private void deleteUser(Event evt) {
        try {
// Path: services/google/api/src/main/java/eu/hlavki/identity/services/google/ResourceNotFoundException.java
// public class ResourceNotFoundException extends RuntimeException {
// 
//     private static final long serialVersionUID = 1L;
// 
// 
//     public ResourceNotFoundException() {
//     }
// 
// 
//     public ResourceNotFoundException(String message) {
//         super(message);
//     }
// 
// 
//     public ResourceNotFoundException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
// 
//     public ResourceNotFoundException(Throwable cause) {
//         super(cause);
//     }
// 
// 
//     public ResourceNotFoundException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
//         super(message, cause, enableSuppression, writableStackTrace);
//     }
// }
// 
// Path: services/ldap/api/src/main/java/eu/hlavki/identity/services/ldap/LdapSystemException.java
// public class LdapSystemException extends RuntimeException {
// 
//     private static final long serialVersionUID = 1L;
// 
// 
//     public LdapSystemException(String message) {
//         super(message);
//     }
// 
// 
//     public LdapSystemException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
// 
//     public LdapSystemException(Throwable cause) {
//         super(cause);
//     }
// 
// 
//     public LdapSystemException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
//         super(message, cause, enableSuppression, writableStackTrace);
//     }
// }
// 
// Path: services/google/push/src/main/java/eu/hlavki/identity/services/push/config/Configuration.java
// public interface Configuration {
// 
//     public static final String TOPIC_CHANGE = "eu/hlavki/identity/push/Configuration/CHANGED";
// 
//     boolean isEnabled();
// }
// 
// Path: services/google/push/src/main/java/eu/hlavki/identity/services/push/model/AuditRecord.java
// @Getter
// @Setter
// @NoArgsConstructor
// @XmlAccessorType(XmlAccessType.FIELD)
// @XmlRootElement
// public class AuditRecord {
// 
//     private String kind;
//     private Id id;
//     private String etag;
//     private String ipAddress;
//     private List<Event> events;
// 
//     @Getter
//     @Setter
//     @NoArgsConstructor
//     @XmlAccessorType(XmlAccessType.FIELD)
//     public static class Id {
// 
//         @XmlJavaTypeAdapter(ZonedDateTimeAdapter.class)
//         private ZonedDateTime time;
//         private Long uniqueQualifier;
//         private String applicationName;
//         private String customerId;
//     }
// 
//     @Getter
//     @Setter
//     @NoArgsConstructor
//     @XmlAccessorType(XmlAccessType.FIELD)
//     public static class Actor {
// 
//         private String callerType;
//         private String email;
//         private String profileId;
//     }
// 
//     @Getter
//     @Setter
//     @NoArgsConstructor
//     @ToString
//     @XmlAccessorType(XmlAccessType.FIELD)
//     public static class Event {
// 
//         private EventType type;
//         private String name;
//         private Long profileId;
//         private List<Parameter> parameters;
//     }
// 
//     @Getter
//     @Setter
//     @NoArgsConstructor
//     @ToString
//     @XmlAccessorType(XmlAccessType.FIELD)
//     public static class Parameter {
// 
//         private String name;
//         private String value;
//         private Integer intValue;
//         private Boolean boolValue;
//     }
// }
// 
// Path: services/google/push/src/main/java/eu/hlavki/identity/services/push/model/AuditRecord.java
// @Getter
// @Setter
// @NoArgsConstructor
// @ToString
// @XmlAccessorType(XmlAccessType.FIELD)
// public static class Event {
// 
//     private EventType type;
//     private String name;
//     private Long profileId;
//     private List<Parameter> parameters;
// }
// 
// Path: services/synchronize/api/src/main/java/eu/hlavki/identity/services/sync/AccountSyncService.java
// public interface AccountSyncService {
// 
//     void synchronizeUserGroups(UserInfo userInfo);
// 
// 
//     void synchronizeGroup(String groupEmail) throws ResourceNotFoundException;
// 
// 
//     void removeGroup(String groupEmail);
// 
// 
//     void synchronizeAllGroups();
// 
// 
//     void synchronizeGSuiteUser(String email);
// 
// 
//     void synchronizeGSuiteUsers();
// 
// 
//     void removeUserByEmail(String email);
// 
// 
//     void cleanExternalUsers();
// }


// Path: services/google/push/src/main/java/eu/hlavki/identity/services/push/rest/PushNotificationRest.java
import eu.hlavki.identity.services.google.ResourceNotFoundException;
import eu.hlavki.identity.services.ldap.LdapSystemException;
import eu.hlavki.identity.services.push.config.Configuration;
import eu.hlavki.identity.services.push.model.AuditRecord;
import eu.hlavki.identity.services.push.model.AuditRecord.Event;
import eu.hlavki.identity.services.sync.AccountSyncService;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

        }
    }

    private void syncGroup(Event evt) {
        try {
            syncService.synchronizeGroup(getGroupEmail(evt));
            syncService.cleanExternalUsers();
        } catch (LdapSystemException | ResourceNotFoundException e) {
            log.error("Cannot process event " + evt + " because of error!", e);
        }
    }

    private void syncUser(Event evt) {
        try {
            syncService.synchronizeGSuiteUser(getUserEmail(evt));
        } catch (LdapSystemException | ResourceNotFoundException e) {
            log.error("Cannot process event " + evt + " because of error!", e);
        }
    }

    private void deleteGroup(Event evt) {
        try {
            syncService.removeGroup(getGroupEmail(evt));
        } catch (LdapSystemException e) {
            log.error("Cannot remove group from event " + evt + " because of error!", e);
        }
    }

    private void deleteUser(Event evt) {
        try {
            syncService.removeUserByEmail(getUserEmail(evt));