You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by jo...@apache.org on 2008/04/03 09:59:55 UTC

svn commit: r644206 - in /ofbiz/trunk/framework: entity/src/org/ofbiz/entity/model/ service/src/org/ofbiz/service/ service/src/org/ofbiz/service/eca/ webtools/src/org/ofbiz/webtools/artifactinfo/ webtools/webapp/webtools/artifactinfo/

Author: jonesde
Date: Thu Apr  3 00:59:52 2008
New Revision: 644206

URL: http://svn.apache.org/viewvc?rev=644206&view=rev
Log:
Added stuff to get definition location URL for all artifact types

Modified:
    ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelReader.java
    ofbiz/trunk/framework/service/src/org/ofbiz/service/ModelService.java
    ofbiz/trunk/framework/service/src/org/ofbiz/service/ModelServiceReader.java
    ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaRule.java
    ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaUtil.java
    ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/ArtifactInfoBase.java
    ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/ControllerRequestArtifactInfo.java
    ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/ControllerViewArtifactInfo.java
    ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/EntityArtifactInfo.java
    ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/FormWidgetArtifactInfo.java
    ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/ScreenWidgetArtifactInfo.java
    ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/ServiceArtifactInfo.java
    ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/ServiceEcaArtifactInfo.java
    ofbiz/trunk/framework/webtools/webapp/webtools/artifactinfo/ArtifactInfo.ftl

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=644206&r1=644205&r2=644206&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 Thu Apr  3 00:59:52 2008
@@ -164,13 +164,16 @@
             modelEntity = createModelViewEntity(curEntityElement, null, def);
         }
 
