com.meltmedia.cadmium.core.lifecycle.LifecycleService.java Source code

Java tutorial

Introduction

Here is the source code for com.meltmedia.cadmium.core.lifecycle.LifecycleService.java

Source

/**
 *    Copyright 2012 meltmedia
 *
 *    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.meltmedia.cadmium.core.lifecycle;

import com.meltmedia.cadmium.core.ClusterMembers;
import com.meltmedia.cadmium.core.WarInfo;
import com.meltmedia.cadmium.core.commands.StateUpdateRequest;
import com.meltmedia.cadmium.core.messaging.ChannelMember;
import com.meltmedia.cadmium.core.messaging.Message;
import com.meltmedia.cadmium.core.messaging.MessageSender;
import com.meltmedia.cadmium.core.messaging.ProtocolMessage;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.ArrayList;
import java.util.List;

@Singleton
public class LifecycleService {
    private final Logger log = LoggerFactory.getLogger(getClass());

    @Inject
    @ClusterMembers
    List<ChannelMember> members;

    @Inject
    MessageSender sender;

    public void updateState(ChannelMember member, UpdateState state) {
        if (members != null && members.contains(member)) {
            log.info("Updating state of {} to {}", member.getAddress().toString(), state);
            member = members.get(members.indexOf(member));
            member.setState(state);
        }
    }

    public void updateConfigState(ChannelMember member, UpdateState state) {
        if (members != null && members.contains(member)) {
            log.info("Updating config state of {} to {}", member.getAddress().toString(), state);
            member = members.get(members.indexOf(member));
            member.setConfigState(state);
        }
    }

    public void updateWarInfo(ChannelMember member, WarInfo warInfo) {
        if (members != null && members.contains(member)) {
            log.info("Updating artifact info of {} to {}", member.getAddress().toString(),
                    ToStringBuilder.reflectionToString(warInfo));
            member = members.get(members.indexOf(member));
            member.setWarInfo(warInfo);
        }
    }

    public boolean isMe(ChannelMember member) {
        if (members != null && members.contains(member)) {
            return members.get(members.indexOf(member)).isMine();
        }
        return false;
    }

    public void updateMyState(UpdateState state) {
        updateMyState(state, null, true);
    }

    public void updateMyConfigState(UpdateState state) {
        updateMyConfigState(state, null, true);
    }

    public void updateMyState(UpdateState state, String uuid) {
        updateMyState(state, uuid, true);
    }

    public void updateMyConfigState(UpdateState state, String uuid) {
        updateMyConfigState(state, uuid, true);
    }

    public void updateMyState(UpdateState state, String uuid, boolean sendUpdate) {
        if (members != null) {
            for (ChannelMember member : members) {
                if (member.isMine()) {
                    UpdateState oldState = member.getState();
                    member.setState(state);
                    if (oldState != state) {
                        log.info("Updating my state to {} and sendUpdate is {}", state, sendUpdate);
                        if (sendUpdate) {
                            sendStateUpdate(null, uuid);
                        }
                    }
                }
            }
        }
    }

    public void updateMyConfigState(UpdateState state, String uuid, boolean sendUpdate) {
        if (members != null) {
            for (ChannelMember member : members) {
                if (member.isMine()) {
                    UpdateState oldState = member.getConfigState();
                    member.setConfigState(state);
                    if (oldState != state) {
                        log.info("Updating my config state to {} and sendUpdate is {}", state, sendUpdate);
                        if (sendUpdate) {
                            sendConfigStateUpdate(null, uuid);
                        }
                    }
                }
            }
        }
    }

    public void sendConfigStateUpdate(ChannelMember dest) {
        sendConfigStateUpdate(dest, null);
    }

    public void sendStateUpdate(ChannelMember dest) {
        sendStateUpdate(dest, null);
    }

    public void sendStateUpdate(ChannelMember dest, String uuid) {
        StateUpdateRequest request = new StateUpdateRequest();
        request.setState(getCurrentState().name());
        if (uuid != null) {
            request.setUuid(uuid);
        }
        Message<StateUpdateRequest> updateStateMsg = new Message<StateUpdateRequest>(ProtocolMessage.STATE_UPDATE,
                request);
        try {
            log.info("Sending state update message from state change!");
            sender.sendMessage(updateStateMsg, dest);
        } catch (Exception e) {
            log.warn("Failed to send state update: {}", e.getMessage());
        }
    }

    public void sendConfigStateUpdate(ChannelMember dest, String uuid) {
        StateUpdateRequest request = new StateUpdateRequest();
        request.setConfigState(getCurrentConfigState().name());
        if (uuid != null) {
            request.setUuid(uuid);
        }
        Message<StateUpdateRequest> updateStateMsg = new Message<StateUpdateRequest>(ProtocolMessage.STATE_UPDATE,
                request);

        try {
            log.info("Sending state update message from state change!");
            sender.sendMessage(updateStateMsg, dest);
        } catch (Exception e) {
            log.warn("Failed to send state update: {}", e.getMessage());
        }
    }

    public UpdateState getCurrentState() {
        if (members != null) {
            for (ChannelMember member : members) {
                if (member.isMine()) {
                    return member.getState();
                }
            }
        }
        return null;
    }

    public UpdateState getState(ChannelMember member) {
        if (members != null) {
            if (members.contains(member)) {
                return members.get(members.indexOf(member)).getState();
            }
        }
        return null;
    }

    public boolean allEquals(UpdateState state) {
        if (members != null) {
            log.info("Checking if all {} members are in {} state", members.size(), state);
            boolean allEqual = true;
            for (ChannelMember member : members) {
                if (member.getState() != state) {
                    allEqual = false;
                    break;
                }
            }
            return allEqual;
        }
        return false;
    }

    public UpdateState getCurrentConfigState() {
        if (members != null) {
            for (ChannelMember member : members) {
                if (member.isMine()) {
                    return member.getConfigState();
                }
            }
        }
        return null;
    }

    public UpdateState getConfigState(ChannelMember member) {
        if (members != null) {
            if (members.contains(member)) {
                return members.get(members.indexOf(member)).getConfigState();
            }
        }
        return null;
    }

    public boolean allEqualsConfig(UpdateState state) {
        if (members != null) {
            log.info("Checking if all {} members are in {} state", members.size(), state);
            boolean allEqual = true;
            for (ChannelMember member : members) {
                if (member.getConfigState() != state) {
                    allEqual = false;
                    break;
                }
            }
            return allEqual;
        }
        return false;
    }

    public List<ChannelMember> getPeirStates() {
        List<ChannelMember> peirMembers = new ArrayList<ChannelMember>();
        if (members != null) {
            for (ChannelMember member : members) {
                peirMembers
                        .add(new ChannelMember(member.getExternalIp(), member.getAddress(), member.isCoordinator(),
                                member.isMine(), member.getState(), member.getConfigState(), member.getWarInfo()));

            }
        }
        return peirMembers;
    }

    public void setMembers(List<ChannelMember> members) {
        this.members = members;
    }

    public void setSender(MessageSender sender) {
        this.sender = sender;
    }

}