/*
* Copyright 2012-2017 CodeLibs Project and the Others.
*
* 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.codelibs.fess.es.config.allcommon;
import java.io.Serializable;
import java.util.Map;
import java.util.Set;
import org.dbflute.Entity;
import org.dbflute.FunCustodial;
import org.dbflute.dbmeta.accessory.EntityModifiedProperties;
import org.dbflute.dbmeta.accessory.EntityUniqueDrivenProperties;
import org.dbflute.util.DfCollectionUtil;
import org.elasticsearch.action.delete.DeleteRequestBuilder;
import org.elasticsearch.action.index.IndexRequestBuilder;
/**
* @author ESFlute (using FreeGen)
*/
public abstract class EsAbstractEntity implements Entity, Serializable, Cloneable {
// ===================================================================================
// Definition
// ==========
private static final long serialVersionUID = 1L;
// ===================================================================================
// Attribute
// =========
protected DocMeta docMeta;
protected final EntityUniqueDrivenProperties __uniqueDrivenProperties = newUniqueDrivenProperties();
protected final EntityModifiedProperties __modifiedProperties = newModifiedProperties();
protected EntityModifiedProperties __specifiedProperties;
// ===================================================================================
// Doc Meta
// ========
public DocMeta asDocMeta() {
if (docMeta == null) {
docMeta = new DocMeta();
}
return docMeta;
}
// ===================================================================================
// Modified Properties
// ===================
public Set<String> mymodifiedProperties() {
return __modifiedProperties.getPropertyNames();
}
public void mymodifyProperty(String propertyName) {
registerModifiedProperty(propertyName);
}
public void mymodifyPropertyCancel(String propertyName) {
__modifiedProperties.remove(propertyName);
}
public void clearModifiedInfo() {
__modifiedProperties.clear();
}
public boolean hasModification() {
return !__modifiedProperties.isEmpty();
}
protected EntityModifiedProperties newModifiedProperties() {
return new EntityModifiedProperties();
}
protected void registerModifiedProperty(String propertyName) {
__modifiedProperties.addPropertyName(propertyName);
registerSpecifiedProperty(propertyName); // synchronize if exists, basically for user's manual call
}
public void modifiedToSpecified() {
if (__modifiedProperties.isEmpty()) {
return; // basically no way when called in Framework (because called when SpecifyColumn exists)
}
__specifiedProperties = newModifiedProperties();
__specifiedProperties.accept(__modifiedProperties);
}
// ===================================================================================
// Specified Properties
// ====================
public Set<String> myspecifiedProperties() {
if (__specifiedProperties != null) {
return __specifiedProperties.getPropertyNames();
}
return DfCollectionUtil.emptySet();
}
public void myspecifyProperty(String propertyName) {
registerSpecifiedProperty(propertyName);
}
public void myspecifyPropertyCancel(String propertyName) {
if (__specifiedProperties != null) {
__specifiedProperties.remove(propertyName);
}
}
public void clearSpecifiedInfo() {
if (__specifiedProperties != null) {
__specifiedProperties.clear();
}
}
protected void checkSpecifiedProperty(String propertyName) {
FunCustodial.checkSpecifiedProperty(this, propertyName, __specifiedProperties);
}
protected void registerSpecifiedProperty(String propertyName) { // basically called by modified property registration
if (__specifiedProperties != null) { // normally false, true if e.g. setting after selected
__specifiedProperties.addPropertyName(propertyName);
}
}
// ===================================================================================
// Unique Key
// ==========
@Override
public boolean hasPrimaryKeyValue() {
return asDocMeta().id() != null;
}
protected EntityUniqueDrivenProperties newUniqueDrivenProperties() {
return new EntityUniqueDrivenProperties();
}
@Override
public Set<String> myuniqueDrivenProperties() {
return __uniqueDrivenProperties.getPropertyNames();
}
@Override
public void myuniqueByProperty(String propertyName) {
__uniqueDrivenProperties.addPropertyName(propertyName);
}
@Override
public void myuniqueByPropertyCancel(String propertyName) {
__uniqueDrivenProperties.remove(propertyName);
}
@Override
public void clearUniqueDrivenInfo() {
__uniqueDrivenProperties.clear();
}
// ===================================================================================
// Birthplace Mark
// ===============
@Override
public void markAsSelect() {
}
@Override
public boolean createdBySelect() {
return false;
}
// ===================================================================================
// Classification
// ==============
@Override
public void myunlockUndefinedClassificationAccess() {
}
@Override
public boolean myundefinedClassificationAccessAllowed() {
return false;
}
// ===================================================================================
// Empty String
// ============
protected String convertEmptyToNull(String value) {
return (value != null && value.length() == 0) ? null : value;
}
// ===================================================================================
// Source
// ======
public abstract Map<String, Object> toSource();
// ===================================================================================
// Basic Override
// ==============
// #pending hashCode(), equals()
@Override
public int instanceHash() {
return super.hashCode();
}
@Override
public String toString() {
return getClass().getSimpleName() + ":" + doBuildColumnString(", ") + "@" + Integer.toHexString(hashCode());
}
protected abstract String doBuildColumnString(String dm);
@Override
public String toStringWithRelation() { // #pending
return toString();
}
@Override
public String buildDisplayString(String name, boolean column, boolean relation) { // #pending
return toString();
}
// ===================================================================================
// Assist Class
// ============
public class DocMeta implements Serializable {
private static final long serialVersionUID = 1L;
protected String id;
protected Long version;
private transient RequestOptionCall<IndexRequestBuilder> indexOption;
private transient RequestOptionCall<DeleteRequestBuilder> deleteOption;
public DocMeta id(String id) {
this.id = id;
myuniqueByProperty("_id");
return this;
}
public String id() {
return id;
}
public DocMeta version(Long version) {
this.version = version;
return this;
}
public Long version() {
return version;
}
public DocMeta indexOption(RequestOptionCall<IndexRequestBuilder> builder) {
this.indexOption = builder;
return this;
}
public RequestOptionCall<IndexRequestBuilder> indexOption() {
return indexOption;
}
public DocMeta deleteOption(RequestOptionCall<DeleteRequestBuilder> builder) {
this.deleteOption = builder;
return this;
}
public RequestOptionCall<DeleteRequestBuilder> deleteOption() {
return deleteOption;
}
}
@FunctionalInterface
public interface RequestOptionCall<OP> {
void callback(OP op);
}
}