/*
* #%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.ipojo;
import com.google.common.collect.ImmutableMap;
import org.apache.felix.ipojo.annotations.Context;
import org.apache.felix.ipojo.extender.InstanceDeclaration;
import org.osgi.framework.BundleContext;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import org.wisdom.api.DefaultController;
import org.wisdom.api.annotations.Controller;
import org.wisdom.api.annotations.Path;
import org.wisdom.api.annotations.Route;
import org.wisdom.api.annotations.View;
import org.wisdom.api.http.HttpMethod;
import org.wisdom.api.http.Result;
import org.wisdom.api.security.Authenticated;
import org.wisdom.api.templates.Template;
import org.wisdom.monitor.service.MonitorExtension;
import java.util.Collection;
import java.util.List;
/**
* The controller providing the monitoring capabilities for iPOJO.
*/
@Controller
@Path("/monitor/ipojo")
@Authenticated("Monitor-Authenticator")
public class IPOJOController extends DefaultController implements MonitorExtension {
@View("monitor/ipojo")
Template ipojo;
@Context
BundleContext context;
@Route(method = HttpMethod.GET, uri = "/")
public Result ipojo() {
return ok(render(ipojo));
}
@Route(method = HttpMethod.GET, uri = ".json")
public Result data() {
final List<InstanceModel> instances = InstanceModel.instances(context);
final List<FactoryModel> factories = FactoryModel.factories(context);
int valid = 0, invalid = 0, stopped = 0;
for (InstanceModel model : instances) {
if (model.getState().equals("VALID")) {
valid++;
} else if (model.getState().equals("INVALID")) {
invalid++;
} else if (model.getState().equals("STOPPED")) {
stopped++;
}
}
return ok(ImmutableMap.builder()
.put("instances", instances)
.put("factories", factories)
.put("valid", valid)
.put("invalid", invalid)
.put("stopped", stopped)
.put("unbound", Integer.toString(getUnboundDeclarationCount()))
.build()).json();
}
private int getUnboundDeclarationCount() {
int count = 0;
try {
Collection<ServiceReference<InstanceDeclaration>> list = context.getServiceReferences(InstanceDeclaration
.class, null);
for (ServiceReference<InstanceDeclaration> ref : list) {
InstanceDeclaration declaration = context.getService(ref);
if (!declaration.getStatus().isBound()) {
count++;
}
}
} catch (InvalidSyntaxException e) { //NOSONAR
// Ignore it (filter null).
}
return count;
}
@Override
public String label() {
return "iPOJO";
}
@Override
public String url() {
return "/monitor/ipojo/";
}
@Override
public String category() {
return "osgi";
}
}