+        String resourceLocation = entityResourceHandler.getLocation();
+        try {
+            resourceLocation = entityResourceHandler.getURL().toExternalForm();
+        } catch (GenericConfigException e) {
+            Debug.logError(e, "Could not get resource URL", module);
+        }
+        
         // utilTimer.timerString("  After createModelEntity -- " + i + " --");
         if (modelEntity != null) {
-            try {
-                modelEntity.setLocation(entityResourceHandler.getFullLocation());
-            } catch (GenericConfigException e) {
-                Debug.logWarning("Error getting ResourceHandler full location: " + e.getMessage(), module);
-            }
+            modelEntity.setLocation(resourceLocation);
             entityCache.put(entityName, modelEntity);
             // utilTimer.timerString("  After entityCache.put -- " + i + " --");
             if (isEntity) {

Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/ModelService.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/ModelService.java?rev=644206&r1=644205&r2=644206&view=diff
==============================================================================
--- ofbiz/trunk/framework/service/src/org/ofbiz/service/ModelService.java (original)
+++ ofbiz/trunk/framework/service/src/org/ofbiz/service/ModelService.java Thu Apr  3 00:59:52 2008
@@ -96,6 +96,9 @@
 
     /** The name of this service */
     public String name;
+    
+    /** The location of the definition this service */
+    public String definitionLocation;
 
     /** The description of this service */
     public String description;
@@ -188,6 +191,7 @@
 
     public ModelService(ModelService model) {
         this.name = model.name;
+        this.definitionLocation = model.definitionLocation;
         this.description = model.description;
         this.engineName = model.engineName;
         this.nameSpace = model.nameSpace;
@@ -243,6 +247,7 @@
     public String toString() {
         StringBuilder buf = new StringBuilder();
         buf.append(name).append("::");
+        buf.append(definitionLocation).append("::");
         buf.append(description).append("::");
         buf.append(engineName).append("::");
         buf.append(nameSpace).append("::");

Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/ModelServiceReader.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/ModelServiceReader.java?rev=644206&r1=644205&r2=644206&view=diff
==============================================================================
--- ofbiz/trunk/framework/service/src/org/ofbiz/service/ModelServiceReader.java (original)
+++ ofbiz/trunk/framework/service/src/org/ofbiz/service/ModelServiceReader.java Thu Apr  3 00:59:52 2008
@@ -141,6 +141,13 @@
 
                     docElement.normalize();
 
+                    String resourceLocation = handler.getLocation();
+                    try {
+                        resourceLocation = handler.getURL().toExternalForm();
+                    } catch (GenericConfigException e) {
+                        Debug.logError(e, "Could not get resource URL", module);
+                    }
+                    
                     int i = 0;
                     Node curChild = docElement.getFirstChild();
                     if (curChild != null) {
@@ -153,8 +160,8 @@
                         do {
                             if (curChild.getNodeType() == Node.ELEMENT_NODE && "service".equals(curChild.getNodeName())) {
                                 i++;
-                                Element curService = (Element) curChild;
-                                String serviceName = UtilXml.checkEmpty(curService.getAttribute("name"));
+                                Element curServiceElement = (Element) curChild;
+                                String serviceName = UtilXml.checkEmpty(curServiceElement.getAttribute("name"));
 
                                 // check to see if service with same name has already been read
                                 if (modelServices.containsKey(serviceName)) {
@@ -163,7 +170,7 @@
                                 }
 
                                 // utilTimer.timerString("  After serviceName -- " + i + " --");
-                                ModelService service = createModelService(curService);
+                                ModelService service = createModelService(curServiceElement, resourceLocation);
 
                                 // utilTimer.timerString("  After createModelService -- " + i + " --");
                                 if (service != null) {
@@ -198,15 +205,9 @@
                         Debug.logImportant("Loaded " + i + " Service definitions from " + readerURL, module);
                     } else {
                         utilTimer.timerString("Finished document in " + handler + " - Total Services: " + i + " FINISHED");
-						if (Debug.importantOn()) {
-							String resourceLocation = handler.getLocation();
-							try {
-								resourceLocation = handler.getURL().toExternalForm();
-							} catch (GenericConfigException e) {
-								Debug.logError(e, "Could not get resource URL", module);
-							}
-	                        Debug.logImportant("Loaded " + i + " Service definitions from " + resourceLocation, module);
-						}
+                        if (Debug.importantOn()) {
+                            Debug.logImportant("Loaded " + i + " Service definitions from " + resourceLocation, module);
+                        }
                     }
                 }
             }
@@ -252,10 +253,11 @@
         return ec.keySet();
     }
 
-    protected ModelService createModelService(Element serviceElement) {
+    protected ModelService createModelService(Element serviceElement, String resourceLocation) {
         ModelService service = new ModelService();
 
         service.name = UtilXml.checkEmpty(serviceElement.getAttribute("name")).intern();
+        service.definitionLocation = resourceLocation;
         service.engineName = UtilXml.checkEmpty(serviceElement.getAttribute("engine")).intern();
         service.location = UtilXml.checkEmpty(serviceElement.getAttribute("location")).intern();
         service.invoke = UtilXml.checkEmpty(serviceElement.getAttribute("invoke")).intern();  
@@ -502,7 +504,7 @@
                             param.type = fieldType.getJavaType();
                             // this is a special case where we use something different in the service layer than we do in the entity/data layer
                             if ("java.sql.Blob".equals(param.type)) {
-                            	param.type = "java.nio.ByteBuffer";
+                                param.type = "java.nio.ByteBuffer";
                             }
                             param.mode = UtilXml.checkEmpty(autoElement.getAttribute("mode")).intern();
                             param.optional = "true".equalsIgnoreCase(autoElement.getAttribute("optional")); // default to true

Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaRule.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaRule.java?rev=644206&r1=644205&r2=644206&view=diff
==============================================================================
--- ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaRule.java (original)
+++ ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaRule.java Thu Apr  3 00:59:52 2008
@@ -46,10 +46,12 @@
     protected List<ServiceEcaCondition> conditions = FastList.newInstance();
     protected List<Object> actionsAndSets = FastList.newInstance();
     protected boolean enabled = true;
+    protected String definitionLocation = null;
 
     protected ServiceEcaRule() {}
 
-    public ServiceEcaRule(Element eca) {
+    public ServiceEcaRule(Element eca, String definitionLocation) {
+        this.definitionLocation = definitionLocation;
         this.serviceName = eca.getAttribute("service");
         this.eventName = eca.getAttribute("event");
         this.runOnFailure = "true".equals(eca.getAttribute("run-on-failure"));
@@ -91,6 +93,10 @@
     
     public String getEventName() {
         return this.eventName;
+    }
+    
+    public String getDefinitionLocation() {
+        return this.definitionLocation;
     }
     
     public List<ServiceEcaAction> getEcaActionList() {

Modified: ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaUtil.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaUtil.java?rev=644206&r1=644205&r2=644206&view=diff
==============================================================================
--- ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaUtil.java (original)
+++ ofbiz/trunk/framework/service/src/org/ofbiz/service/eca/ServiceEcaUtil.java Thu Apr  3 00:59:52 2008
@@ -82,6 +82,13 @@
             return;
         }
 
+        String resourceLocation = handler.getLocation();
+        try {
+            resourceLocation = handler.getURL().toExternalForm();
+        } catch (GenericConfigException e) {
+            Debug.logError(e, "Could not get resource URL", module);
+        }
+        
         int numDefs = 0;
         for (Element e: UtilXml.childElementList(rootElement, "eca")) {
             String serviceName = e.getAttribute("service");
@@ -101,16 +108,10 @@
                     eventMap.put(eventName, rules);
                 }
             }
-            rules.add(new ServiceEcaRule(e));
+            rules.add(new ServiceEcaRule(e, resourceLocation));
             numDefs++;
         }
         if (Debug.importantOn()) {
-            String resourceLocation = handler.getLocation();
-            try {
-                resourceLocation = handler.getURL().toExternalForm();
-            } catch (GenericConfigException e) {
-                Debug.logError(e, "Could not get resource URL", module);
-            }
             Debug.logImportant("Loaded [" + numDefs + "] Service ECA definitions from " + resourceLocation, module);
         }
     }

Modified: ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/ArtifactInfoBase.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/ArtifactInfoBase.java?rev=644206&r1=644205&r2=644206&view=diff
==============================================================================
--- ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/ArtifactInfoBase.java (original)
+++ ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/ArtifactInfoBase.java Thu Apr  3 00:59:52 2008
@@ -18,6 +18,9 @@
  */
 package org.ofbiz.webtools.artifactinfo;
 
+import java.net.MalformedURLException;
+import java.net.URL;
+
 
 
 /**
@@ -49,6 +52,8 @@
     abstract public String getDisplayType();
     abstract public String getType();
     abstract public String getUniqueId();
+    abstract public URL getLocationURL() throws MalformedURLException;
+    
     
     //public static List<ArtifactInfoBase> sortArtifactInfoSetByDisplayName(Set<ArtifactInfoBase> artifactInfoSet) {
         //SortedMap<String, ArtifactInfoBase> sortedMap = FastMap.newInstance();

Modified: ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/ControllerRequestArtifactInfo.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/ControllerRequestArtifactInfo.java?rev=644206&r1=644205&r2=644206&view=diff
==============================================================================
--- ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/ControllerRequestArtifactInfo.java (original)
+++ ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/ControllerRequestArtifactInfo.java Thu Apr  3 00:59:52 2008
@@ -18,6 +18,7 @@
  */
 package org.ofbiz.webtools.artifactinfo;
 
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.Map;
 import java.util.Set;
@@ -146,6 +147,10 @@
     
     public String getUniqueId() {
         return this.controllerXmlUrl.toExternalForm() + "#" + this.requestUri;
+    }
+    
+    public URL getLocationURL() throws MalformedURLException {
+        return this.controllerXmlUrl;
     }
     
     public boolean equals(Object obj) {

Modified: ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/ControllerViewArtifactInfo.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/ControllerViewArtifactInfo.java?rev=644206&r1=644205&r2=644206&view=diff
==============================================================================
--- ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/ControllerViewArtifactInfo.java (original)
+++ ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/ControllerViewArtifactInfo.java Thu Apr  3 00:59:52 2008
@@ -18,6 +18,7 @@
  */
 package org.ofbiz.webtools.artifactinfo;
 
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.Map;
 import java.util.Set;
@@ -104,6 +105,10 @@
     
     public String getUniqueId() {
         return this.controllerXmlUrl.toExternalForm() + "#" + this.viewUri;
+    }
+    
+    public URL getLocationURL() throws MalformedURLException {
+        return this.controllerXmlUrl;
     }
     
     public boolean equals(Object obj) {

Modified: ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/EntityArtifactInfo.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/EntityArtifactInfo.java?rev=644206&r1=644205&r2=644206&view=diff
==============================================================================
--- ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/EntityArtifactInfo.java (original)
+++ ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/EntityArtifactInfo.java Thu Apr  3 00:59:52 2008
@@ -18,11 +18,14 @@
  */
 package org.ofbiz.webtools.artifactinfo;
 
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.util.List;
 import java.util.Set;
 
 import javolution.util.FastSet;
 
+import org.ofbiz.base.location.FlexibleLocation;
 import org.ofbiz.base.util.GeneralException;
 import org.ofbiz.entity.GenericEntityException;
 import org.ofbiz.entity.model.ModelEntity;
@@ -73,6 +76,10 @@
     
     public String getUniqueId() {
         return this.modelEntity.getEntityName();
+    }
+    
+    public URL getLocationURL() throws MalformedURLException {
+        return FlexibleLocation.resolveLocation(this.modelEntity.getLocation(), null);
     }
     
     public boolean equals(Object obj) {

Modified: ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/FormWidgetArtifactInfo.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/FormWidgetArtifactInfo.java?rev=644206&r1=644205&r2=644206&view=diff
==============================================================================
--- ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/FormWidgetArtifactInfo.java (original)
+++ ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/FormWidgetArtifactInfo.java Thu Apr  3 00:59:52 2008
@@ -19,12 +19,15 @@
 package org.ofbiz.webtools.artifactinfo;
 
 import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.util.Set;
 
 import javax.xml.parsers.ParserConfigurationException;
 
 import javolution.util.FastSet;
 
+import org.ofbiz.base.location.FlexibleLocation;
 import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.GeneralException;
 import org.ofbiz.base.util.UtilMisc;
@@ -193,6 +196,10 @@
     
     public String getUniqueId() {
         return this.formLocation + "#" + this.formName;
+    }
+    
+    public URL getLocationURL() throws MalformedURLException {
+        return FlexibleLocation.resolveLocation(this.formLocation, null);
     }
     
     public boolean equals(Object obj) {

Modified: ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/ScreenWidgetArtifactInfo.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/ScreenWidgetArtifactInfo.java?rev=644206&r1=644205&r2=644206&view=diff
==============================================================================
--- ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/ScreenWidgetArtifactInfo.java (original)
+++ ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/ScreenWidgetArtifactInfo.java Thu Apr  3 00:59:52 2008
@@ -19,12 +19,15 @@
 package org.ofbiz.webtools.artifactinfo;
 
 import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.util.Set;
 
 import javax.xml.parsers.ParserConfigurationException;
 
 import javolution.util.FastSet;
 
+import org.ofbiz.base.location.FlexibleLocation;
 import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.GeneralException;
 import org.ofbiz.base.util.UtilMisc;
@@ -179,6 +182,10 @@
     
     public String getUniqueId() {
         return this.screenLocation + "#" + this.screenName;
+    }
+    
+    public URL getLocationURL() throws MalformedURLException {
+        return FlexibleLocation.resolveLocation(this.screenLocation, null);
     }
     
     public boolean equals(Object obj) {

Modified: ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/ServiceArtifactInfo.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/ServiceArtifactInfo.java?rev=644206&r1=644205&r2=644206&view=diff
==============================================================================
--- ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/ServiceArtifactInfo.java (original)
+++ ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/ServiceArtifactInfo.java Thu Apr  3 00:59:52 2008
@@ -21,6 +21,8 @@
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -29,6 +31,7 @@
 import javolution.util.FastMap;
 import javolution.util.FastSet;
 
+import org.ofbiz.base.location.FlexibleLocation;
 import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.FileUtil;
 import org.ofbiz.base.util.GeneralException;
@@ -245,6 +248,14 @@
     
     public String getUniqueId() {
         return this.modelService.name;
+    }
+    
+    public URL getLocationURL() throws MalformedURLException {
+        return FlexibleLocation.resolveLocation(this.modelService.definitionLocation, null);
+    }
+    
+    public URL getImplementationLocationURL() throws MalformedURLException {
+        return FlexibleLocation.resolveLocation(this.modelService.location, null);
     }
     
     public Set<EntityArtifactInfo> getEntitiesUsedByService() {

Modified: ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/ServiceEcaArtifactInfo.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/ServiceEcaArtifactInfo.java?rev=644206&r1=644205&r2=644206&view=diff
==============================================================================
--- ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/ServiceEcaArtifactInfo.java (original)
+++ ofbiz/trunk/framework/webtools/src/org/ofbiz/webtools/artifactinfo/ServiceEcaArtifactInfo.java Thu Apr  3 00:59:52 2008
@@ -18,6 +18,8 @@
  */
 package org.ofbiz.webtools.artifactinfo;
 
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -26,6 +28,7 @@
 import javolution.util.FastMap;
 import javolution.util.FastSet;
 
+import org.ofbiz.base.location.FlexibleLocation;
 import org.ofbiz.base.util.GeneralException;
 import org.ofbiz.base.util.UtilMisc;
 import org.ofbiz.service.eca.ServiceEcaAction;
@@ -74,6 +77,10 @@
     
     public String getUniqueId() {
         return this.serviceEcaRule.toString();
+    }
+    
+    public URL getLocationURL() throws MalformedURLException {
+        return FlexibleLocation.resolveLocation(this.serviceEcaRule.getDefinitionLocation(), null);
     }
     
     public ServiceEcaRule getServiceEcaRule() {

Modified: ofbiz/trunk/framework/webtools/webapp/webtools/artifactinfo/ArtifactInfo.ftl
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webtools/webapp/webtools/artifactinfo/ArtifactInfo.ftl?rev=644206&r1=644205&r2=644206&view=diff
==============================================================================
--- ofbiz/trunk/framework/webtools/webapp/webtools/artifactinfo/ArtifactInfo.ftl (original)
+++ ofbiz/trunk/framework/webtools/webapp/webtools/artifactinfo/ArtifactInfo.ftl Thu Apr  3 00:59:52 2008
@@ -68,10 +68,13 @@
 <#else/>
     
     <h1>Artifact Info (${artifactInfo.getDisplayType()}): ${artifactInfo.getDisplayName()}</h1>
+    <#if artifactInfo.getLocationURL()?exists>
+        <div>Defined in: <a href="${artifactInfo.getLocationURL()}">${artifactInfo.getLocationURL()}</a></div>
+    </#if>
 
     <#if artifactInfo.getType() == "entity">
-        <h2>Entity Fields</h2>
         <div><a href="<@o...@ofbizUrl>">All Entity Data</a></div>
+        <h2>Entity Fields</h2>
         <table>
         <#list artifactInfo.modelEntity.getFieldsCopy() as modelField>
             <tr><td>${modelField.getName()}<#if modelField.getIsPk()>*</#if></td><td>${modelField.getType()}</td><td>${modelField.getDescription()?if_exists}</td></tr>
@@ -106,6 +109,7 @@
         <h2>Service Info</h2>
         <div>&nbsp;Description: ${artifactInfo.modelService.description}</div>
         <div>&nbsp;Run (${artifactInfo.modelService.engineName}): ${artifactInfo.modelService.location} :: ${artifactInfo.modelService.invoke}</div>
+        <div>&nbsp;Impl Location: <a href="${artifactInfo.getImplementationLocationURL()}">${artifactInfo.getImplementationLocationURL()}</a></div>
         <h2>Service Parameters</h2>
         <table>
             <tr><td>Name</td><td>Type</td><td>Optional</td><td>Mode</td></tr>