package mandelbrot.dependency.data;
import java.io.File;
import java.util.Comparator;
import org.codehaus.jackson.annotate.JsonCreator;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.annotate.JsonTypeName;
import org.codehaus.plexus.util.StringUtils;
import com.google.common.base.Function;
import com.google.common.base.Objects;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
/***
* A description of a single ocaml module. Serializable via JSON format.
* @author carm
*
*/
@JsonTypeName("moduleDescriptor")
public class ModuleDescriptor extends ModuleKey implements
Comparable<ModuleDescriptor> {
private static final String MODULE_FILE_PROPERTY = "moduleFile";
private static final String MODULE_NAME_PROPERTY = "moduleName";
private static final String JAVA_PACKAGE_NAME_PROPERTY = "javaPackageName";
private static final String MODULE_TYPE_PROPERTY = "moduleType";
private final String javaPackageName;
@JsonIgnore
private final Optional<File> moduleFile;
@JsonProperty(MODULE_FILE_PROPERTY)
public String getModuleFileName() {
if (moduleFile.isPresent())
return moduleFile.get().getPath();
else
return null;
}
@JsonCreator
public ModuleDescriptor(final @JsonProperty(MODULE_NAME_PROPERTY) String moduleName,
final @JsonProperty(MODULE_TYPE_PROPERTY) ModuleType moduleType,
final @JsonProperty(MODULE_FILE_PROPERTY) String moduleFile,
final @JsonProperty(JAVA_PACKAGE_NAME_PROPERTY) String javaPackageName) {
this(moduleName, moduleType, StringUtils.isBlank(moduleFile) ? null : new File(moduleFile), javaPackageName);
}
public ModuleDescriptor(final String moduleName,
final ModuleType moduleType, final File moduleFile,
final String javaPackageName) {
this(moduleName, moduleType, Optional.fromNullable(moduleFile),
javaPackageName);
}
public ModuleDescriptor(final String moduleName,
final ModuleType moduleType, final Optional<File> moduleFile,
final String javaPackageName) {
super(moduleName, moduleType);
this.moduleFile = Preconditions.checkNotNull(moduleFile);
this.javaPackageName = Preconditions.checkNotNull(javaPackageName);
}
public String getJavaPackageName() {
return javaPackageName;
}
@JsonIgnore
public Optional<File> getModuleFile() {
return moduleFile;
}
@Override
public int hashCode() {
return Objects.hashCode(moduleName, moduleType, moduleFile,
javaPackageName);
}
@Override
public boolean equals(final Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final ModuleDescriptor other = (ModuleDescriptor) obj;
if (!Objects.equal(moduleFile, other.moduleFile))
return false;
if (!Objects.equal(moduleName, other.moduleName))
return false;
if (!Objects.equal(moduleType, other.moduleType))
return false;
return Objects.equal(javaPackageName, other.javaPackageName);
}
public static class Builder extends ModuleKey.Builder {
private File moduleFile;
private String javaPackageName;
@Override
public Builder setModuleName(final String moduleName) {
super.setModuleName(moduleName);
return this;
}
@Override
public Builder setModuleType(final ModuleType moduleType) {
super.setModuleType(moduleType);
return this;
}
public Builder setModuleFile(final File moduleFile) {
this.moduleFile = moduleFile;
if (isModuleKeySet())
return this;
else
return setModuleKey(ModuleKey.fromFile(moduleFile));
}
public Builder setJavaPackageName(final String javaPackageName) {
this.javaPackageName = javaPackageName;
return this;
}
@Override
public ModuleDescriptor build() {
final ModuleKey key = super.build();
return new ModuleDescriptor(key.getModuleName(),
key.getModuleType(), moduleFile, javaPackageName);
}
public Builder setModuleKey(final ModuleKey key) {
setModuleName(key.getModuleName());
setModuleType(key.getModuleType());
return this;
}
public Builder copyOf(final ModuleDescriptor paramF) {
setModuleKey(paramF);
setModuleFile(paramF.getModuleFile().orNull());
setModuleName(paramF.getModuleName());
setJavaPackageName(paramF.getJavaPackageName());
return this;
}
}
public static Function<ModuleDescriptor, String> toFileTransform() {
return new Function<ModuleDescriptor, String>() {
public String apply(final ModuleDescriptor desc) {
return desc.getModuleFile().get().getPath();
}
};
}
public boolean nameEquals(final String module) {
return Objects.equal(getModuleName(), module);
}
@Override
public int compareTo(final ModuleDescriptor other) {
if (other == null)
return -1;
int compareTo;
compareTo = ModuleType.dependencyCompareTo().compare(getModuleType(),
other.getModuleType());
if (compareTo != 0)
return compareTo;
compareTo = Optional.fromNullable(getModuleName()).or("")
.compareTo(Optional.fromNullable(other.getModuleName()).or(""));
if (compareTo != 0)
return compareTo;
compareTo = getModuleFile().or(new File("")).compareTo(
other.getModuleFile().or(new File("")));
if (compareTo != 0)
return compareTo;
compareTo = Optional
.fromNullable(getJavaPackageName())
.or("")
.compareTo(
Optional.fromNullable(other.getJavaPackageName()).or(""));
return compareTo;
}
public static Comparator<? super ModuleDescriptor> comparator() {
return new Comparator<ModuleDescriptor>() {
@Override
public int compare(final ModuleDescriptor paramT1,
final ModuleDescriptor paramT2) {
if (Objects.equal(paramT1, paramT2))
return 0;
if (paramT1 == null)
return 1;
return paramT1.compareTo(paramT2);
}
};
}
public static Builder builder() {
return new Builder();
}
}