/** * */ package org.minnal.api; import java.lang.annotation.Annotation; import java.net.InetAddress; import java.sql.Timestamp; import java.util.Date; import java.util.List; import org.minnal.api.filter.ExcludeAnnotationsConvertor; import org.minnal.api.filter.MinnalApiSpecFilter; import org.minnal.core.Application; import org.minnal.core.Bundle; import org.minnal.core.Container; import org.minnal.core.ContainerAdapter; import org.minnal.core.config.ApplicationConfiguration; import org.minnal.core.config.ConnectorConfiguration; import org.minnal.core.config.ConnectorConfiguration.Scheme; import com.fasterxml.jackson.annotation.JsonBackReference; import com.google.common.collect.Lists; import com.wordnik.swagger.config.ConfigFactory; import com.wordnik.swagger.config.FilterFactory; import com.wordnik.swagger.config.ScannerFactory; import com.wordnik.swagger.config.SwaggerConfig; import com.wordnik.swagger.converter.ModelConverters; import com.wordnik.swagger.converter.OverrideConverter; import com.wordnik.swagger.jaxrs.config.DefaultJaxrsScanner; import com.wordnik.swagger.jaxrs.reader.DefaultJaxrsApiReader; import com.wordnik.swagger.reader.ClassReaders; /** * @author ganeshs * */ public class ApiBundle extends ContainerAdapter implements Bundle<ApiBundleConfiguration> { private ApiBundleConfiguration configuration; @Override public void init(Container container, ApiBundleConfiguration configuration) { this.configuration = configuration; container.registerListener(this); SwaggerConfig config = ConfigFactory.config(); config.setApiVersion("1.0.1"); for (ConnectorConfiguration connector : container.getConfiguration().getServerConfiguration().getConnectorConfigurations()) { if (connector.getScheme() == Scheme.http) { config.setBasePath(connector.getScheme().toString() + "://" + getHostName() + ":" + connector.getPort()); break; } } ScannerFactory.setScanner(new DefaultJaxrsScanner()); ClassReaders.setReader(new DefaultJaxrsApiReader()); FilterFactory.setFilter(new MinnalApiSpecFilter()); ModelConverters.addConverter(getExcludeAnnotationsConvertor(), true); ModelConverters.addConverter(getOverrideConverter(), true); } /** * Returns the override converter * * @return */ protected OverrideConverter getOverrideConverter() { OverrideConverter converter = new OverrideConverter(); String dateJson = "{\"id\": \"date-time\", \"name\": \"date-time\", \"qualifiedType\": \"date-time\"}"; converter.add(Date.class.getCanonicalName(), dateJson); converter.add(Timestamp.class.getCanonicalName(), dateJson); return converter; } /** * Returns the model convertor * * @return */ protected ExcludeAnnotationsConvertor getExcludeAnnotationsConvertor() { List<Class<? extends Annotation>> excludedAnnotations = Lists.<Class<? extends Annotation>>newArrayList(JsonBackReference.class); excludedAnnotations.addAll(configuration.getExcludedAnnotations()); return new ExcludeAnnotationsConvertor(excludedAnnotations); } @Override public void start() { } @Override public void stop() { } @Override public void preMount(Application<ApplicationConfiguration> application) { application.registerPlugin(new ApiPlugin(configuration.isEnableCors())); } @Override public int getOrder() { return Integer.MAX_VALUE - 1; } protected String getHostName() { try { return InetAddress.getLocalHost().getHostAddress(); } catch (Exception e) { return "localhost"; } } }