001/**
002 * Copyright 2005-2016 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.kuali.rice.ksb.messaging.web;
017
018import org.apache.commons.lang.StringUtils;
019import org.apache.log4j.Logger;
020import org.apache.struts.action.ActionForm;
021import org.apache.struts.action.ActionForward;
022import org.apache.struts.action.ActionMapping;
023import org.apache.struts.action.ActionMessages;
024import org.kuali.rice.core.api.config.CoreConfigHelper;
025import org.kuali.rice.core.api.config.property.ConfigContext;
026import org.kuali.rice.core.api.util.RiceUtilities;
027import org.kuali.rice.ksb.api.KsbApiServiceLocator;
028import org.kuali.rice.ksb.api.bus.Endpoint;
029import org.kuali.rice.ksb.api.bus.ServiceBus;
030import org.kuali.rice.ksb.api.bus.ServiceConfiguration;
031import org.kuali.rice.ksb.api.registry.ServiceInfo;
032import org.kuali.rice.ksb.api.registry.ServiceRegistry;
033
034import javax.servlet.ServletException;
035import javax.servlet.http.HttpServletRequest;
036import javax.servlet.http.HttpServletResponse;
037import javax.xml.namespace.QName;
038import java.io.IOException;
039import java.util.ArrayList;
040import java.util.List;
041import java.util.Map;
042
043
044/**
045 * Struts action for interacting with the queue of messages.
046 *
047 * @author Kuali Rice Team (rice.collab@kuali.org)
048 */
049public class ServiceRegistryAction extends KSBAction {
050
051        private static final String REMOVED_APPLICATION_ID_PARAM = "removedApplicationId";
052    private static final Logger LOG = Logger.getLogger(ServiceRegistryAction.class);
053
054    public ActionForward start(ActionMapping mapping, ActionForm form, HttpServletRequest request,
055            HttpServletResponse response) throws IOException, ServletException {
056        return mapping.findForward("basic");
057    }
058
059    public ActionForward refreshServiceRegistry(ActionMapping mapping, ActionForm form, HttpServletRequest request,
060        HttpServletResponse response) throws IOException, ServletException {
061        // TODO is this what really constitutes a "refresh" of the service registry?
062        KsbApiServiceLocator.getServiceBus().synchronize();
063        return mapping.findForward("basic");
064    }
065    
066        /**
067     * Enable deletion of localhost service registry entries.
068     */
069    public ActionForward deleteLocalhostEntries(ActionMapping mapping, ActionForm form, HttpServletRequest request,
070                HttpServletResponse response) throws IOException, ServletException {
071        ServiceRegistry serviceRegistry = KsbApiServiceLocator.getServiceRegistry();
072        List<ServiceInfo> serviceInfos = serviceRegistry.getAllOnlineServices();
073        List<String> serviceEndpointsToDelete = new ArrayList<String>();
074        for (ServiceInfo serviceInfo : serviceInfos) {
075            if (serviceInfo.getServerIpAddress().equals("localhost") ||
076                    serviceInfo.getEndpointUrl().contains("localhost") ||
077                    serviceInfo.getServerIpAddress().equals("127.0.0.1") ||
078                    serviceInfo.getEndpointUrl().contains("127.0.0.1")) {
079                serviceEndpointsToDelete.add(serviceInfo.getServiceId());
080            }
081        }
082        serviceRegistry.removeServiceEndpoints(serviceEndpointsToDelete);
083        KsbApiServiceLocator.getServiceBus().synchronize();
084                return mapping.findForward("basic");
085    }
086
087    public ActionForward deleteApplicationIdEntries(ActionMapping mapping, ActionForm form, HttpServletRequest request,
088            HttpServletResponse response) throws IOException, ServletException {
089        
090        final String applicationId = request.getParameter(REMOVED_APPLICATION_ID_PARAM);
091        if(StringUtils.isNotBlank(applicationId)) {
092            ServiceRegistry serviceRegistry = KsbApiServiceLocator.getServiceRegistry();
093            List<ServiceInfo> serviceInfos = serviceRegistry.getAllServicesForApplication(applicationId);
094            List<String> serviceEndpointsToDelete = new ArrayList<String>();
095            for (ServiceInfo serviceInfo : serviceInfos) {
096                serviceEndpointsToDelete.add(serviceInfo.getServiceId());
097            }
098            serviceRegistry.removeServiceEndpoints(serviceEndpointsToDelete);
099            KsbApiServiceLocator.getServiceBus().synchronize();
100        } else {
101            LOG.info("No rows were deleted from the KRSB_SVC_DEF_T table because the application ID was null or blank.");
102        }
103
104        return mapping.findForward("basic");
105    }
106
107    public ActionMessages establishRequiredState(HttpServletRequest request, ActionForm actionForm) throws Exception {
108        ServiceRegistryForm form = (ServiceRegistryForm)actionForm;
109        form.setMyIpAddress(RiceUtilities.getIpNumber());
110        form.setMyApplicationId(CoreConfigHelper.getApplicationId());
111        form.setDevMode(ConfigContext.getCurrentContextConfig().getDevMode());
112        ServiceBus serviceBus = KsbApiServiceLocator.getServiceBus();
113        form.setMyInstanceId(serviceBus.getInstanceId());
114        form.setPublishedServices(getPublishedServices(serviceBus));
115        ServiceRegistry serviceRegistry = KsbApiServiceLocator.getServiceRegistry();
116        form.setGlobalRegistryServices(getGlobalRegistryServices(serviceRegistry));
117
118        return null;
119    }
120
121    private List<ServiceConfiguration> getPublishedServices(ServiceBus serviceBus) {
122        Map<QName, Endpoint> localEndpoints = serviceBus.getLocalEndpoints();
123        List<ServiceConfiguration> publishedServices = new ArrayList<ServiceConfiguration>();
124        for (Endpoint endpoint : localEndpoints.values()) {
125                publishedServices.add(endpoint.getServiceConfiguration());
126        }
127        return publishedServices;
128    }
129
130    private List<ServiceInfo> getGlobalRegistryServices(ServiceRegistry serviceRegistry) {
131        return serviceRegistry.getAllServices();
132    }
133
134}