001 package org.apache.maven.lifecycle.internal; 002 003 /* 004 * Licensed to the Apache Software Foundation (ASF) under one 005 * or more contributor license agreements. See the NOTICE file 006 * distributed with this work for additional information 007 * regarding copyright ownership. The ASF licenses this file 008 * to you under the Apache License, Version 2.0 (the 009 * "License"); you may not use this file except in compliance 010 * with the License. You may obtain a copy of the License at 011 * 012 * http://www.apache.org/licenses/LICENSE-2.0 013 * 014 * Unless required by applicable law or agreed to in writing, 015 * software distributed under the License is distributed on an 016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 017 * KIND, either express or implied. See the License for the 018 * specific language governing permissions and limitations 019 * under the License. 020 */ 021 022 import org.apache.maven.project.MavenProject; 023 024 import java.util.ArrayList; 025 import java.util.Collections; 026 import java.util.List; 027 028 /** 029 * @since 3.0 030 * @author Kristian Rosenvold 031 * NOTE: This class is not part of any public api and can be changed or deleted without prior notice. 032 */ 033 public class BuildLogItem 034 { 035 private final ExecutionPlanItem executionPlanItem; 036 037 private final MavenProject project; 038 039 private final long startTime; 040 041 private long endTime; 042 043 private final List<DependencyLogEntry> dependencies = 044 Collections.synchronizedList( new ArrayList<DependencyLogEntry>() ); 045 046 public BuildLogItem( MavenProject project, ExecutionPlanItem executionPlanItem ) 047 { 048 this.executionPlanItem = executionPlanItem; 049 this.project = project; 050 startTime = System.currentTimeMillis(); 051 052 } 053 054 055 public MavenProject getProject() 056 { 057 return project; 058 } 059 060 public void setComplete() 061 { 062 endTime = System.currentTimeMillis(); 063 } 064 065 public void addWait( MavenProject upstreamProject, ExecutionPlanItem inSchedule, long startWait ) 066 { 067 long now = System.currentTimeMillis(); 068 dependencies.add( new DependencyLogEntry( upstreamProject, inSchedule, startWait, now, null ) ); 069 } 070 071 public void addDependency( MavenProject upstreamProject, String message ) 072 { 073 dependencies.add( new DependencyLogEntry( upstreamProject, message ) ); 074 } 075 076 public String toString( long rootStart ) 077 { 078 StringBuilder result = new StringBuilder(); 079 result.append( String.format( "%1d %2d ", startTime - rootStart, endTime - rootStart ) ); 080 result.append( project.getName() ); 081 result.append( " " ); 082 result.append( getMojoExecutionDescription( executionPlanItem ) ); 083 if ( dependencies.size() > 0 ) 084 { 085 result.append( "\n" ); 086 for ( DependencyLogEntry waitLogEntry : dependencies ) 087 { 088 result.append( " " ); 089 result.append( waitLogEntry.toString() ); 090 result.append( "\n" ); 091 } 092 } 093 return result.toString(); 094 } 095 096 097 public Object toGraph( long rootStart ) 098 { 099 StringBuilder result = new StringBuilder(); 100 if ( dependencies.size() > 0 ) 101 { 102 for ( DependencyLogEntry waitLogEntry : dependencies ) 103 { 104 result.append( " " ); 105 result.append( nodeKey( project, executionPlanItem ) ); 106 result.append( " -> " ); 107 result.append( waitLogEntry.toNodeKey() ); 108 result.append( waitLogEntry.toNodeDescription( rootStart ) ); 109 result.append( "\n" ); 110 } 111 } 112 else 113 { 114 result.append( " " ); 115 result.append( nodeKey( project, executionPlanItem ) ); 116 result.append( "\n" ); 117 } 118 return result.toString(); 119 } 120 121 private static String nodeKey( MavenProject mavenProject, ExecutionPlanItem executionPlanItem ) 122 { 123 String key = mavenProject.getArtifactId(); 124 if ( executionPlanItem != null ) 125 { 126 key += "_" + getMojoExecutionDescription( executionPlanItem ); 127 } 128 return key.replace( ".", "_" ).replace( ":", "_" ); 129 } 130 131 private static String getMojoExecutionDescription( ExecutionPlanItem executionPlanItem ) 132 { 133 if ( executionPlanItem.getMojoExecution() != null ) 134 { 135 return executionPlanItem.getMojoExecution().getArtifactId() + getLifeCyclePhase( executionPlanItem ); 136 } 137 else 138 { 139 return ""; 140 } 141 } 142 143 private static String getLifeCyclePhase( ExecutionPlanItem executionPlanItem ) 144 { 145 return executionPlanItem.getLifecyclePhase() != null ? "[" + executionPlanItem.getLifecyclePhase() + "]" : ""; 146 } 147 148 149 class DependencyLogEntry 150 { 151 private final ExecutionPlanItem executionPlanItem; 152 153 private final MavenProject upstreamProject; 154 155 private final Long start; 156 157 private final Long stop; 158 159 private final String message; 160 161 DependencyLogEntry( MavenProject upstreamProject, ExecutionPlanItem executionPlanItem, Long start, Long stop, 162 String message ) 163 { 164 this.upstreamProject = upstreamProject; 165 this.executionPlanItem = executionPlanItem; 166 this.start = start; 167 this.stop = stop; 168 this.message = message; 169 } 170 171 DependencyLogEntry( MavenProject upstreamProject, String message ) 172 { 173 this( upstreamProject, null, null, null, message ); 174 } 175 176 public String toString() 177 { 178 return upstreamProject.getName() + ":" + getExecutionPlanItem() + getElapsed() + getMessage(); 179 } 180 181 public String toNodeKey() 182 { 183 return nodeKey( upstreamProject, executionPlanItem ); 184 } 185 186 public String toNodeDescription( long rootStart ) 187 { 188 return ""; 189 } 190 191 192 private String getMessage() 193 { 194 return message != null ? message : ""; 195 } 196 197 private String getExecutionPlanItem() 198 { 199 if ( executionPlanItem != null ) 200 { 201 return getMojoExecutionDescription( executionPlanItem ); 202 } 203 else 204 { 205 return ""; 206 } 207 } 208 209 private String getElapsed() 210 { 211 if ( start != null && stop != null ) 212 { 213 long elapsed = stop - start; 214 return elapsed > 0 ? ", wait=" + elapsed : ""; 215 } 216 return ""; 217 } 218 } 219 220 }