001 /**
002 * Copyright 2005-2014 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 */
016 package org.kuali.rice.ksb.messaging.web;
017
018 import org.apache.commons.lang.StringUtils;
019 import org.apache.log4j.Logger;
020 import org.apache.struts.action.ActionForm;
021 import org.apache.struts.action.ActionForward;
022 import org.apache.struts.action.ActionMapping;
023 import org.apache.struts.action.ActionMessages;
024 import org.kuali.rice.core.api.config.CoreConfigHelper;
025 import org.kuali.rice.core.api.config.property.ConfigContext;
026 import org.kuali.rice.core.api.util.RiceUtilities;
027 import org.kuali.rice.ksb.api.KsbApiServiceLocator;
028 import org.kuali.rice.ksb.api.bus.Endpoint;
029 import org.kuali.rice.ksb.api.bus.ServiceBus;
030 import org.kuali.rice.ksb.api.bus.ServiceConfiguration;
031 import org.kuali.rice.ksb.api.registry.ServiceInfo;
032 import org.kuali.rice.ksb.api.registry.ServiceRegistry;
033
034 import javax.servlet.ServletException;
035 import javax.servlet.http.HttpServletRequest;
036 import javax.servlet.http.HttpServletResponse;
037 import javax.xml.namespace.QName;
038 import java.io.IOException;
039 import java.util.ArrayList;
040 import java.util.List;
041 import 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 */
049 public 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 serviceEndpointsToDelete.add(serviceInfo.getServiceId());
078 }
079 }
080 serviceRegistry.removeServiceEndpoints(serviceEndpointsToDelete);
081 KsbApiServiceLocator.getServiceBus().synchronize();
082 return mapping.findForward("basic");
083 }
084
085 public ActionForward deleteApplicationIdEntries(ActionMapping mapping, ActionForm form, HttpServletRequest request,
086 HttpServletResponse response) throws IOException, ServletException {
087
088 final String applicationId = request.getParameter(REMOVED_APPLICATION_ID_PARAM);
089 if(StringUtils.isNotBlank(applicationId)) {
090 ServiceRegistry serviceRegistry = KsbApiServiceLocator.getServiceRegistry();
091 List<ServiceInfo> serviceInfos = serviceRegistry.getAllOnlineServices();
092 List<String> serviceEndpointsToDelete = new ArrayList<String>();
093 for (ServiceInfo serviceInfo : serviceInfos) {
094 if (serviceInfo.getApplicationId().equals(applicationId)) {
095 serviceEndpointsToDelete.add(serviceInfo.getServiceId());
096 }
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 }