1 package org.kuali.common.util;
2
3 import java.io.File;
4 import java.io.IOException;
5 import java.util.ArrayList;
6 import java.util.Arrays;
7 import java.util.Collections;
8 import java.util.List;
9 import java.util.Properties;
10
11 import org.apache.commons.io.FileUtils;
12 import org.codehaus.plexus.util.StringUtils;
13 import org.slf4j.Logger;
14 import org.slf4j.LoggerFactory;
15
16 public class MetaInfUtils {
17
18 private static final Logger logger = LoggerFactory.getLogger(MetaInfUtils.class);
19
20 public static void scanAndCreateFiles(List<MetaInfContext> contexts) throws IOException {
21 for (MetaInfContext context : contexts) {
22 List<File> files = getFiles(context);
23 List<MetaInfResource> resources = getResources(context, files);
24 doLocations(context, resources);
25 if (context.isAddPropertiesFile()) {
26 doProperties(context, resources);
27 }
28 }
29 }
30
31 public static List<File> getFiles(MetaInfContext context) throws IOException {
32 Assert.notNull(context.getBaseDir(), "baseDir is null");
33 Assert.notNull(context.getOutputFile(), "outputFile is null");
34 List<String> includes = context.getIncludes();
35 List<String> excludes = context.getExcludes();
36 logger.info("Examining - " + context.getBaseDir().getCanonicalPath());
37 logger.info("Include - " + CollectionUtils.getSpaceSeparatedString(includes));
38 logger.info("Exclude - " + CollectionUtils.getSpaceSeparatedString(excludes));
39 SimpleScanner scanner = new SimpleScanner(context.getBaseDir(), includes, excludes);
40 List<File> files = scanner.getFiles();
41 logger.info("Located " + files.size() + " files");
42 return files;
43 }
44
45 public static void doLocations(MetaInfContext context, List<MetaInfResource> resources) throws IOException {
46 List<String> locations = getLocations(resources);
47 if (context.isSort()) {
48 Collections.sort(locations);
49 }
50 logger.info("Creating " + context.getOutputFile().getCanonicalPath());
51 FileUtils.writeLines(context.getOutputFile(), locations);
52 }
53
54 public static void doProperties(MetaInfContext context, List<MetaInfResource> resources) {
55 logger.debug("doProperties()");
56 Properties properties = getProperties(context, resources);
57 File propertiesFile = new File(LocationUtils.getCanonicalPath(context.getOutputFile()) + ".properties");
58 PropertyUtils.store(properties, propertiesFile, "UTF-8");
59 }
60
61 public static Properties getProperties(MetaInfContext context, List<MetaInfResource> resources) {
62 Properties properties = new Properties();
63 for (MetaInfResource resource : resources) {
64 String sizeKey = resource.getKey() + ".size";
65 properties.setProperty(sizeKey, resource.getSize() + "");
66 if (context.isAddLineCount()) {
67 String linesKey = resource.getKey() + ".lines";
68 properties.setProperty(linesKey, resource.getLines() + "");
69 }
70 }
71 return properties;
72 }
73
74 public static String getPropertyKey(String location) {
75 String key = StringUtils.replace(location, ":", ".");
76 return StringUtils.replace(key, "/", ".");
77 }
78
79 public static void scanAndCreateFile(MetaInfContext context) throws IOException {
80 scanAndCreateFiles(Arrays.asList(context));
81 }
82
83 public static List<MetaInfResource> getResources(MetaInfContext context, List<File> files) throws IOException {
84 List<MetaInfResource> resources = new ArrayList<MetaInfResource>();
85 for (int i = 0; i < files.size(); i++) {
86 MetaInfResource resource = getResource(context, files.get(i));
87 resources.add(resource);
88 }
89 return resources;
90 }
91
92 public static List<String> getLocations(List<MetaInfResource> resources) {
93 List<String> locations = new ArrayList<String>();
94 for (MetaInfResource resource : resources) {
95 locations.add(resource.getLocation());
96 }
97 return locations;
98 }
99
100 public static List<String> getLocations(File baseDir, List<File> files, String prefix) throws IOException {
101 List<String> locations = new ArrayList<String>();
102 for (int i = 0; i < files.size(); i++) {
103 String location = getLocation(baseDir, files.get(i), prefix);
104 locations.add(location);
105 }
106 return locations;
107 }
108
109 public static MetaInfResource getResource(MetaInfContext context, File file) throws IOException {
110 String location = getLocation(context.getBaseDir(), file, context.getPrefix());
111 long size = file.length();
112 long lines = -1;
113 if (context.isAddLineCount()) {
114 lines = LocationUtils.getLineCount(file);
115 }
116 String key = getPropertyKey(location);
117
118 MetaInfResource resource = new MetaInfResource();
119 resource.setLocation(location);
120 resource.setSize(size);
121 resource.setKey(key);
122 resource.setLines(lines);
123 return resource;
124 }
125
126 public static String getLocation(File baseDir, File file, String prefix) throws IOException {
127 String dir = baseDir.getCanonicalPath();
128 String path = file.getCanonicalPath();
129 int pos = dir.length() + 1;
130 return prefix + StringUtils.substring(path, pos);
131 }
132
133 }