/*
* Copyright (c) 2013-2015 mgm technology partners GmbH
*
* 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 com.mgmtp.perfload.perfalyzer.util;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import java.io.File;
import java.nio.file.Path;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static com.google.common.base.Joiner.on;
import static com.google.common.base.Preconditions.checkState;
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Lists.newArrayListWithExpectedSize;
import static org.apache.commons.io.FilenameUtils.getExtension;
import static org.apache.commons.io.FilenameUtils.wildcardMatch;
/**
* @author rnaegele
*/
public class PerfAlyzerFile implements Comparable<PerfAlyzerFile> {
/**
* Regular expression that matches a part of a perfAlyzer file. File name parts are enclosed by
* square brackets, e. g. {@code [perfmon][cpu_X].out}.
*/
private static final Pattern PATTERN_FILE_NAME_PARTS = Pattern.compile("\\[([^]]+)\\]");
private static final Pattern PATTERN_MARKER = Pattern.compile("\\{([^}]+)\\}");
private final String path;
private String extension;
private final List<String> fileNameParts;
private String marker;
private PerfAlyzerFile(final String path, final String extension, final List<String> fileNameParts, final String marker) {
this.path = path;
this.extension = extension;
this.fileNameParts = newArrayList(fileNameParts);
this.marker = marker;
}
public static PerfAlyzerFile create(final File file) {
checkState(!file.isAbsolute(), "File must not be absolute: %s", file);
String fileName = file.getName();
List<String> parts = newArrayListWithExpectedSize(3);
List<String> partsWithBrackets = newArrayListWithExpectedSize(3);
Matcher m = PATTERN_FILE_NAME_PARTS.matcher(fileName);
while (m.find()) {
partsWithBrackets.add(m.group());
parts.add(m.group(1));
}
m = PATTERN_MARKER.matcher(fileName);
String marker = m.find() ? m.group(1) : null;
return new PerfAlyzerFile(FilenameUtils.getPath(file.getPath()), getExtension(fileName), parts, marker);
}
public PerfAlyzerFile copy() {
return new PerfAlyzerFile(path, extension, newArrayList(fileNameParts), marker);
}
/**
* @return the file
*/
public File getFile() {
String baseName = '[' + on("][").join(fileNameParts) + ']';
if (marker != null) {
baseName += "{" + marker + '}';
}
return new File(path, baseName + (extension.equals(StringUtils.EMPTY) ? StringUtils.EMPTY : '.' + extension));
}
public Path getPath() {
return getFile().toPath();
}
public PerfAlyzerFile addFileNamePart(final String part) {
if (part != null) {
fileNameParts.add(part);
}
return this;
}
public PerfAlyzerFile addFileNamePart(final Iterable<String> parts) {
for (String part : parts) {
fileNameParts.add(part);
}
return this;
}
public PerfAlyzerFile addFileNamePart(final int index, final String part) {
fileNameParts.add(index, part);
return this;
}
public PerfAlyzerFile removeFileNamePart(final int index) {
fileNameParts.remove(index);
return this;
}
public PerfAlyzerFile removeFileNamePart(final String wildcard) {
for (Iterator<String> it = fileNameParts.iterator(); it.hasNext();) {
if (wildcardMatch(it.next(), wildcard)) {
it.remove();
break;
}
}
return this;
}
public PerfAlyzerFile setExtension(final String extension) {
this.extension = extension;
return this;
}
/**
* @return the fileNameParts
*/
public List<String> getFileNameParts() {
return fileNameParts;
}
/**
* @return the marker
*/
public String getMarker() {
return marker;
}
public void setMarker(final String marker) {
this.marker = marker;
}
@Override
public int compareTo(final PerfAlyzerFile o) {
return getFile().compareTo(o.getFile());
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
}
}