package jeffaschenk.commons.touchpoint.model;
import jeffaschenk.commons.identifiers.AlternateId;
import jeffaschenk.commons.identifiers.RandomGUID;
import jeffaschenk.commons.system.internal.file.services.GlobalConstants;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Scanner;
/**
* RootElement
* Abstract Class for common Inclusion by other Objects and Providing common root for all objects.
*
* @author Jeff Schenk
* @version $Id: $
*/
@MappedSuperclass
public abstract class RootElement implements GlobalConstants, RootElementInterface, Cloneable, java.io.Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private AlternateId alternateId;
private boolean loaded = false;
private boolean updated = false;
private Date timestamp;
protected RootElement() {
this.id = new Integer(0);
this.timestamp = new Date();
this.alternateId = new AlternateId(new RandomGUID().toString());
}
@Column(name = "id", unique = true, nullable = false, insertable = false, updatable = false)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
@Embedded
public AlternateId getAlternateId() {
return this.alternateId;
}
@Override
public void setAlternateId(AlternateId alternateId) {
this.alternateId = alternateId;
}
@Override
@Transient
public boolean isExtractLoaded() {
return loaded;
}
protected void setExtractLoaded(boolean loaded) {
this.loaded = loaded;
}
@Override
@Transient
public boolean isUpdated() {
return updated;
}
public void setUpdated(boolean updated) {
this.updated = updated;
}
@Override
@Transient
public Date getTimestamp() {
return timestamp;
}
public void setTimestamp(Date timestamp) {
this.timestamp = timestamp;
}
/**
* Default Global Pipe Separator Character String
*
* @return String
*/
@Transient
@Override
public String getPipeCharacter() {
return DEFAULT_GLOBAL_PIPE_CHARACTER;
}
/**
* Obtain the String name of the JDBC table for the Object.
*
* @return String Name of the Table annotated on the Entity Object.
*/
@Transient
@Override
public String getTableName() {
Table tableAnnotation = this.getClass().getAnnotation(Table.class);
return tableAnnotation == null ? null : tableAnnotation.name();
}
/**
* helper method to perform parsing of the Extract File itself from
*/
@Transient
public static List<String> parseExtractFileRow(String input_line) {
List<String> parsedInput = new ArrayList<String>();
Scanner column_data = new Scanner(input_line).useDelimiter("\\" + DEFAULT_GLOBAL_PIPE_CHARACTER);
while (column_data.hasNext()) {
parsedInput.add(column_data.next());
}
column_data.close();
return parsedInput;
}
/**
* Export Object, only certain Objects will Implement
* this method.
*
* @return String of UnMarshaled Object
*/
@Transient
@Override
public String export() {
return null;
}
/**
* Helper to determine if Marshaled Element is Empty?
*
* @return boolean indicator, True if Empty for Export.
*/
@Transient
@Override
public boolean isEmptyForExport() {
return false;
}
/**
* Helper method to obtain Export Header.
* Normally, non will exit, only certain Objects
* get exported.
*
* @return String Export Header
*/
@Transient
@Override
public String getExportHeader() {
return "";
}
@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;
RootElement other = (RootElement) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
@Override
public String toString() {
return this.getClass().getSimpleName() + " ID:[" + ((this.id == null) ? "No ID yet" : this.id.toString()) + "]";
}
/**
* Get the Pipe Header for the Object used upon export.
*
* @return String
*/
@Transient
@Override
public String getPipeHeader() {
// TODO
return "|";
}
/**
* Initialize object from a parsed Input Stream.
*
* @param parsedInput
*
*/
@Transient
@Override
public void initializeFromParsedExtract(List<String> parsedInput) {
this.setExtractLoaded(true);
// TODO -- And Extend As Needed in Implementing Classes.
}
}