/*
* #%L
* Wisdom-Framework
* %%
* Copyright (C) 2013 - 2015 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 monitor.raml.console;
import org.apache.felix.ipojo.annotations.Invalidate;
import org.apache.felix.ipojo.annotations.Requires;
import org.apache.felix.ipojo.annotations.Validate;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
import org.wisdom.api.DefaultController;
import org.wisdom.api.annotations.*;
import org.wisdom.api.asset.Asset;
import org.wisdom.api.asset.Assets;
import org.wisdom.api.http.HttpMethod;
import org.wisdom.api.http.Result;
import org.wisdom.api.templates.Template;
import org.wisdom.monitor.service.MonitorExtension;
import java.util.LinkedHashSet;
import java.util.Set;
/**
* <p>
* Simple Wisdom Monitor extension that looks for .raml files into <code>/assets/raml</code> and add the
* Raml API Console for each of them.
* </p>
*
* <p>The file name must match <code>[A-Za-z0-9_-]+\.raml$<code/></p>
*
* @version 1.0
* @author barjo
*/
@Controller
@Path("/monitor/raml/{name}")
public class RamlMonitorController extends DefaultController {
/**
* The raml file extension.
*/
private static final String RAML_EXT = ".raml";
/**
* The assets directory that contains the raml files.
*/
private static final String RAML_ASSET_DIR = "/assets/raml/";
private BundleContext context;
private Set<ServiceRegistration> registrations = new LinkedHashSet<>();
/**
* Names of the published raml spec.
*/
private Set<String> names = new LinkedHashSet<>();
/**
* Template used to render the raml spec.
*/
@View("monitor/ramlconsole")
Template template;
/**
* The Assets service published by wisdom.
*/
@Requires
private Assets assets;
/**
* Return the raml console api corresponding to the raml of given name.
*
* @response.mime text/html
* @param name Name of the raml api to display.
* @return the raml console api or 404 if the file of given name doesn't exist in wisdom
*/
@Route(method = HttpMethod.GET, uri = "")
public Result index(@PathParameter("name") String name) {
if(names.contains(name)){
return ok(render(template,"source",RAML_ASSET_DIR+name+RAML_EXT));
}
return notFound();
}
/**
* Retrieve the BundleContext from this constructor.
*
* @param context The bundle context used in order to register the RamlMonitorConsole services.
*/
public RamlMonitorController(BundleContext context) {
this.context = context;
}
/**
* Looks for the raml file available in the assets and publish a RamlMonitorConsole for each of them.
*/
@Validate
public void start(){
//Publish the monitor extension
for(Asset asset : assets.assets()) {
if (asset.getPath().matches("^"+RAML_ASSET_DIR+"[A-Za-z0-9_-]+\\"+RAML_EXT+"$")){
String name = asset.getPath().substring(RAML_ASSET_DIR.length(), asset.getPath().length() - RAML_EXT.length());
if(!names.add(name)){ //skip if two Controller have the same name, it's impossible
continue;
}
registrations.add(context.registerService(MonitorExtension.class, new RamlMonitorConsole(name), null));
}
}
}
/**
* Unregister all RamlMonitorConsole services created by this instance.
*/
@Invalidate
public void stop(){
for(ServiceRegistration registration: registrations){
registration.unregister();
}
registrations.clear();
names.clear();
}
}