/** * Odoo, Open Source Management Solution * Copyright (C) 2012-today Odoo SA (<http:www.odoo.com>) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http:www.gnu.org/licenses/> * * Created on 31/12/14 11:20 AM */ package com.odoo.core.orm.fields; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; public class OColumn { public static final String TAG = OColumn.class.getSimpleName(); public static final String ROW_ID = "_id"; private LinkedHashMap<String, String> mSelectionMap = new LinkedHashMap<>(); public static enum RelationType { OneToMany, ManyToOne, ManyToMany } private String name, label, related_column; private Integer size; private Class<?> type; private RelationType relationType; private Object defaultValue; private Boolean autoIncrement = false, required = false; private Boolean isLocalColumn = false; private LinkedHashMap<String, ColumnDomain> columnDomains = new LinkedHashMap<>(); private Integer condition_operator_index = 0; private Integer recordSyncLimit = 0; //Annotation properties private Method mOnChangeMethod = null; private Boolean mOnChangeBGProcess = false; private Boolean mHasDomainFilterColumn = false; private Boolean is_functional_column = false; private Method functional_method = null; private Boolean use_annotation = true; private Boolean functional_store = false; private String[] functional_store_depends = null; private String syncColumnName = null; public OColumn(String label, Class<?> type) { this.label = label; this.type = type; } public OColumn(String label, Class<?> type, RelationType relationType) { this(label, type); this.relationType = relationType; } public OColumn setName(String name) { this.name = name; return this; } public Integer getRecordSyncLimit() { return recordSyncLimit; } public OColumn setRecordSyncLimit(Integer recordSyncLimit) { this.recordSyncLimit = recordSyncLimit; return this; } public String getName() { return name; } public OColumn setLabel(String label) { this.label = label; return this; } public String getLabel() { return label; } public RelationType getRelationType() { return relationType; } public OColumn setRelatedColumn(String column) { related_column = column; return this; } public OColumn setSize(Integer size) { this.size = size; return this; } public Integer getSize() { return size; } public OColumn setDefaultValue(Object defValue) { defaultValue = defValue; return this; } public OColumn setRequired() { required = true; return this; } public boolean isRequired() { return required; } public OColumn setAutoIncrement() { autoIncrement = true; return this; } public OColumn setLocalColumn() { isLocalColumn = true; return this; } public OColumn setType(Class<?> type) { this.type = type; return this; } public Class<?> getType() { return type; } public Object getDefaultValue() { return defaultValue; } public Boolean isAutoIncrement() { return autoIncrement; } public Boolean isLocal() { return isLocalColumn; } public String getRelatedColumn() { return related_column; } public OColumn addDomain(String column_name, String operator, Object value) { columnDomains.put(column_name, new ColumnDomain(column_name, operator, value)); return this; } public OColumn addDomain(String condition_operator) { columnDomains.put("condition_operator_" + (condition_operator_index++) + condition_operator, new ColumnDomain(condition_operator)); return this; } public LinkedHashMap<String, ColumnDomain> getDomains() { if (hasDomainFilterColumn()) { return new LinkedHashMap<>(); } return columnDomains; } public boolean hasDomainFilterColumn() { return mHasDomainFilterColumn; } public OColumn setHasDomainFilterColumn(Boolean domainFilterColumn) { mHasDomainFilterColumn = domainFilterColumn; return this; } public boolean hasOnChange() { return (mOnChangeMethod != null); } public Method getOnChangeMethod() { return mOnChangeMethod; } public void setOnChangeMethod(Method method) { mOnChangeMethod = method; } public Boolean isOnChangeBGProcess() { return mOnChangeBGProcess; } public void setOnChangeBGProcess(Boolean process) { mOnChangeBGProcess = process; } public void cleanDomains() { columnDomains.clear(); } public LinkedHashMap<String, ColumnDomain> getFilterDomains() { return columnDomains; } /** * Clone domain. * * @param domains the domains * @return the o column */ public OColumn cloneDomain(LinkedHashMap<String, ColumnDomain> domains) { columnDomains.putAll(domains); return this; } /** * Sets the functional store. * * @param store the new functional store */ public void setFunctionalStore(Boolean store) { functional_store = store; } /** * Gets the functional store. * * @return the functional store */ public Boolean canFunctionalStore() { return functional_store; } /** * Sets the functional store depends. * * @param depends the depends * @return the o column */ public OColumn setFunctionalStoreDepends(String[] depends) { functional_store_depends = depends; return this; } public Boolean isFunctionalColumn() { return is_functional_column; } public OColumn setIsFunctionalColumn(Boolean is_functional_column) { this.is_functional_column = is_functional_column; return this; } public Method getFunctionalMethod() { return functional_method; } public OColumn setFunctionalMethod(Method functional_method) { this.functional_method = functional_method; return this; } /** * Gets the functional store depends. * * @return the functional store depends */ public List<String> getFunctionalStoreDepends() { if (functional_store_depends != null) return Arrays.asList(functional_store_depends); return new ArrayList<String>(); } public HashMap<String, String> getSelectionMap() { return mSelectionMap; } public OColumn addSelection(String key, String value) { mSelectionMap.put(key, value); return this; } public String getSyncColumnName() { return syncColumnName; } public void setSyncColumnName(String syncColumnName) { this.syncColumnName = syncColumnName; } public String getSyncColumn() { if (getSyncColumnName() != null) { return getSyncColumnName(); } return getName(); } @Override public String toString() { return "OColumn{" + "name='" + name + '\'' + ", label='" + label + '\'' + ", related_column='" + related_column + '\'' + ", size=" + size + ", type=" + type + ", relationType=" + relationType + ", defaultValue=" + defaultValue + ", autoIncrement=" + autoIncrement + ", required=" + required + ", isLocalColumn=" + isLocalColumn + ", columnDomains=" + columnDomains + ", condition_operator_index=" + condition_operator_index + ", recordSyncLimit=" + recordSyncLimit + ", mOnChangeMethod=" + mOnChangeMethod + ", mOnChangeBGProcess=" + mOnChangeBGProcess + ", mHasDomainFilterColumn=" + mHasDomainFilterColumn + ", is_functional_column=" + is_functional_column + ", functional_method=" + functional_method + ", use_annotation=" + use_annotation + ", functional_store=" + functional_store + ", functional_store_depends=" + Arrays.toString(functional_store_depends) + '}'; } public class ColumnDomain { private String column = null; private String operator = null; private Object value = null; private String conditional_operator = null; public ColumnDomain(String conditional_operator) { this.conditional_operator = conditional_operator; } public ColumnDomain(String column, String operator, Object value) { this.column = column; this.operator = operator; this.value = value; } public String getColumn() { return column; } public void setColumn(String column) { this.column = column; } public String getOperator() { return operator; } public void setOperator(String operator) { this.operator = operator; } public Object getValue() { return value; } public void setValue(Object value) { this.value = value; } public String getConditionalOperator() { return conditional_operator; } public void setConditionalOperator(String conditional_operator) { this.conditional_operator = conditional_operator; } @Override public String toString() { StringBuffer domain = new StringBuffer(); domain.append("["); if (this.conditional_operator == null) { domain.append(this.column); domain.append(", "); domain.append(this.operator); domain.append(", "); domain.append(this.value); } else { domain.append(this.conditional_operator); } domain.append("]"); return domain.toString(); } } }