You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ja...@apache.org on 2007/04/20 19:41:08 UTC

svn commit: r530864 - in /ofbiz/trunk/applications/product: entitydef/entitygroup.xml entitydef/entitymodel.xml src/org/ofbiz/product/product/ProductSearch.java src/org/ofbiz/product/product/ProductSearchSession.java webapp/catalog/find/advancedsearch.ftl

Author: jacopoc
Date: Fri Apr 20 10:41:07 2007
New Revision: 530864

URL: http://svn.apache.org/viewvc?view=rev&rev=530864
Log:
Implemented the ability to include / exclude ProductFeatureGroups in the advanced search.

Modified:
    ofbiz/trunk/applications/product/entitydef/entitygroup.xml
    ofbiz/trunk/applications/product/entitydef/entitymodel.xml
    ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductSearch.java
    ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductSearchSession.java
    ofbiz/trunk/applications/product/webapp/catalog/find/advancedsearch.ftl

Modified: ofbiz/trunk/applications/product/entitydef/entitygroup.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/entitydef/entitygroup.xml?view=diff&rev=530864&r1=530863&r2=530864
==============================================================================
--- ofbiz/trunk/applications/product/entitydef/entitygroup.xml (original)
+++ ofbiz/trunk/applications/product/entitydef/entitygroup.xml Fri Apr 20 10:41:07 2007
@@ -89,6 +89,7 @@
     <entity-group group="org.ofbiz" entity="ProductFeatureDataResource" />
     <entity-group group="org.ofbiz" entity="ProductFeatureGroup" />
     <entity-group group="org.ofbiz" entity="ProductFeatureGroupAndAppl" />
+    <entity-group group="org.ofbiz" entity="ProdFeaGrpAppAndProdFeaApp" />
     <entity-group group="org.ofbiz" entity="ProductFeatureGroupAppl" />
     <entity-group group="org.ofbiz" entity="ProductFeatureIactn" />
     <entity-group group="org.ofbiz" entity="ProductFeatureIactnType" />

Modified: ofbiz/trunk/applications/product/entitydef/entitymodel.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/entitydef/entitymodel.xml?view=diff&rev=530864&r1=530863&r2=530864
==============================================================================
--- ofbiz/trunk/applications/product/entitydef/entitymodel.xml (original)
+++ ofbiz/trunk/applications/product/entitydef/entitymodel.xml Fri Apr 20 10:41:07 2007
@@ -993,6 +993,26 @@
         <key-map field-name="productFeatureId"/>
       </view-link>
     </view-entity>
+    <view-entity entity-name="ProdFeaGrpAppAndProdFeaApp"
+            package-name="org.ofbiz.product.feature"
+            title="ProductFeatureGroupAppl And ProductFeatureAppl View Entity">
+      <member-entity entity-alias="PFGA" entity-name="ProductFeatureGroupAppl"/>
+      <member-entity entity-alias="PFA" entity-name="ProductFeatureAppl"/>
+      <alias entity-alias="PFGA" name="productFeatureGroupId"/>
+      <alias entity-alias="PFGA" name="productFeatureId"/>
+      <alias entity-alias="PFA" name="groupFromDate" field="fromDate"/>
+      <alias entity-alias="PFA" name="groupThruDate" field="thruDate"/>
+      <alias entity-alias="PFA" name="productId"/>
+      <alias entity-alias="PFA" name="productFeatureApplTypeId"/>
+      <alias entity-alias="PFA" name="fromDate"/>
+      <alias entity-alias="PFA" name="thruDate"/>
+      <alias entity-alias="PFA" name="sequenceNum"/>
+      <alias entity-alias="PFA" name="amount"/>
+      <alias entity-alias="PFA" name="recurringAmount"/>
+      <view-link entity-alias="PFGA" rel-entity-alias="PFA">
+        <key-map field-name="productFeatureId"/>
+      </view-link>
+    </view-entity>
     <entity entity-name="ProductFeatureGroupAppl"
             package-name="org.ofbiz.product.feature"
             title="Product Feature Group Applicability Entity">

