All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ai.houyi.dorado.swagger.SwaggerFactory Maven / Gradle / Ivy

/*
 * Copyright 2017 The OpenDSP Project
 *
 * The OpenDSP Project licenses this file to you 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.
 */
package ai.houyi.dorado.swagger;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.ServiceLoader;
import java.util.Set;

import ai.houyi.dorado.Dorado;
import ai.houyi.dorado.rest.util.PackageScanner;
import ai.houyi.dorado.swagger.ext.ApiContext;
import ai.houyi.dorado.swagger.ext.ApiContextBuilder;
import ai.houyi.dorado.swagger.ext.ApiKey;
import io.swagger.models.Scheme;
import io.swagger.models.SecurityRequirement;
import io.swagger.models.Swagger;
import io.swagger.models.auth.ApiKeyAuthDefinition;
import io.swagger.models.auth.In;

/**
 * 
 * @author wangwp
 */
public class SwaggerFactory {
	private static Swagger swagger;
	private static ApiContextBuilder apiContextBuilder;

	static {
		ServiceLoader apiContextBuilders = ServiceLoader.load(ApiContextBuilder.class);
		apiContextBuilder = apiContextBuilders.iterator().hasNext() ? apiContextBuilders.iterator().next() : null;

		try {

			if (apiContextBuilder == null) {
				if (Dorado.isEnableSpring) {
					apiContextBuilder = Dorado.beanContainer.getBean(ApiContextBuilder.class);
				}
			}
		} catch (Throwable ex) {
			// ignore this exception
		}
	}

	public static Swagger getSwagger() {
		if (swagger != null)
			return swagger;

		Reader reader = new Reader(new Swagger());

		String[] packages = null;
		Class mainClass = Dorado.mainClass;
		EnableSwagger enableSwagger = mainClass.getAnnotation(EnableSwagger.class);

		if (enableSwagger != null) {
			packages = enableSwagger.value();
		}

		if (packages == null || packages.length == 0) {
			packages = Dorado.serverConfig.scanPackages();
		}

		if (packages == null || packages.length == 0) {
			packages = new String[] { mainClass.getPackage().getName() };
		}

		if (packages == null || packages.length == 0) {
			throw new IllegalArgumentException("缺少scanPackages设置");
		}

		Set> classes = new HashSet<>();
		for (String pkg : packages) {
			try {
				classes.addAll(PackageScanner.scan(pkg));
			} catch (Exception ex) {
				// ignore this ex
			}
		}

		Swagger _swagger = reader.read(classes);
		_swagger.setSchemes(Arrays.asList(Scheme.HTTP, Scheme.HTTPS));

		if (apiContextBuilder == null) {
			swagger = _swagger;
			return _swagger;
		}

		ApiContext apiContext = apiContextBuilder.buildApiContext();
		if (apiContext == null) {
			swagger = _swagger;
			return _swagger;
		}

		ApiKey apiKey = apiContext.getApiKey();
		if (apiKey != null) {
			ApiKeyAuthDefinition apiKeyAuth = new ApiKeyAuthDefinition(apiKey.getName(),
					In.forValue(apiKey.getIn() == null ? "header" : apiKey.getIn()));
			_swagger.securityDefinition("auth", apiKeyAuth);

			List securityRequirements = new ArrayList<>();
			SecurityRequirement sr = new SecurityRequirement();
			sr.requirement("auth");
			securityRequirements.add(sr);
			_swagger.setSecurity(securityRequirements);
		}
		if (apiContext.getInfo() != null)
			_swagger.setInfo(apiContext.getInfo());

		swagger = _swagger;
		return _swagger;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy