package no.difi.datahotel.logic;
import no.difi.datahotel.model.*;
import no.difi.datahotel.util.Disk;
import no.difi.datahotel.util.Filesystem;
import no.difi.datahotel.util.MetadataLogger;
import org.springframework.stereotype.Component;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static no.difi.datahotel.util.Filesystem.FILE_DEFINITIONS;
import static no.difi.datahotel.util.Filesystem.FOLDER_SLAVE;
@Component("field")
public class FieldBean {
private Map<String, List<Field>> fields = new HashMap<String, List<Field>>();
private Map<String, Definition> definitions = new HashMap<String, Definition>();
/**
* Holds the timestamp of the definitions file last read.
*/
private long defUpdated;
/**
* Updated definitions if an updated definitions file is available.
*/
public void updateDefinitions() {
File f = Filesystem.getFile(FOLDER_SLAVE, FILE_DEFINITIONS);
if (f.isFile() && f.lastModified() != defUpdated) {
Map<String, Definition> definitions = new HashMap<String, Definition>();
for (Definition def : ((Definitions) Disk.read(Definitions.class, f)).getDefinitions())
definitions.put(def.getShortName(), def);
this.definitions = definitions;
defUpdated = f.lastModified();
}
}
public void update(Metadata metadata) {
updateDefinitions();
MetadataLogger logger = metadata.getLogger();
logger.info("Reading fields.");
if (fields.containsKey(metadata.getLocation())) {
for (Field f : fields.get(metadata.getLocation())) {
if (f.getDefShort() != null && definitions.containsKey(f.getDefShort()))
definitions.get(f.getDefShort()).removeField(f);
}
}
Fields fresh = Fields.read(metadata.getLocation());
fields.put(metadata.getLocation(), fresh.getFields());
for (Field f : fresh.getFields()) {
f.setMetadata(metadata);
if (f.getDefinition() != null)
f.setDefShort(f.getDefinition().getShortName());
if (f.getDefShort() != null && definitions.containsKey(f.getDefShort()))
definitions.get(f.getDefShort()).addField(f);
// Definition d = f.getDefinition();
}
}
/**
* Get all fields for a dataset.
*/
public List<FieldLight> getFields(Metadata metadata) {
List<FieldLight> result = new ArrayList<FieldLight>();
for (Field f : fields.get(metadata.getLocation()))
result.add(f.light());
return result;
}
/**
* Get all definitions, not sorted.
*/
public List<DefinitionLight> getDefinitions() {
List<DefinitionLight> result = new ArrayList<DefinitionLight>();
for (Definition d : definitions.values())
result.add(d.light());
return result;
}
/**
* Get definition by short name if available.
*/
public DefinitionLight getDefinition(String def) {
if (definitions.containsKey(def))
return definitions.get(def).light();
return null;
}
public List<Field> getUsage(String def) {
if (definitions.containsKey(def))
return definitions.get(def).getFields();
return null;
}
}