Modified: ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductSearch.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductSearch.java?view=diff&rev=530864&r1=530863&r2=530864
==============================================================================
--- ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductSearch.java (original)
+++ ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductSearch.java Fri Apr 20 10:41:07 2007
@@ -180,6 +180,10 @@
         public Set excludeFeatureCategoryIds = FastSet.newInstance();
         public Set alwaysIncludeFeatureCategoryIds = FastSet.newInstance();
 
+        public Set includeFeatureGroupIds = FastSet.newInstance();
+        public Set excludeFeatureGroupIds = FastSet.newInstance();
+        public Set alwaysIncludeFeatureGroupIds = FastSet.newInstance();
+
         public ProductSearchContext(GenericDelegator delegator, String visitId) {
             this.delegator = delegator;
             this.visitId = visitId;
@@ -339,7 +343,8 @@
                     includeCategoryIdOrSetAndList.size() == 0 && alwaysIncludeCategoryIdOrSetAndList.size() == 0 &&
                     includeFeatureIds.size() == 0 && excludeFeatureIds.size() == 0 && alwaysIncludeFeatureIds.size() == 0 &&
                     includeFeatureIdOrSetAndList.size() == 0 && alwaysIncludeFeatureIdOrSetAndList.size() == 0 &&
-                    includeFeatureCategoryIds.size() == 0 && excludeFeatureCategoryIds.size() == 0 && alwaysIncludeFeatureCategoryIds.size() == 0) {
+                    includeFeatureCategoryIds.size() == 0 && excludeFeatureCategoryIds.size() == 0 && alwaysIncludeFeatureCategoryIds.size() == 0 &&
+                    includeFeatureGroupIds.size() == 0 && excludeFeatureGroupIds.size() == 0 && alwaysIncludeFeatureGroupIds.size() == 0) {
                 return;
             }
             
@@ -412,6 +417,32 @@
                     incExcCondList.add(new EntityExpr(otherFeaturePrefix + "ProductFeatureCategoryId", EntityOperator.EQUALS, includeFeatureCategoryId));
                 }
             }
+            if (includeFeatureGroupIds.size() > 0) {
+                Iterator includeFeatureGroupIdIter = includeFeatureGroupIds.iterator();
+                while (includeFeatureGroupIdIter.hasNext()) {
+                    String includeFeatureGroupId = (String) includeFeatureGroupIdIter.next();
+                    String featurePrefix = "pfa" + this.index;
+                    String entityAlias = "PFA" + this.index;
+                    String otherFeaturePrefix = "pfga" + this.index;
+                    String otherEntityAlias = "PFGA" + this.index;
+                    this.index++;
+
+                    this.dynamicViewEntity.addMemberEntity(entityAlias, "ProductFeatureAppl");
+                    this.dynamicViewEntity.addMemberEntity(otherEntityAlias, "ProductFeatureGroupAppl");
+                    this.dynamicViewEntity.addAlias(otherEntityAlias, otherFeaturePrefix + "ProductFeatureGroupId", "productFeatureGroupId", null, null, null, null);
+                    this.dynamicViewEntity.addAlias(entityAlias, featurePrefix + "FromDate", "fromDate", null, null, null, null);
+                    this.dynamicViewEntity.addAlias(entityAlias, featurePrefix + "ThruDate", "thruDate", null, null, null, null);
+                    this.dynamicViewEntity.addAlias(otherEntityAlias, otherFeaturePrefix + "FromDate", "fromDate", null, null, null, null);
+                    this.dynamicViewEntity.addAlias(otherEntityAlias, otherFeaturePrefix + "ThruDate", "thruDate", null, null, null, null);
+                    this.dynamicViewEntity.addViewLink("PROD", entityAlias, Boolean.FALSE, ModelKeyMap.makeKeyMapList("productId"));
+                    this.dynamicViewEntity.addViewLink(entityAlias, otherEntityAlias, Boolean.FALSE, ModelKeyMap.makeKeyMapList("productFeatureId"));
+                    incExcCondList.add(new EntityExpr(new EntityExpr(featurePrefix + "ThruDate", EntityOperator.EQUALS, null), EntityOperator.OR, new EntityExpr(featurePrefix + "ThruDate", EntityOperator.GREATER_THAN, this.nowTimestamp)));
+                    incExcCondList.add(new EntityExpr(featurePrefix + "FromDate", EntityOperator.LESS_THAN, this.nowTimestamp));
+                    incExcCondList.add(new EntityExpr(new EntityExpr(otherFeaturePrefix + "ThruDate", EntityOperator.EQUALS, null), EntityOperator.OR, new EntityExpr(otherFeaturePrefix + "ThruDate", EntityOperator.GREATER_THAN, this.nowTimestamp)));
+                    incExcCondList.add(new EntityExpr(otherFeaturePrefix + "FromDate", EntityOperator.LESS_THAN, this.nowTimestamp));
+                    incExcCondList.add(new EntityExpr(otherFeaturePrefix + "ProductFeatureGroupId", EntityOperator.EQUALS, includeFeatureGroupId));
+                }
+            }
             
             if (excludeCategoryIds.size() > 0) {
                 List idExcludeCondList = FastList.newInstance();
@@ -437,6 +468,16 @@
                 EntityConditionValue subSelCond = new EntityConditionSubSelect("ProductFeatureAndAppl", "productId", new EntityConditionList(idExcludeCondList, EntityOperator.AND), true, delegator);
                 incExcCondList.add(new EntityExpr("mainProductId", EntityOperator.NOT_EQUAL, subSelCond));
             }
