package org.springframework.roo.addon.web.mvc.views.components;
import org.apache.commons.lang3.StringUtils;
import org.springframework.roo.addon.jpa.addon.entity.JpaEntityMetadata;
import org.springframework.roo.addon.jpa.addon.entity.JpaEntityMetadata.RelationInfo;
import org.springframework.roo.addon.web.mvc.controller.addon.ControllerMetadata;
import org.springframework.roo.support.util.XmlUtils;
import java.util.List;
/**
* This class contains all necessary information about a detail entity to show it
* in a page
*
* @author Manuel Iborra
* @since 2.0
*/
public class DetailEntityItem extends EntityItem {
private EntityItem rootEntity;
private RelationInfo fieldInfo;
private String tabLinkCode;
private String fieldName;
private String fieldNameCapitalized;
private DetailEntityItem parentEntity;
private int level;
private List<RelationInfo> path;
private String pathString;
private String pathStringFieldNames;
private String controllerPath;
/**
* Constructs a DetailEntityItem using the fieldName and suffixId
*
* @param fieldName
* the fieldName that represents the relationship
* @param suffixId
* used to generate field id
*/
public DetailEntityItem(JpaEntityMetadata childEntityMetadata,
ControllerMetadata controllerMetadata, String controllerPath, String detailSuffix,
EntityItem rootEntity) {
super(childEntityMetadata.getDestination().getSimpleTypeName(), detailSuffix,
childEntityMetadata.isReadOnly());
this.level = controllerMetadata.getDetailsFieldInfo().size();
this.rootEntity = rootEntity;
this.fieldInfo = controllerMetadata.getLastDetailsInfo();
this.fieldName = fieldInfo.fieldName;
this.fieldNameCapitalized = StringUtils.capitalize(fieldName);
this.tabLinkCode = null;
this.pathString = controllerMetadata.getDetailsPathAsString("-");
this.pathStringFieldNames = controllerMetadata.getDetailsPathAsString(".");
this.controllerPath = controllerPath;
this.z = calculateZ();
buildDetailItemId(detailSuffix);
}
/**
* Builds the id of the specified detail
*
* @param suffix
* The suffix to complete the field id
*
*/
private void buildDetailItemId(String suffix) {
String id = XmlUtils.convertId(this.pathString.toLowerCase());
// If suffix is not blank or null, concatenate it
if (!StringUtils.isEmpty(suffix)) {
id = id.concat("-").concat(XmlUtils.convertId(suffix.toLowerCase()));
}
this.entityItemId = id;
}
/**
* Calculate the hash code of the path, configuration and fieldName
*
* @return hash code
*/
private String calculateZ() {
final int prime = 31;
int result = 1;
result = prime * result + ((entityItemId == null) ? 0 : entityItemId.hashCode());
result = prime * result + ((getConfiguration() == null) ? 0 : getConfiguration().hashCode());
result = prime * result + ((fieldName == null) ? 0 : fieldName.hashCode());
return Integer.toHexString(result);
}
public String getTabLinkCode() {
return tabLinkCode;
}
public void setTabLinkCode(String tabLinkCode) {
this.tabLinkCode = tabLinkCode;
}
public String getFieldName() {
return fieldName;
}
public void setFieldName(String fieldName) {
this.fieldName = fieldName;
}
public String getFieldNameCapitalized() {
return fieldNameCapitalized;
}
public void setFieldNameCapitalized(String fieldNameCapitalized) {
this.fieldNameCapitalized = fieldNameCapitalized;
}
public EntityItem getRootEntity() {
return rootEntity;
}
public DetailEntityItem getParentEntity() {
return parentEntity;
}
public void setParentEntity(DetailEntityItem parent) {
this.parentEntity = parent;
}
public int getLevel() {
return level;
}
public String getPathString() {
return pathString;
}
public List<RelationInfo> getPath() {
return path;
}
public String getPathStringFieldNames() {
return pathStringFieldNames;
}
public boolean isTheParentEntity(DetailEntityItem parent) {
String parentPath = parent.getPathString();
return pathString.equals(parentPath.concat("-").concat(fieldName));
}
public RelationInfo getFieldInfo() {
return fieldInfo;
}
public String getControllerPath() {
return controllerPath;
}
public void setControllerPath(String controllerPath) {
this.controllerPath = controllerPath;
}
}