/*
* #%L
* Wisdom-Framework
* %%
* Copyright (C) 2013 - 2014 Wisdom Framework
* %%
* 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.
* #L%
*/
package org.wisdom.monitor.extensions.wisdom;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.apache.felix.ipojo.ComponentInstance;
import org.apache.felix.ipojo.annotations.Requires;
import org.apache.felix.ipojo.architecture.Architecture;
import org.apache.felix.ipojo.architecture.InstanceDescription;
import org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceDescription;
import org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandlerDescription;
import org.wisdom.api.DefaultController;
import org.wisdom.api.annotations.Controller;
import org.wisdom.api.annotations.Route;
import org.wisdom.api.annotations.View;
import org.wisdom.api.content.Json;
import org.wisdom.api.http.HttpMethod;
import org.wisdom.api.http.Result;
import org.wisdom.api.router.Router;
import org.wisdom.api.security.Authenticated;
import org.wisdom.api.templates.Template;
import org.wisdom.monitor.service.MonitorExtension;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Provide information about controller.
* It also inspect invalid controller to determine the reason of the invalidity.
*/
@Controller
@Authenticated("Monitor-Authenticator")
public class ControllerExtension extends DefaultController implements MonitorExtension {
@View("monitor/controllers")
Template template;
@Requires
org.wisdom.api.Controller[] controllers;
@Requires
Router router;
@Requires
Json json;
@Requires
Architecture[] architectures;
/**
* @return the extension's main page.
*/
@Route(method = HttpMethod.GET, uri = "/monitor/controllers")
public Result index() {
return ok(render(template));
}
/**
* @return the JSON structure read by the HTML page.
*/
@Route(method = HttpMethod.GET, uri = "/monitor/controllers/controllers")
public Result getControllers() {
ObjectNode node = json.newObject();
ArrayNode array = json.newArray();
for (org.wisdom.api.Controller controller : controllers) {
array.add(ControllerModel.from(controller, router, json));
}
for (InstanceDescription description : getInvalidControllers()) {
array.add(ControllerModel.from(description, json));
}
node.put("controllers", array);
node.put("invalid", getInvalidControllers().size());
return ok(node);
}
private List<InstanceDescription> getInvalidControllers() {
List<InstanceDescription> invalid = new ArrayList<>();
for (Architecture architecture : architectures) {
final InstanceDescription description = architecture.getInstanceDescription();
// Is it invalid ?
if (description.getState() == ComponentInstance.INVALID) {
// Is it a controller
ProvidedServiceHandlerDescription hd = (ProvidedServiceHandlerDescription)
description.getHandlerDescription("org.apache.felix.ipojo:provides");
if (hd != null) {
for (ProvidedServiceDescription psd : hd.getProvidedServices()) {
if (Arrays.asList(psd.getServiceSpecifications()).contains(org.wisdom.api.Controller.class
.getName())) {
invalid.add(description);
}
}
}
}
}
return invalid;
}
/**
* @return {@literal Controllers}.
*/
@Override
public String label() {
return "Controllers";
}
/**
* @return {@literal /monitor/controllers}.
*/
@Override
public String url() {
return "/monitor/controllers";
}
/**
* @return {@literal Wisdom}.
*/
@Override
public String category() {
return "Wisdom";
}
}