+            if (excludeFeatureGroupIds.size() > 0) {
+                List idExcludeCondList = FastList.newInstance();
+                idExcludeCondList.add(new EntityExpr(new EntityExpr("thruDate", EntityOperator.EQUALS, null), EntityOperator.OR, new EntityExpr("thruDate", EntityOperator.GREATER_THAN, this.nowTimestamp)));
+                idExcludeCondList.add(new EntityExpr("fromDate", EntityOperator.LESS_THAN, this.nowTimestamp));
+                idExcludeCondList.add(new EntityExpr(new EntityExpr("groupThruDate", EntityOperator.EQUALS, null), EntityOperator.OR, new EntityExpr("groupThruDate", EntityOperator.GREATER_THAN, this.nowTimestamp)));
+                idExcludeCondList.add(new EntityExpr("groupFromDate", EntityOperator.LESS_THAN, this.nowTimestamp));
+                idExcludeCondList.add(new EntityExpr("productFeatureGroupId", EntityOperator.IN, excludeFeatureGroupIds));
+                EntityConditionValue subSelCond = new EntityConditionSubSelect("ProdFeaGrpAppAndProdFeaApp", "productId", new EntityConditionList(idExcludeCondList, EntityOperator.AND), true, delegator);
+                incExcCondList.add(new EntityExpr("mainProductId", EntityOperator.NOT_EQUAL, subSelCond));
+            }
             
             if (alwaysIncludeCategoryIds.size() > 0) {
                 String categoryPrefix = "pcm" + this.index;
@@ -488,6 +529,32 @@
                     alwIncCondList.add(new EntityExpr(otherFeaturePrefix + "ProductFeatureCategoryId", EntityOperator.EQUALS, alwaysIncludeFeatureCategoryId));
                 }
             }
