001/* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 */ 019package org.apache.isis.tool.mavenplugin; 020 021import java.io.File; 022import java.util.List; 023import java.util.Set; 024import org.apache.maven.model.Plugin; 025import org.apache.maven.plugin.AbstractMojo; 026import org.apache.maven.plugin.MojoExecutionException; 027import org.apache.maven.plugin.MojoFailureException; 028import org.apache.maven.plugin.logging.Log; 029import org.apache.maven.plugins.annotations.Component; 030import org.apache.maven.plugins.annotations.Parameter; 031import org.apache.maven.project.MavenProject; 032import org.apache.isis.core.commons.config.IsisConfiguration; 033import org.apache.isis.core.commons.config.IsisConfigurationBuilderDefault; 034import org.apache.isis.core.metamodel.app.IsisMetaModel; 035import org.apache.isis.core.metamodel.runtimecontext.noruntime.RuntimeContextNoRuntime; 036import org.apache.isis.core.runtime.services.ServicesInstaller; 037import org.apache.isis.core.runtime.services.ServicesInstallerFromAnnotation; 038import org.apache.isis.core.runtime.services.ServicesInstallerFromConfigurationAndAnnotation; 039import org.apache.isis.core.runtime.system.DeploymentType; 040import org.apache.isis.progmodels.dflt.ProgrammingModelFacetsJava5; 041import org.apache.isis.tool.mavenplugin.util.IsisMetaModels; 042import org.apache.isis.tool.mavenplugin.util.MavenProjects; 043 044public abstract class IsisMojoAbstract extends AbstractMojo { 045 046 protected static final String CURRENT_PLUGIN_KEY = "org.apache.isis.tool:isis-maven-plugin"; 047 048 @Component 049 private MavenProject mavenProject; 050 051 @Parameter(required = true, readonly = false, property = "isisConfigDir") 052 private String isisConfigDir; 053 054 private final MetaModelProcessor metaModelProcessor; 055 private final ContextForMojo context; 056 057 protected IsisMojoAbstract(final MetaModelProcessor metaModelProcessor) { 058 this.metaModelProcessor = metaModelProcessor; 059 this.context = new ContextForMojo(mavenProject, getLog()); 060 } 061 062 public void execute() throws MojoExecutionException, MojoFailureException { 063 064 final Plugin plugin = MavenProjects.lookupPlugin(mavenProject, CURRENT_PLUGIN_KEY); 065 final List<Object> serviceList = plugin != null ? serviceListFor(plugin) : null; 066 if(serviceList == null || serviceList.size() == 0) { 067 return; 068 } 069 getLog().info("Found " + serviceList.size() + " services"); 070 071 usingIsisMetaModel(serviceList, metaModelProcessor); 072 } 073 074 private void usingIsisMetaModel( 075 final List<Object> serviceList, 076 final MetaModelProcessor metaModelProcessor) throws MojoExecutionException, MojoFailureException { 077 078 IsisMetaModel isisMetaModel = null; 079 try { 080 isisMetaModel = bootstrapIsis(serviceList); 081 metaModelProcessor.process(isisMetaModel, context); 082 } finally { 083 IsisMetaModels.disposeSafely(isisMetaModel); 084 } 085 } 086 087 private List<Object> serviceListFor(Plugin plugin) throws MojoFailureException { 088 IsisConfiguration isisConfiguration = getIsisConfiguration(); 089 090 final ServicesInstaller servicesInstaller; 091 if(isisConfiguration == null) { 092 servicesInstaller = new ServicesInstallerFromAnnotation(); 093 } else { 094 final ServicesInstallerFromConfigurationAndAnnotation servicesInstallerFromConfigurationAndAnnotation = new ServicesInstallerFromConfigurationAndAnnotation(); 095 servicesInstallerFromConfigurationAndAnnotation.setConfiguration(isisConfiguration); 096 servicesInstaller = servicesInstallerFromConfigurationAndAnnotation; 097 } 098 099 servicesInstaller.setIgnoreFailures(true); 100 servicesInstaller.init(); 101 102 return servicesInstaller.getServices(DeploymentType.SERVER_PROTOTYPE); 103 } 104 105 private IsisConfiguration getIsisConfiguration() throws MojoFailureException { 106 final File file = getIsisConfigDir(); 107 final String absoluteConfigDir = file.getAbsolutePath(); 108 if(!file.exists() || !file.isDirectory()) { 109 context.throwFailureException("Configuration error", 110 String.format("isisConfigDir (%s) does not exist or is not a directory", absoluteConfigDir)); 111 } 112 final IsisConfigurationBuilderDefault configBuilder = new IsisConfigurationBuilderDefault(absoluteConfigDir); 113 configBuilder.addDefaultConfigurationResources(); 114 return configBuilder.getConfiguration(); 115 } 116 117 private File getIsisConfigDir() { 118 File file = new File(isisConfigDir); 119 if(!file.isAbsolute()) { 120 final File basedir = mavenProject.getBasedir(); 121 file = new File(basedir, isisConfigDir); 122 } 123 return file; 124 } 125 126 private static IsisMetaModel bootstrapIsis(List<Object> serviceList) { 127 IsisMetaModel isisMetaModel = new IsisMetaModel( 128 new RuntimeContextNoRuntime(), 129 new ProgrammingModelFacetsJava5(), 130 serviceList); 131 isisMetaModel.init(); 132 return isisMetaModel; 133 } 134 135 //region > Context 136 static class ContextForMojo implements MetaModelProcessor.Context { 137 138 private final MavenProject mavenProject; 139 private final Log log; 140 141 public ContextForMojo(final MavenProject mavenProject, final Log log) { 142 this.mavenProject = mavenProject; 143 this.log = log; 144 } 145 146 @Override 147 public MavenProject getMavenProject() { 148 return mavenProject; 149 } 150 151 @Override 152 public Log getLog() { 153 return log; 154 } 155 156 @Override 157 public void throwFailureException(String errorMessage, Set<String> logMessages) throws MojoFailureException { 158 logErrors(logMessages); 159 throw new MojoFailureException(errorMessage); 160 } 161 162 @Override 163 public void throwFailureException(String errorMessage, String... logMessages) throws MojoFailureException { 164 logErrors(logMessages); 165 throw new MojoFailureException(errorMessage); 166 } 167 168 @Override 169 public void throwExecutionException(String errorMessage, Exception e) throws MojoExecutionException { 170 logErrors(errorMessage); 171 throw new MojoExecutionException(errorMessage, e); 172 } 173 174 private void logErrors(Set<String> logMessages) { 175 logErrors(logMessages.toArray(new String[] {})); 176 } 177 178 @Override 179 public void logErrors(String... logMessages) { 180 log.error(""); 181 log.error(""); 182 log.error(""); 183 for (String logMessage : logMessages) { 184 log.error(logMessage); 185 } 186 log.error(""); 187 log.error(""); 188 log.error(""); 189 } 190 } 191 //endregion 192 193}