This repository has been archived by the owner on Apr 13, 2019. It is now read-only.
forked from Jasig/sass-maven-plugin
-
Notifications
You must be signed in to change notification settings - Fork 18
/
UpdateStylesheetsMojo.java
171 lines (155 loc) · 4.81 KB
/
UpdateStylesheetsMojo.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
/*
* Copyright 2014-2015 Mark Prins, GeoDienstenCentrum.
* Copyright 2010-2014 Jasig.
*
* See the NOTICE file distributed with this work for additional information
* regarding copyright ownership.
*
* Licensed 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 nl.geodienstencentrum.maven.plugin.sass.compiler;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import static org.apache.maven.plugins.annotations.LifecyclePhase.PROCESS_SOURCES;
import nl.geodienstencentrum.maven.plugin.sass.AbstractSassMojo;
import org.apache.commons.io.DirectoryWalker;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.Mojo;
/**
* Mojo that compiles Sass sources into CSS files using
* {@code update_stylesheets}.
*/
@Mojo(name = "update-stylesheets", defaultPhase = PROCESS_SOURCES)
public class UpdateStylesheetsMojo extends AbstractSassMojo {
/**
* Execute the compiler script.
*
* @see org.apache.maven.plugin.Mojo#execute()
* @throws MojoExecutionException when the execution of the plugin
* errored
* @throws MojoFailureException when the Sass compilation fails
*
*/
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
if (this.isSkip()) {
this.getLog().info("Skip compiling Sass templates");
return;
}
boolean buildRequired = true;
try {
buildRequired = buildRequired();
} catch (IOException e) {
throw new MojoExecutionException("Could not check file timestamps", e);
}
if (!buildRequired) {
this.getLog().info("Skip compiling Sass templates, no changes.");
return;
}
this.getLog().info("Compiling Sass templates");
// build sass script
final StringBuilder sassBuilder = new StringBuilder();
this.buildBasicSassScript(sassBuilder);
sassBuilder.append("Sass::Plugin.update_stylesheets");
final String sassScript = sassBuilder.toString();
// ...and execute
this.executeSassScript(sassScript);
}
/**
* Returns true if a build is required.
*
* @return true if a build is required
* @throws IOException if one occurs checking the files and directories
*/
private boolean buildRequired() throws IOException {
// If the target directory does not exist we need a build
if (!buildDirectory.exists()) {
return true;
}
final LastModifiedWalker sourceWalker =
new LastModifiedWalker(getSassSourceDirectory());
final LastModifiedWalker targetWalker = new LastModifiedWalker(destination);
// If either directory is empty, we do a build to make sure
if (sourceWalker.getCount() == 0 || targetWalker.getCount() == 0) {
return true;
}
return sourceWalker.getYoungest() > targetWalker.getYoungest();
}
/**
* Directorywalker that looks at the lastModified timestamp of files.
*
* @see File#lastModified()
*/
private class LastModifiedWalker extends DirectoryWalker<Void> {
/**
* timestamp of the youngest file.
*/
private Long youngest;
/**
* timestamp of the oldest file.
*/
private Long oldest;
/**
* number of files in the directory.
*/
private int count = 0;
/**
* Create a "last modified" directory walker.
* @param startDirectory The direcoty to start walking.
*/
public LastModifiedWalker(final File startDirectory) throws IOException {
walk(startDirectory, null);
getLog().info("Checked " + count + " files for " + startDirectory);
}
/**
* {@inheritDoc}
*/
@Override
protected void handleFile(final File file, final int depth,
final Collection<Void> results) throws IOException {
long lastMod = file.lastModified();
youngest = youngest == null ? lastMod : Math.max(youngest, lastMod);
oldest = oldest == null ? lastMod : Math.min(oldest, lastMod);
count++;
super.handleFile(file, depth, results);
}
/**
* Get timestamp of the youngest file in the directory.
*
* @return timestamp of youngest file
* @see File#lastModified()
*/
public Long getYoungest() {
return youngest;
}
/**
* Get timestamp of the oldest file in the directory.
*
* @return timestamp of oldest file
* @see File#lastModified()
*/
public Long getOldest() {
return oldest;
}
/**
* get number of files in the directory.
*
* @return number of files
*/
public int getCount() {
return count;
}
}
}