package ecologylab.bigsemantics.logging; import java.util.ArrayList; import java.util.Date; import java.util.List; import ecologylab.bigsemantics.Utils; import ecologylab.bigsemantics.metadata.builtins.PersistenceMetaInfo; import ecologylab.concurrent.DownloadableLogRecord; import ecologylab.generic.HashMapArrayList; import ecologylab.net.ParsedURL; import ecologylab.serialization.annotations.simpl_collection; import ecologylab.serialization.annotations.simpl_composite; import ecologylab.serialization.annotations.simpl_inherit; import ecologylab.serialization.annotations.simpl_map; import ecologylab.serialization.annotations.simpl_scalar; /** * * @author quyin */ @simpl_inherit public class DocumentLogRecord extends DownloadableLogRecord { @simpl_scalar ParsedURL documentLocation; @simpl_map("phase") HashMapArrayList<String, Phase> phases; @simpl_composite PersistenceMetaInfo persistenceMetaInfo; @simpl_scalar int downloadStatusCode; @simpl_collection("record") List<DocumentErrorRecord> errorRecords; public ParsedURL getDocumentLocation() { return documentLocation; } public void setDocumentLocation(ParsedURL documentUrl) { this.documentLocation = documentUrl; } public void beginPhase(String name) { getOrAddPhase(name).beginTime = new Date(); } public void endPhase(String name) { Phase phase = getPhase(name); if (phase != null) { phase.endTime = new Date(); phase.timeInMs = phase.endTime.getTime() - phase.beginTime.getTime(); } } public long getTotalMs(String name) { Phase phase = getPhase(name); return phase == null ? -1 : phase.timeInMs; } public Date getBeginTime(String name) { Phase phase = getPhase(name); return phase == null ? null : phase.beginTime; } public Date getEndTime(String name) { Phase phase = getPhase(name); return phase == null ? null : phase.endTime; } public Phase getPhase(String name) { return phases == null ? null : phases.get(name); } public Phase getOrAddPhase(String name) { Phase result = null; if (phases == null) { synchronized (this) { if (phases == null) { phases = new HashMapArrayList<String, Phase>(); } } } if (!phases.containsKey(name)) { synchronized (phases) { if (!phases.containsKey(name)) { Phase phase = new Phase(); phase.name = name; phases.put(name, phase); result = phase; } } } if (result == null) { result = phases.get(name); } return phases.get(name); } public PersistenceMetaInfo getPersistenceMetaInfo() { return persistenceMetaInfo; } public void setPersistenceMetaInfo(PersistenceMetaInfo persistenceMetaInfo) { this.persistenceMetaInfo = persistenceMetaInfo; } public int getDownloadStatusCode() { return downloadStatusCode; } public void setDownloadStatusCode(int downloadStatusCode) { this.downloadStatusCode = downloadStatusCode; } public List<DocumentErrorRecord> getErrorRecords() { return errorRecords; } public List<DocumentErrorRecord> errorRecords() { if (errorRecords == null) { synchronized (this) { if (errorRecords == null) { errorRecords = new ArrayList<DocumentErrorRecord>(); } } } return errorRecords; } public void addErrorRecord(DocumentErrorRecord errorRecord) { errorRecords().add(errorRecord); } public void addErrorRecord(String message, Throwable throwable) { String stacktrace = throwable == null ? null : Utils.getStackTraceAsString(throwable); addErrorRecord(new DocumentErrorRecord(message, stacktrace)); } }