gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 1 | /******************************************************************************* |
| 2 | * Copyright (c) 2007 Oracle Corporation. |
| 3 | * All rights reserved. This program and the accompanying materials |
| 4 | * are made available under the terms of the Eclipse Public License v1.0 |
| 5 | * which accompanies this distribution, and is available at |
| 6 | * http://www.eclipse.org/legal/epl-v10.html |
| 7 | * |
| 8 | * Contributors: |
| 9 | * Oracle - initial API and implementation |
| 10 | * |
| 11 | ********************************************************************************/ |
| 12 | package org.eclipse.jst.jsf.common.metadata.internal; |
| 13 | |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 14 | import java.util.Iterator; |
| 15 | |
gkessler | 53e15ba | 2007-06-11 20:55:59 +0000 | [diff] [blame] | 16 | import org.eclipse.core.runtime.IStatus; |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 17 | import org.eclipse.emf.ecore.util.EcoreUtil.Copier; |
gkessler | 53e15ba | 2007-06-11 20:55:59 +0000 | [diff] [blame] | 18 | import org.eclipse.jst.jsf.common.JSFCommonPlugin; |
itrimble | 7dafed7 | 2007-04-16 19:55:20 +0000 | [diff] [blame] | 19 | import org.eclipse.jst.jsf.common.metadata.Entity; |
| 20 | import org.eclipse.jst.jsf.common.metadata.EntityGroup; |
| 21 | import org.eclipse.jst.jsf.common.metadata.IncludeEntityGroup; |
| 22 | import org.eclipse.jst.jsf.common.metadata.Model; |
| 23 | import org.eclipse.jst.jsf.common.metadata.Trait; |
gkessler | 53e15ba | 2007-06-11 20:55:59 +0000 | [diff] [blame] | 24 | import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext; |
gkessler | 82a7558 | 2007-05-16 23:51:15 +0000 | [diff] [blame] | 25 | import org.eclipse.jst.jsf.common.metadata.query.MetaDataException; |
gkessler | 53e15ba | 2007-06-11 20:55:59 +0000 | [diff] [blame] | 26 | import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper; |
gkessler | 82a7558 | 2007-05-16 23:51:15 +0000 | [diff] [blame] | 27 | import org.eclipse.jst.jsf.common.metadata.query.internal.SearchControl; |
| 28 | import org.eclipse.jst.jsf.common.metadata.query.internal.SimpleEntityQueryVisitorImpl; |
| 29 | import org.eclipse.jst.jsf.common.metadata.query.internal.SimpleResultSet; |
| 30 | import org.eclipse.jst.jsf.common.metadata.query.internal.SimpleTraitQueryVisitorImpl; |
| 31 | import org.eclipse.jst.jsf.common.metadata.query.internal.HierarchicalSearchControl; |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 32 | /** |
| 33 | * Implements {@link IMetaDataModelMergeAssistant} |
| 34 | * |
| 35 | * Responsible for merging source models into one. The first model in has subsequent |
| 36 | * entities and traits added to it. |
| 37 | * |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 38 | * TODO - make locating of existing entities and traits in the merged model more efficient |
gkessler | cbf7322 | 2007-06-12 21:41:43 +0000 | [diff] [blame] | 39 | * TODO - refactor out Taglibdomain-only aspects of include-group processing |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 40 | * |
| 41 | */ |
| 42 | public class MetaDataModelMergeAssistantImpl implements |
| 43 | IMetaDataModelMergeAssistant { |
| 44 | |
| 45 | private MetaDataModel mergedModel; |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 46 | private Copier copier; |
gkessler | 82a7558 | 2007-05-16 23:51:15 +0000 | [diff] [blame] | 47 | private SimpleEntityQueryVisitorImpl entityVisitor; |
| 48 | private SimpleTraitQueryVisitorImpl traitVisitor; |
gkessler | 510d92b | 2007-02-28 05:04:50 +0000 | [diff] [blame] | 49 | private IMetaDataSourceModelProvider provider; |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 50 | |
| 51 | /** |
gkessler | 82a7558 | 2007-05-16 23:51:15 +0000 | [diff] [blame] | 52 | * Constructor. Queries with search control limited to first found. |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 53 | * @param model |
| 54 | */ |
| 55 | public MetaDataModelMergeAssistantImpl(MetaDataModel model) { |
| 56 | this.mergedModel = model; |
| 57 | copier = new Copier(); |
gkessler | cbf7322 | 2007-06-12 21:41:43 +0000 | [diff] [blame] | 58 | entityVisitor = new SimpleEntityQueryVisitorImpl(new HierarchicalSearchControl(1, |
| 59 | HierarchicalSearchControl.SCOPE_ALL_LEVELS)); |
gkessler | 82a7558 | 2007-05-16 23:51:15 +0000 | [diff] [blame] | 60 | traitVisitor = new SimpleTraitQueryVisitorImpl(new SearchControl(1)); |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 61 | } |
| 62 | |
| 63 | /* (non-Javadoc) |
| 64 | * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelMergeAssistant#getMergedModel() |
| 65 | */ |
| 66 | public MetaDataModel getMergedModel() { |
| 67 | return mergedModel; |
| 68 | } |
| 69 | |
| 70 | /* (non-Javadoc) |
| 71 | * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelMergeAssistant#getSourceModel() |
| 72 | */ |
gkessler | 510d92b | 2007-02-28 05:04:50 +0000 | [diff] [blame] | 73 | public IMetaDataSourceModelProvider getSourceModelProvider() { |
| 74 | return provider; |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 75 | } |
| 76 | |
gkessler | 510d92b | 2007-02-28 05:04:50 +0000 | [diff] [blame] | 77 | public void setSourceModelProvider(IMetaDataSourceModelProvider provider) { |
| 78 | this.provider = provider; |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 79 | } |
| 80 | |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 81 | |
| 82 | /* (non-Javadoc) |
itrimble | 7ecc4d5 | 2007-04-18 21:07:11 +0000 | [diff] [blame] | 83 | * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelMergeAssistant#addEntityGroup(org.eclipse.jst.jsf.common.metadata.EntityGroup) |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 84 | */ |
| 85 | public void addEntityGroup(EntityGroup entityGroup) { |
| 86 | Model model = (Model)getMergedModel().getRoot(); |
| 87 | if (!isExistingEntityGroup(model, entityGroup)){ |
| 88 | model.getEntityGroups().add(entityGroup); |
| 89 | } |
| 90 | } |
| 91 | |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 92 | /* (non-Javadoc) |
itrimble | 7ecc4d5 | 2007-04-18 21:07:11 +0000 | [diff] [blame] | 93 | * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelMergeAssistant#addEntity(org.eclipse.jst.jsf.common.metadata.Entity) |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 94 | */ |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 95 | public boolean addEntity(final Entity entity) { |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 96 | Entity mmEntity = getMergedEntity(entity); |
| 97 | if (mmEntity == null){ |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 98 | addEntityAsNecessary((Entity)entity.eContainer(), entity); |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 99 | return true; |
| 100 | } |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 101 | addIncludeGroupsAsNecessary(mmEntity, entity); |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 102 | return false; |
| 103 | } |
| 104 | |
gkessler | c2f44ec | 2007-12-07 23:43:50 +0000 | [diff] [blame] | 105 | public Entity getMergedEntity(Entity queryRoot, String entityKey){ |
| 106 | Entity ret = null; |
| 107 | SimpleResultSet rs = (SimpleResultSet)entityVisitor.findEntities(queryRoot, entityKey); |
| 108 | try { |
| 109 | if (! rs.getResults().isEmpty()) |
| 110 | ret = (Entity)rs.getResults().get(0); |
| 111 | rs.close(); |
| 112 | } catch (MetaDataException e) { |
gkessler | cfc5308 | 2008-11-18 22:25:04 +0000 | [diff] [blame] | 113 | JSFCommonPlugin.log(IStatus.ERROR, "Error in getMergedEntity()", e); //$NON-NLS-1$ |
gkessler | c2f44ec | 2007-12-07 23:43:50 +0000 | [diff] [blame] | 114 | } |
| 115 | return ret; |
| 116 | } |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 117 | private void addIncludeGroupsAsNecessary(final Entity mmEntity, final Entity entity) { |
| 118 | for (Iterator it=entity.getIncludeGroups().iterator();it.hasNext();){ |
| 119 | IncludeEntityGroup grp = (IncludeEntityGroup)it.next(); |
| 120 | boolean found = false; |
| 121 | for (Iterator it2=mmEntity.getIncludeGroups().iterator();it2.hasNext();){ |
| 122 | IncludeEntityGroup grp2 = (IncludeEntityGroup)it2.next(); |
| 123 | if (grp2.equals(grp)){ |
| 124 | found = true; |
| 125 | break; |
| 126 | } |
| 127 | } |
| 128 | if (!found){//maybe we should clone and add |
| 129 | mmEntity.getIncludeGroups().add(grp); |
| 130 | } |
| 131 | } |
| 132 | } |
| 133 | |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 134 | /** |
| 135 | * Checks to see if the entity (by id) is present in the mergedModel or not. |
| 136 | * If not, it will perform a copy of the entity and it's attributes using |
| 137 | * EcoreUtil.Copier. |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 138 | * |
| 139 | * @param parent |
| 140 | * @param entity |
| 141 | * @return |
| 142 | */ |
| 143 | private Entity addEntityAsNecessary(final Entity parent, final Entity entity) { |
| 144 | Entity mmParent = null; |
| 145 | Entity mmEntity = null; |
| 146 | if (parent != null){ |
| 147 | mmParent = getMergedEntity(parent); |
| 148 | if (mmParent == null){ |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 149 | mmParent = addEntityAsNecessary((Entity)entity.eContainer(), entity); |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 150 | } |
| 151 | } |
| 152 | if (mmParent != null){ |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 153 | mmEntity = addEntityInternal(mmParent, entity); |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 154 | return mmEntity; |
| 155 | } |
| 156 | return mmEntity; |
| 157 | } |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 158 | |
| 159 | private boolean isExistingEntityGroup(Model model, EntityGroup entityGroup) { |
| 160 | boolean found = false; |
| 161 | for(Iterator it=model.getEntityGroups().iterator();it.hasNext();){ |
| 162 | if (entityGroup.getId().equals(((EntityGroup)it.next()).getId())) |
| 163 | return true; |
| 164 | } |
| 165 | return found; |
| 166 | } |
| 167 | |
gkessler | cbf7322 | 2007-06-12 21:41:43 +0000 | [diff] [blame] | 168 | private Entity getExistingChildEntity(final Entity parent, final Entity entity) { |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 169 | for(Iterator it=parent.getChildEntities().iterator();it.hasNext();){ |
gkessler | cbf7322 | 2007-06-12 21:41:43 +0000 | [diff] [blame] | 170 | Entity foundEntity = (Entity)it.next(); |
| 171 | if (entity.getId().equals(foundEntity.getId())) |
| 172 | return foundEntity; |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 173 | } |
gkessler | cbf7322 | 2007-06-12 21:41:43 +0000 | [diff] [blame] | 174 | return null; |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 175 | } |
| 176 | |
gkessler | cbf7322 | 2007-06-12 21:41:43 +0000 | [diff] [blame] | 177 | private /*synchronized*/ Entity addEntityInternal(final Entity parent, final Entity entity) { |
cbateman | 4a2fa1e | 2007-03-22 23:54:07 +0000 | [diff] [blame] | 178 | Entity mmEntity =(Entity)copier.copy(entity); |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 179 | copier.copyReferences(); |
| 180 | parent.getChildEntities().add(mmEntity); |
| 181 | return mmEntity; |
| 182 | } |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 183 | |
| 184 | /* (non-Javadoc) |
itrimble | 7ecc4d5 | 2007-04-18 21:07:11 +0000 | [diff] [blame] | 185 | * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelMergeAssistant#addTrait(org.eclipse.jst.jsf.common.metadata.Entity, org.eclipse.jst.jsf.common.metadata.Trait) |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 186 | */ |
| 187 | public boolean addTrait(Entity entity, Trait trait) { |
| 188 | Entity returnedEntity = getMergedEntity(entity); |
| 189 | if (returnedEntity != null){ |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 190 | return addTraitAsNecessary(returnedEntity, trait); |
| 191 | } |
| 192 | return false; |
| 193 | } |
| 194 | |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 195 | |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 196 | private boolean addTraitAsNecessary(Entity mergedEntity, Trait trait) { |
| 197 | Trait mmTrait = getMergedTrait(mergedEntity, trait); |
| 198 | if (mmTrait == null){ |
gkessler | aa43c77 | 2008-09-03 23:29:04 +0000 | [diff] [blame] | 199 | addTraitInternal(mergedEntity, trait); |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 200 | return true; |
| 201 | |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 202 | } |
| 203 | return false; |
| 204 | } |
| 205 | |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 206 | /* (non-Javadoc) |
| 207 | * @see org.eclipse.jst.jsf.common.metadata.internal.IMetaDataModelMergeAssistant#setMergeComplete() |
| 208 | */ |
| 209 | public void setMergeComplete() { |
| 210 | Model model = (Model)getMergedModel().getRoot(); |
gkessler | aa43c77 | 2008-09-03 23:29:04 +0000 | [diff] [blame] | 211 | if (model != null){ |
gkessler | cfc5308 | 2008-11-18 22:25:04 +0000 | [diff] [blame] | 212 | StandardModelFactory.debug(">> Begin processIncludeGroups for: "+getMergedModel().getModelKey(),StandardModelFactory.DEBUG_MD_LOAD); //$NON-NLS-1$ |
gkessler | aa43c77 | 2008-09-03 23:29:04 +0000 | [diff] [blame] | 213 | |
| 214 | processIncludeGroups(model); |
| 215 | |
gkessler | cfc5308 | 2008-11-18 22:25:04 +0000 | [diff] [blame] | 216 | StandardModelFactory.debug(">> End processIncludeGroups for: "+getMergedModel().getModelKey(),StandardModelFactory.DEBUG_MD_LOAD); //$NON-NLS-1$ |
gkessler | aa43c77 | 2008-09-03 23:29:04 +0000 | [diff] [blame] | 217 | } |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 218 | } |
| 219 | |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 220 | /** |
| 221 | * Copies the passed trait and adds it to the merged entity. |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 222 | * The source model provider of the trait is then set on the trait so that |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 223 | * the trait can know where it came from. |
| 224 | * |
| 225 | * @param parent |
| 226 | * @param trait |
| 227 | * @return merged Trait |
| 228 | */ |
| 229 | private Trait addTraitInternal(final Entity parent, final Trait trait) { |
cbateman | 4a2fa1e | 2007-03-22 23:54:07 +0000 | [diff] [blame] | 230 | Trait mmTrait =(Trait)copier.copy(trait); |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 231 | copier.copyReferences(); |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 232 | parent.getTraits().add(mmTrait); |
| 233 | //set the model key to know from where the trait came |
gkessler | 510d92b | 2007-02-28 05:04:50 +0000 | [diff] [blame] | 234 | mmTrait.setSourceModelProvider(trait.getSourceModelProvider()); |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 235 | return mmTrait; |
| 236 | } |
| 237 | |
| 238 | /** |
| 239 | * Locates the entity in the merged model matching by id only. |
gkessler | cbf7322 | 2007-06-12 21:41:43 +0000 | [diff] [blame] | 240 | * If not located, this method returns null; |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 241 | * |
| 242 | * @param entity |
| 243 | * @return merged entity |
| 244 | */ |
gkessler | cbf7322 | 2007-06-12 21:41:43 +0000 | [diff] [blame] | 245 | private Entity getMergedEntity(Entity entity){ |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 246 | if (entity instanceof Model) |
| 247 | return (Entity)mergedModel.getRoot(); |
| 248 | |
| 249 | Entity ret = null; |
| 250 | String entityKey = getIdRelativeToRoot(entity); |
gkessler | 82a7558 | 2007-05-16 23:51:15 +0000 | [diff] [blame] | 251 | SimpleResultSet rs = (SimpleResultSet)entityVisitor.findEntities((Entity)mergedModel.getRoot(), entityKey); |
gkessler | 53e15ba | 2007-06-11 20:55:59 +0000 | [diff] [blame] | 252 | try { |
| 253 | if (! rs.getResults().isEmpty()) |
| 254 | ret = (Entity)rs.getResults().get(0); |
| 255 | rs.close(); |
| 256 | } catch (MetaDataException e) { |
gkessler | cfc5308 | 2008-11-18 22:25:04 +0000 | [diff] [blame] | 257 | JSFCommonPlugin.log(IStatus.ERROR, "Error in getMergedEntity()", e); //$NON-NLS-1$ |
gkessler | 82a7558 | 2007-05-16 23:51:15 +0000 | [diff] [blame] | 258 | } |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 259 | return ret; |
| 260 | } |
| 261 | |
| 262 | private String getIdRelativeToRoot(final Entity entity) { |
| 263 | Entity e = entity; |
| 264 | StringBuffer buf = new StringBuffer(); |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 265 | while (e.eContainer() != null){ |
| 266 | buf.insert(0, e.getId()); |
| 267 | if (e.eContainer()!=null && e.eContainer().eContainer() != null) |
gkessler | cfc5308 | 2008-11-18 22:25:04 +0000 | [diff] [blame] | 268 | buf.insert(0,"/"); //$NON-NLS-1$ |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 269 | e = (Entity)e.eContainer(); |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 270 | } |
| 271 | return buf.toString(); |
| 272 | } |
| 273 | |
| 274 | /** |
| 275 | * Locates the trait in the merged model matching by id only. |
| 276 | * If not located, this method returns null; |
| 277 | * |
| 278 | * @param entity |
| 279 | * @param trait |
| 280 | * @return merged Trait |
| 281 | */ |
| 282 | public Trait getMergedTrait(Entity entity, Trait trait){ |
gkessler | 82a7558 | 2007-05-16 23:51:15 +0000 | [diff] [blame] | 283 | SimpleResultSet rs = (SimpleResultSet)traitVisitor.findTraits(entity, trait.getId()); |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 284 | Trait ret = null; |
gkessler | 53e15ba | 2007-06-11 20:55:59 +0000 | [diff] [blame] | 285 | try { |
| 286 | if (! rs.getResults().isEmpty()) |
| 287 | ret = (Trait)rs.getResults().get(0); |
| 288 | rs.close(); |
| 289 | } catch (MetaDataException e) { |
gkessler | cfc5308 | 2008-11-18 22:25:04 +0000 | [diff] [blame] | 290 | JSFCommonPlugin.log(IStatus.ERROR, "Error in getMergedTrait()", e); //$NON-NLS-1$ |
gkessler | 82a7558 | 2007-05-16 23:51:15 +0000 | [diff] [blame] | 291 | } |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 292 | return ret; |
| 293 | } |
gkessler | 82a7558 | 2007-05-16 23:51:15 +0000 | [diff] [blame] | 294 | |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 295 | private void processIncludeGroups(final Model root) { |
cbateman | 4a2fa1e | 2007-03-22 23:54:07 +0000 | [diff] [blame] | 296 | addEntityGroupReferencesRecursively(root); |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 297 | } |
| 298 | |
| 299 | private void addEntityGroupReferencesRecursively(final Entity entity) { |
| 300 | doIncludes(entity); |
| 301 | for (int i=0, size=entity.getChildEntities().size();i<size;i++){ |
| 302 | addEntityGroupReferencesRecursively((Entity)entity.getChildEntities().get(i)); |
| 303 | } |
| 304 | } |
| 305 | |
| 306 | private void doIncludes(final Entity entity){ |
| 307 | for (int j=0, groupsSize=entity.getIncludeGroups().size();j<groupsSize; j++){ |
| 308 | IncludeEntityGroup include = (IncludeEntityGroup)entity.getIncludeGroups().get(j); |
| 309 | if (include.getId() != null){ |
| 310 | //is this a local merge? |
gkessler | cbf7322 | 2007-06-12 21:41:43 +0000 | [diff] [blame] | 311 | if (include.getModelUri() == null|| |
| 312 | (include.getModelUri() |
| 313 | .equals(getMergedModel() |
| 314 | .getModelKey().getUri())) ){ |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 315 | EntityGroup eg = ((Model)getMergedModel().getRoot()).findIncludeGroup(include.getId()); |
| 316 | addIncludeRefs(entity, eg); |
| 317 | } else //external model include |
| 318 | addIncludeRefs(entity, include); |
| 319 | } |
| 320 | } |
| 321 | } |
| 322 | /* |
| 323 | * Adds traits and child entities from an external entity group to the passed entity |
| 324 | * @param entity |
| 325 | * @param include |
| 326 | */ |
| 327 | private void addIncludeRefs(final Entity entity, final IncludeEntityGroup include) { |
gkessler | 53e15ba | 2007-06-11 20:55:59 +0000 | [diff] [blame] | 328 | ITaglibDomainMetaDataModelContext modelContext = new TaglibDomainMetaDataModelContextImpl( |
| 329 | getMergedModel().getModelKey().getDomain(), |
| 330 | getMergedModel().getModelKey().getProject(), |
| 331 | include.getModelUri() |
| 332 | ); |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 333 | |
gkessler | 53e15ba | 2007-06-11 20:55:59 +0000 | [diff] [blame] | 334 | Model externalModel = TaglibDomainMetaDataQueryHelper.getModel(modelContext); |
gkessler | 4c8bd02 | 2008-02-01 20:21:15 +0000 | [diff] [blame] | 335 | if (externalModel != null){ |
| 336 | EntityGroup entityGroup = externalModel.findIncludeGroup(include.getId()); |
| 337 | addIncludeRefs(entity, entityGroup); |
| 338 | } |
| 339 | else { |
gkessler | cfc5308 | 2008-11-18 22:25:04 +0000 | [diff] [blame] | 340 | JSFCommonPlugin.log(IStatus.ERROR, "Unable to load external metadata model refs for "+modelContext.getURI() //$NON-NLS-1$ |
| 341 | + " into "+ entity.getModel().getCurrentModelContext().getUri()); //$NON-NLS-1$ |
gkessler | 4c8bd02 | 2008-02-01 20:21:15 +0000 | [diff] [blame] | 342 | } |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 343 | } |
| 344 | |
| 345 | /* |
| 346 | * Adds traits and child entities from a local entity group to the passed entity if not already present for the entity. |
| 347 | * First |
| 348 | * @param entity |
| 349 | * @param entityGroup |
| 350 | */ |
| 351 | private void addIncludeRefs(final Entity entity, final EntityGroup entityGroup) { |
| 352 | if (entityGroup == null) |
| 353 | return; |
| 354 | |
| 355 | for (int i=0, size=entityGroup.getTraits().size();i<size;i++){ |
gkessler | cbf7322 | 2007-06-12 21:41:43 +0000 | [diff] [blame] | 356 | addTrait(entity, (Trait)entityGroup.getTraits().get(i)); |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 357 | } |
| 358 | |
| 359 | for (int i=0, size=entityGroup.getChildEntities().size();i<size;i++){ |
gkessler | cbf7322 | 2007-06-12 21:41:43 +0000 | [diff] [blame] | 360 | traverseAndAddIncludes(entity, (Entity)entityGroup.getChildEntities().get(i)); |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 361 | } |
| 362 | } |
| 363 | |
gkessler | cbf7322 | 2007-06-12 21:41:43 +0000 | [diff] [blame] | 364 | private void traverseAndAddIncludes(final Entity parent, final Entity entity){ |
| 365 | Entity mergedEntity = addIncludedEntityAsNecessary(parent, entity); |
| 366 | |
| 367 | for (final Iterator/*<Trait>*/ it=entity.getTraits().iterator();it.hasNext();){ |
| 368 | Trait trait = (Trait)it.next(); |
| 369 | addTraitAsNecessary(mergedEntity, trait); |
| 370 | } |
| 371 | |
| 372 | for (final Iterator/*<EntityKey>*/ it=entity.getChildEntities().iterator();it.hasNext();){ |
| 373 | Entity e = (Entity)it.next(); |
| 374 | traverseAndAddIncludes(mergedEntity, e);//add as normal |
| 375 | } |
| 376 | |
| 377 | } |
| 378 | |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 379 | /* |
| 380 | * Checks to see if the entity (by id) is present as a child entity in the parent or not. |
gkessler | cbf7322 | 2007-06-12 21:41:43 +0000 | [diff] [blame] | 381 | * If not, it will add the entity to the childEntities without copying. |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 382 | * |
| 383 | * @param parent |
| 384 | * @param entity |
gkessler | cbf7322 | 2007-06-12 21:41:43 +0000 | [diff] [blame] | 385 | * @return Entity |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 386 | */ |
gkessler | cbf7322 | 2007-06-12 21:41:43 +0000 | [diff] [blame] | 387 | private Entity addIncludedEntityAsNecessary(final Entity parent, final Entity entity) { |
| 388 | Entity mergedEntity = getExistingChildEntity(parent, entity); |
| 389 | if (mergedEntity == null){ |
| 390 | mergedEntity = addEntityInternal(parent, entity); |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 391 | } |
gkessler | cbf7322 | 2007-06-12 21:41:43 +0000 | [diff] [blame] | 392 | return mergedEntity; |
gkessler | c2f5b4d | 2007-02-07 00:04:40 +0000 | [diff] [blame] | 393 | } |
| 394 | |
gkessler | 185eba9 | 2007-01-24 17:22:47 +0000 | [diff] [blame] | 395 | } |