You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by do...@apache.org on 2012/04/19 01:48:27 UTC

svn commit: r1327733 - /ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelReader.java

Author: doogie
Date: Wed Apr 18 23:48:26 2012
New Revision: 1327733

URL: http://svn.apache.org/viewvc?rev=1327733&view=rev
Log:
FIX/FEATURE: When connecting views to their real entities, do a dependency sort, so
that a view that references another view is configured after it's
dependencies.

Modified:
    ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelReader.java

Modified: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelReader.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelReader.java?rev=1327733&r1=1327732&r2=1327733&view=diff
==============================================================================
--- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelReader.java (original)
+++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelReader.java Wed Apr 18 23:48:26 2012
@@ -176,7 +176,6 @@ public class ModelReader implements Seri
         // utilTimer.timerString("  After createModelEntity -- " + i + " --");
         if (modelEntity != null) {
             modelEntity.setLocation(resourceLocation);
-            entityCache.put(entityName, modelEntity);
             // utilTimer.timerString("  After entityCache.put -- " + i + " --");
             if (isEntity) {
                 if (Debug.verboseOn()) Debug.logVerbose("-- [Entity]: #" + i + ": " + entityName, module);
@@ -245,7 +244,11 @@ public class ModelReader implements Seri
                                     i++;
                                     ModelEntity modelEntity = buildEntity(entityResourceHandler, (Element) curChild, i, def);
                                     // put the view entity in a list to get ready for the second pass to populate fields...
-                                    if (isViewEntity) tempViewEntityList.add((ModelViewEntity) modelEntity);
+                                    if (isViewEntity) {
+                                        tempViewEntityList.add((ModelViewEntity) modelEntity);
+                                    } else {
+                                        entityCache.put(modelEntity.getEntityName(), modelEntity);
+                                    }
                                 } else if (isExtendEntity && curChild.getNodeType() == Node.ELEMENT_NODE) {
                                     tempExtendEntityElementList.add((Element) curChild);
                                 }
@@ -266,15 +269,59 @@ public class ModelReader implements Seri
 
                     // do a pass on all of the view entities now that all of the entities have
                     // loaded and populate the fields
-                    for (ModelViewEntity curViewEntity: tempViewEntityList) {
-
-                        curViewEntity.populateFields(this);
-                        for (ModelViewEntity.ModelMemberEntity mve: curViewEntity.getAllModelMemberEntities()) {
+                    while (!tempViewEntityList.isEmpty()) {
+                        int startSize = tempViewEntityList.size();
+                        Iterator<ModelViewEntity> mveIt = tempViewEntityList.iterator();
+TEMP_VIEW_LOOP:
+                        while (mveIt.hasNext()) {
+                            ModelViewEntity curViewEntity = mveIt.next();
+                            for (ModelViewEntity.ModelMemberEntity mve: curViewEntity.getAllModelMemberEntities()) {
+                                if (!entityCache.containsKey(mve.getEntityName())) {
+                                    continue TEMP_VIEW_LOOP;
+                                }
+                            }
+                            mveIt.remove();
+                            curViewEntity.populateFields(this);
+                            for (ModelViewEntity.ModelMemberEntity mve: curViewEntity.getAllModelMemberEntities()) {
+                                ModelEntity me = (ModelEntity) entityCache.get(mve.getEntityName());
+                                me.addViewEntity(curViewEntity);
+                            }
+                            entityCache.put(curViewEntity.getEntityName(), curViewEntity);
+                        }
+                        if (tempViewEntityList.size() == startSize) {
+                            // Oops, the remaining views reference other entities
+                            // that can't be found, or they reference other views
+                            // that have some reference problem.
+                            break;
+                        }
+                    }
+                    if (!tempViewEntityList.isEmpty()) {
+                        StringBuilder sb = new StringBuilder("View entities reference non-existant members:\n");
+                        Set<String> allViews = FastSet.newInstance();
+                        for (ModelViewEntity curViewEntity: tempViewEntityList) {
+                            allViews.add(curViewEntity.getEntityName());
+                        }
+                        for (ModelViewEntity curViewEntity: tempViewEntityList) {
+                            Set<String> perViewMissingEntities = FastSet.newInstance();
+                            Iterator<ModelViewEntity.ModelMemberEntity> mmeIt = curViewEntity.getAllModelMemberEntities().iterator();
+                            while (mmeIt.hasNext()) {
+                                ModelViewEntity.ModelMemberEntity mme = mmeIt.next();
+                                String memberEntityName = mme.getEntityName();
+                                if (!entityCache.containsKey(memberEntityName)) {
+                                    // this member is not a real entity
+                                    // check to see if it is a view
+                                    if (!allViews.contains(memberEntityName)) {
+                                        // not a view, it's a real missing entity
+                                        perViewMissingEntities.add(memberEntityName);
+                                    }
+                                }
+                            }
+                            for (String perViewMissingEntity: perViewMissingEntities) {
+                                sb.append("\t[").append(curViewEntity.getEntityName()).append("] missing member entity [").append(perViewMissingEntity).append("]\n");
+                            }
 
-                            ModelEntity me = entityCache.get(mve.getEntityName());
-                            if (me == null) throw new GenericEntityConfException("View " + curViewEntity.getEntityName() + " references non-existant entity: " + mve.getEntityName());
-                            me.addViewEntity(curViewEntity);
                         }
+                        throw new GenericEntityConfException(sb.toString());
                     }
 
                     // auto-create relationships