+            if (alwaysIncludeFeatureGroupIds.size() > 0) {
+                Iterator alwaysIncludeFeatureGroupIdIter = alwaysIncludeFeatureGroupIds.iterator();
+                while (alwaysIncludeFeatureGroupIdIter.hasNext()) {
+                    String alwaysIncludeFeatureGroupId = (String) alwaysIncludeFeatureGroupIdIter.next();
+                    String featurePrefix = "pfa" + this.index;
+                    String entityAlias = "PFA" + this.index;
+                    String otherFeaturePrefix = "pfga" + this.index;
+                    String otherEntityAlias = "PFGA" + this.index;
+                    this.index++;
+
+                    this.dynamicViewEntity.addMemberEntity(entityAlias, "ProductFeatureAppl");
+                    this.dynamicViewEntity.addMemberEntity(otherEntityAlias, "ProductFeatureGroupAppl");
+                    this.dynamicViewEntity.addAlias(otherEntityAlias, otherFeaturePrefix + "ProductFeatureGroupId", "productFeatureGroupId", null, null, null, null);
+                    this.dynamicViewEntity.addAlias(entityAlias, featurePrefix + "FromDate", "fromDate", null, null, null, null);
+                    this.dynamicViewEntity.addAlias(entityAlias, featurePrefix + "ThruDate", "thruDate", null, null, null, null);
+                    this.dynamicViewEntity.addAlias(otherEntityAlias, otherFeaturePrefix + "FromDate", "fromDate", null, null, null, null);
+                    this.dynamicViewEntity.addAlias(otherEntityAlias, otherFeaturePrefix + "ThruDate", "thruDate", null, null, null, null);
+                    this.dynamicViewEntity.addViewLink("PROD", entityAlias, Boolean.FALSE, ModelKeyMap.makeKeyMapList("productId"));
+                    this.dynamicViewEntity.addViewLink(entityAlias, otherEntityAlias, Boolean.FALSE, ModelKeyMap.makeKeyMapList("productFeatureId"));
+                    alwIncCondList.add(new EntityExpr(new EntityExpr(featurePrefix + "ThruDate", EntityOperator.EQUALS, null), EntityOperator.OR, new EntityExpr(featurePrefix + "ThruDate", EntityOperator.GREATER_THAN, this.nowTimestamp)));
+                    alwIncCondList.add(new EntityExpr(featurePrefix + "FromDate", EntityOperator.LESS_THAN, this.nowTimestamp));
+                    alwIncCondList.add(new EntityExpr(new EntityExpr(otherFeaturePrefix + "ThruDate", EntityOperator.EQUALS, null), EntityOperator.OR, new EntityExpr(otherFeaturePrefix + "ThruDate", EntityOperator.GREATER_THAN, this.nowTimestamp)));
+                    alwIncCondList.add(new EntityExpr(otherFeaturePrefix + "FromDate", EntityOperator.LESS_THAN, this.nowTimestamp));
+                    alwIncCondList.add(new EntityExpr(otherFeaturePrefix + "ProductFeatureGroupId", EntityOperator.EQUALS, alwaysIncludeFeatureGroupId));
+                }
+            }
 
             // handle includeFeatureIdOrSetAndList and alwaysIncludeFeatureIdOrSetAndList
             if (includeFeatureIdOrSetAndList.size() > 0) {
@@ -1101,7 +1168,83 @@
             }
         }
     }
