java/code/src/com/redhat/rhn/domain/kickstart/KickstartData.hbm.xml | 3 +
java/code/src/com/redhat/rhn/domain/kickstart/KickstartFactory.java | 19 ++++++++++
java/code/src/com/redhat/rhn/domain/kickstart/builder/KickstartBuilder.java | 11 +++--
java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml | 2 -
4 files changed, 29 insertions(+), 6 deletions(-)
New commits:
commit 0dbf215f788a7294d3bf2a21bbe27f859bd0be91
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Thu Oct 18 10:06:15 2012 +0200
822834 - do not allow creating kickstart profiles that differ from existing ones just by case
due to cobbler behavior that converts the kickstart profiles to lowercase
diff --git a/java/code/src/com/redhat/rhn/domain/kickstart/KickstartData.hbm.xml b/java/code/src/com/redhat/rhn/domain/kickstart/KickstartData.hbm.xml
index 7c3eab1..2f88292 100644
--- a/java/code/src/com/redhat/rhn/domain/kickstart/KickstartData.hbm.xml
+++ b/java/code/src/com/redhat/rhn/domain/kickstart/KickstartData.hbm.xml
@@ -99,6 +99,9 @@ PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
<query name="KickstartData.findByIdAndOrg">
<![CDATA[from com.redhat.rhn.domain.kickstart.KickstartData as t where t.id = :id and t.org = :org_id]]>
</query>
+ <query name="KickstartData.findByCILabelAndOrg">
+ <![CDATA[from com.redhat.rhn.domain.kickstart.KickstartData as t where LOWER(t.label) = LOWER(:label) and t.org = :org_id]]>
+ </query>
<query name="KickstartData.findByLabelAndOrg">
<![CDATA[from com.redhat.rhn.domain.kickstart.KickstartData as t where t.label = :label and t.org = :org_id]]>
</query>
diff --git a/java/code/src/com/redhat/rhn/domain/kickstart/KickstartFactory.java b/java/code/src/com/redhat/rhn/domain/kickstart/KickstartFactory.java
index c2c6f66..a328cd4 100644
--- a/java/code/src/com/redhat/rhn/domain/kickstart/KickstartFactory.java
+++ b/java/code/src/com/redhat/rhn/domain/kickstart/KickstartFactory.java
@@ -146,6 +146,25 @@ public class KickstartFactory extends HibernateFactory {
}
/**
+ * Lookup a KickstartData based on a case insensitive label and orgId
+ * This is needed due to the cobbler converts the kickstart profiles to lowecase
+ * @param label to lookup
+ * @param orgId who owns KickstartData
+ * @return KickstartData if found, null if not
+ */
+ public static KickstartData lookupKickstartDataByCILabelAndOrgId(
+ String label, Long orgId) {
+ if (StringUtils.isBlank(label)) {
+ throw new IllegalArgumentException("kickstartLabel cannot be null");
+ }
+ return (KickstartData) HibernateFactory.getSession().
+ getNamedQuery("KickstartData.findByCILabelAndOrg")
+ .setString("label", label)
+ .setLong("org_id", orgId.longValue())
+ .uniqueResult();
+ }
+
+ /**
* Lookup a KickstartData based on a label
* @param label to lookup
* @return KickstartData if found, null if not
diff --git a/java/code/src/com/redhat/rhn/domain/kickstart/builder/KickstartBuilder.java b/java/code/src/com/redhat/rhn/domain/kickstart/builder/KickstartBuilder.java
index 2173c16..d713b03 100644
--- a/java/code/src/com/redhat/rhn/domain/kickstart/builder/KickstartBuilder.java
+++ b/java/code/src/com/redhat/rhn/domain/kickstart/builder/KickstartBuilder.java
@@ -391,9 +391,9 @@ public class KickstartBuilder {
* @param label the Ks label
* @return checks for duplicate labels
*/
- private boolean labelAlreadyExists(String label) {
- return (KickstartFactory.
- lookupKickstartDataByLabelAndOrgId(label, user.getOrg().getId()) != null);
+ private KickstartData labelAlreadyExists(String label) {
+ return KickstartFactory.
+ lookupKickstartDataByCILabelAndOrgId(label, user.getOrg().getId());
}
/**
@@ -406,8 +406,9 @@ public class KickstartBuilder {
ValidatorException.raiseException("kickstart.details.nolabel",
MIN_KS_LABEL_LENGTH);
}
- if (labelAlreadyExists(label)) {
- ValidatorException.raiseException("kickstart.error.labelexists");
+ KickstartData existing = labelAlreadyExists(label);
+ if (existing != null) {
+ ValidatorException.raiseException("kickstart.error.labelexists", existing.getLabel());
}
if (!isLabelValid(label)) {
ValidatorException.raiseException("kickstart.error.invalidlabel",
diff --git a/java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml b/java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml
index 5ce6f57..5b4f5bb 100644
--- a/java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml
+++ b/java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml
@@ -1840,7 +1840,7 @@ available for this kickstart profile to function properly.
</context-group>
</trans-unit>
<trans-unit id="kickstart.error.labelexists">
- <source>Kickstart label already exists. Please choose a unique kickstart label.</source>
+ <source>Kickstart label already exists: '{0}'. Please choose a unique kickstart label.</source>
<context-group name="ctx">
<context context-type="sourcefile">/rhn/kickstart/KickstartDetailsEdit</context>
</context-group>