package org.goko.core.gcode.rs274ngcv3.element;
import java.util.Date;
import java.util.List;
import org.goko.core.common.exception.GkException;
import org.goko.core.gcode.element.GCodeLine;
import org.goko.core.gcode.element.IGCodeProvider;
import org.goko.core.gcode.element.IGCodeProviderSource;
import org.goko.core.gcode.element.validation.IValidationElement;
public class StackableGCodeProviderModifier extends GCodeProvider implements IGCodeProvider, IStackableGCodeProvider{
private IStackableGCodeProvider parent;
private IStackableGCodeProvider child;
private IModifier<GCodeProvider> modifier;
private Date lastUpdateDate;
/**
* Constructor
* @param parent the parent IGCodeProvider
*/
public StackableGCodeProviderModifier(IStackableGCodeProvider parent) {
this(parent, null);
}
/**
* Constructor
* @param parent the parent IGCodeProvider
* @param modifier the modifier
*/
public StackableGCodeProviderModifier(IStackableGCodeProvider parent, IModifier<GCodeProvider> modifier) {
super();
this.parent = parent;
this.parent.setChild(this);
this.modifier = modifier;
}
/** (inheritDoc)
* @see org.goko.core.gcode.rs274ngcv3.element.GCodeProvider#getLines()
*/
@Override
public List<GCodeLine> getLines() throws GkException {
if(!modifier.isEnabled() || !modifier.isConfigured()){
return parent.getLines();
}
return super.getLines();
}
/** (inheritDoc)
* @see org.goko.core.gcode.rs274ngcv3.element.GCodeProvider#getLinesCount()
*/
@Override
public int getLinesCount() throws GkException {
if(!modifier.isEnabled() || !modifier.isConfigured()){
return parent.getLinesCount();
}
return super.getLinesCount();
}
/** (inheritDoc)
* @see org.goko.core.gcode.rs274ngcv3.element.GCodeProvider#getLine(java.lang.Integer)
*/
@Override
public GCodeLine getLine(Integer idLine) throws GkException {
if(!modifier.isEnabled() || !modifier.isConfigured()){
return parent.getLine(idLine);
}
return super.getLine(idLine);
}
/** (inheritDoc)
* @see org.goko.core.gcode.rs274ngcv3.element.GCodeProvider#getLineAtIndex(java.lang.Integer)
*/
@Override
public GCodeLine getLineAtIndex(Integer indexLine) throws GkException {
if(!modifier.isEnabled() || !modifier.isConfigured()){
return parent.getLineAtIndex(indexLine);
}
return super.getLineAtIndex(indexLine);
}
/** (inheritDoc)
* @see org.goko.core.gcode.rs274ngcv3.element.GCodeProvider#getModificationDate()
*/
@Override
public Date getModificationDate() {
return super.getModificationDate();
}
/** (inheritDoc)
* @see org.goko.core.gcode.rs274ngcv3.element.GCodeProvider#update()
*/
@Override
public void update() throws GkException{
parent.update();
// We also have to check if the parent was updated before us
if(lastUpdateDate == null
|| lastUpdateDate.getTime() < modifier.getModificationDate().getTime()
|| lastUpdateDate.getTime() < parent.getModificationDate().getTime()){
if(modifier.isEnabled() && modifier.isConfigured()){
clear();
modifier.apply(parent, this);
}
lastUpdateDate = new Date();
setModificationDate(lastUpdateDate);
}
}
/** (inheritDoc)
* @see org.goko.core.gcode.rs274ngcv3.element.GCodeProvider#getId()
*/
@Override
public Integer getId() {
if(parent!= null){
return parent.getId();
}
return null;
}
/** (inheritDoc)
* @see org.goko.core.gcode.rs274ngcv3.element.GCodeProvider#setId(java.lang.Integer)
*/
@Override
public void setId(Integer id) {
parent.setId(id);
}
/** (inheritDoc)
* @see org.goko.core.gcode.rs274ngcv3.element.GCodeProvider#getCode()
*/
@Override
public String getCode() {
return parent.getCode();
}
/** (inheritDoc)
* @see org.goko.core.gcode.rs274ngcv3.element.IStackableGCodeProvider#getIdModifier()
*/
@Override
public Integer getIdModifier() {
return modifier.getId();
}
/**
* @return the parent
*/
@Override
public IStackableGCodeProvider getParent() {
return parent;
}
/** (inheritDoc)
* @see org.goko.core.gcode.rs274ngcv3.element.IStackableGCodeProvider#setParent(org.goko.core.gcode.rs274ngcv3.element.IStackableGCodeProvider)
*/
@Override
public void setParent(IStackableGCodeProvider parent) {
this.parent = parent;
this.lastUpdateDate = null;
}
/** (inheritDoc)
* @see org.goko.core.gcode.rs274ngcv3.element.GCodeProvider#getSource()
*/
@Override
public IGCodeProviderSource getSource() {
return parent.getSource();
}
/** (inheritDoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((modifier == null) ? 0 : modifier.hashCode());
result = prime * result + ((parent == null) ? 0 : parent.hashCode());
return result;
}
/** (inheritDoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!super.equals(obj))
return false;
if (getClass() != obj.getClass())
return false;
StackableGCodeProviderModifier other = (StackableGCodeProviderModifier) obj;
if (modifier == null) {
if (other.modifier != null)
return false;
} else if (!modifier.equals(other.modifier))
return false;
if (parent == null) {
if (other.parent != null)
return false;
} else if (!parent.equals(other.parent))
return false;
return true;
}
/**
* @return the child
*/
public IStackableGCodeProvider getChild() {
return child;
}
/**
* @param child the child to set
*/
public void setChild(IStackableGCodeProvider child) {
this.child = child;
}
/**
* @return the validationElements
*/
public List<IValidationElement> getValidationElements() {
return parent.getValidationElements();
}
/** (inheritDoc)
* @see org.goko.core.gcode.element.validation.IValidationTarget#hasErrors()
*/
@Override
public boolean hasErrors() {
return parent.hasErrors();
}
/** (inheritDoc)
* @see org.goko.core.gcode.element.validation.IValidationTarget#hasWarnings()
*/
@Override
public boolean hasWarnings() {
return parent.hasWarnings();
}
/** (inheritDoc)
* @see org.goko.core.gcode.element.validation.IValidationTarget#clearValidationElements()
*/
@Override
public void clearValidationElements() {
parent.clearValidationElements();
}
/** (inheritDoc)
* @see org.goko.core.gcode.element.validation.IValidationTarget#addValidationElement(org.goko.core.gcode.element.validation.IValidationElement)
*/
@Override
public void addValidationElement(IValidationElement element) {
parent.addValidationElement(element);
}
}