package org.codefaces.ui.internal.codeLanguages;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;
public class CodeLanguage {
public static final CodeLanguage PLAIN_TEXT = new CodeLanguage(
"no-highlight", "no-highlight", "/html/javascripts/highlight/languages/no-highlight.js", new String[0]);
private static final String FILE_EXTENSION_PATTERN = "*.";
private static final String FILE_EXTENSION_REGEXP = ".*.";
private final List<Pattern> filePatternsRegexps = new ArrayList<Pattern>();
private final String id;
private final String name;
private final String resource;
CodeLanguage(String id, String name, String resource,
String... filePatterns) {
this.id = id;
this.name = name;
this.resource = resource;
Set<String> uniqueFilePatterns = new HashSet<String>(Arrays
.asList(filePatterns));
for (String filePattern : uniqueFilePatterns) {
Pattern filePatternRegexp = createFileExtensionRegexp(filePattern);
filePatternsRegexps.add(filePatternRegexp);
}
}
private Pattern createFileExtensionRegexp(String filePattern) {
if (filePattern.startsWith(FILE_EXTENSION_PATTERN)) {
String extension = filePattern.substring(FILE_EXTENSION_PATTERN
.length());
return Pattern.compile(FILE_EXTENSION_REGEXP + extension);
}
return Pattern.compile(filePattern, Pattern.CASE_INSENSITIVE);
}
Collection<Pattern> getFilePatternsRegexps() {
return filePatternsRegexps;
}
public String getName() {
return name;
}
public String getResource() {
return resource;
}
public String getId() {
return id;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
CodeLanguage other = (CodeLanguage) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
public boolean matchesFileName(String fileName) {
for (Pattern filePatternRegexp : getFilePatternsRegexps()) {
if (filePatternRegexp.matcher(fileName).matches()) {
return true;
}
}
return false;
}
}