package org.deephacks.confit.internal.jaxrs; import org.deephacks.confit.model.Bean; import org.deephacks.confit.model.BeanId; import org.deephacks.confit.model.Schema; import org.deephacks.confit.model.Schema.SchemaPropertyRef; import org.deephacks.confit.model.Schema.SchemaPropertyRefList; import org.deephacks.confit.model.Schema.SchemaPropertyRefMap; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; public class JaxrsBeans { private Collection<JaxrsBean> beans = new ArrayList<>(); public JaxrsBeans() { } public JaxrsBeans(Collection<Bean> beans) { addAll(beans); } public void add(Bean bean) { this.beans.add(new JaxrsBean(bean)); } public void addAll(Collection<Bean> beans) { for (Bean bean : beans) { this.beans.add(new JaxrsBean(bean)); } } public Collection<JaxrsBean> getBeans() { return beans; } public List<Bean> toBeans(Map<String, Schema> schemas) { ArrayList<Bean> result = new ArrayList<>(); for (JaxrsBean bean : beans) { Schema schema = schemas.get(bean.getSchemaName()); result.add(bean.toBean(schema)); } return result; } public static class JaxrsBean { private String id; private String schemaName; private Map<String, List<String>> properties = new HashMap<>(); public JaxrsBean() { } public JaxrsBean(Bean bean) { this.schemaName = bean.getId().getSchemaName(); this.id = bean.getId().getInstanceId(); for (String name : bean.getPropertyNames()) { List<String> values = bean.getValues(name); if (values == null || values.isEmpty()) { continue; } properties.put(name, values); } for (String name : bean.getReferenceNames()) { List<BeanId> refs = bean.getReferences(); if (refs == null || refs.isEmpty()) { continue; } List<String> values = new ArrayList<>(); for (BeanId id : refs) { values.add(id.getInstanceId()); } properties.put(name, values); } } public String getSchemaName() { return schemaName; } public void setSchemaName(String schemaName) { this.schemaName = schemaName; } public String getId() { return id; } public void setId(String id) { this.id = id; } public Map<String, List<String>> getProperties() { return properties; } public void setProperties(Map<String, List<String>> properties) { this.properties = properties; } public Bean toBean(Schema schema) { final BeanId id; if (schema.getId().isSingleton()) { id = BeanId.createSingleton(schema.getName()); } else { id = BeanId.create(getId(), getSchemaName()); } Bean bean = Bean.create(id); Map<String, List<String>> props = getProperties(); for (String name : schema.getPropertyNames()) { List<String> values = props.get(name); if (values == null) { continue; } bean.addProperty(name, values); } for (String name : schema.getReferenceNames()) { List<String> values = props.get(name); if (values == null) { continue; } SchemaPropertyRef ref = schema.get(SchemaPropertyRef.class, name); String schemaName = null; if (ref != null) { schemaName = ref.getSchemaName(); } SchemaPropertyRefList refList = schema.get(SchemaPropertyRefList.class, name); if (refList != null) { schemaName = refList.getSchemaName(); } SchemaPropertyRefMap refMap = schema.get(SchemaPropertyRefMap.class, name); if (refMap != null) { schemaName = refMap.getSchemaName(); } for (String value : values) { bean.addReference(name, BeanId.create(value, schemaName)); } } return bean; } } public static class JaxrsBeanId { private String schemaName; private String instanceId; public JaxrsBeanId() { } public JaxrsBeanId(String schemaName, String instanceId) { this.schemaName = schemaName; this.instanceId = instanceId; } public String getSchemaName() { return schemaName; } public String getInstanceId() { return instanceId; } public BeanId toBeanId() { return BeanId.create(instanceId, schemaName); } } }