-    
+
+    public static class FeatureGroupConstraint extends ProductSearchConstraint {
+        public static final String constraintName = "FeatureGroup";
+        protected String productFeatureGroupId;
+        /** This is a tri-state variable: null = Include, true = Exclude, false = AlwaysInclude */
+        protected Boolean exclude;
+
+        /**
+         * 
+         * @param productFeatureGroupId
+         * @param exclude This is a tri-state variable: null = Include, true = Exclude, false = AlwaysInclude
+         */
+        public FeatureGroupConstraint(String productFeatureGroupId, Boolean exclude) {
+            this.productFeatureGroupId = productFeatureGroupId;
+            this.exclude = exclude;
+        }
+
+        public void addConstraint(ProductSearchContext productSearchContext) {
+            // just add to global sets
+            if (exclude == null) {
+                productSearchContext.includeFeatureGroupIds.add(productFeatureGroupId);
+            } else if (exclude.equals(Boolean.TRUE)) {
+                productSearchContext.excludeFeatureGroupIds.add(productFeatureGroupId);
+            } else if (exclude.equals(Boolean.FALSE)) {
+                productSearchContext.alwaysIncludeFeatureGroupIds.add(productFeatureGroupId);
+            }
+
+            // add in productSearchConstraint, don't worry about the productSearchResultId or constraintSeqId, those will be fill in later
+            productSearchContext.productSearchConstraintList.add(productSearchContext.getDelegator().makeValue("ProductSearchConstraint", UtilMisc.toMap("constraintName", constraintName, "infoString", this.productFeatureGroupId)));
+        }
+
+        public String prettyPrintConstraint(GenericDelegator delegator, boolean detailed, Locale locale) {
+            GenericValue productFeatureGroup = null;
+            try {
+                productFeatureGroup = delegator.findByPrimaryKeyCache("ProductFeatureGroup", UtilMisc.toMap("productFeatureGroupId", productFeatureGroupId));
+            } catch (GenericEntityException e) {
+                Debug.logError(e, "Error finding ProductFeatureGroup and Type information for constraint pretty print", module);
+            }
+            StringBuffer ppBuf = new StringBuffer();
+            if (productFeatureGroup != null) {
+                ppBuf.append(UtilProperties.getMessage(resource, "ProductFeatureGroup", locale) + ": ");
+                if(productFeatureGroup.get("description") != null) {
+                    ppBuf.append(productFeatureGroup.get("description"));    
+                } else {
+                    ppBuf.append("[" + this.productFeatureGroupId + "]");
+                }
+            } 
+            if (this.exclude != null) {
+                if (Boolean.TRUE.equals(this.exclude)) {
+                    ppBuf.append(" (Exclude)");
+                } else {
+                    ppBuf.append(" (Always Include)");
+                }
+            }
+            return (ppBuf.toString());
+        }
+
+        public boolean equals(Object obj) {
+            ProductSearchConstraint psc = (ProductSearchConstraint) obj;
+            if (psc instanceof FeatureGroupConstraint) {
+                FeatureGroupConstraint that = (FeatureGroupConstraint) psc;
+                if (this.productFeatureGroupId == null) {
+                    if (that.productFeatureGroupId != null) {
+                        return false;
+                    }
+                } else {
+                    if (!this.productFeatureGroupId.equals(that.productFeatureGroupId)) {
+                        return false;
+                    }
+                }
+                return true;
+            } else {
+                return false;
+            }
+        }
+    }
+
     
     public static class FeatureSetConstraint extends ProductSearchConstraint {
         public static final String constraintName = "Feature Set";

Modified: ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductSearchSession.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductSearchSession.java?view=diff&rev=530864&r1=530863&r2=530864
==============================================================================
--- ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductSearchSession.java (original)
+++ ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductSearchSession.java Fri Apr 20 10:41:07 2007
@@ -571,6 +571,29 @@
                     constraintsChanged = true;
                 }
             }
+
+            //if product features group were selected add a constraint for each
+            if (parameterName.startsWith("SEARCH_PROD_FEAT_GRP") && !parameterName.startsWith("SEARCH_PROD_FEAT_GRP_EXC")) {
+                String productFeatureGroupId = (String) parameters.get(parameterName);
+                if (productFeatureGroupId != null && productFeatureGroupId.length() > 0) {
+                    String paramNameExt = parameterName.substring("SEARCH_PROD_FEAT_GRP".length());
+                    String searchProdFeatureGroupExc = (String) parameters.get("SEARCH_PROD_FEAT_GRP_EXC" + paramNameExt);
+                    Boolean exclude = UtilValidate.isEmpty(searchProdFeatureGroupExc) ? null : new Boolean(!"N".equals(searchProdFeatureGroupExc));
+                    searchAddConstraint(new ProductSearch.FeatureGroupConstraint(productFeatureGroupId, exclude), session);
+                    constraintsChanged = true;
+                }
+            }
+            // a shorter variation for feature group
+            if (parameterName.startsWith("S_FGI")) {
+                String productFeatureGroupId = (String) parameters.get(parameterName);
+                if (productFeatureGroupId != null && productFeatureGroupId.length() > 0) {
+                    String paramNameExt = parameterName.substring("S_FGI".length());
+                    String searchProdFeatureGroupExc = (String) parameters.get("S_FGX" + paramNameExt);
+                    Boolean exclude = UtilValidate.isEmpty(searchProdFeatureGroupExc) ? null : new Boolean(!"N".equals(searchProdFeatureGroupExc));
+                    searchAddConstraint(new ProductSearch.FeatureGroupConstraint(productFeatureGroupId, exclude), session);
+                    constraintsChanged = true;
+                }
+            }
         }
 
         // if features were selected add a constraint for each
@@ -773,6 +796,7 @@
         int categoriesCount = 0;
         int featuresCount = 0;
         int featureCategoriesCount = 0;
