/*******************************************************************************
* Copyright (c) 2012 OpenLegacy Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* OpenLegacy Inc. - initial API and implementation
*******************************************************************************/
package org.openlegacy.terminal.support.binders;
import org.openlegacy.terminal.ScreenEntityBinder;
import org.openlegacy.terminal.ScreenPojoFieldAccessor;
import org.openlegacy.terminal.TerminalSendAction;
import org.openlegacy.terminal.TerminalSnapshot;
import org.openlegacy.terminal.definitions.ScreenFieldDefinition;
import org.openlegacy.terminal.definitions.ScreenPartEntityDefinition;
import org.openlegacy.terminal.services.ScreenEntitiesRegistry;
import org.openlegacy.terminal.utils.SimpleScreenPojoFieldAccessor;
import org.openlegacy.utils.ReflectionUtil;
import org.springframework.stereotype.Component;
import java.io.Serializable;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import javax.inject.Inject;
@Component
public class ScreenEntityPartsBinder implements ScreenEntityBinder, Serializable {
private static final long serialVersionUID = 1L;
@Inject
private ScreenEntitiesRegistry screenEntitiesRegistry;
@Inject
private ScreenBinderLogic screenBinderLogic;
public void populateEntity(Object screenEntity, TerminalSnapshot terminalSnapshot) {
ScreenPojoFieldAccessor fieldAccessor = new SimpleScreenPojoFieldAccessor(screenEntity);
Map<String, ScreenPartEntityDefinition> partsDefinitions = screenEntitiesRegistry.get(screenEntity.getClass()).getPartsDefinitions();
Set<String> fieldPartNames = partsDefinitions.keySet();
for (String fieldPartName : fieldPartNames) {
ScreenPartEntityDefinition screenPartEntityDefinition = partsDefinitions.get(fieldPartName);
Object partObject = ReflectionUtil.newInstance(screenPartEntityDefinition.getPartClass());
fieldAccessor.setFieldValue(fieldPartName, partObject);
SimpleScreenPojoFieldAccessor partFieldAccessor = new SimpleScreenPojoFieldAccessor(partObject);
Collection<ScreenFieldDefinition> fieldMappingDefinitions = screenPartEntityDefinition.getFieldsDefinitions().values();
screenBinderLogic.populatedFields(partFieldAccessor, terminalSnapshot, fieldMappingDefinitions);
}
}
public void populateSendAction(TerminalSendAction sendAction, TerminalSnapshot terminalSnapshot, Object entity) {
Map<String, ScreenPartEntityDefinition> partsDefinitions = screenEntitiesRegistry.get(entity.getClass()).getPartsDefinitions();
ScreenPojoFieldAccessor fieldAccessor = new SimpleScreenPojoFieldAccessor(entity);
Set<String> fieldPartNames = partsDefinitions.keySet();
for (String fieldPartName : fieldPartNames) {
ScreenPartEntityDefinition screenPartEntityDefinition = partsDefinitions.get(fieldPartName);
Object screenPart = fieldAccessor.getFieldValue(fieldPartName);
screenBinderLogic.populateSendAction(sendAction, terminalSnapshot, screenPart,
screenPartEntityDefinition.getFieldsDefinitions().values());
}
}
}