/*
* Copyright 2014 Eediom Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.araqne.logstorage;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.araqne.api.CollectionTypeHint;
import org.araqne.api.FieldOption;
import org.araqne.confdb.CollectionName;
import org.araqne.log.api.FieldDefinition;
import org.araqne.log.api.msgbus.Marshaler;
import org.araqne.msgbus.Marshalable;
@CollectionName("table")
public class TableSchema implements Marshalable {
/**
* unique table name in a node
*/
@FieldOption(nullable = false)
private String name;
/**
* table id for path generation (name may contains character which is not
* allowed at target storage filesystem)
*/
@FieldOption(nullable = false)
private int id;
private StorageConfig primaryStorage;
private StorageConfig replicaStorage;
@CollectionTypeHint(StorageConfig.class)
private List<StorageConfig> secondaryStorages = new ArrayList<StorageConfig>();
/**
* Table may contains other field which is not specified here. Query
* designer can use these field definitions for search dialog rendering,
* lookup input/output mapping, etc.
*/
@CollectionTypeHint(FieldDefinition.class)
private List<FieldDefinition> fieldDefinitions;
private Map<String, String> metadata = new HashMap<String, String>();
public TableSchema() {
}
public TableSchema(String name, StorageConfig primaryConfig) {
this.name = name;
this.primaryStorage = primaryConfig;
}
public TableSchema clone() {
TableSchema c = new TableSchema();
c.setName(name);
c.setId(id);
c.setPrimaryStorage(primaryStorage.clone());
if (replicaStorage != null)
c.setReplicaStorage(replicaStorage.clone());
List<StorageConfig> l = new ArrayList<StorageConfig>();
for (StorageConfig s : secondaryStorages)
l.add(s.clone());
c.setSecondaryStorages(l);
c.setFieldDefinitions(cloneFieldDefinitions(fieldDefinitions));
if (metadata != null)
c.setMetadata(new HashMap<String, String>(metadata));
return c;
}
private List<FieldDefinition> cloneFieldDefinitions(List<FieldDefinition> l) {
if (l == null)
return null;
List<FieldDefinition> cloned = new ArrayList<FieldDefinition>();
for (FieldDefinition d : l)
cloned.add(FieldDefinition.parse(d.toString()));
return cloned;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public StorageConfig getPrimaryStorage() {
return primaryStorage;
}
public void setPrimaryStorage(StorageConfig primaryStorage) {
this.primaryStorage = primaryStorage;
}
public StorageConfig getReplicaStorage() {
return replicaStorage;
}
public void setReplicaStorage(StorageConfig replicaStorage) {
this.replicaStorage = replicaStorage;
}
public List<StorageConfig> getSecondaryStorages() {
return secondaryStorages;
}
public void setSecondaryStorages(List<StorageConfig> secondaryStorages) {
this.secondaryStorages = secondaryStorages;
}
public List<FieldDefinition> getFieldDefinitions() {
if (fieldDefinitions == null)
return null;
return new ArrayList<FieldDefinition>(fieldDefinitions);
}
/**
* update table field definitions
*
* @param tableName
* existing table name
* @param fields
* field definitions or null
* @since 2.5.1
*/
public void setFieldDefinitions(List<FieldDefinition> fieldDefinitions) {
this.fieldDefinitions = fieldDefinitions;
}
public Map<String, String> getMetadata() {
return metadata;
}
public void setMetadata(Map<String, String> metadata) {
this.metadata = metadata;
}
@Override
public Map<String, Object> marshal() {
Map<String, Object> m = new HashMap<String, Object>();
m.put("name", name);
m.put("id", id);
m.put("metadata", metadata);
m.put("primary_storage", primaryStorage.marshal());
if (replicaStorage != null)
m.put("replica_storage", replicaStorage.marshal());
if (secondaryStorages != null && !secondaryStorages.isEmpty())
m.put("secondary_storages", Marshaler.marshal(secondaryStorages));
if (fieldDefinitions != null)
m.put("fields", serializeFields());
return m;
}
private List<String> serializeFields() {
List<String> l = new ArrayList<String>();
for (FieldDefinition d : fieldDefinitions)
l.add(d.toString());
return l;
}
}