/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF 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 org.apache.isis.tool.mavenplugin; import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.List; import com.google.common.base.Charsets; import com.google.common.io.Files; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; import org.apache.maven.project.MavenProject; import org.apache.isis.applib.services.swagger.SwaggerService; import org.apache.isis.core.runtime.system.session.IsisSessionFactory; @Mojo( name = "swagger", defaultPhase = LifecyclePhase.PACKAGE, requiresProject = true, requiresDependencyResolution = ResolutionScope.COMPILE, requiresDependencyCollection = ResolutionScope.COMPILE ) public class IsisMojoSwagger extends IsisMojoAbstract { protected IsisMojoSwagger() { super(); } /** * Filename prefix; is appended by the visibility parameter. */ @Parameter(required = false, readonly = false, property = "fileNamePrefix", defaultValue = "swagger") private String fileNamePrefix; /** * List of visibilities required. Defaults to both `PUBLIC` and `PRIVATE` */ @Parameter(required = false, readonly = false, property = "visibilities") private List<SwaggerService.Visibility> visibilities; /** * Preferred format. Defaults to <code>JSON</code>. */ @Parameter(required = false, readonly = false, property = "format", defaultValue = "JSON") private SwaggerService.Format format; /** * Directory to generate Swagger spec file; defaults to <code>target/generated-resources/isis-swagger</code> */ @Parameter(required = false, readonly = false, property = "output", defaultValue = "generated-resources/isis-swagger") private String output; @Override protected void doExecute( final ContextForMojo context, final IsisSessionFactory isisSessionFactory) throws MojoFailureException, IOException { final SwaggerService swaggerService = isisSessionFactory.getServicesInjector().lookupService(SwaggerService.class); final MavenProject mavenProject = context.getMavenProject(); final File outputDir = determineOutputDir(mavenProject, output); final List<SwaggerService.Visibility> visibilityList = determineVisibility(visibilities); for (SwaggerService.Visibility visibility : visibilityList) { final File swaggerSpecFile = buildSwaggerSpecFile(visibility, format, outputDir, fileNamePrefix); writeSwaggerSpec(swaggerService, visibility, format, swaggerSpecFile); } } private static File determineOutputDir(final MavenProject mavenProject, final String output) { final String targetDir = mavenProject.getBuild().getDirectory(); final String outputDirStr = targetDir + File.separator + output; return new File(outputDirStr); } private static List<SwaggerService.Visibility> determineVisibility(final List<SwaggerService.Visibility> visibilities) { if (visibilities == null || visibilities.isEmpty()) { return Arrays.asList(SwaggerService.Visibility.PUBLIC, SwaggerService.Visibility.PRIVATE); } return visibilities; } private File buildSwaggerSpecFile( final SwaggerService.Visibility visibility, final SwaggerService.Format format, final File outputDir, final String fileNamePrefix) { final String swaggerSpecName = fileNamePrefix + "-" + visibility + "." + format.name().toLowerCase(); return new File(outputDir, swaggerSpecName); } private void writeSwaggerSpec( final SwaggerService swaggerService, final SwaggerService.Visibility visibility, final SwaggerService.Format format, final File swaggerSpecFile) throws MojoFailureException { final String swaggerSpec = swaggerService.generateSwaggerSpec(visibility, format); try { Files.createParentDirs(swaggerSpecFile); } catch (IOException e) { throw new MojoFailureException( String.format("Failed to create dir: '%s'", swaggerSpecFile.getParent())); } try { Files.write(swaggerSpec, swaggerSpecFile, Charsets.UTF_8); } catch (IOException e) { throw new MojoFailureException("Failed to write out " + swaggerSpecFile); } } }