Skip to content

Commit 988c115

Browse files
committed
refactoring
1 parent 79110b7 commit 988c115

7 files changed

Lines changed: 188 additions & 85 deletions

File tree

jcp-tests/jcp-test-gradle/build.gradle

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -35,30 +35,30 @@ jar {
3535

3636

3737
preprocess {
38-
sources = sourceSets.main.java.srcDirs
39-
allowWhitespaces = true
40-
eol = '\r\n'
41-
keepAttributes=true
42-
sourceEncoding='UTF-8'
43-
targetEncoding='UTF-8'
44-
ignoreMissingSources=false
45-
excludeExtensions=['txt','xml']
46-
fileExtensions=['java']
47-
unknownVarAsFalse=false
48-
dryRun=false
49-
verbose=true
50-
clearTarget=true
51-
careForLastEol=true
52-
keepComments=true
53-
excludeFolders=['**/some1','**/some2']
54-
configFiles=['./configFile.txt']
55-
keepLines=true
56-
allowWhitespaces=true
57-
preserveIndents=true
58-
dontOverwriteSameContent=false
59-
vars = ['some.test.global': 'Some Test Global Value']
38+
sources = sourceSets.main.java.srcDirs
39+
allowWhitespaces = true
40+
eol = '\r\n'
41+
keepAttributes = true
42+
sourceEncoding = 'UTF-8'
43+
targetEncoding = 'UTF-8'
44+
ignoreMissingSources = false
45+
excludeExtensions = ['txt', 'xml']
46+
fileExtensions = ['java']
47+
unknownVarAsFalse = false
48+
dryRun = false
49+
verbose = true
50+
clearTarget = true
51+
careForLastEol = true
52+
keepComments = true
53+
excludeFolders = ['**/some1', '**/some2']
54+
configFiles = ['./configFile.txt']
55+
keepLines = true
56+
allowWhitespaces = true
57+
preserveIndents = true
58+
dontOverwriteSameContent = false
59+
vars = ['some.test.global': 'Some Test Global Value']
6060
}
61-
task (changeSourceFolder) {
61+
task(changeSourceFolder) {
6262
sourceSets.main.java.srcDirs = [preprocess.target]
6363
}.dependsOn preprocess
6464

jcp/src/main/java/com/igormaznitsa/jcp/JcpPreprocessor.java

Lines changed: 39 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@
2121

2222
package com.igormaznitsa.jcp;
2323

24+
import static com.igormaznitsa.jcp.InfoHelper.makeTextForHelpInfo;
25+
import static com.igormaznitsa.jcp.utils.PreprocessorUtils.readWholeTextFileIntoArray;
26+
import static com.igormaznitsa.jcp.utils.PreprocessorUtils.throwPreprocessorException;
27+
import static com.igormaznitsa.meta.common.utils.Assertions.assertNotNull;
28+
29+
2430
import com.igormaznitsa.jcp.cmdline.AllowWhitespaceDirectiveHandler;
2531
import com.igormaznitsa.jcp.cmdline.CareForLastEolHandler;
2632
import com.igormaznitsa.jcp.cmdline.ClearTargetHandler;
@@ -53,12 +59,6 @@
5359
import com.igormaznitsa.jcp.expression.ValueType;
5460
import com.igormaznitsa.jcp.utils.PreprocessorUtils;
5561
import com.igormaznitsa.meta.annotation.MustNotContainNull;
56-
import lombok.Data;
57-
import org.apache.commons.io.FileUtils;
58-
import org.apache.commons.io.FilenameUtils;
59-
import org.springframework.util.AntPathMatcher;
60-
61-
import javax.annotation.Nonnull;
6262
import java.io.File;
6363
import java.io.IOException;
6464
import java.nio.charset.StandardCharsets;
@@ -69,11 +69,11 @@
6969
import java.util.List;
7070
import java.util.Locale;
7171
import java.util.Set;
72-
73-
import static com.igormaznitsa.jcp.InfoHelper.makeTextForHelpInfo;
74-
import static com.igormaznitsa.jcp.utils.PreprocessorUtils.readWholeTextFileIntoArray;
75-
import static com.igormaznitsa.jcp.utils.PreprocessorUtils.throwPreprocessorException;
76-
import static com.igormaznitsa.meta.common.utils.Assertions.assertNotNull;
72+
import javax.annotation.Nonnull;
73+
import lombok.Data;
74+
import org.apache.commons.io.FileUtils;
75+
import org.apache.commons.io.FilenameUtils;
76+
import org.springframework.util.AntPathMatcher;
7777

7878
/**
7979
* The main class implements the Java Comment Preprocessor, it has the main
@@ -211,17 +211,22 @@ public PreprocessorContext getContext() {
211211
@Nonnull
212212
public Statistics execute() throws IOException {
213213
final long timeStart = System.currentTimeMillis();
214-
processConfigFiles();
215214

216-
this.context.logInfo(String.format("File extensions: %s excluded %s", this.context.getExtensions(), this.context.getExcludeExtensions()));
215+
this.context.getActivatedConfigFiles().addAll(processConfigFiles());
216+
217+
this.context.logInfo(String
218+
.format("File extensions: %s excluded %s", this.context.getExtensions(),
219+
this.context.getExcludeExtensions()));
217220
final List<PreprocessorContext.SourceFolder> srcFolders = this.context.getSources();
218221
this.context.logDebug("Source folders: " + srcFolders);
219222

220223
if (srcFolders.isEmpty()) {
221224
this.context.logWarning("Source folder list is empty!");
222225
}
223226

224-
final Collection<FileInfoContainer> filesToBePreprocessed = collectFilesToPreprocess(srcFolders, this.context.getExcludeFolders());
227+
final Collection<FileInfoContainer> filesToBePreprocessed =
228+
collectFilesToPreprocess(srcFolders, this.context.getExcludeFolders());
229+
this.context.getPreprocessedResources().addAll(filesToBePreprocessed);
225230

226231
final List<PreprocessingState.ExcludeIfInfo> excludedIf = processGlobalDirectives(filesToBePreprocessed);
227232

@@ -323,7 +328,9 @@ private Statistics preprocessFiles(@Nonnull @MustNotContainNull final Collection
323328
if (this.context.isVerbose()) {
324329
this.context.logForVerbose(String.format("Copy file %s -> {dst} %s", PreprocessorUtils.getFilePath(fileRef.getSourceFile()), fileRef.makeTargetFilePathAsString()));
325330
}
326-
PreprocessorUtils.copyFile(fileRef.getSourceFile(), destinationFile, this.context.isKeepAttributes());
331+
PreprocessorUtils.copyFile(fileRef.getSourceFile(), destinationFile,
332+
this.context.isKeepAttributes());
333+
fileRef.getGeneratedResources().add(destinationFile);
327334
copiedCounter++;
328335
}
329336
}
@@ -332,12 +339,19 @@ private Statistics preprocessFiles(@Nonnull @MustNotContainNull final Collection
332339
fileRef.preprocessFile(null, this.context);
333340
final long elapsedTime = System.currentTimeMillis() - startTime;
334341
if (this.context.isVerbose()) {
335-
this.context.logForVerbose(String.format("File preprocessing completed '%s', elapsed time %d ms", PreprocessorUtils.getFilePath(fileRef.getSourceFile()), elapsedTime));
342+
this.context.logForVerbose(String
343+
.format("File preprocessing completed '%s', elapsed time %d ms",
344+
PreprocessorUtils.getFilePath(fileRef.getSourceFile()), elapsedTime));
336345
}
337346
preprocessedCounter++;
338347
}
339348
}
340-
return new Statistics(preprocessedCounter, copiedCounter, excludedCounter);
349+
350+
return new Statistics(
351+
preprocessedCounter,
352+
copiedCounter,
353+
excludedCounter
354+
);
341355
}
342356

343357
private void createTargetFolder() throws IOException {
@@ -430,7 +444,8 @@ private Set<File> findAllFiles(
430444
if (excludedFolderPattern == null) {
431445
result.addAll(findAllFiles(sourceCanonicalPath, file, antPathMatcher, excludedFolderPatterns));
432446
} else {
433-
this.context.logForVerbose(String.format("Folder '%s' excluded by '%s'", folderPath, excludedFolderPattern));
447+
this.context.logForVerbose(
448+
String.format("Folder '%s' excluded by '%s'", folderPath, excludedFolderPattern));
434449
}
435450
} else {
436451
result.add(file);
@@ -440,9 +455,13 @@ private Set<File> findAllFiles(
440455
return result;
441456
}
442457

443-
void processConfigFiles() throws IOException {
458+
List<File> processConfigFiles() throws IOException {
459+
460+
final List<File> processedConfigFileList = new ArrayList<>();
444461

445462
for (final File file : context.getConfigFiles()) {
463+
processedConfigFileList.add(file);
464+
446465
final String[] lines = readWholeTextFileIntoArray(file, StandardCharsets.UTF_8, null);
447466

448467
int readStringIndex = -1;
@@ -499,6 +518,7 @@ void processConfigFiles() throws IOException {
499518
}
500519
}
501520
}
521+
return processedConfigFileList;
502522
}
503523

504524
@Data

jcp/src/main/java/com/igormaznitsa/jcp/containers/FileInfoContainer.java

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121

2222
package com.igormaznitsa.jcp.containers;
2323

24+
import static com.igormaznitsa.meta.common.utils.Assertions.assertNotNull;
25+
26+
2427
import com.igormaznitsa.jcp.context.PreprocessingState;
2528
import com.igormaznitsa.jcp.context.PreprocessorContext;
2629
import com.igormaznitsa.jcp.directives.AbstractDirectiveHandler;
@@ -31,18 +34,17 @@
3134
import com.igormaznitsa.jcp.utils.PreprocessorUtils;
3235
import com.igormaznitsa.jcp.utils.ResetablePrinter;
3336
import com.igormaznitsa.meta.annotation.MustNotContainNull;
34-
import lombok.Data;
35-
36-
import javax.annotation.Nonnull;
37-
import javax.annotation.Nullable;
3837
import java.io.File;
3938
import java.io.IOException;
39+
import java.util.Collection;
40+
import java.util.HashSet;
4041
import java.util.List;
4142
import java.util.Set;
4243
import java.util.regex.Matcher;
4344
import java.util.regex.Pattern;
44-
45-
import static com.igormaznitsa.meta.common.utils.Assertions.assertNotNull;
45+
import javax.annotation.Nonnull;
46+
import javax.annotation.Nullable;
47+
import lombok.Data;
4648

4749
/**
4850
* The class is one from the main classes in the preprocessor because it describes a preprocessing file and contains business logic for the process
@@ -84,7 +86,13 @@ public class FileInfoContainer {
8486
*/
8587
private String targetFileName;
8688

87-
public FileInfoContainer(@Nonnull final File srcFile, @Nonnull final String targetFileName, final boolean copyOnly) {
89+
/**
90+
* List of file generated from the file.
91+
*/
92+
private final Collection<File> generatedResources = new HashSet<>();
93+
94+
public FileInfoContainer(@Nonnull final File srcFile, @Nonnull final String targetFileName,
95+
final boolean copyOnly) {
8896
assertNotNull("Source file is null", srcFile);
8997
assertNotNull("Target file name is null", targetFileName);
9098

@@ -471,15 +479,21 @@ public PreprocessingState preprocessFile(@Nullable final PreprocessingState stat
471479
if (!context.isDryRun() && assertNotNull(lastTextFileDataContainer).isAutoFlush()) {
472480
final File outFile = context.createDestinationFileForPath(makeTargetFilePathAsString());
473481

474-
final boolean wasSaved = preprocessingState.saveBuffersToFile(outFile, context.isKeepComments());
482+
final boolean wasSaved =
483+
preprocessingState.saveBuffersToFile(outFile, context.isKeepComments());
475484

476485
if (context.isVerbose()) {
477-
context.logForVerbose(String.format("Content was %s into file '%s'", (wasSaved ? "saved" : "not saved"), outFile.toString()));
486+
context.logForVerbose(String
487+
.format("Content was %s into file '%s'", (wasSaved ? "saved" : "not saved"),
488+
outFile.toString()));
478489
}
479490

480-
if (this.sourceFile != null && context.isKeepAttributes() && !PreprocessorUtils.copyFileAttributes(this.getSourceFile(), outFile)) {
491+
if (this.sourceFile != null && context.isKeepAttributes() &&
492+
!PreprocessorUtils.copyFileAttributes(this.getSourceFile(), outFile)) {
481493
throw new IOException("Can't copy attributes in result file: " + outFile);
482494
}
495+
496+
this.getGeneratedResources().add(outFile);
483497
}
484498
return preprocessingState;
485499
}

jcp/src/main/java/com/igormaznitsa/jcp/context/PreprocessorContext.java

Lines changed: 58 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@
2222
package com.igormaznitsa.jcp.context;
2323

2424

25+
import static com.igormaznitsa.meta.common.utils.Assertions.assertDoesntContainNull;
26+
import static com.igormaznitsa.meta.common.utils.Assertions.assertNotNull;
27+
import static java.util.Arrays.asList;
28+
import static java.util.Collections.singletonList;
29+
import static java.util.Collections.unmodifiableList;
30+
31+
2532
import com.igormaznitsa.jcp.containers.FileInfoContainer;
2633
import com.igormaznitsa.jcp.containers.TextFileDataContainer;
2734
import com.igormaznitsa.jcp.exceptions.FilePositionInfo;
@@ -33,33 +40,29 @@
3340
import com.igormaznitsa.jcp.utils.PreprocessorUtils;
3441
import com.igormaznitsa.meta.annotation.MustNotContainNull;
3542
import com.igormaznitsa.meta.common.utils.GetUtils;
36-
import lombok.AccessLevel;
37-
import lombok.Data;
38-
import lombok.Getter;
39-
import lombok.Setter;
40-
import org.apache.commons.io.FilenameUtils;
41-
42-
import javax.annotation.Nonnull;
43-
import javax.annotation.Nullable;
4443
import java.io.File;
4544
import java.io.IOException;
4645
import java.nio.charset.Charset;
4746
import java.nio.charset.StandardCharsets;
4847
import java.util.ArrayList;
48+
import java.util.Collection;
4949
import java.util.Collections;
5050
import java.util.HashMap;
5151
import java.util.HashSet;
5252
import java.util.List;
5353
import java.util.Map;
54+
import java.util.Optional;
5455
import java.util.Set;
5556
import java.util.concurrent.atomic.AtomicReference;
5657
import java.util.stream.Collectors;
57-
58-
import static com.igormaznitsa.meta.common.utils.Assertions.assertDoesntContainNull;
59-
import static com.igormaznitsa.meta.common.utils.Assertions.assertNotNull;
60-
import static java.util.Arrays.asList;
61-
import static java.util.Collections.singletonList;
62-
import static java.util.Collections.unmodifiableList;
58+
import java.util.stream.Stream;
59+
import javax.annotation.Nonnull;
60+
import javax.annotation.Nullable;
61+
import lombok.AccessLevel;
62+
import lombok.Data;
63+
import lombok.Getter;
64+
import lombok.Setter;
65+
import org.apache.commons.io.FilenameUtils;
6366

6467
/**
6568
* Preprocessor context class is a main class which contains all options for preprocessin and allow to work with variables in expressions.
@@ -103,6 +106,8 @@ public class PreprocessorContext {
103106
private PreprocessorExtension preprocessorExtension;
104107
private Charset sourceEncoding = DEFAULT_CHARSET;
105108
private Charset targetEncoding = DEFAULT_CHARSET;
109+
private final Collection<File> activatedConfigFiles = new ArrayList<>();
110+
private final Collection<FileInfoContainer> preprocessedResources = new ArrayList<>();
106111
@Setter(AccessLevel.NONE)
107112
private PreprocessorLogger preprocessorLogger = new SystemOutLogger();
108113

@@ -135,6 +140,9 @@ public PreprocessorContext(@Nonnull final File baseDir) {
135140
public PreprocessorContext(@Nonnull final PreprocessorContext context) {
136141
assertNotNull("Source context must not be null", context);
137142

143+
this.activatedConfigFiles.addAll(context.activatedConfigFiles);
144+
this.preprocessedResources.addAll(context.preprocessedResources);
145+
138146
this.baseDir = context.getBaseDir();
139147
this.verbose = context.isVerbose();
140148
this.keepComments = context.isKeepComments();
@@ -183,6 +191,42 @@ public PreprocessorContext(@Nonnull final PreprocessorContext context) {
183191
this.currentInCloneSource = context.getPreprocessingState().peekFile();
184192
}
185193

194+
@Nonnull
195+
public Collection<File> findAllInputFiles() {
196+
return Stream.concat(this.configFiles.stream(),
197+
this.preprocessedResources.stream().map(x -> x.getSourceFile())
198+
).collect(Collectors.toSet());
199+
}
200+
201+
@Nonnull
202+
public Collection<File> findAllGeneratedFiles() {
203+
return this.preprocessedResources.stream()
204+
.flatMap(x -> x.getGeneratedResources().stream())
205+
.collect(Collectors.toSet());
206+
}
207+
208+
public void notifyAboutFileInfoContainer(@Nullable final FileInfoContainer fileInfoContainer) {
209+
if (fileInfoContainer != null) {
210+
final FileInfoContainer existing =
211+
this.findFileInfoContainer(fileInfoContainer.getSourceFile()).orElse(null);
212+
if (existing == null) {
213+
this.preprocessedResources.add(fileInfoContainer);
214+
} else {
215+
existing.getGeneratedResources().addAll(fileInfoContainer.getGeneratedResources());
216+
}
217+
}
218+
}
219+
220+
@Nonnull
221+
public Optional<FileInfoContainer> findFileInfoContainer(@Nullable final File file) {
222+
if (file == null) {
223+
return Optional.empty();
224+
} else {
225+
return this.preprocessedResources.stream().filter(x -> file.equals(x.getSourceFile()))
226+
.findFirst();
227+
}
228+
}
229+
186230
@Nonnull
187231
private static String makeStackView(
188232
@Nullable final TextFileDataContainer cloneSource,

0 commit comments

Comments
 (0)