/** * Copyright 2004-2016 Riccardo Solmi. All rights reserved. * This file is part of the Whole Platform. * * The Whole Platform is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * The Whole Platform 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the Whole Platform. If not, see <http://www.gnu.org/licenses/>. */ package org.whole.lang.builders; import java.util.Date; import org.whole.lang.contexts.IEntityContext; import org.whole.lang.factories.GenericEntityFactory; import org.whole.lang.factories.IEntityFactory; import org.whole.lang.factories.IEntityRegistryProvider; import org.whole.lang.factories.RegistryConfigurations; import org.whole.lang.model.EnumValue; import org.whole.lang.model.IEntity; import org.whole.lang.reflect.EntityDescriptor; import org.whole.lang.reflect.FeatureDescriptor; import org.whole.lang.templates.ITemplate; import org.whole.lang.util.EntityUtils; /** * @author Riccardo Solmi */ public class ModelBuilder extends AbstractBuilder { private final IEntityFactory entityFactory; private final IEntityFactory resolverEntityFactory; public ModelBuilder() { this(RegistryConfigurations.DEFAULT); } public ModelBuilder(IEntityRegistryProvider provider) { entityFactory = GenericEntityFactory.instance(provider); resolverEntityFactory = GenericEntityFactory.instance(RegistryConfigurations.RESOLVER); } public ModelBuilder(IEntityContext entityContext) { this(entityContext, RegistryConfigurations.DEFAULT); } public ModelBuilder(IEntityContext entityContext, IEntityRegistryProvider provider) { this(provider); wSetEntityContext(entityContext); } public void wFeature(int index) { entityContext.wFeature(index); } public void wFeature(FeatureDescriptor feature) { entityContext.wFeature(feature); } public void wFeature(ITemplate pattern) { //TODO } protected IEntity wClonePrototype() { return entityFactory.create(entityContext.wCurrentGetEntityDescriptor()); } protected <T extends IEntity> T wClone(EntityDescriptor<T> entityDesc) { return entityFactory.create(entityDesc); } protected <T extends IEntity> T wShallowClone(EntityDescriptor<T> entityDesc) { return entityFactory.shallowClone(entityDesc); } protected IEntity wCloneFeature(EntityDescriptor<?> entityDesc) { return entityFactory.cloneFeature( entityDesc, entityContext.wCurrentIndexOf()); } protected IEntity wCloneFeature() { return wCloneFeature(entityContext.wGetAdaptee(false).wGetEntityDescriptor()); } public void wDefault() { if (entityContext.wHasNext()) entityContext.wCurrentSet(wCloneFeature()); else entityContext.wCurrentSet(wClonePrototype()); } public void wEntity() { entityContext.wCurrentSet(wClonePrototype()); } public void wEntity_() { entityContext.wCurrentSet(wClonePrototype()); } public void _wEntity() { _wEntity(entityContext.wGetEntityDescriptor()); } public void wEntity(EntityDescriptor<?> entityDesc) { entityContext.wCurrentSet(wClone(entityDesc)); } public void wEntity_(EntityDescriptor<?> entityDesc) { entityContext.wCurrentSet(wShallowClone(entityDesc)); } public void wEntity_(EntityDescriptor<?> entityDesc, int initialCapacity) { // wEntity_(entityDesc); entityContext.wCurrentSet(resolverEntityFactory.shallowClone(entityDesc)); //TODO ensureCapacity } public void _wEntity(EntityDescriptor<?> entityDesc) { if (EntityUtils.isSimple(entityDesc)) { IEntity prototype = entityFactory.getEntityRegistry(entityDesc).get(entityDesc); int index = 0; entityContext.wFeature(0); while (entityContext.wHasNext()) { if (entityContext.wCurrentGet() == prototype.wGet(index++)) entityContext.wCurrentSet(wCloneFeature(entityDesc)); entityContext.wNext(); } } else while (entityContext.wHasNext()) { entityContext.wCurrentSet(wCloneFeature()); entityContext.wNext(); } } public void wEntity(EntityDescriptor<?> entityDesc, boolean value) { IEntity valueEntity = wClone(entityDesc); entityContext.wCurrentSet(valueEntity); valueEntity.wSetValue(value); } public void wEntity(EntityDescriptor<?> entityDesc, byte value) { IEntity valueEntity = wClone(entityDesc); entityContext.wCurrentSet(valueEntity); valueEntity.wSetValue(value); } public void wEntity(EntityDescriptor<?> entityDesc, char value) { IEntity valueEntity = wClone(entityDesc); entityContext.wCurrentSet(valueEntity); valueEntity.wSetValue(value); } public void wEntity(EntityDescriptor<?> entityDesc, double value) { IEntity valueEntity = wClone(entityDesc); entityContext.wCurrentSet(valueEntity); valueEntity.wSetValue(value); } public void wEntity(EntityDescriptor<?> entityDesc, float value) { IEntity valueEntity = wClone(entityDesc); entityContext.wCurrentSet(valueEntity); valueEntity.wSetValue(value); } public void wEntity(EntityDescriptor<?> entityDesc, int value) { IEntity valueEntity = wClone(entityDesc); entityContext.wCurrentSet(valueEntity); valueEntity.wSetValue(value); } public void wEntity(EntityDescriptor<?> entityDesc, long value) { IEntity valueEntity = wClone(entityDesc); entityContext.wCurrentSet(valueEntity); valueEntity.wSetValue(value); } public void wEntity(EntityDescriptor<?> entityDesc, short value) { IEntity valueEntity = wClone(entityDesc); entityContext.wCurrentSet(valueEntity); valueEntity.wSetValue(value); } public void wEntity(EntityDescriptor<?> entityDesc, String value) { IEntity valueEntity = wClone(entityDesc); entityContext.wCurrentSet(valueEntity); //TODO moved responsibility to GenericBuilderContext // if (entityDesc.getDataKind().isString()) valueEntity.wSetValue(value); // else // DataTypeUtils.setFromPersistenceString(valueEntity, value); } public void wEntity(EntityDescriptor<?> entityDesc, Date value) { IEntity valueEntity = wClone(entityDesc); entityContext.wCurrentSet(valueEntity); valueEntity.wSetValue(value); } public void wEntity(EntityDescriptor<?> entityDesc, EnumValue value) { IEntity valueEntity = wClone(entityDesc); entityContext.wCurrentSet(valueEntity); valueEntity.wSetValue(value); } public void wEntity(EntityDescriptor<?> entityDesc, Object value) { IEntity valueEntity = wClone(entityDesc); entityContext.wCurrentSet(valueEntity); valueEntity.wSetValue(value); } }