+        int featureGroupsCount = 0;
         int keywordsCount = 0;
         boolean isNotFirst = false;
         while (constraintIter.hasNext()) {
@@ -838,6 +862,24 @@
                     searchParamString.append(featureCategoriesCount);
                     searchParamString.append("=");
                     searchParamString.append(pfcc.exclude.booleanValue() ? "Y" : "N");
+                }
+            } else if (psc instanceof ProductSearch.FeatureGroupConstraint) {
+                ProductSearch.FeatureGroupConstraint pfgc = (ProductSearch.FeatureGroupConstraint) psc;
+                featureGroupsCount++;
+                if (isNotFirst) {
+                    searchParamString.append("&amp;");
+                } else {
+                    isNotFirst = true;
+                }
+                searchParamString.append("S_FGI");
+                searchParamString.append(featureGroupsCount);
+                searchParamString.append("=");
+                searchParamString.append(pfgc.productFeatureGroupId);
+                if (pfgc.exclude != null) {
+                    searchParamString.append("&amp;S_FGX");
+                    searchParamString.append(featureGroupsCount);
+                    searchParamString.append("=");
+                    searchParamString.append(pfgc.exclude.booleanValue() ? "Y" : "N");
                 }
             } else if (psc instanceof ProductSearch.KeywordConstraint) {
                 ProductSearch.KeywordConstraint kc = (ProductSearch.KeywordConstraint) psc;

Modified: ofbiz/trunk/applications/product/webapp/catalog/find/advancedsearch.ftl
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/webapp/catalog/find/advancedsearch.ftl?view=diff&rev=530864&r1=530863&r2=530864
==============================================================================
--- ofbiz/trunk/applications/product/webapp/catalog/find/advancedsearch.ftl (original)
+++ ofbiz/trunk/applications/product/webapp/catalog/find/advancedsearch.ftl Fri Apr 20 10:41:07 2007
@@ -110,6 +110,31 @@
         </div>
       </td>
     </tr>
+    <tr>
+      <td align="right" valign="top">
+        <div class="tabletext">${uiLabelMap.ProductFeatureGroup} ${uiLabelMap.CommonIds}:</div>
+      </td>
+      <td valign="middle">
+        <div>
+          <input type="text" class="inputBox" name="SEARCH_PROD_FEAT_GRP1" size="15" value="${requestParameters.SEARCH_PROD_FEAT_GRP1?if_exists}"/>&nbsp;
+              ${uiLabelMap.CommonInclude}<input type="radio" name="SEARCH_PROD_FEAT_GRP_EXC1" value="" checked="checked"/>
+              ${uiLabelMap.CommonExclude}<input type="radio" name="SEARCH_PROD_FEAT_GRP_EXC1" value="Y"/>
+              ${uiLabelMap.CommonAlwaysInclude}<input type="radio" name="SEARCH_PROD_FEAT_GRP_EXC1" value="N"/>
+        </div>
+        <div>
+          <input type="text" class="inputBox" name="SEARCH_PROD_FEAT_GRP2" size="15" value="${requestParameters.SEARCH_PROD_FEAT_GRP2?if_exists}"/>&nbsp;
+              ${uiLabelMap.CommonInclude}<input type="radio" name="SEARCH_PROD_FEAT_GRP_EXC2" value="" checked="checked"/>
+              ${uiLabelMap.CommonExclude}<input type="radio" name="SEARCH_PROD_FEAT_GRP_EXC2" value="Y"/>
+              ${uiLabelMap.CommonAlwaysInclude}<input type="radio" name="SEARCH_PROD_FEAT_GRP_EXC2" value="N"/>
+        </div>
+        <div>
+          <input type="text" class="inputBox" name="SEARCH_PROD_FEAT_GRP3" size="15" value="${requestParameters.SEARCH_PROD_FEAT_GRP3?if_exists}"/>&nbsp;
+              ${uiLabelMap.CommonInclude}<input type="radio" name="SEARCH_PROD_FEAT_GRP_EXC3" value="" checked="checked"/>
+              ${uiLabelMap.CommonExclude}<input type="radio" name="SEARCH_PROD_FEAT_GRP_EXC3" value="Y"/>
+              ${uiLabelMap.CommonAlwaysInclude}<input type="radio" name="SEARCH_PROD_FEAT_GRP_EXC3" value="N"/>
+        </div>
+      </td>
+    </tr>
     
     <tr>
       <td align="right" valign="top">