package com.webobjects.monitor.wotaskd.rest.controllers; import com.webobjects.appserver.WOActionResults; import com.webobjects.appserver.WORequest; import com.webobjects.foundation.NSArray; import com.webobjects.foundation.NSDictionary; import com.webobjects.monitor._private.MApplication; import com.webobjects.monitor._private.MHost; import com.webobjects.monitor._private.MInstance; import com.webobjects.monitor._private.MObject; import com.webobjects.monitor._private.MonitorException; import com.webobjects.monitor.wotaskd.DirectAction; import er.extensions.appserver.ERXHttpStatusCodes; import er.extensions.eof.ERXKeyFilter; import er.extensions.eof.ERXQ; public class MApplicationController extends JavaMonitorController { public MApplicationController(WORequest request) { super(request); } @Override public WOActionResults createAction() throws Throwable { checkPassword(); ERXKeyFilter filter = ERXKeyFilter.filterWithAttributes(); MApplication application = create(filter); siteConfig().addApplication_W(application); return response(application, filter); } @Override public WOActionResults destroyAction() throws Throwable { checkPassword(); MApplication application = (MApplication) routeObjectForKey("mApplication"); deleteApplication(application); return response(application, ERXKeyFilter.filterWithNone()); } @Override public WOActionResults indexAction() throws Throwable { checkPassword(); return response(siteConfig().applicationArray(), ERXKeyFilter.filterWithAttributes()); } @Override public WOActionResults showAction() throws Throwable { checkPassword(); MApplication application = (MApplication) routeObjectForKey("mApplication"); return response(application, ERXKeyFilter.filterWithAttributes()); } @Override public WOActionResults updateAction() throws Throwable { checkPassword(); MApplication application = (MApplication) routeObjectForKey("mApplication"); update(application, ERXKeyFilter.filterWithAttributes()); return response(application, ERXKeyFilter.filterWithAttributes()); } public WOActionResults addInstanceAction() throws Throwable { checkPassword(); MApplication application = (MApplication) routeObjectForKey("name"); // Old code. The if statement replaces this code along with the addInstanceOnAllHostsAction() method. kib 20110622 // addInstance(application, (MHost)routeObjectForKey("host"), false); if (request().stringFormValueForKey("host") != null) { MHost mHost = siteConfig().hostWithName(request().stringFormValueForKey("host")); addInstance(application, mHost, false); } else addInstance(application, null, true); return response(application, ERXKeyFilter.filterWithNone()); } public WOActionResults deleteInstanceAction() throws Throwable { checkPassword(); MApplication application = (MApplication) routeObjectForKey("name"); deleteInstance(application, Integer.valueOf(request().stringFormValueForKey("id"))); return response(application, ERXKeyFilter.filterWithNone()); } public WOActionResults addInstanceOnAllHostsAction() throws Throwable { checkPassword(); MApplication application = (MApplication) routeObjectForKey("name"); addInstance(application, null, true); return response(application, ERXKeyFilter.filterWithNone()); } private void addInstance(MApplication application, MHost host, boolean addToAllHosts) { try { if (addToAllHosts) { for (MHost aHost : siteConfig().hostArray()) { siteConfig().addInstances_M(aHost, application, 1); } } else { siteConfig().addInstances_M(host, application, 1); } } finally { } } private void deleteInstance(MApplication application, Integer instanceId) { final MInstance instance = application.instanceWithID(instanceId); try { siteConfig().removeInstance_M(instance); } finally { } } private void deleteApplication(MApplication application) { try { siteConfig().removeApplication_M(application); } finally { } } public WOActionResults infoAction() { checkPassword(); return response(instancesArray(), instanceFilter()); } protected NSArray<MInstance> instancesArray() { MApplication application = (MApplication) routeObjectForKey("name"); String id = request().stringFormValueForKey("id"); NSArray<MInstance> instances = siteConfig().instanceArray(); if (application != null) { if (id != null) { instances = ERXQ.filtered(siteConfig().instanceArray(), ERXQ.is("applicationName", application.name()).and(ERXQ.is("id", id))); } else { instances = ERXQ.filtered(siteConfig().instanceArray(), ERXQ.is("applicationName", application.name())); } } return instances; } public WOActionResults isRunningAction() { checkPassword(); NSArray<MInstance> instances = instancesArray(); String num = (String) context().request().formValueForKey("num"); int numberOfInstancesRequested = -1; if (num != null && !num.equals("") && !num.equalsIgnoreCase("all")) { try { numberOfInstancesRequested = Integer.valueOf(num).intValue(); if (numberOfInstancesRequested > instances.count()) { numberOfInstancesRequested = -1; } } catch (Exception e) { // ignore } } int instancesAlive = 0; for (MInstance minstance: instances) { if (minstance.state == MObject.ALIVE) { instancesAlive++; } } String status = "YES"; if ((numberOfInstancesRequested == -1 && instancesAlive < instances.count()) || instancesAlive < numberOfInstancesRequested) { status = "NO"; } return response(status, ERXKeyFilter.filterWithAll()); } public WOActionResults isStoppedAction() { checkPassword(); String status = "YES"; for (MInstance minstance: instancesArray()) { if (minstance.state == MObject.DEAD) continue; status = "NO"; break; } return response(status, ERXKeyFilter.filterWithAll()); } public WOActionResults stopAction() throws MonitorException { checkPassword(); for (MInstance minstance: instancesArray()) { if (minstance.state == MObject.ALIVE || minstance.state == MObject.STARTING) { minstance.state = MObject.STOPPING; if (application().localMonitor().stopInstance(minstance) == null) throw new MonitorException("No response to STOP " + minstance.displayName()); } } return response(ERXHttpStatusCodes.OK); } public WOActionResults startAction() { checkPassword(); for (MInstance minstance: instancesArray()) { if (minstance.state == MObject.DEAD || minstance.state == MObject.STOPPING || minstance.state == MObject.CRASHING || minstance.state == MObject.UNKNOWN) { minstance.state = MObject.STARTING; String errorMsg = application().localMonitor().startInstance(minstance); if (errorMsg != null) { NSDictionary element = new NSDictionary(new Object[]{Boolean.FALSE, errorMsg}, DirectAction.errorKeys); return response(element, ERXKeyFilter.filterWithAttributes()); } } } return response(ERXHttpStatusCodes.OK); } public WOActionResults forceQuitAction() throws MonitorException { for (MInstance minstance: instancesArray()) { minstance.state = MObject.STOPPING; if (application().localMonitor().terminateInstance(minstance) == null) throw new MonitorException("No response to STOP " + minstance.displayName()); } return response(ERXHttpStatusCodes.OK); } public ERXKeyFilter instanceFilter() { ERXKeyFilter filter = ERXKeyFilter.filterWithNone(); filter.include("applicationName"); filter.include("id"); filter.include("host.name"); filter.include("port"); filter.include("deaths"); filter.include("isRefusingNewSessions"); filter.include("isScheduled"); filter.include("schedulingHourlyStartTime"); filter.include("schedulingDailyStartTime"); filter.include("schedulingWeeklyStartTime"); filter.include("schedulingType"); filter.include("schedulingStartDay"); filter.include("schedulingInterval"); filter.include("transactions"); filter.include("activeSessions"); filter.include("averageIdlePeriod"); filter.include("avgTransactionTime"); filter.include("isAutoRecovering"); return filter; } }