package com.log.core;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
import com.log.model.ApplicationObject;
@Component
public class RegistrationContainer {
private static final Logger LOGGER = Logger
.getLogger(RegistrationContainer.class);
private Map<String, List<ApplicationRegistration>> registrations;
public RegistrationContainer() {
registrations = new HashMap<String, List<ApplicationRegistration>>();
}
public void appendLog(ApplicationObject object) {
String applicationId = object.getApplicationId();
List<ApplicationRegistration> applicationRegistrations = null;
synchronized (registrations) {
applicationRegistrations = registrations.get(applicationId);
}
if (applicationRegistrations != null) {
synchronized (applicationRegistrations) {
for (ApplicationRegistration applicationRegistration : applicationRegistrations) {
applicationRegistration.appendLog(object);
}
}
}
}
public void appendObjects(List<? extends ApplicationObject> objects) {
if(objects.isEmpty()) {
return;
}
String applicationId = objects.get(0).getApplicationId();
List<ApplicationRegistration> applicationRegistrations = null;
synchronized (registrations) {
applicationRegistrations = registrations.get(applicationId);
}
if (applicationRegistrations != null) {
synchronized (applicationRegistrations) {
for (ApplicationRegistration applicationRegistration : applicationRegistrations) {
for(ApplicationObject object : objects) {
assert object.getApplicationId().equals(applicationId);
applicationRegistration.appendLog(object);
}
}
}
}
}
public void register(ApplicationRegistration applicationRegistration) {
String applicationId = applicationRegistration.getApplication().getId();
LOGGER.info(String.format("Register application %s", applicationId));
synchronized (registrations) {
if(!registrations.containsKey(applicationId)) {
registrations.put(applicationId, new ArrayList<ApplicationRegistration>());
}
synchronized (registrations.get(applicationId)) {
registrations.get(applicationId).add(applicationRegistration);
}
}
}
public void unregister(ApplicationRegistration applicationRegistration) {
String applicationId = applicationRegistration.getApplication().getId();
LOGGER.info(String.format("Unregister application %s", applicationId));
synchronized (registrations) {
if(registrations.containsKey(applicationId)) {
synchronized (registrations.get(applicationId)) {
registrations.get(applicationId).remove(applicationRegistration);
}
}
}
}
}