modules/core/domain/src/main/java/org/rhq/core/domain/content/Repo.java
| 25
modules/core/native-system/src/main/java/org/rhq/core/system/SystemInfoFactory.java
| 23
modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/AgentMain.java
| 25
modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/i18n/AgentI18NResourceKeys.java
| 9
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/alert/ListAlertHistoryUIBean.java
| 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/alert/NotificationTemplatesUIBean.java
| 3
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/ContentProviderDetailsUIBean.java
| 32
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/ContentSourceCandidateReposUIBean.java
| 50 +
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/ContentSourceReposUIBean.java
| 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/RepoPackageVersionsUIBean.java
| 2
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/browse/BrowseGroupsUIBean.java
| 8
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/subsystem/SubsystemAlertHistoryUIBean.java
| 9
modules/enterprise/gui/portal-war/src/main/webapp-filtered/WEB-INF/classes/ApplicationResources.properties
| 2
modules/enterprise/gui/portal-war/src/main/webapp/css/win.css
| 9
modules/enterprise/gui/portal-war/src/main/webapp/rhq/content/contentProvider.xhtml
| 139 +--
modules/enterprise/gui/portal-war/src/main/webapp/rhq/content/listRepos.xhtml
| 6
modules/enterprise/gui/portal-war/src/main/webapp/rhq/content/repo.xhtml
| 39
modules/enterprise/gui/portal-war/src/main/webapp/rhq/inventory/browseGroups.xhtml
| 2
modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/alert/viewAlert.xhtml
| 8
modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/subscription.xhtml
| 444 +++++-----
modules/enterprise/gui/portal-war/src/main/webapp/rhq/subsystem/alertHistory.xhtml
| 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java
| 13
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerLocal.java
| 3
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertNotificationManagerBean.java
| 3
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerBean.java
| 3
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java
| 125 +-
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManager.java
| 141 +--
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/ContentServerPluginContainer.java
| 4
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/RepoDetails.java
| 13
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/RepoGroupDetails.java
| 10
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/AdvisorySourceSynchronizer.java
| 4
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/DistributionSourceSynchronizer.java
| 1
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/PackageSourceSynchronizer.java
| 1
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/RepoSourceSynchronizer.java
| 6
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/ContentProviderSyncJob.java
| 38
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/RepoSyncJob.java
| 1
modules/enterprise/server/plugins/jboss-software/src/main/java/org/rhq/enterprise/server/plugins/jboss/software/HtmlUtility.java
| 103 ++
modules/enterprise/server/plugins/jboss-software/src/main/java/org/rhq/enterprise/server/plugins/jboss/software/JBossSoftwareContentSourceAdapter.java
| 14
modules/enterprise/server/plugins/jboss-software/src/main/java/org/rhq/enterprise/server/plugins/jboss/software/RssFeedParser.java
| 44
modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/util/DeploymentUtility.java
| 2
modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/JMXDiscoveryComponent.java
| 35
modules/plugins/jmx/src/main/resources/META-INF/rhq-plugin.xml
| 2
pom.xml
| 10
43 files changed, 873 insertions(+), 544 deletions(-)
New commits:
commit 0ece93f48fe89488acd1ee8a319da9ec329ebf75
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Wed Mar 24 19:22:49 2010 -0400
misc minor bugfixes and improvements of content GUI, geared toward making installation
of patches from JBoss CSP more intuitive
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/content/Repo.java
b/modules/core/domain/src/main/java/org/rhq/core/domain/content/Repo.java
index 9f810bc..93aef39 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/content/Repo.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/content/Repo.java
@@ -48,6 +48,7 @@ import javax.persistence.Table;
import javax.persistence.Transient;
import javax.xml.bind.annotation.XmlTransient;
+import org.jetbrains.annotations.NotNull;
import org.rhq.core.domain.common.Tag;
import org.rhq.core.domain.common.Taggable;
import org.rhq.core.domain.resource.Resource;
@@ -88,7 +89,8 @@ import org.rhq.core.domain.resource.Resource;
+ ") "
+ "FROM Repo AS c "
+ "WHERE c.id NOT IN ( SELECT rc.repo.id FROM ResourceRepo rc WHERE
rc.resource.id = :resourceId ) "
- + "AND c.candidate is false " + "GROUP BY c, c.name,
c.description, c.creationDate, c.lastModifiedDate"),
+ + "AND c.candidate = false "
+ + "GROUP BY c, c.name, c.description, c.creationDate,
c.lastModifiedDate"),
@NamedQuery(name = Repo.QUERY_FIND_AVAILABLE_REPO_COMPOSITES_BY_RESOURCE_ID_COUNT,
query = "SELECT COUNT( c ) "
+ "FROM Repo AS c "
+ "WHERE c.id NOT IN ( SELECT rc.repo.id FROM ResourceRepo rc WHERE
rc.resource.id = :resourceId ) "
@@ -797,7 +799,7 @@ public class Repo implements Serializable, Taggable {
/**
* Add a tag association with this repo.
*
- * @param tag
+ * @param tag
*/
public void addTag(Tag tag) {
if (this.repoTags == null) {
@@ -811,7 +813,7 @@ public class Repo implements Serializable, Taggable {
/**
* Set tag associations with this repo.
*
- * @param tag
+ * @param tags
*/
public void setTags(Set<Tag> tags) {
if (this.repoTags == null) {
@@ -870,23 +872,20 @@ public class Repo implements Serializable, Taggable {
/**
* The list of sync results - order ENSURED by the incrementing ID of this object
*/
+ @NotNull
public List<RepoSyncResults> getSyncResults() {
- if (syncResults == null) {
- return null;
+ if (this.syncResults == null) {
+ this.syncResults = new ArrayList<RepoSyncResults>();
+ return this.syncResults;
}
- Comparator dc = new Comparator() {
- public int compare(Object arg0, Object arg1) {
- RepoSyncResults c1 = (RepoSyncResults) arg0;
- RepoSyncResults c2 = (RepoSyncResults) arg1;
-
+ Collections.sort(syncResults, new Comparator<RepoSyncResults>() {
+ public int compare(RepoSyncResults c1, RepoSyncResults c2) {
Integer id1 = c1.getId();
Integer id2 = c2.getId();
-
return id1.compareTo(id2);
}
- };
- Collections.sort(syncResults, dc);
+ });
return syncResults;
}
diff --git
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/ContentProviderDetailsUIBean.java
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/ContentProviderDetailsUIBean.java
index b80763d..52b011f 100644
---
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/ContentProviderDetailsUIBean.java
+++
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/ContentProviderDetailsUIBean.java
@@ -66,34 +66,36 @@ public class ContentProviderDetailsUIBean {
public String test() {
ContentSourceManagerLocal manager = LookupUtil.getContentSourceManager();
- try {
- if (manager.testContentSourceConnection(contentSource.getId())) {
- FacesContextUtility.addMessage(FacesMessage.SEVERITY_INFO,
- "The test passed - the remote repository for [" +
contentSource.getName() + "] is available.");
- } else {
- FacesContextUtility.addMessage(FacesMessage.SEVERITY_WARN,
- "Failed the attempt to connect to the remote repository for
[" + contentSource.getName()
- + "] Check the configuration and make sure the remote
repository is up.");
- }
- } catch (Exception e) {
+ if (manager.testContentSourceConnection(contentSource.getId())) {
+ FacesContextUtility.addMessage(FacesMessage.SEVERITY_INFO,
+ "Test passed - the remote repository for [" +
contentSource.getName() + "] is available.");
+ } else {
FacesContextUtility.addMessage(FacesMessage.SEVERITY_WARN,
- "Unable to make a connection to the remote repository for [" +
contentSource.getName() + "]", e);
+ "Test failed - failed to connect to the remote repository for
[" + contentSource.getName()
+ + "] - check the configuration and make sure the remote
repository is up and reachable.");
}
return "success";
}
public String sync() {
- Subject subject = EnterpriseFacesContextUtility.getSubject();
- ContentSourceManagerLocal manager = LookupUtil.getContentSourceManager();
+ // Test the content provider connection before proceeding.
+ ContentSourceManagerLocal contentSourceManager =
LookupUtil.getContentSourceManager();
+ if (!contentSourceManager.testContentSourceConnection(contentSource.getId())) {
+ FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR,
+ "Failed to connect to the remote repository for [" +
contentSource.getName()
+ + "] - check the configuration and make sure the remote
repository is up and reachable.");
+ return "success";
+ }
+ Subject subject = EnterpriseFacesContextUtility.getSubject();
try {
- manager.synchronizeAndLoadContentSource(subject, contentSource.getId());
+ contentSourceManager.synchronizeAndLoadContentSource(subject,
contentSource.getId());
FacesContextUtility.addMessage(FacesMessage.SEVERITY_INFO,
"Synchronizing content provider ["
+ contentSource.getName() + "] now.");
} catch (Exception e) {
FacesContextUtility.addMessage(FacesMessage.SEVERITY_WARN,
- "Failed to start the sychronization process for [" +
contentSource.getName() + "]", e);
+ "Failed to start the synchronization process for [" +
contentSource.getName() + "]", e);
}
return "success";
diff --git
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/ContentSourceCandidateReposUIBean.java
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/ContentSourceCandidateReposUIBean.java
index 5f3ea5a..cf94b98 100644
---
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/ContentSourceCandidateReposUIBean.java
+++
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/ContentSourceCandidateReposUIBean.java
@@ -18,8 +18,10 @@
*/
package org.rhq.enterprise.gui.content;
+import javax.faces.application.FacesMessage;
import javax.faces.model.DataModel;
+import org.jetbrains.annotations.NotNull;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.content.Repo;
import org.rhq.core.domain.util.PageControl;
@@ -30,8 +32,12 @@ import org.rhq.enterprise.gui.common.paging.PageControlView;
import org.rhq.enterprise.gui.common.paging.PagedListDataModel;
import org.rhq.enterprise.gui.util.EnterpriseFacesContextUtility;
import org.rhq.enterprise.server.content.ContentSourceManagerLocal;
+import org.rhq.enterprise.server.content.RepoManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
+import java.util.ArrayList;
+import java.util.List;
+
public class ContentSourceCandidateReposUIBean extends PagedDataTableUIBean {
public static final String MANAGED_BEAN_NAME =
ContentSourceCandidateReposUIBean.class.getSimpleName();
@@ -39,6 +45,32 @@ public class ContentSourceCandidateReposUIBean extends
PagedDataTableUIBean {
public ContentSourceCandidateReposUIBean() {
}
+ public String importSelectedRepos() {
+ Subject subject = EnterpriseFacesContextUtility.getSubject();
+ String[] selected = getSelectedContentSourceRepos();
+ int contentProviderId =
Integer.valueOf(FacesContextUtility.getRequiredRequestParameter("id"));
+ int[] repoIds = getIntegerArray(selected);
+
+ if (repoIds.length > 0) {
+ try {
+ RepoManagerLocal repoManager = LookupUtil.getRepoManagerLocal();
+ List<Integer> ids = new ArrayList<Integer>(repoIds.length);
+ for (int repoId : repoIds) {
+ ids.add(repoId);
+ }
+ repoManager.importCandidateRepo(subject, ids);
+
+ FacesContextUtility.addMessage(FacesMessage.SEVERITY_INFO, "Imported
" + repoIds.length
+ + " repositories from content provider.");
+ } catch (Exception e) {
+ FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR,
+ "Failed to import one or more repositories from content
provider.", e);
+ }
+ }
+
+ return "success";
+ }
+
@Override
public DataModel getDataModel() {
if (dataModel == null) {
@@ -66,4 +98,22 @@ public class ContentSourceCandidateReposUIBean extends
PagedDataTableUIBean {
return results;
}
}
+
+ private String[] getSelectedContentSourceRepos() {
+ return
FacesContextUtility.getRequest().getParameterValues("selectedCandidateRepos");
+ }
+
+ @NotNull
+ private int[] getIntegerArray(String[] input) {
+ if (input == null) {
+ return new int[0];
+ }
+
+ int[] output = new int[input.length];
+ for (int i = 0; i < output.length; i++) {
+ output[i] = Integer.valueOf(input[i]).intValue(); // force it to parse to
make sure its valid
+ }
+
+ return output;
+ }
}
\ No newline at end of file
diff --git
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/ContentSourceReposUIBean.java
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/ContentSourceReposUIBean.java
index 455be12..bfe2483 100644
---
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/ContentSourceReposUIBean.java
+++
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/ContentSourceReposUIBean.java
@@ -21,6 +21,7 @@ package org.rhq.enterprise.gui.content;
import javax.faces.application.FacesMessage;
import javax.faces.model.DataModel;
+import org.jetbrains.annotations.NotNull;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.content.Repo;
import org.rhq.core.domain.util.PageControl;
@@ -94,6 +95,7 @@ public class ContentSourceReposUIBean extends PagedDataTableUIBean {
return
FacesContextUtility.getRequest().getParameterValues("selectedContentSourceRepos");
}
+ @NotNull
private int[] getIntegerArray(String[] input) {
if (input == null) {
return new int[0];
diff --git
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/RepoPackageVersionsUIBean.java
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/RepoPackageVersionsUIBean.java
index b738e02..5d1305d 100644
---
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/RepoPackageVersionsUIBean.java
+++
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/content/RepoPackageVersionsUIBean.java
@@ -71,7 +71,7 @@ public class RepoPackageVersionsUIBean extends PagedDataTableUIBean {
contentManager.deployPackages(subject, resourceIds, packageIds);
} catch (Exception e) {
FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Failed to
deploy packages: " + packageIds
- + " to resources subscribed to repo: " + repoId + " Error:
" + e.getMessage());
+ + " to Resources subscribed to repository: " + repoId + "
Error: " + e.getMessage());
}
}
diff --git
a/modules/enterprise/gui/portal-war/src/main/webapp-filtered/WEB-INF/classes/ApplicationResources.properties
b/modules/enterprise/gui/portal-war/src/main/webapp-filtered/WEB-INF/classes/ApplicationResources.properties
index 8132311..1ce62b1 100644
---
a/modules/enterprise/gui/portal-war/src/main/webapp-filtered/WEB-INF/classes/ApplicationResources.properties
+++
b/modules/enterprise/gui/portal-war/src/main/webapp-filtered/WEB-INF/classes/ApplicationResources.properties
@@ -2956,7 +2956,7 @@ largeenv.breadcrumb=Large Environment Preparation
resource.inventory.view.deleteResourceConfirm = Deleting this resource will delete the
actual resource being managed on the agent machine. Are you sure you want to proceed?
# Content Provider
-contentprovider.list.breadcrumb=Content Provider
+contentprovider.list.breadcrumb=Content Providers
contentprovider.new.breadcrumb=New
# Repo
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/css/win.css
b/modules/enterprise/gui/portal-war/src/main/webapp/css/win.css
index 01fd46c..76d051e 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/css/win.css
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/css/win.css
@@ -23,6 +23,15 @@ IMG {
border-style: none;
}
+PRE {
+ /* Wrap lines longer than the containing block. */
+ white-space: pre-wrap; /* css-3 */
+ white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */
+ white-space: -pre-wrap; /* Opera 4-6 */
+ white-space: -o-pre-wrap; /* Opera 7 */
+ word-wrap: break-word; /* Internet Explorer 5.5+ */
+}
+
HR {
width: 100%;
height: 1px;
diff --git
a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/content/contentProvider.xhtml
b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/content/contentProvider.xhtml
index 373507b..ea760cd 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/content/contentProvider.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/content/contentProvider.xhtml
@@ -11,7 +11,8 @@
xmlns:c="http://java.sun.com/jstl/core"
xmlns:onc="http://jboss.org/on/component"
xmlns:onf="http://jboss.org/on/function"
-
xmlns:rich="http://richfaces.ajax4jsf.org/rich">
+
xmlns:a4j="http://richfaces.org/a4j"
+
xmlns:rich="http://richfaces.org/rich">
<ui:composition template="/rhq/layout/main.xhtml">
@@ -34,6 +35,16 @@
<ui:define name="body">
+ <a4j:region>
+ <h:form id="pollerForm">
+ <input type="hidden" name="id"
value="#{param.id}"/>
+ <input type="hidden" name="mode"
value="#{param.mode}"/>
+
+ <!-- TODO: Only update if a sync is in progress. -->
+ <a4j:poll id="poller" interval="7000"
enabled="true" reRender="poller,bodyPanel"/>
+ </h:form>
+ </a4j:region>
+
<h:messages showSummary="true"
showDetail="true"
infoClass="InfoBlock"
@@ -42,7 +53,9 @@
fatalClass="FatalBlock"
globalOnly="true"
layout="table"
- width="100%"/>
+ style="width: 100%"/>
+
+ <h:panelGroup id="bodyPanel" layout="block">
<h:form id="contentProviderDetailsForm">
<input type="hidden" name="id"
value="${param.id}"/>
@@ -72,7 +85,7 @@
</td>
</tr>
<tr>
- <td align="right"><b>Sync
Schedule:</b></td>
+ <td align="right"><b>Synchronization
Schedule:</b></td>
<td align="left">
<h:inputText rendered="${mode eq 'edit'}"
value="#{ContentProviderDetailsUIBean.contentSource.syncSchedule}" />
<h:outputText rendered="${mode ne 'edit'}"
value="#{ContentProviderDetailsUIBean.contentSource.syncSchedule}" />
@@ -143,21 +156,16 @@
</rich:panel>
<rich:panel>
- <table>
- <tr>
- <td>
- <onc:config
configurationDefinition="#{ContentProviderDetailsUIBean.contentSourceTypeConfigurationDefinition}"
-
configuration="#{ContentProviderDetailsUIBean.contentSource.configuration}"
- readOnly="#{mode ne 'edit'}"
- nullConfigurationDefinitionMessage="This content
provider type does not require a configuration."
- nullConfigurationMessage="Configuration is
empty."
- nullConfigurationStyle="InfoBlock"/>
- </td>
- </tr>
- </table>
+ <onc:config
configurationDefinition="#{ContentProviderDetailsUIBean.contentSourceTypeConfigurationDefinition}"
+
configuration="#{ContentProviderDetailsUIBean.contentSource.configuration}"
+ readOnly="#{mode ne 'edit'}"
+ nullConfigurationDefinitionMessage="This content provider
type does not require a configuration."
+ nullConfigurationMessage="Configuration is empty."
+ nullConfigurationStyle="InfoBlock"/>
</rich:panel>
<h:panelGrid columns="3" styleClass="buttons-table"
columnClasses="button-cell">
+ <ui:remove><!-- view mode buttons --></ui:remove>
<h:commandButton rendered="${mode ne 'edit'}"
value="EDIT"
action="#{ContentProviderDetailsUIBean.edit}"
alt="Edit" styleClass="buttonmed"
id="editButton"/>
@@ -167,6 +175,8 @@
<h:commandButton rendered="${mode ne 'edit'}"
value="SYNCHRONIZE"
action="#{ContentProviderDetailsUIBean.sync}"
alt="Synchronize" styleClass="buttonmed"
id="syncButton"/>
+
+ <ui:remove><!-- edit mode buttons --></ui:remove>
<h:commandButton rendered="${mode eq 'edit'}"
value="SAVE"
action="#{ContentProviderDetailsUIBean.save}"
alt="Save" styleClass="buttonmed"
id="saveButton"/>
@@ -177,7 +187,9 @@
</h:form>
- <!-- REPOS LIST -->
+
+
+ <!-- IMPORTED (NOT CANDIDATE) REPOS LIST -->
<h:form id="contentProviderReposListForm">
<input type="hidden" name="id"
value="${param.id}"/>
@@ -185,7 +197,7 @@
<rich:panel>
<f:facet name="header">
- <h:outputText value="Repositories Associated With This Content
Provider"/>
+ <h:outputText value="Repositories"/>
</f:facet>
<h:panelGrid columns="1" width="100%">
@@ -193,8 +205,8 @@
<ui:param name="contentProviderReposDataModel"
value="#{ContentSourceReposUIBean.dataModel}"/>
<rich:dataTable id="contentProviderReposDataTable"
rows="#{PageControl.ContentSourceReposList.pageSize}"
- value="contentProviderReposDataModel"
- var="repolitem"
+ value="#{contentProviderReposDataModel}"
+ var="repo"
width="100%"
columnsWidth="1%, 20%, 20%, 20%"
headerClass="tableRowHeader"
@@ -202,7 +214,6 @@
onRowMouseOver="this.style.backgroundColor='#E7E7E7'"
onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'">
-
<f:facet name="PageControlView">
<onc:paginationControl id="ContentSourceReposList" />
</f:facet>
@@ -212,7 +223,7 @@
<onc:allSelect target="selectedContentSourceRepos"
/>
</f:facet>
- <onc:select name="selectedContentSourceRepos"
value="#{repoitem.id}" />
+ <onc:select name="selectedContentSourceRepos"
value="#{repo.id}" />
</rich:column>
<rich:column rendered="#{param.debug}">
@@ -222,7 +233,7 @@
</onc:sortableColumnHeader>
</f:facet>
- <h:outputText value="#{repoitem.id}"/>
+ <h:outputText value="#{repo.id}"/>
</rich:column>
<rich:column>
@@ -234,8 +245,8 @@
<h:outputLink value="repo.xhtml">
<f:param name="mode" value="view"/>
- <f:param name="id"
value="#{repoitem.id}"/>
- <h:outputText value="#{repoitem.name}" />
+ <f:param name="id" value="#{repo.id}"/>
+ <h:outputText value="#{repo.name}" />
</h:outputLink>
</rich:column>
@@ -246,7 +257,7 @@
</onc:sortableColumnHeader>
</f:facet>
- <h:outputText value="#{repoitem.creationDate}">
+ <h:outputText value="#{repo.creationDate}">
<f:convertDateTime pattern="M/d/yy, h:mm:ss aa, zzz"
timeZone="#{ServerInfoUIBean.timeZone}"/>
</h:outputText>
</rich:column>
@@ -258,7 +269,7 @@
</onc:sortableColumnHeader>
</f:facet>
- <h:outputText value="#{repoitem.lastModifiedDate}">
+ <h:outputText value="#{repo.lastModifiedDate}">
<f:convertDateTime pattern="M/d/yy, h:mm:ss aa, zzz"
timeZone="#{ServerInfoUIBean.timeZone}"/>
</h:outputText>
</rich:column>
@@ -270,16 +281,20 @@
</onc:sortableColumnHeader>
</f:facet>
- <h:outputText value="#{repoitem.description}"/>
+ <h:outputText value="#{repo.description}"/>
</rich:column>
<f:facet name="footer">
<rich:columnGroup>
<!-- colspan 6:5 for the debug 'id' column -->
<rich:column colspan="#{param.debug ? 6 : 5}"
width="100%">
+ <ui:remove>
+ <!--
<onc:selectCommandButton
action="#{ContentSourceReposUIBean.deleteSelectedContentSourceRepos}"
- value="DISASSOCIATE SELECTED"
target="selectedContentSourceRepos" styleClass="on-pager-button
buttonsmall"/>
-
+ value="DISASSOCIATE SELECTED"
target="selectedContentSourceRepos"
+ styleClass="on-pager-button
buttonsmall"/>
+ -->
+ </ui:remove>
<ui:param name="paginationDataTableName"
value="contentProviderReposDataTable"/>
<ui:param name="paginationDataModel"
value="#{contentProviderReposDataModel}"/>
<ui:param name="paginationPageControl"
value="#{PageControl.ContentSourceReposList}"/>
@@ -294,8 +309,9 @@
</rich:panel>
</h:form>
-
- <!-- SYNCHRONIZATION RESULTS LIST -->
+
+
+ <!-- REPO IMPORT RESULTS LIST -->
<h:form id="contentSourceSyncResultsListForm">
<input type="hidden" name="id"
value="${param.id}"/>
@@ -303,7 +319,7 @@
<rich:panel>
<f:facet name="header">
- <h:outputText value="Synchronization Results"/>
+ <h:outputText value="Repository Import Results"/>
</f:facet>
<h:panelGrid columns="1" width="100%">
@@ -386,10 +402,12 @@
<rich:componentControl for="resultsModalPanel"
attachTo="resultsLink" operation="show"
event="onclick"/>
</h:outputLink>
<h:outputText rendered="#{syncitem.results eq null}"
value=""/>
- <rich:modalPanel id="resultsModalPanel"
width="350" height="300" style="overflow: auto;">
+
+ <rich:modalPanel id="resultsModalPanel"
width="640" height="480" moveable="false"
resizeable="false"
+ style="overflow: auto;">
<f:facet name="header">
- <h:panelGroup>
- <h:outputText value="Results" />
+ <h:panelGroup layout="block">
+ Results for synchronization request with id #{syncitem.id}
</h:panelGroup>
</f:facet>
<f:facet name="controls">
@@ -398,7 +416,9 @@
<rich:componentControl for="resultsModalPanel"
attachTo="resultsModelPanelHideLink" operation="hide"
event="onclick"/>
</h:panelGroup>
</f:facet>
- <PRE><h:outputText value="#{syncitem.results}"
/></PRE>
+ <h:panelGroup layout="block">
+ <pre>#{syncitem.results}</pre>
+ </h:panelGroup>
</rich:modalPanel>
</rich:column>
@@ -424,15 +444,17 @@
</h:form>
- <!-- REPO LIST -->
- <h:form id="contentSourceRepoListForm">
+
+ <!-- CANDIDATE (NOT IMPORTED) REPOS LIST -->
+
+ <h:form id="contentSourceRepoListForm"
rendered="#{ContentSourceCandidateReposUIBean.dataModel.rowCount gt 0}">
<input type="hidden" name="id"
value="${param.id}"/>
<input type="hidden" name="mode"
value="${param.mode}"/>
<rich:panel>
<f:facet name="header">
- <h:outputText value="Repositories you can synchronize from this
Content Provider"/>
+ <h:outputText value="Candidate Repositories"/>
</f:facet>
<h:panelGrid columns="2" width="100%">
@@ -441,42 +463,43 @@
<rich:dataTable id="contentSourceReposDataTable"
rows="#{PageControl.ContentSourceCandidateReposList.pageSize}"
value="#{contentSourceReposDataModel}"
- var="repoitem"
+ var="repo"
width="100%"
- columnsWidth="100%"
+ columnsWidth="1%,99%"
headerClass="tableRowHeader"
footerClass="on-pager-footer"
onRowMouseOver="this.style.backgroundColor='#E7E7E7'"
onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'">
-
<f:facet name="PageControlView">
<onc:paginationControl
id="ContentSourceCandidateReposList" />
</f:facet>
- <rich:column rendered="#{param.debug}">
- <f:facet name="header">
- <onc:sortableColumnHeader sort="c.id">
- <h:outputText styleClass="headerText"
value="ID" />
- </onc:sortableColumnHeader>
- </f:facet>
- <h:outputText value="#{repoitem.id}"/>
- </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:allSelect target="selectedCandidateRepos" />
+ </f:facet>
+
+ <onc:select name="selectedCandidateRepos"
value="#{repo.id}" />
+ </rich:column>
+
<rich:column>
<f:facet name="header">
<onc:sortableColumnHeader sort="c.name">
<h:outputText styleClass="headerText"
value="Name" />
</onc:sortableColumnHeader>
</f:facet>
- <h:outputLink value="repo.xhtml">
- <f:param name="mode" value="view"/>
- <f:param name="id"
value="#{repoitem.id}"/>
- <h:outputText value="#{repoitem.name}" />
- </h:outputLink>
+
+ <h:outputText value="#{repo.name}" />
+ <h:outputText value="(id=#{repo.id})"
rendered="#{param.debug}" />
</rich:column>
+
<f:facet name="footer">
<rich:columnGroup>
- <!-- colspan 6:5 for the debug 'id' column -->
- <rich:column colspan="#{param.debug ? 6 : 5}"
width="100%">
+ <!-- colspan 7:6 for the debug 'id' column -->
+ <rich:column colspan="2" width="100%">
+ <onc:selectCommandButton
action="#{ContentSourceCandidateReposUIBean.importSelectedRepos}"
+ value="IMPORT SELECTED"
target="selectedCandidateRepos" styleClass="on-pager-button
buttonsmall"/>
<ui:param name="paginationDataTableName"
value="contentSourceReposDataTable"/>
<ui:param name="paginationDataModel"
value="#{contentSourceReposDataModel}"/>
<ui:param name="paginationPageControl"
value="#{PageControl.ContentSourceCandidateReposList}"/>
@@ -492,6 +515,8 @@
</rich:panel>
</h:form>
+ </h:panelGroup>
+
</ui:define>
</ui:composition>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/content/listRepos.xhtml
b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/content/listRepos.xhtml
index 284dd88..3561655 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/content/listRepos.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/content/listRepos.xhtml
@@ -114,10 +114,8 @@
</f:facet>
<a4j:region>
- <a4j:poll id="poll" interval="5000"
- reRender="statusid" />
- <h:outputText style="font-size:16px"
- value="#{item.syncStatus}" />
+ <a4j:poll id="poll" interval="5000"
reRender="statusid" />
+ <h:outputText styleClass="headerText"
value="#{item.syncStatus}" />
</a4j:region>
</rich:column>
diff --git a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/content/repo.xhtml
b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/content/repo.xhtml
index 1a12dd0..91a35b4 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/content/repo.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/content/repo.xhtml
@@ -109,14 +109,14 @@
</c:choose></td>
</tr>
<tr>
- <td align="right"><b>Raw Percentage
:</b></td>
+ <td align="right"><b>Raw
Percentage:</b></td>
<td align="left">
<h:outputText id="syncPercent"
value="#{RepoDetailsUIBean.percentComplete}" />
</td>
</tr>
<tr>
- <td align="right"><b>Synchronization Progress
:</b></td>
+ <td align="right"><b>Synchronization
Progress:</b></td>
<td align="left">
<c:choose>
<c:when
@@ -493,7 +493,9 @@
</rich:panel>
</h:form>
- <!-- PACKAGE VERSION LIST -->
+
+
+ <!-- PACKAGE LIST -->
<h:form id="repoPackageVersionsListForm">
<a4j:region id="packageList">
@@ -503,7 +505,7 @@
<rich:panel>
<f:facet name="header">
<h:outputText
- value="Package Versions Accessible To This Repository" />
+ value="Packages" />
</f:facet>
<h:panelGrid columns="1" width="100%">
@@ -531,18 +533,16 @@
</h:panelGroup>
-
<ui:param name="repoPackageVersionsDataModel"
value="#{RepoPackageVersionsUIBean.dataModel}" />
<rich:dataTable id="repoPackageVersionsDataTable"
rows="#{PageControl.RepoPackageVersionsList.pageSize}"
- value="#{repoPackageVersionsDataModel}" var="pvitem"
+ value="#{repoPackageVersionsDataModel}" var="package"
width="100%" columnsWidth="5%,20%, 10%, 5%, 60%"
headerClass="tableRowHeader"
footerClass="on-pager-footer"
onRowMouseOver="this.style.backgroundColor='#E7E7E7'"
onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'">
-
<f:facet name="PageControlView">
<onc:paginationControl id="RepoPackageVersionsList" />
</f:facet>
@@ -552,10 +552,9 @@
<onc:allSelect target="selectedPackages" />
</f:facet>
- <onc:select name="selectedPackages"
value="#{pvitem.id}" />
+ <onc:select name="selectedPackages"
value="#{package.id}" />
</rich:column>
-
<rich:column rendered="#{param.debug}">
<f:facet name="header">
<onc:sortableColumnHeader sort="pv.id">
@@ -563,7 +562,7 @@
</onc:sortableColumnHeader>
</f:facet>
- <h:outputText value="#{pvitem.id}" />
+ <h:outputText value="#{package.id}" />
</rich:column>
<rich:column>
@@ -574,8 +573,8 @@
</f:facet>
<h:outputLink value="packageVersion.xhtml">
- <f:param name="id" value="#{pvitem.id}" />
- <h:outputText value="#{pvitem.displayName}" />
+ <f:param name="id" value="#{package.id}" />
+ <h:outputText value="#{package.displayName}" />
</h:outputLink>
</rich:column>
@@ -587,7 +586,7 @@
</onc:sortableColumnHeader>
</f:facet>
- <h:outputText value="#{pvitem.displayVersion}" />
+ <h:outputText value="#{package.displayVersion}" />
</rich:column>
<rich:column>
@@ -597,7 +596,7 @@
</onc:sortableColumnHeader>
</f:facet>
- <h:outputText value="#{pvitem.architecture.name}" />
+ <h:outputText value="#{package.architecture.name}" />
</rich:column>
<rich:column>
@@ -608,7 +607,9 @@
</onc:sortableColumnHeader>
</f:facet>
- <h:outputText value="#{pvitem.shortDescription}" />
+ <h:panelGroup layout="block">
+ <h:outputText value="#{package.shortDescription}"
escape="false" />
+ </h:panelGroup>
</rich:column>
<f:facet name="footer">
@@ -650,7 +651,7 @@
</a4j:region>
</h:form>
- <h:form id="repoDistributionListForm">
+ <h:form id="repoDistributionListForm"
rendered="#{RepoDistributionUIBean.dataModel.rowCount gt 0}">
<a4j:region id="distributionList">
<input type="hidden" name="id"
value="${param.id}" />
<input type="hidden" name="mode"
value="${param.mode}" />
@@ -658,7 +659,7 @@
<rich:panel>
<f:facet name="header">
<h:outputText
- value="Distribution Trees Associated To This Repository" />
+ value="Distribution Trees" />
</f:facet>
<h:panelGrid columns="1" width="100%">
@@ -745,14 +746,14 @@
</a4j:region>
</h:form>
- <h:form id="repoAdvisoryListForm">
+ <h:form id="repoAdvisoryListForm"
rendered="#{RepoAdvisoryUIBean.dataModel.rowCount gt 0}">
<a4j:region id="advisoryList">
<input type="hidden" name="id"
value="${param.id}" />
<input type="hidden" name="mode"
value="${param.mode}" />
<rich:panel>
<f:facet name="header">
- <h:outputText value="Advisory Associated To This Repository"
/>
+ <h:outputText value="Advisories" />
</f:facet>
<h:panelGrid columns="1" width="100%">
diff --git
a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/subscription.xhtml
b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/subscription.xhtml
index 01ef108..b2f1380 100644
---
a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/subscription.xhtml
+++
b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/content/subscription.xhtml
@@ -1,263 +1,265 @@
-<?xml version="1.0"?>
-
-<!DOCTYPE html
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-<html
xmlns="http://www.w3.org/1999/xhtml"
-
xmlns:h="http://java.sun.com/jsf/html"
-
xmlns:f="http://java.sun.com/jsf/core"
-
xmlns:ui="http://java.sun.com/jsf/facelets"
-
xmlns:c="http://java.sun.com/jstl/core"
-
xmlns:onc="http://jboss.org/on/component"
-
xmlns:onf="http://jboss.org/on/function"
-
xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
-
xmlns:rich="http://richfaces.ajax4jsf.org/rich">
-
-<ui:composition template="/rhq/resource/layout/main.xhtml">
-
+<?xml version="1.0"?>
+
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html
xmlns="http://www.w3.org/1999/xhtml"
+
xmlns:h="http://java.sun.com/jsf/html"
+
xmlns:f="http://java.sun.com/jsf/core"
+
xmlns:ui="http://java.sun.com/jsf/facelets"
+
xmlns:c="http://java.sun.com/jstl/core"
+
xmlns:onc="http://jboss.org/on/component"
+
xmlns:onf="http://jboss.org/on/function"
+
xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
+
xmlns:rich="http://richfaces.ajax4jsf.org/rich">
+
+<ui:composition template="/rhq/resource/layout/main.xhtml">
+
<ui:param name="pageTitle" value="View Repo Subscriptions for
Resource '#{ResourceUIBean.name}'"/>
- <ui:param name="selectedTabName"
value="Content.Subscriptions"/>
-
- <ui:define name="content">
-
- <!-- CURRENT REPOS -->
+ <ui:param name="selectedTabName"
value="Content.Subscriptions"/>
+
+ <ui:define name="content">
+
+ <!-- CURRENT REPOS -->
<h:form id="currentRepoForm">
- <input type="hidden" name="id"
value="${param.id}"/>
-
- <rich:panel styleClass="BlockContent">
- <f:facet name="header"><h:outputText value="Current
Resource Subscriptions"/></f:facet>
+ <input type="hidden" name="id"
value="${param.id}"/>
+
+ <rich:panel styleClass="BlockContent">
+ <f:facet name="header"><h:outputText value="Current
Resource Subscriptions"/></f:facet>
<a4j:keepAlive beanName="ResourceReposUIBean"/>
-
+
<ui:param name="resourceReposDataModel"
value="#{ResourceReposUIBean.dataModel}"/>
<rich:dataTable id="resourceReposDataTable"
rows="#{PageControl.ResourceReposList.pageSize}"
value="#{resourceReposDataModel}"
- var="item"
- width="100%"
- columnsWidth="1%, 25%, 40%, 5%, 15%, 15%"
- headerClass="tableRowHeader"
- footerClass="on-pager-footer"
-
onRowMouseOver="this.style.backgroundColor='#E7E7E7'"
-
onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'">
-
- <f:facet name="PageControlView">
+ var="item"
+ width="100%"
+ columnsWidth="1%, 25%, 40%, 5%, 15%, 15%"
+ headerClass="tableRowHeader"
+ footerClass="on-pager-footer"
+
onRowMouseOver="this.style.backgroundColor='#E7E7E7'"
+
onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'">
+
+ <f:facet name="PageControlView">
<onc:paginationControl id="ResourceReposList" />
- </f:facet>
-
- <rich:column>
- <f:facet name="header">
+ </f:facet>
+
+ <rich:column>
+ <f:facet name="header">
<onc:allSelect target="selectedResourceRepos" />
- </f:facet>
-
+ </f:facet>
+
<onc:select name="selectedResourceRepos"
value="#{item.repo.id}"/>
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="c.name">
- <h:outputText styleClass="headerText"
value="Name" />
- </onc:sortableColumnHeader>
- </f:facet>
-
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="c.name">
+ <h:outputText styleClass="headerText"
value="Name" />
+ </onc:sortableColumnHeader>
+ </f:facet>
+
<h:outputLink value="/rhq/content/repo.xhtml">
- <f:param name="mode" value="view"/>
+ <f:param name="mode" value="view"/>
<f:param name="id"
value="#{item.repo.id}"/>
<h:outputText value="#{item.repo.name}" />
- </h:outputLink>
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <h:outputText styleClass="headerText"
value="Description" />
- </f:facet>
-
+ </h:outputLink>
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <h:outputText styleClass="headerText"
value="Description" />
+ </f:facet>
+
<h:outputText value="#{item.repo.description}"/>
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="COUNT(pv)">
- <h:outputText styleClass="headerText"
value="Package Count" />
- </onc:sortableColumnHeader>
- </f:facet>
-
- <h:outputText value="#{item.packageVersionCount}" />
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="c.creationDate">
- <h:outputText styleClass="headerText"
value="Created" />
- </onc:sortableColumnHeader>
- </f:facet>
-
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="COUNT(pv)">
+ <h:outputText styleClass="headerText"
value="Package Count" />
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputText value="#{item.packageVersionCount}" />
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="c.creationDate">
+ <h:outputText styleClass="headerText"
value="Created" />
+ </onc:sortableColumnHeader>
+ </f:facet>
+
<h:outputText value="#{item.repo.creationDate}">
- <f:convertDateTime pattern="M/d/yy, h:mm:ss aa, zzz"
timeZone="#{ServerInfoUIBean.timeZone}"/>
- </h:outputText>
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader
sort="c.lastModifiedDate">
- <h:outputText styleClass="headerText"
value="Last Modified" />
- </onc:sortableColumnHeader>
- </f:facet>
-
+ <f:convertDateTime pattern="M/d/yy, h:mm:ss aa, zzz"
timeZone="#{ServerInfoUIBean.timeZone}"/>
+ </h:outputText>
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader
sort="c.lastModifiedDate">
+ <h:outputText styleClass="headerText"
value="Last Modified" />
+ </onc:sortableColumnHeader>
+ </f:facet>
+
<h:outputText value="#{item.repo.lastModifiedDate}">
- <f:convertDateTime pattern="M/d/yy, h:mm:ss aa, zzz"
timeZone="#{ServerInfoUIBean.timeZone}"/>
- </h:outputText>
- </rich:column>
-
- <f:facet name="footer">
- <rich:columnGroup>
- <rich:column colspan="6" width="100%">
+ <f:convertDateTime pattern="M/d/yy, h:mm:ss aa, zzz"
timeZone="#{ServerInfoUIBean.timeZone}"/>
+ </h:outputText>
+ </rich:column>
+
+ <f:facet name="footer">
+ <rich:columnGroup>
+ <rich:column colspan="6" width="100%">
<onc:selectCommandButton
action="#{ResourceReposUIBean.deleteSelectedResourceRepos}"
- value="REMOVE SUBSCRIPTIONS"
+ value="UNSUBSCRIBE"
+ alt="Unsubscribe"
target="selectedResourceRepos"
- styleClass="on-pager-button
buttonsmall"
-
rendered="${GlobalPermissionsUIBean.inventory}"/>
-
- <ui:include
src="/rhq/resource/include/pagination.xhtml">
+ styleClass="on-pager-button
buttonsmall"
+
rendered="${GlobalPermissionsUIBean.inventory}"/>
+
+ <ui:include
src="/rhq/resource/include/pagination.xhtml">
<ui:param name="paginationDataTableName"
value="resourceReposDataTable"/>
<ui:param name="paginationDataModel"
value="#{resourceReposDataModel}"/>
<ui:param name="paginationPageControl"
value="#{PageControl.ResourceReposList}"/>
- </ui:include>
- </rich:column>
- </rich:columnGroup>
- </f:facet>
-
- </rich:dataTable>
-
- </rich:panel>
- </h:form>
-
-
- <!-- AVAILABLE REPOS -->
+ </ui:include>
+ </rich:column>
+ </rich:columnGroup>
+ </f:facet>
+
+ </rich:dataTable>
+
+ </rich:panel>
+ </h:form>
+
+
+ <!-- AVAILABLE REPOS -->
<h:form id="availableRepoForm"
- rendered="${GlobalPermissionsUIBean.inventory}">
- <input type="hidden" name="id"
value="${param.id}"/>
- <rich:panel styleClass="BlockContent">
+ rendered="${GlobalPermissionsUIBean.inventory}">
+ <input type="hidden" name="id"
value="${param.id}"/>
+ <rich:panel styleClass="BlockContent">
<f:facet name="header"><h:outputText value="Available
Repositories"/></f:facet>
-
+
<a4j:keepAlive beanName="AvailableResourceReposUIBean"/>
-
+
<ui:param name="availableResourceReposDataModel"
value="#{AvailableResourceReposUIBean.dataModel}"/>
<rich:dataTable id="availableResourceReposDataTable"
rows="#{PageControl.AvailableResourceReposList.pageSize}"
value="#{availableResourceReposDataModel}"
- var="item"
- width="100%"
- columnsWidth="1%, 25%, 40%, 5%, 15%, 15%"
- headerClass="tableRowHeader"
- footerClass="on-pager-footer"
-
onRowMouseOver="this.style.backgroundColor='#E7E7E7'"
-
onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'">
-
- <f:facet name="PageControlView">
+ var="item"
+ width="100%"
+ columnsWidth="1%, 25%, 40%, 5%, 15%, 15%"
+ headerClass="tableRowHeader"
+ footerClass="on-pager-footer"
+
onRowMouseOver="this.style.backgroundColor='#E7E7E7'"
+
onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'">
+
+ <f:facet name="PageControlView">
<onc:paginationControl id="AvailableResourceReposList"
/>
- </f:facet>
-
- <rich:column>
- <f:facet name="header">
+ </f:facet>
+
+ <rich:column>
+ <f:facet name="header">
<onc:allSelect target="selectedAvailableResourceRepos"
/>
- </f:facet>
-
+ </f:facet>
+
<onc:select name="selectedAvailableResourceRepos"
value="#{item.repo.id}"/>
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="c.name">
- <h:outputText styleClass="headerText"
value="Name" />
- </onc:sortableColumnHeader>
- </f:facet>
-
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="c.name">
+ <h:outputText styleClass="headerText"
value="Name" />
+ </onc:sortableColumnHeader>
+ </f:facet>
+
<h:outputLink value="/rhq/content/repo.xhtml">
- <f:param name="mode" value="view"/>
+ <f:param name="mode" value="view"/>
<f:param name="id"
value="#{item.repo.id}"/>
<h:outputText value="#{item.repo.name}" />
- </h:outputLink>
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <h:outputText styleClass="headerText"
value="Description" />
- </f:facet>
-
+ </h:outputLink>
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <h:outputText styleClass="headerText"
value="Description" />
+ </f:facet>
+
<h:outputText value="#{item.repo.description}"/>
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="COUNT(pv)">
- <h:outputText styleClass="headerText"
value="Package Count" />
- </onc:sortableColumnHeader>
- </f:facet>
-
- <h:outputText value="#{item.packageVersionCount}" />
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader sort="c.creationDate">
- <h:outputText styleClass="headerText"
value="Created" />
- </onc:sortableColumnHeader>
- </f:facet>
-
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="COUNT(pv)">
+ <h:outputText styleClass="headerText"
value="Package Count" />
+ </onc:sortableColumnHeader>
+ </f:facet>
+
+ <h:outputText value="#{item.packageVersionCount}" />
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader sort="c.creationDate">
+ <h:outputText styleClass="headerText"
value="Created" />
+ </onc:sortableColumnHeader>
+ </f:facet>
+
<h:outputText value="#{item.repo.creationDate}">
- <f:convertDateTime pattern="M/d/yy, h:mm:ss aa, zzz"
timeZone="#{ServerInfoUIBean.timeZone}"/>
- </h:outputText>
- </rich:column>
-
- <rich:column>
- <f:facet name="header">
- <onc:sortableColumnHeader
sort="c.lastModifiedDate">
- <h:outputText styleClass="headerText"
value="Last Modified" />
- </onc:sortableColumnHeader>
- </f:facet>
-
+ <f:convertDateTime pattern="M/d/yy, h:mm:ss aa, zzz"
timeZone="#{ServerInfoUIBean.timeZone}"/>
+ </h:outputText>
+ </rich:column>
+
+ <rich:column>
+ <f:facet name="header">
+ <onc:sortableColumnHeader
sort="c.lastModifiedDate">
+ <h:outputText styleClass="headerText"
value="Last Modified" />
+ </onc:sortableColumnHeader>
+ </f:facet>
+
<h:outputText value="#{item.repo.lastModifiedDate}">
- <f:convertDateTime pattern="M/d/yy, h:mm:ss aa, zzz"
timeZone="#{ServerInfoUIBean.timeZone}"/>
- </h:outputText>
- </rich:column>
-
- <f:facet name="footer">
- <rich:columnGroup>
- <rich:column colspan="6" width="100%">
+ <f:convertDateTime pattern="M/d/yy, h:mm:ss aa, zzz"
timeZone="#{ServerInfoUIBean.timeZone}"/>
+ </h:outputText>
+ </rich:column>
+
+ <f:facet name="footer">
+ <rich:columnGroup>
+ <rich:column colspan="6" width="100%">
<onc:selectCommandButton
action="#{AvailableResourceReposUIBean.subscribeSelectedResourceRepos}"
- value="ADD SUBSCRIPTIONS"
+ value="SUBSCRIBE"
+ alt="Subscribe"
target="selectedAvailableResourceRepos"
- styleClass="on-pager-button
buttonsmall"
-
rendered="${GlobalPermissionsUIBean.inventory}"/>
-
- <ui:include
src="/rhq/resource/include/pagination.xhtml">
+ styleClass="on-pager-button
buttonsmall"
+
rendered="${GlobalPermissionsUIBean.inventory}"/>
+
+ <ui:include
src="/rhq/resource/include/pagination.xhtml">
<ui:param name="paginationDataTableName"
value="availableResourceReposDataTable"/>
<ui:param name="paginationDataModel"
value="#{availableResourceReposDataModel}"/>
<ui:param name="paginationPageControl"
value="#{PageControl.AvailableResourceReposList}"/>
- </ui:include>
- </rich:column>
- </rich:columnGroup>
- </f:facet>
-
- </rich:dataTable>
-
- </rich:panel>
-
- <ui:remove><!-- The package mode isn't returning enough data to
differentiate it from the new subtab, so
- disabling it for now until we decide if this is needed.
--></ui:remove>
- <!--
- <p align="center">
- <h:outputLink
value="/rhq/resource/content/subscription_packages.xhtml">
- <f:param name="id" value="${param.id}"/>
- <h:outputText value="Switch To Package Mode" />
- </h:outputLink>
- </p>
- -->
-
- </h:form>
-
- </ui:define>
-</ui:composition>
-
-</html>
+ </ui:include>
+ </rich:column>
+ </rich:columnGroup>
+ </f:facet>
+
+ </rich:dataTable>
+
+ </rich:panel>
+
+ <ui:remove><!-- The package mode isn't returning enough data to
differentiate it from the new subtab, so
+ disabling it for now until we decide if this is needed.
--></ui:remove>
+ <!--
+ <p align="center">
+ <h:outputLink
value="/rhq/resource/content/subscription_packages.xhtml">
+ <f:param name="id" value="${param.id}"/>
+ <h:outputText value="Switch To Package Mode" />
+ </h:outputLink>
+ </p>
+ -->
+
+ </h:form>
+
+ </ui:define>
+</ui:composition>
+
+</html>
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerBean.java
index 317656b..7b35cad 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerBean.java
@@ -915,7 +915,8 @@ public class ContentSourceManagerBean implements
ContentSourceManagerLocal {
@TransactionAttribute(TransactionAttributeType.NEVER)
public boolean internalSynchronizeContentSource(int contentSourceId) throws Exception
{
ContentServerPluginContainer pc = ContentManagerHelper.getPluginContainer();
- return pc.getAdapterManager().synchronizeContentProvider(contentSourceId);
+ ContentProviderManager contentProviderManager = pc.getAdapterManager();
+ return contentProviderManager.synchronizeContentProvider(contentSourceId);
}
@SuppressWarnings("unchecked")
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java
index 4e078aa..b7e13c7 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java
@@ -115,7 +115,7 @@ public class RepoManagerBean implements RepoManagerLocal,
RepoManagerRemote {
@RequiredPermission(Permission.MANAGE_INVENTORY)
public void deleteRepo(Subject subject, int repoId) {
- log.debug("User [" + subject + "] is deleting repo [" +
repoId + "]");
+ log.debug("User [" + subject + "] is deleting repository with id
[" + repoId + "]...");
// bulk delete m-2-m mappings to the doomed repo
// get ready for bulk delete by clearing entity manager
@@ -133,9 +133,9 @@ public class RepoManagerBean implements RepoManagerLocal,
RepoManagerRemote {
Repo repo = entityManager.find(Repo.class, repoId);
if (repo != null) {
entityManager.remove(repo);
- log.debug("User [" + subject + "] deleted repo [" + repo
+ "]");
+ log.debug("User [" + subject + "] deleted repository [" +
repo + "]");
} else {
- log.debug("Repo ID [" + repoId + "] doesn't exist -
nothing to delete");
+ log.debug("Repository with id [" + repoId + "] doesn't
exist - nothing to delete");
}
// remove any unused, orphaned package versions
@@ -326,16 +326,16 @@ public class RepoManagerBean implements RepoManagerLocal,
RepoManagerRemote {
getRepo(subject, repo.getId());
// should we check non-null repo relationships and warn that we aren't
changing them?
- log.debug("User [" + subject + "] is updating repo [" + repo
+ "]");
+ log.debug("User [" + subject + "] is updating [" + repo +
"]...");
repo = entityManager.merge(repo);
- log.debug("User [" + subject + "] updated repo [" + repo +
"]");
+ log.debug("User [" + subject + "] updated [" + repo +
"].");
try {
ContentServerPluginContainer pc = ContentManagerHelper.getPluginContainer();
pc.unscheduleRepoSyncJob(repo);
pc.scheduleRepoSyncJob(repo);
} catch (Exception e) {
- log.warn("Failed to reschedule for [" + repo + "]", e);
+ log.warn("Failed to reschedule repository synchronization job for
[" + repo + "].", e);
}
return repo;
@@ -346,9 +346,9 @@ public class RepoManagerBean implements RepoManagerLocal,
RepoManagerRemote {
validateRepo(repo);
repo.setCandidate(false);
- log.debug("User [" + subject + "] is creating repo [" + repo
+ "]");
+ log.debug("User [" + subject + "] is creating [" + repo +
"]...");
entityManager.persist(repo);
- log.debug("User [" + subject + "] created repo [" + repo +
"]");
+ log.debug("User [" + subject + "] created [" + repo +
"]");
// Schedule the repo sync job.
try {
@@ -356,7 +356,7 @@ public class RepoManagerBean implements RepoManagerLocal,
RepoManagerRemote {
// Schedule a job for the future
pc.scheduleRepoSyncJob(repo);
} catch (Exception e) {
- log.error("error trying to schedule RepoSync", e);
+ log.error("Failed to schedule repository synchronization job for ["
+ repo + "].", e);
throw new RuntimeException(e);
}
@@ -366,11 +366,7 @@ public class RepoManagerBean implements RepoManagerLocal,
RepoManagerRemote {
@RequiredPermission(Permission.MANAGE_INVENTORY)
public Repo createCandidateRepo(Subject subject, Repo repo) throws RepoException {
validateRepo(repo);
-
- repo.setCandidate(true);
-
entityManager.persist(repo);
-
return repo;
}
@@ -408,17 +404,17 @@ public class RepoManagerBean implements RepoManagerLocal,
RepoManagerRemote {
existingGroup.setRepoGroupType(groupType);
// Don't let the whole report blow up if one of these fails,
- // but be sure to mention it to the report
+ // but be sure to mention it in the report.
try {
createRepoGroup(subject, existingGroup);
importedRepoGroups.add(createMe);
} catch (RepoException e) {
if (e.getType() ==
RepoException.RepoExceptionType.NAME_ALREADY_EXISTS) {
- result.append("Skipping existing repo group
[").append(name).append("]").append('\n');
+ result.append("Skipping existing repository group
[").append(name).append("]").append('\n');
} else {
- log.error("Error adding repo group [" + name +
"]", e);
- result.append("Could not add repo group
[").append(name).append(
+ log.error("Error adding repository group [" + name +
"]", e);
+ result.append("Could not add repository group
[").append(name).append(
"]. See log for more
information.").append('\n');
}
}
@@ -426,9 +422,9 @@ public class RepoManagerBean implements RepoManagerLocal,
RepoManagerRemote {
}
if (importedRepoGroups.isEmpty()) {
- result.append("There are new repo groups since the last time this
content source was synchronized.\n");
+ result.append("There are no new repository groups since the last time
this content source was synchronized.\n");
} else {
- result.append("Imported the following
[").append(importedRepoGroups.size()).append("] repo group(s): ").
+ result.append("Imported the following
[").append(importedRepoGroups.size()).append("] repository group(s): ").
append(importedRepoGroups).append('\n');
}
@@ -457,11 +453,11 @@ public class RepoManagerBean implements RepoManagerLocal,
RepoManagerRemote {
} catch (Exception e) {
if (e instanceof RepoException
&& ((RepoException) e).getType() ==
RepoException.RepoExceptionType.NAME_ALREADY_EXISTS) {
- result.append("Skipping addition of existing repo
[").append(createMe.getName()).append("]")
+ result.append("Skipping addition of existing repository
[").append(createMe.getName()).append("]")
.append('\n');
} else {
- log.error("Error processing repo [" + createMe +
"]", e);
- result.append("Could not add repo
[").append(createMe.getName()).append(
+ log.error("Error processing repository [" + createMe +
"]", e);
+ result.append("Could not add repository
[").append(createMe.getName()).append(
"]. See log for more
information.").append('\n');
}
}
@@ -478,39 +474,42 @@ public class RepoManagerBean implements RepoManagerLocal,
RepoManagerRemote {
}
removeRepoFromList(createMe.getName(), candidatesForThisProvider);
} catch (Exception e) {
- log.error("Error processing repo [" + createMe +
"]", e);
- result.append("Could not add repo
[").append(createMe.getName()).append(
+ log.error("Error processing repository [" + createMe +
"]", e);
+ result.append("Could not add repository
[").append(createMe.getName()).append(
"]. See log for more
information.").append('\n');
}
}
}
if (importedRepos.isEmpty()) {
- result.append("There are new repos since the last time this content
source was synchronized.\n");
+ result.append("There are no new repositories since the last time this
content source was synchronized.\n");
} else {
- result.append("Imported the following
").append(importedRepos.size()).append(" repo(s): ").
+ result.append("Imported the following
").append(importedRepos.size()).append(" repository(s): ").
append(importedRepos).append('\n');
}
// Any repos that haven't been removed from candidatesForThisProvider were
not returned in this
// report, so remove them from the database.
- for (Repo deleteMe : candidatesForThisProvider) {
- deleteRepo(subject, deleteMe.getId());
+ if (!candidatesForThisProvider.isEmpty()) {
+ for (Repo deleteMe : candidatesForThisProvider) {
+ deleteRepo(subject, deleteMe.getId());
+ }
+ result.append("Deleted the following
").append(candidatesForThisProvider.size()).append("obsolete repository(s):
").
+ append(candidatesForThisProvider).append('\n');
}
}
@RequiredPermission(Permission.MANAGE_INVENTORY)
public void importCandidateRepo(Subject subject, List<Integer> repoIds) throws
RepoException {
-
for (Integer repoId : repoIds) {
Repo repo = entityManager.find(Repo.class, repoId);
if (repo == null) {
- throw new RepoException("Unable to find candidate repo for import.
ID: " + repoId);
+ throw new RepoException("Unable to find candidate repository with id
" + repoId + " for import.");
}
if (!repo.isCandidate()) {
- throw new RepoException("Unable to import repo - repo is already
imported. ID: " + repoId);
+ throw new RepoException("Unable to import repository with id "
+ repoId + ", because it is already imported.");
}
repo.setCandidate(false);
@@ -585,8 +584,8 @@ public class RepoManagerBean implements RepoManagerLocal,
RepoManagerRemote {
throw new Exception("There is no content source with id [" + id
+ "]");
}
- RepoContentSource ccsmapping = repo.addContentSource(cs);
- entityManager.persist(ccsmapping);
+ RepoContentSource repoContentSourceMapping = repo.addContentSource(cs);
+ entityManager.persist(repoContentSourceMapping);
Set<PackageVersion> alreadyAssociatedPVs = new
HashSet<PackageVersion>(repo.getPackageVersions());
@@ -865,13 +864,15 @@ public class RepoManagerBean implements RepoManagerLocal,
RepoManagerRemote {
/**
* Performs the necessary logic to determine if a candidate repo should be added to
the system, adding it
- * in the process if it needs to. If the repo already exists in the system, this
method is a no-op.
+ * in the process if it needs to. If the repo already exists in the system, associate
it with the specified
+ * content source.
* <p/>
* Calling this method with a repo that has a parent assumes the parent has already
been created. This call
* assumes the repo group has been created as well.
*
* @param contentSourceId identifies the content provider that introduced the
candidate into the system
* @param createMe describes the candidate to be created
+ *
* @throws Exception if there is an error associating the content source with the
repo or if the repo
* indicates a parent or repo group that does not exist
*/
@@ -880,15 +881,21 @@ public class RepoManagerBean implements RepoManagerLocal,
RepoManagerRemote {
Subject overlord = subjectManager.getOverlord();
String name = createMe.getName();
- List<Repo> existingRepo = getRepoByName(name);
+ List<Repo> existingRepos = getRepoByName(name);
- // If the repo doesn't exist, create it.
- if (existingRepo.size() != 0) {
+ if (!existingRepos.isEmpty()) {
+ // The repo already exists - make sure it is associated with the specified
content provider.
+ for (Repo existingRepo : existingRepos) {
+ addContentSourcesToRepo(overlord, existingRepo.getId(), new int[] {
contentSourceId });
+ }
return false;
}
- // Create and populate the repo
+ // The repo doesn't exist yet in the system - create it.
Repo addMe = new Repo(name);
+ // TODO: The below line was added to simplify things for JON (i.e. patches from
JBoss CSP) - remove it if we
+ // need more flexibility for other use cases. (ips, 03/24/10)
+ addMe.setCandidate(false); // auto-import
addMe.setDescription(createMe.getDescription());
String createMeGroup = createMe.getRepoGroup();
@@ -942,7 +949,7 @@ public class RepoManagerBean implements RepoManagerLocal,
RepoManagerRemote {
countQuery.setParameter("repoId", repoId);
- return ((Long) countQuery.getSingleResult()).longValue();
+ return (Long) countQuery.getSingleResult();
}
@RequiredPermission(Permission.MANAGE_INVENTORY)
@@ -994,16 +1001,15 @@ public class RepoManagerBean implements RepoManagerLocal,
RepoManagerRemote {
countQuery.setParameter("repoId", repoId);
- return ((Long) countQuery.getSingleResult()).longValue();
+ return (Long) countQuery.getSingleResult();
}
public String calculateSyncStatus(Subject subject, int repoId) {
Repo found = this.getRepo(subject, repoId);
- Set<ContentSyncStatus> stati = new HashSet<ContentSyncStatus>();
List<RepoSyncResults> syncResults = found.getSyncResults();
// Add the most recent sync results status
int latestIndex = syncResults.size() - 1;
- if (syncResults != null && (!syncResults.isEmpty()) &&
syncResults.get(latestIndex) != null) {
+ if (!syncResults.isEmpty() && syncResults.get(latestIndex) != null) {
RepoSyncResults results = syncResults.get(latestIndex);
return results.getStatus().toString();
} else {
@@ -1014,7 +1020,6 @@ public class RepoManagerBean implements RepoManagerLocal,
RepoManagerRemote {
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public RepoSyncResults getMostRecentSyncResults(Subject subject, int repoId) {
Repo found = this.getRepo(subject, repoId);
- Set<ContentSyncStatus> stati = new HashSet<ContentSyncStatus>();
List<RepoSyncResults> syncResults = found.getSyncResults();
int latestIndex = syncResults.size() - 1;
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManager.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManager.java
index c486873..ab12bae 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManager.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManager.java
@@ -179,10 +179,9 @@ public class ContentProviderManager {
synchronized (synchronizeContentSourceLock) {
progress.append(new Date()).append(": ");
progress.append("Start synchronization of content provider
[").append(contentSource.getName()).append(
- "]");
- progress.append('\n');
+ "]\n");
progress.append(new Date()).append(": ");
- progress.append("Getting currently known list of content source
packages...");
+ progress.append("Getting currently known list of
packages...\n");
results = new ContentSourceSyncResults(contentSource);
results.setResults(progress.toString());
results = contentSourceManager.persistContentSourceSyncResults(results);
@@ -201,7 +200,7 @@ public class ContentProviderManager {
// one sync will get an error and rollback its tx and no harm
// will be done.
log.info("Content provider [" + contentSource.getName()
- + "] is already currently being synchronized - this sync request
will be ignored.");
+ + "] is already being synchronized - this sync request will be
ignored.");
return false;
}
@@ -275,17 +274,16 @@ public class ContentProviderManager {
// Load the repo to sync
Repo repo = repoManager.getRepo(overlord, repoId);
if (repo == null) {
- throw new IllegalArgumentException("Invalid repo ID specified for sync:
" + repoId);
+ throw new IllegalArgumentException("Invalid repository with id [" +
repoId + "] specified for sync.");
}
// results =
// contentSourceManager.persistContentSourceSyncResults(results);
StringBuilder progress = new StringBuilder();
progress.append(new Date()).append(": ");
- progress.append("Start synchronization of Repository
[").append(repo.getName()).append("]");
- progress.append('\n');
+ progress.append("Start synchronization of Repository
[").append(repo.getName()).append("]\n");
progress.append(new Date()).append(": ");
- progress.append("Getting currently known list of content source
packages...");
+ progress.append("Getting currently known list of content source
packages...\n");
SyncTracker tracker = new SyncTracker(new RepoSyncResults(repo), new
ProgressWatcher());
tracker.setResults(progress.toString());
tracker.setRepoSyncResults(repoManager.persistRepoSyncResults(tracker.getRepoSyncResults()));
@@ -294,14 +292,15 @@ public class ContentProviderManager {
if (tracker.getRepoSyncResults() == null) {
log.info("Repository [" + repo.getName()
- + "] is already currently being synchronized, this sync request will
be ignored");
+ + "] is already currently being synchronized - this sync request
will be ignored.");
return false;
}
Exception ie = null;
try {
ThreadUtil.checkInterrupted();
- // METADATA Loop
+
+ // Sync each of the content sources associated with the repo.
for (ContentSource source : repo.getContentSources()) {
try {
ContentProvider provider =
getIsolatedContentProvider(source.getId());
@@ -312,7 +311,7 @@ public class ContentProviderManager {
tracker = updateSyncStatus(tracker,
ContentSyncStatus.PACKAGEMETADATA);
tracker =
packageSourceSynchronizer.synchronizePackageMetadata(tracker);
- } catch (SyncException e) {
+ } catch (Exception e) {
processSyncException(e, tracker, repo, source, repoManager);
}
}
@@ -338,83 +337,98 @@ public class ContentProviderManager {
// fails
try {
ContentProvider provider =
getIsolatedContentProvider(source.getId());
-
- PackageSourceSynchronizer packageSourceSynchronizer = new
PackageSourceSynchronizer(repo, source,
- provider);
- log.debug("synchronizeRepo :: synchronizePackageBits");
- tracker = updateSyncStatus(tracker, ContentSyncStatus.PACKAGEBITS);
- tracker = packageSourceSynchronizer.synchronizePackageBits(tracker,
provider);
- tracker = updatePercentComplete(tracker, repoManager);
- // Check to cancel after each contentsource
- ThreadUtil.checkInterrupted();
-
- } catch (SyncException e) {
+ if (provider instanceof PackageSource) {
+ PackageSourceSynchronizer packageSourceSyncer = new
PackageSourceSynchronizer(repo, source,
+ provider);
+ log.debug("synchronizeRepo ::
synchronizePackageBits");
+ tracker = updateSyncStatus(tracker,
ContentSyncStatus.PACKAGEBITS);
+ tracker = packageSourceSyncer.synchronizePackageBits(tracker,
provider);
+ tracker = updatePercentComplete(tracker, repoManager);
+ }
+ } catch (Exception e) {
processSyncException(e, tracker, repo, source, repoManager);
}
+ // Check for cancellation after each content source.
+ ThreadUtil.checkInterrupted();
}
- // Distro meta
+
+ // Sync distro metadata.
+ log.debug("synchronizeRepo :: synchronizeDistributionMetadata");
for (ContentSource source : repo.getContentSources()) {
try {
ContentProvider provider =
getIsolatedContentProvider(source.getId());
- DistributionSourceSynchronizer distributionSourceSynchronizer = new
DistributionSourceSynchronizer(
- repo, source, provider);
-
- log.debug("synchronizeRepo ::
synchronizeDistributionMetadata");
- tracker = updateSyncStatus(tracker,
ContentSyncStatus.DISTROMETADATA);
- tracker =
distributionSourceSynchronizer.synchronizeDistributionMetadata(tracker);
- tracker = updatePercentComplete(tracker, repoManager);
- ThreadUtil.checkInterrupted();
- } catch (SyncException e) {
+ if (provider instanceof DistributionSource) {
+ DistributionSourceSynchronizer distroSourceSyncer = new
DistributionSourceSynchronizer(
+ repo, source, provider);
+ tracker = updateSyncStatus(tracker,
ContentSyncStatus.DISTROMETADATA);
+ tracker =
distroSourceSyncer.synchronizeDistributionMetadata(tracker);
+ tracker = updatePercentComplete(tracker, repoManager);
+ }
+ } catch (Exception e) {
processSyncException(e, tracker, repo, source, repoManager);
}
+ // Check for cancellation after each content source.
+ ThreadUtil.checkInterrupted();
}
- // Distro bits
+ // Sync distro bits.
+ log.debug("synchronizeRepo :: synchronizeDistributionBits");
for (ContentSource source : repo.getContentSources()) {
try {
ContentProvider provider =
getIsolatedContentProvider(source.getId());
- DistributionSourceSynchronizer distributionSourceSynchronizer = new
DistributionSourceSynchronizer(
- repo, source, provider);
-
- log.debug("synchronizeRepo ::
synchronizeDistributionBits");
- tracker = updateSyncStatus(tracker, ContentSyncStatus.DISTROBITS);
- tracker =
distributionSourceSynchronizer.synchronizeDistributionBits(tracker);
- tracker = updatePercentComplete(tracker, repoManager);
+ if (provider instanceof DistributionSource) {
+ DistributionSourceSynchronizer distroSourceSyncer = new
DistributionSourceSynchronizer(
+ repo, source, provider);
+ tracker = updateSyncStatus(tracker,
ContentSyncStatus.DISTROBITS);
+ tracker =
distroSourceSyncer.synchronizeDistributionBits(tracker);
+ tracker = updatePercentComplete(tracker, repoManager);
+ }
ThreadUtil.checkInterrupted();
- } catch (SyncException e) {
+ } catch (Exception e) {
processSyncException(e, tracker, repo, source, repoManager);
}
+ // Check for cancellation after each content source.
+ ThreadUtil.checkInterrupted();
}
- // advisory meta
+ // Sync advisory metadata.
+ log.debug("synchronizeRepo :: synchronizeAdvisoryMetadata");
for (ContentSource source : repo.getContentSources()) {
try {
- log.debug("synchronizeRepo ::
synchronizeAdvisoryMetadata");
+
ContentProvider provider =
getIsolatedContentProvider(source.getId());
- tracker = updateSyncStatus(tracker,
ContentSyncStatus.ADVISORYMETADATA);
- AdvisorySourceSynchronizer advisorySourcesync = new
AdvisorySourceSynchronizer(repo, source,
- provider);
- tracker = advisorySourcesync.synchronizeAdvisoryMetadata(tracker);
- tracker = updatePercentComplete(tracker, repoManager);
- ThreadUtil.checkInterrupted();
- } catch (SyncException e) {
+ if (provider instanceof AdvisorySource) {
+ tracker = updateSyncStatus(tracker,
ContentSyncStatus.ADVISORYMETADATA);
+ AdvisorySourceSynchronizer advisorySourceSyncer = new
AdvisorySourceSynchronizer(repo, source,
+ provider);
+ tracker =
advisorySourceSyncer.synchronizeAdvisoryMetadata(tracker);
+ tracker = updatePercentComplete(tracker, repoManager);
+ }
+ } catch (Exception e) {
processSyncException(e, tracker, repo, source, repoManager);
}
+ // Check for cancellation after each content source.
+ ThreadUtil.checkInterrupted();
}
// Update status to finished.
+ if (tracker.getRepoSyncResults().getStatus() != ContentSyncStatus.FAILURE) {
+ tracker.getRepoSyncResults().setStatus(ContentSyncStatus.SUCCESS);
+ }
+ tracker = updateSyncStatus(tracker,
tracker.getRepoSyncResults().getStatus());
+
progress = new StringBuilder();
progress.append("\n");
progress.append(tracker.getRepoSyncResults().getResults());
progress.append("\n");
progress.append(new Date()).append(": ");
- progress.append(" Repository
[").append(repo.getName()).append("]");
- progress.append('\n');
- progress.append(new Date()).append(": ");
- progress.append("completed syncing.");
+ progress.append("Repository
[").append(repo.getName()).append("] ");
+ progress.append("completed syncing with ");
+ progress.append((tracker.getRepoSyncResults().getStatus() ==
ContentSyncStatus.FAILURE) ? "one or more" : "no");
+ progress.append(" errors.\n");
tracker.setResults(progress.toString());
- tracker = updateSyncStatus(tracker, ContentSyncStatus.SUCCESS);
- log.debug("synchronizeRepo :: Success");
+
+ log.debug("synchronizeRepo :: " +
tracker.getRepoSyncResults().getStatus());
} catch (Exception e) {
RepoSyncResults recentResults =
repoManager.getMostRecentSyncResults(overlord, repo.getId());
log.debug("Caught InterruptedException");
@@ -423,7 +437,7 @@ public class ContentProviderManager {
tracker.getProgressWatcher().resetToZero();
tracker = updatePercentComplete(tracker, repoManager);
try {
- tracker = updateSyncStatus(tracker, ContentSyncStatus.CANCELLED, false);
+ tracker = updateSyncStatus(tracker, ContentSyncStatus.CANCELLED);
} catch (InterruptedException e1) {
throw new RuntimeException("Unexpected InterruptedException",
e1);
}
@@ -481,11 +495,7 @@ public class ContentProviderManager {
}
- private SyncTracker updateSyncStatus(SyncTracker tracker, ContentSyncStatus status)
throws InterruptedException {
- return updateSyncStatus(tracker, status, true);
- }
-
- private SyncTracker updateSyncStatus(SyncTracker tracker, ContentSyncStatus status,
boolean checkCancelling)
+ private SyncTracker updateSyncStatus(SyncTracker tracker, ContentSyncStatus status)
throws InterruptedException {
RepoManagerLocal repoManager = LookupUtil.getRepoManagerLocal();
SubjectManagerLocal subjMgr = LookupUtil.getSubjectManager();
@@ -853,8 +863,7 @@ public class ContentProviderManager {
try {
Thread.currentThread().setContextClassLoader(classLoader);
return method.invoke(instance, args);
- } finally {
- Thread.currentThread().setContextClassLoader(startingClassLoader);
+ } finally {
Thread.currentThread().setContextClassLoader(startingClassLoader);
}
}
}
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/ContentServerPluginContainer.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/ContentServerPluginContainer.java
index 9c1f89d..f04aa9e 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/ContentServerPluginContainer.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/ContentServerPluginContainer.java
@@ -20,6 +20,7 @@ package org.rhq.enterprise.server.plugin.pc.content;
import java.util.Date;
+import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.SchedulerException;
import org.quartz.SimpleTrigger;
@@ -121,7 +122,8 @@ public class ContentServerPluginContainer extends
AbstractTypeServerPluginContai
JobDetail job = new
JobDetail(ContentProviderSyncJob.createUniqueJobName(contentSource),
CONTENT_SRC_SYNC_JOB_GROUP_NAME, ContentProviderSyncJob.class, false, false,
false);
- ContentProviderSyncJob.createJobDataMap(contentSource, job);
+ JobDataMap jobDataMap = ContentProviderSyncJob.createJobDataMap(contentSource,
job);
+ jobDataMap.putAsString(ContentProviderSyncJob.DATAMAP_SYNC_IMPORTED_REPOS,
true);
SimpleTrigger trigger = new SimpleTrigger(job.getName(), job.getGroup());
trigger.setVolatility(false);
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/AdvisorySourceSynchronizer.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/AdvisorySourceSynchronizer.java
index 68df9c3..ae97e02 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/AdvisorySourceSynchronizer.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/AdvisorySourceSynchronizer.java
@@ -87,7 +87,7 @@ public class AdvisorySourceSynchronizer {
public SyncTracker synchronizeAdvisoryMetadata(SyncTracker tracker) throws
SyncException, InterruptedException {
if (!(provider instanceof AdvisorySource)) {
- log.error(" Advisory Instance:" + provider);
+ // Nothing to do.
return tracker;
}
@@ -98,7 +98,7 @@ public class AdvisorySourceSynchronizer {
long start = System.currentTimeMillis();
List<Advisory> advs = repoManager.findAssociatedAdvisory(overlord,
repo.getId(), pc);
- log.error("Found " + advs.size() + " Advisory for repo " +
repo.getId());
+ log.error("Found " + advs.size() + " advisories for repo " +
repo.getId());
ThreadUtil.checkInterrupted();
AdvisorySyncReport advReport = new AdvisorySyncReport(repo.getId());
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/DistributionSourceSynchronizer.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/DistributionSourceSynchronizer.java
index e5dfd67..2a26a33 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/DistributionSourceSynchronizer.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/DistributionSourceSynchronizer.java
@@ -78,6 +78,7 @@ public class DistributionSourceSynchronizer {
public SyncTracker synchronizeDistributionMetadata(SyncTracker tracker) throws
SyncException, InterruptedException {
if (!(provider instanceof DistributionSource)) {
+ // Nothing to do.
return tracker;
}
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/PackageSourceSynchronizer.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/PackageSourceSynchronizer.java
index 4f7d05a..48c26a3 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/PackageSourceSynchronizer.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/PackageSourceSynchronizer.java
@@ -85,6 +85,7 @@ public class PackageSourceSynchronizer {
public SyncTracker synchronizePackageMetadata(SyncTracker tracker) throws
SyncException, InterruptedException {
if (!(provider instanceof PackageSource)) {
+ // Nothing to do.
return tracker;
}
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/RepoSourceSynchronizer.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/RepoSourceSynchronizer.java
index 6edf1f9..f0adc8f 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/RepoSourceSynchronizer.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/RepoSourceSynchronizer.java
@@ -37,7 +37,7 @@ import org.rhq.enterprise.server.plugin.pc.content.RepoSource;
import org.rhq.enterprise.server.util.LookupUtil;
/**
- * Holds the methods necessary to interact with a plugin and execute its repo related
+ * Holds the methods necessary to interact with a plugin and execute its repo-related
* synchronization tasks.
*
* @author Jason Dobies
@@ -63,6 +63,7 @@ public class RepoSourceSynchronizer {
public void synchronizeCandidateRepos(StringBuilder progress) throws Exception {
if (!(provider instanceof RepoSource)) {
+ // Nothing to do.
return;
}
@@ -82,5 +83,4 @@ public class RepoSourceSynchronizer {
log.info("importRepos: [" + source.getName() + "]: report has been
merged ("
+ (System.currentTimeMillis() - start) + ")ms");
}
-
}
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/ContentProviderSyncJob.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/ContentProviderSyncJob.java
index a76d82f..4d948dd 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/ContentProviderSyncJob.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/ContentProviderSyncJob.java
@@ -29,9 +29,12 @@ import org.quartz.StatefulJob;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.content.ContentSource;
-import org.rhq.core.domain.content.ContentSourceType;
+import org.rhq.core.domain.content.Repo;
+import org.rhq.core.domain.criteria.RepoCriteria;
+import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
import org.rhq.enterprise.server.content.ContentSourceManagerLocal;
+import org.rhq.enterprise.server.content.RepoManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
/**
@@ -48,6 +51,7 @@ import org.rhq.enterprise.server.util.LookupUtil;
public class ContentProviderSyncJob implements StatefulJob {
private static final String DATAMAP_CONTENT_SOURCE_NAME =
"contentSourceName";
private static final String DATAMAP_CONTENT_SOURCE_TYPE_NAME =
"contentSourceTypeName";
+ public static final String DATAMAP_SYNC_IMPORTED_REPOS =
"syncImportedRepos";
private static final Log log = LogFactory.getLog(ContentProviderSyncJob.class);
private static final String SEPARATOR = "--";
@@ -71,6 +75,7 @@ public class ContentProviderSyncJob implements StatefulJob {
String name = dataMap.getString(DATAMAP_CONTENT_SOURCE_NAME);
String typeName = dataMap.getString(DATAMAP_CONTENT_SOURCE_TYPE_NAME);
+ boolean syncImportedRepos = dataMap.getBoolean(DATAMAP_SYNC_IMPORTED_REPOS);
if (name == null) {
throw new IllegalStateException("Missing the content source name in
details data");
@@ -80,8 +85,13 @@ public class ContentProviderSyncJob implements StatefulJob {
throw new IllegalStateException("Missing the content source type
name in details data");
}
- synchronizeAndLoad(name, typeName);
+ ContentSource contentSource = synchronizeAndLoad(name, typeName);
+ if (syncImportedRepos) {
+ // Synchronize all repos associated with the content provider - these may
be repos we just
+ // discovered during this sync or ones that were already associated.
+ syncImportedRepos(contentSource);
+ }
} catch (Exception e) {
String errorMsg = "Failed to sync content source in job [" +
context.getJobDetail() + "]";
log.error(errorMsg, e);
@@ -101,6 +111,22 @@ public class ContentProviderSyncJob implements StatefulJob {
}
}
+ private void syncImportedRepos(ContentSource contentSource) throws
InterruptedException {
+ SubjectManagerLocal subjectManager = LookupUtil.getSubjectManager();
+ Subject overlord = subjectManager.getOverlord();
+ RepoCriteria repoCriteria = new RepoCriteria();
+ repoCriteria.addFilterContentSourceIds(contentSource.getId());
+ repoCriteria.addFilterCandidate(false);
+ RepoManagerLocal repoManager = LookupUtil.getRepoManagerLocal();
+ PageList<Repo> repos = repoManager.findReposByCriteria(overlord,
repoCriteria);
+ Integer[] repoIds = new Integer[repos.size()];
+ for (int i = 0; i < repos.size(); i++) {
+ Repo repo = repos.get(i);
+ repoIds[i] = repo.getId();
+ }
+ repoManager.internalSynchronizeRepos(overlord, repoIds);
+ }
+
/**
* This will synchronize the identified content source such that its package version
information is updated and, if
* not lazy-loading, its package bits are downloaded.
@@ -109,12 +135,12 @@ public class ContentProviderSyncJob implements StatefulJob {
* potentially very long running (on the order of hours potentially). We do our
processing in here with this in
* mind. We make sure we never do any one thing that potentially could timeout a
transaction.</p>
*
- * @param contentSourceName name of the {@link ContentSource}
- * @param contentSourceTypeName name of the {@link ContentSourceType}
+ * @param contentSourceName name of the {@link
org.rhq.core.domain.content.ContentSource}
+ * @param contentSourceTypeName name of the {@link
org.rhq.core.domain.content.ContentSourceType}
*
* @throws Exception if either the sync failed or one of the packages failed to
download
*/
- private void synchronizeAndLoad(String contentSourceName, String
contentSourceTypeName) throws Exception {
+ private ContentSource synchronizeAndLoad(String contentSourceName, String
contentSourceTypeName) throws Exception {
// note that we will keep calling getOverlord on this subject manager - the
overlord
// has a very short session lifespan so we need to keep asking for a new one, due
to the possibility
// that some of the methods we call here take longer than the overlord's
lifespan
@@ -142,6 +168,8 @@ public class ContentProviderSyncJob implements StatefulJob {
log.info("Content source [" + contentSourceName + "] is
currently being synchronized already. "
+ "Please wait for the current sync job to finish.");
}
+
+ return contentSource;
}
/**
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/RepoSyncJob.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/RepoSyncJob.java
index 4d0ad10..9df8c74 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/RepoSyncJob.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/RepoSyncJob.java
@@ -195,6 +195,7 @@ public class RepoSyncJob implements StatefulJob, InterruptableJob {
* @throws Exception if there is an error in the sync
*/
private void sync(String repoName) throws InterruptedException {
+ log.debug("Syncing repo [" + repoName + "]...");
SubjectManagerLocal subjectManager = LookupUtil.getSubjectManager();
RepoManagerLocal repoManager = LookupUtil.getRepoManagerLocal();
diff --git
a/modules/enterprise/server/plugins/jboss-software/src/main/java/org/rhq/enterprise/server/plugins/jboss/software/HtmlUtility.java
b/modules/enterprise/server/plugins/jboss-software/src/main/java/org/rhq/enterprise/server/plugins/jboss/software/HtmlUtility.java
new file mode 100644
index 0000000..b3ae50a
--- /dev/null
+++
b/modules/enterprise/server/plugins/jboss-software/src/main/java/org/rhq/enterprise/server/plugins/jboss/software/HtmlUtility.java
@@ -0,0 +1,103 @@
+package org.rhq.enterprise.server.plugins.jboss.software;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author Ian Springer
+ */
+public class HtmlUtility {
+ private static final Map<String, Character> ENTITY_TO_CHAR_MAP = new
HashMap<String, Character>();
+
+ static {
+ ENTITY_TO_CHAR_MAP.put("<", '<');
+ ENTITY_TO_CHAR_MAP.put(">", '>');
+ ENTITY_TO_CHAR_MAP.put("&", '&');
+ ENTITY_TO_CHAR_MAP.put(""", '"');
+ ENTITY_TO_CHAR_MAP.put("à", 'à');
+ ENTITY_TO_CHAR_MAP.put("À", 'À');
+ ENTITY_TO_CHAR_MAP.put("â", 'â');
+ ENTITY_TO_CHAR_MAP.put("ä", 'ä');
+ ENTITY_TO_CHAR_MAP.put("Ä", 'Ä');
+ ENTITY_TO_CHAR_MAP.put("Â", 'Â');
+ ENTITY_TO_CHAR_MAP.put("å", 'å');
+ ENTITY_TO_CHAR_MAP.put("Å", 'Å');
+ ENTITY_TO_CHAR_MAP.put("æ", 'æ');
+ ENTITY_TO_CHAR_MAP.put("Æ", 'Æ');
+ ENTITY_TO_CHAR_MAP.put("ç", 'ç');
+ ENTITY_TO_CHAR_MAP.put("Ç", 'Ç');
+ ENTITY_TO_CHAR_MAP.put("é", 'é');
+ ENTITY_TO_CHAR_MAP.put("É", 'É');
+ ENTITY_TO_CHAR_MAP.put("è", 'è');
+ ENTITY_TO_CHAR_MAP.put("È", 'È');
+ ENTITY_TO_CHAR_MAP.put("ê", 'ê');
+ ENTITY_TO_CHAR_MAP.put("Ê", 'Ê');
+ ENTITY_TO_CHAR_MAP.put("ë", 'ë');
+ ENTITY_TO_CHAR_MAP.put("Ë", 'Ë');
+ ENTITY_TO_CHAR_MAP.put("ï", 'ï');
+ ENTITY_TO_CHAR_MAP.put("Ï", 'Ï');
+ ENTITY_TO_CHAR_MAP.put("ô", 'ô');
+ ENTITY_TO_CHAR_MAP.put("Ô", 'Ô');
+ ENTITY_TO_CHAR_MAP.put("ö", 'ö');
+ ENTITY_TO_CHAR_MAP.put("Ö", 'Ö');
+ ENTITY_TO_CHAR_MAP.put("ø", 'ø');
+ ENTITY_TO_CHAR_MAP.put("Ø", 'Ø');
+ ENTITY_TO_CHAR_MAP.put("ß", 'ß');
+ ENTITY_TO_CHAR_MAP.put("ù", 'ù');
+ ENTITY_TO_CHAR_MAP.put("Ù", 'Ù');
+ ENTITY_TO_CHAR_MAP.put("û", 'û');
+ ENTITY_TO_CHAR_MAP.put("Û", 'Û');
+ ENTITY_TO_CHAR_MAP.put("ü", 'ü');
+ ENTITY_TO_CHAR_MAP.put("Ü", 'Ü');
+ ENTITY_TO_CHAR_MAP.put(" ", ' ');
+ ENTITY_TO_CHAR_MAP.put("®", '\u00a9');
+ ENTITY_TO_CHAR_MAP.put("©", '\u00ae');
+ ENTITY_TO_CHAR_MAP.put("€", '\u20a0');
+ }
+
+ public static String unescapeHTML(String string) {
+ if (string == null) {
+ return null;
+ }
+ if (string.length() < 4) {
+ // This is an optimization, since we know that no entities are less than 4
characters in length
+ // (< and > are the shortest ones).
+ return string;
+ }
+
+ StringBuilder unescapedString = new StringBuilder((int) (string.length() *
1.1));
+ int index = 0;
+ while (index < string.length()) {
+ int ampersandIndex = string.indexOf("&", index);
+ if (ampersandIndex >= 0 && ampersandIndex < (string.length() -
3)) {
+ int semicolonIndex = string.indexOf(";", ampersandIndex + 1);
+ if (semicolonIndex >= 0) {
+ // Found an entity - see if it's one we grok.
+ String entity = string.substring(ampersandIndex, semicolonIndex +
1);
+ Character c = ENTITY_TO_CHAR_MAP.get(entity);
+ if (c != null) {
+ // If we were able to map the entity, append the unescaped
character.
+ unescapedString.append(c);
+ } else {
+ // Otherwise, append the unknown entity as is.
+ unescapedString.append(entity);
+ }
+ // Append the substring from the index up to but not including the
ampersand.
+ unescapedString.append(string.substring(index, ampersandIndex));
+ index = semicolonIndex + 1;
+ } else {
+ // No semicolon found - not an entity. Append the substring from the
index up to and including the
+ // ampersand.
+ unescapedString.append(string.substring(index, ampersandIndex + 1));
+ index = ampersandIndex + 1;
+ }
+ } else {
+ // No more entities in the string - append the rest of the original
string.
+ unescapedString.append(string.substring(index));
+ index = string.length();
+ }
+ }
+
+ return unescapedString.toString();
+ }
+}
diff --git
a/modules/enterprise/server/plugins/jboss-software/src/main/java/org/rhq/enterprise/server/plugins/jboss/software/JBossSoftwareContentSourceAdapter.java
b/modules/enterprise/server/plugins/jboss-software/src/main/java/org/rhq/enterprise/server/plugins/jboss/software/JBossSoftwareContentSourceAdapter.java
index 7f065da..788961e 100644
---
a/modules/enterprise/server/plugins/jboss-software/src/main/java/org/rhq/enterprise/server/plugins/jboss/software/JBossSoftwareContentSourceAdapter.java
+++
b/modules/enterprise/server/plugins/jboss-software/src/main/java/org/rhq/enterprise/server/plugins/jboss/software/JBossSoftwareContentSourceAdapter.java
@@ -111,9 +111,9 @@ public class JBossSoftwareContentSourceAdapter implements
ContentProvider, Packa
public void testConnection() throws Exception {
if (!active)
- throw new Exception("Content source is NOT set to active, connection
cannot be established.");
+ throw new Exception("Content source is NOT set to active - connection
cannot be established.");
- // If there is an error in the connection, this call will throw an exception
describing it
+ // If there is an error in the connection, this call will throw an exception
describing it.
retrieveRssDocument();
}
@@ -135,8 +135,8 @@ public class JBossSoftwareContentSourceAdapter implements
ContentProvider, Packa
try {
parser.parseResults(rssDocument, report, existingPackages);
- } catch (ParserConfigurationException e) {
- throw new SyncException("error parsing results.", e);
+ } catch (Exception e) {
+ throw new SyncException("Error parsing RSS document.", e);
}
}
@@ -220,7 +220,7 @@ public class JBossSoftwareContentSourceAdapter implements
ContentProvider, Packa
if (status == 404) {
throw new SyncException("Could not find the feed at URL [" +
url
- + "]. Make sure the URL field correctly " + "refers to
the CSP feed location.");
+ + "]. Make sure the URL field correctly refers to the CSP feed
location.");
}
if (status == 401 || status == 403) {
@@ -237,7 +237,7 @@ public class JBossSoftwareContentSourceAdapter implements
ContentProvider, Packa
method.releaseConnection();
}
- // Parse the raw feed into chuchill domain objects
+ // Parse the raw feed into churchill domain objects
RssDocument parsedFeed = null;
if (rawFeed != null) {
parsedFeed = RssParser.parseRss(rawFeed);
diff --git
a/modules/enterprise/server/plugins/jboss-software/src/main/java/org/rhq/enterprise/server/plugins/jboss/software/RssFeedParser.java
b/modules/enterprise/server/plugins/jboss-software/src/main/java/org/rhq/enterprise/server/plugins/jboss/software/RssFeedParser.java
index c65a7b9..5fb03b2 100644
---
a/modules/enterprise/server/plugins/jboss-software/src/main/java/org/rhq/enterprise/server/plugins/jboss/software/RssFeedParser.java
+++
b/modules/enterprise/server/plugins/jboss-software/src/main/java/org/rhq/enterprise/server/plugins/jboss/software/RssFeedParser.java
@@ -56,29 +56,29 @@ import org.rhq.enterprise.server.plugin.pc.content.PackageSyncReport;
public class RssFeedParser {
// Constants --------------------------------------------
- public static final String JBOSS_AS4_PLUGIN_NAME = "JBossAS";
- public static final String JBOSS_AS5_PLUGIN_NAME = "JBossAS5";
+ private static final String JBOSS_AS4_PLUGIN_NAME = "JBossAS";
+ private static final String JBOSS_AS5_PLUGIN_NAME = "JBossAS5";
- public static final String ARCHITECTURE = "noarch";
+ private static final String ARCHITECTURE = "noarch";
/**
- * Corresponds to the resource type name defined in the JBoss AS plugin.
+ * Corresponds to the resource type name defined in the JBossAS or JBossAS5 plugin.
*/
- public static final String RESOURCE_TYPE_JBOSS_AS = "JBossAS Server";
+ private static final String RESOURCE_TYPE_JBOSS_AS = "JBossAS Server";
/**
* Corresponds to the package type name defined in the JBoss AS plugin.
*/
- public static final String PACKAGE_TYPE_CUMULATIVE_PATCH =
"cumulativePatch";
+ private static final String PACKAGE_TYPE_CUMULATIVE_PATCH =
"cumulativePatch";
- public static final String RSS_SOFTWARE_TYPE_BUGFIX = "BUGFIX";
- public static final String RSS_SOFTWARE_TYPE_SECURITY = "SECURITY";
- public static final String RSS_SOFTWARE_TYPE_ENHANCEMENT = "ENHANCEMENT";
- public static final String RSS_SOFTWARE_TYPE_DISTRIBUTION =
"DISTRIBUTION";
+ private static final String RSS_SOFTWARE_TYPE_BUGFIX = "BUGFIX";
+ private static final String RSS_SOFTWARE_TYPE_SECURITY = "SECURITY";
+ private static final String RSS_SOFTWARE_TYPE_ENHANCEMENT = "ENHANCEMENT";
+ private static final String RSS_SOFTWARE_TYPE_DISTRIBUTION =
"DISTRIBUTION";
- public static final String DIST_STATUS_AVAILABLE = "AVAILABLE";
- public static final String DIST_STATUS_OBSOLETE = "OBSOLETE";
- public static final String DIST_STATUS_REMOVED = "REMOVED";
+ private static final String DIST_STATUS_AVAILABLE = "AVAILABLE";
+ private static final String DIST_STATUS_OBSOLETE = "OBSOLETE";
+ private static final String DIST_STATUS_REMOVED = "REMOVED";
// Attributes --------------------------------------------
@@ -104,10 +104,10 @@ public class RssFeedParser {
while (repos.hasMoreElements()) {
RssChannel repo = (RssChannel) repos.nextElement();
- Enumeration repotems = repo.items();
+ Enumeration repoItems = repo.items();
- while (repotems.hasMoreElements()) {
- RssChannelItem item = (RssChannelItem) repotems.nextElement();
+ while (repoItems.hasMoreElements()) {
+ RssChannelItem item = (RssChannelItem) repoItems.nextElement();
RssJbnPatch patch = item.getJbnPatch();
RssDublinCore dublinCore = item.getDublinCore();
@@ -199,9 +199,9 @@ public class RssFeedParser {
try {
Document document = builder.parse(new
ByteArrayInputStream(instructions.getBytes()));
String choppedInstructions =
xpath.evaluate(instructionExpression, document);
- // the jbpm xml processor doesn't like whitespace at the
beginning, so trim it
- // bytes will be retrieved using platform encoding on the
agent side so use the same
- // on the server side and assume they are identical
+ // The JBPM XML processor doesn't like whitespace at the
beginning, so trim it.
+ // Bytes will be retrieved using platform encoding on the
agent side, so use the same
+ // on the server side and assume they are identical.
packageDetails.setMetadata(choppedInstructions.trim().getBytes());
} catch (Exception e) {
log.error("Could not parse or set automated installation
instructions for package: "
@@ -212,13 +212,13 @@ public class RssFeedParser {
packageDetails.setExtraProperties(extraProperties);
- // For each product listed for the patch, add an entry for its
resource version
+ // For each product listed for the patch, add an entry for its
resource version.
for (Object productObj : products) {
RssJbnDependency product = (RssJbnDependency) productObj;
// The CSP feed will include an optional JON version that maps up
to how the resource
- // version will be identified by (now RHQ). If this is specified,
we'll want to use
- // the mapped version instead
+ // version will be identified by RHQ. If this is specified,
we'll want to use the mapped
+ // version instead.
String productVersion = product.getJonResourceVersion();
if (product.getProductVersion().equals("4.0.4")) {
commit eb64c175e4653e92bb2d0128ec5abf930377c1a6
Merge: 4af7705... 79f695f...
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Mon Mar 22 16:20:01 2010 -0400
Merge branch 'bugfixes'
commit 79f695ff4458919a8d6099a7fe6ba94518271d2a
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Fri Mar 19 14:37:34 2010 -0400
add id's to executions, so we will be able to override those executions in
descendant poms
(cherry picked from commit 8f9b19320ccf5fb32b1c572f4d7d8c7d8a184a65)
diff --git a/pom.xml b/pom.xml
index 0574c8e..6ab5dd6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -531,9 +531,8 @@
</plugins>
</pluginManagement>
- <plugins>
-
+ <plugins>
<!-- Set the 'maven.version' property to the version of Maven being
used,
so we can include the Maven version in the MANIFEST.MF files of all
@@ -614,8 +613,9 @@
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
- <executions>
+ <executions>
<execution>
+ <id>read-build-properties</id>
<phase>process-resources</phase>
<goals>
<goal>read-project-properties</goal>
commit 4af7705cf5e243aa8294820984df3bd8f8af9652
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon Mar 22 15:21:14 2010 +0100
BZ 571885 - If no notification templaes are defined, tell the user so and don't
bomb out.
diff --git
a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/alert/viewAlert.xhtml
b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/alert/viewAlert.xhtml
index eec04d4..1c42245 100644
---
a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/alert/viewAlert.xhtml
+++
b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/resource/alert/viewAlert.xhtml
@@ -225,6 +225,7 @@
<h:form id="newNotificationsFromTemplateForm">
<input type="hidden" name="ad"
value="${param.ad}"/>
+ <rich:panel
rendered="#{definitionNotificationsUIBean.notificationTemplates.size >
0}">
<div>
<h:selectOneMenu id="templateList"
value="#{definitionNotificationsUIBean.selectedTemplate}">
<f:selectItems
value="#{definitionNotificationsUIBean.notificationTemplates}"/>
@@ -243,11 +244,18 @@
styleClass="buttonmed"
style="margin-top: auto;">
</h:commandButton>
+ </rich:panel>
+
+ <rich:panel
rendered="#{definitionNotificationsUIBean.notificationTemplates.size == 0}">
+ No Alert Notification Templates have been defined
yet.<br/>
+ Please create some in Administration -> System Configuration
-> AlertNotification Templates
+ </rich:panel>
<h:outputLink id="alertTemplateCancelLink"
styleClass="buttonmed" value="#" style="float: right; margin:
10px;">
<h:outputText value="Cancel" />
<rich:componentControl
for="addAlertFromTemplatePanel" attachTo="alertTemplateCancelLink"
operation="hide" event="onclick" />
</h:outputLink>
+
</h:form>
</rich:modalPanel>
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertNotificationManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertNotificationManagerBean.java
index 15bf999..c8f66d0 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertNotificationManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertNotificationManagerBean.java
@@ -384,7 +384,8 @@ public class AlertNotificationManagerBean implements
AlertNotificationManagerLoc
try {
template = (NotificationTemplate) q.getSingleResult();
} catch (NoResultException nre) {
- throw new IllegalArgumentException("There is no template with name
'" + templateName +"'");
+ LOG.info("There is no alert notification template with name '"
+ templateName +"'");
+ template = new NotificationTemplate("dummy",null);
}
return template;
}
commit c3012c76bb86e12f72eba142b29570ceab05b4c1
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon Mar 22 14:36:36 2010 +0100
BZ 571911 - Fix acknowledge on the subsystem page.
diff --git
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/alert/ListAlertHistoryUIBean.java
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/alert/ListAlertHistoryUIBean.java
index 0b6023a..def7220 100644
---
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/alert/ListAlertHistoryUIBean.java
+++
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/alert/ListAlertHistoryUIBean.java
@@ -179,7 +179,7 @@ public class ListAlertHistoryUIBean extends PagedDataTableUIBean {
Integer[] alertIds = StringUtility.getIntegerArray(selectedAlerts);
try {
- int num = alertManager.acknowledgeAlerts(subject,resource.getId(),alertIds);
+ int num = alertManager.acknowledgeAlerts(subject, alertIds);
if (num==-1)
FacesContextUtility.addMessage(FacesMessage.SEVERITY_WARN,"No Alerts
passed to ack");
else
diff --git
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/subsystem/SubsystemAlertHistoryUIBean.java
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/subsystem/SubsystemAlertHistoryUIBean.java
index 0ad0c7a..b1db3e8 100644
---
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/subsystem/SubsystemAlertHistoryUIBean.java
+++
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/subsystem/SubsystemAlertHistoryUIBean.java
@@ -67,12 +67,12 @@ public class SubsystemAlertHistoryUIBean extends SubsystemView {
private SelectItem[] categoryFilterItems;
private static final IntExtractor<AlertHistoryComposite> RESOURCE_ID_EXTRACTOR
= new IntExtractor<AlertHistoryComposite>() {
-
+
public int extract(AlertHistoryComposite object) {
return object.getAlert().getAlertDefinition().getResource().getId();
}
};
-
+
public SubsystemAlertHistoryUIBean() {
datePattern =
EnterpriseFacesContextUtility.getWebUser().getWebPreferences().getDateTimeDisplayPreferences()
.getDateTimeFormatTrigger();
@@ -158,12 +158,11 @@ public class SubsystemAlertHistoryUIBean extends SubsystemView {
public String acknowledgeSelectedAlerts() {
Subject subject = EnterpriseFacesContextUtility.getSubject();
- Resource resource = EnterpriseFacesContextUtility.getResource();
AlertManagerLocal alertManager = LookupUtil.getAlertManager();
try {
Integer[] selectedItems = getSelectedItems();
- int num = alertManager.acknowledgeAlerts(subject,resource.getId(),
selectedItems);
+ int num = alertManager.acknowledgeAlerts(subject, selectedItems);
if (num==-1)
FacesContextUtility.addMessage(FacesMessage.SEVERITY_WARN,"No Alerts
passed to ack");
else
@@ -243,7 +242,7 @@ public class SubsystemAlertHistoryUIBean extends SubsystemView {
protected IntExtractor<AlertHistoryComposite> getResourceIdExtractor() {
return RESOURCE_ID_EXTRACTOR;
}
-
+
private void getDataFromRequest() {
SubsystemAlertHistoryUIBean outer = SubsystemAlertHistoryUIBean.this;
outer.resourceFilter =
FacesContextUtility.getOptionalRequestParameter(FORM_PREFIX +
"resourceFilter");
diff --git
a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/subsystem/alertHistory.xhtml
b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/subsystem/alertHistory.xhtml
index bf591c4..1f81df9 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/subsystem/alertHistory.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/subsystem/alertHistory.xhtml
@@ -200,7 +200,7 @@
value="PURGE ALL"
styleClass="on-pager-button buttonsmall"
rendered="#{GlobalPermissionsUIBean.superuser}" />
<onc:selectCommandButton
action="#{SubsystemAlertHistoryUIBean.acknowledgeSelectedAlerts}"
- value="ACKNOWLEDGE SELECTED"
target="selectedAlerts" styleClass="on-pager-button buttonsmall"
+ value="ACKNOWLEDGE SELECTED"
target="selectedItems" styleClass="on-pager-button buttonsmall"
rendered="#{GlobalPermissionsUIBean.superuser}" />
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java
index 0f48f9e..322a93c 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerBean.java
@@ -566,14 +566,12 @@ public class AlertManagerBean implements AlertManagerLocal,
AlertManagerRemote {
* Acknowledge the alerts (that got fired) so that admins know who is working
* on fixing the situation.
* @param user calling user
- * @param resourceId resource the alerts happened on
* @param alertIds PKs of the alerts to ack
* @return number of alerts acknowledged
*/
- public int acknowledgeAlerts(Subject user, int resourceId, Integer[] alertIds) {
- if (!authorizationManager.hasResourcePermission(user, Permission.MANAGE_ALERTS,
resourceId)) {
- throw new PermissionException("User [" + user.getName() + "]
does not have permissions to acknowledge alerts "
- + "for resourceId=" + resourceId);
+ public int acknowledgeAlerts(Subject user, Integer[] alertIds) {
+ if (!authorizationManager.hasGlobalPermission(user, Permission.MANAGE_ALERTS)) {
+ throw new PermissionException("User [" + user.getName() + "]
does not have permissions to acknowledge alerts ");
}
int i=0;
@@ -585,8 +583,11 @@ public class AlertManagerBean implements AlertManagerLocal,
AlertManagerRemote {
for (int id : alertIds) {
acknowledgeAlert(id,user);
i++;
- if (i %20 == 0)
+ if (i % 50 == 0) {
entityManager.flush();
+ entityManager.clear();
+ }
+
}
return i;
}
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerLocal.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerLocal.java
index e482ffa..46e4b8e 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerLocal.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertManagerLocal.java
@@ -122,11 +122,10 @@ public interface AlertManagerLocal {
* Acknowledge the alerts (that got fired) so that admins know who is working
* on fixing the situation.
* @param user calling user
- * @param resourceId resource the alerts happened on
* @param alertIds PKs of the alerts to ack
* @return number of alerts acknowledged
*/
- int acknowledgeAlerts(Subject user, int resourceId, Integer[] alertIds);
+ int acknowledgeAlerts(Subject user, Integer[] alertIds);
/**
* Remove the alerts with the specified id's.
commit d0ac8f88594f6fab62ac3ade64cd278c07c38c48
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Mon Mar 22 12:13:36 2010 +0100
BZ 571968 - refresh list of templates after delete
diff --git
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/alert/NotificationTemplatesUIBean.java
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/alert/NotificationTemplatesUIBean.java
index 19bc895..f384e3f 100644
---
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/alert/NotificationTemplatesUIBean.java
+++
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/alert/NotificationTemplatesUIBean.java
@@ -148,6 +148,9 @@ public class NotificationTemplatesUIBean implements Serializable {
String summary = getDeletionSummary(numDeleted);
FacesContextUtility.addMessage(FacesMessage.SEVERITY_INFO, summary);
+ // Re-get the list of still existing templates
+ this.notificationTemplates =
alertNotificationManager.listNotificationTemplates(this.subject);
+
return null;
}
commit d49f3d1ce688cdfff563a1f78c66b1a516b8ccc3
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Fri Mar 19 15:10:45 2010 -0400
...
diff --git a/pom.xml b/pom.xml
index 1a21ab1..054740c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -587,7 +587,7 @@
</executions>
</plugin>
- <plugin>
+ <plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<executions>
@@ -608,7 +608,7 @@
</configuration>
</execution>
</executions>
- </plugin>
+ </plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
commit 8f9b19320ccf5fb32b1c572f4d7d8c7d8a184a65
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Fri Mar 19 14:37:34 2010 -0400
add id's to executions, so we will be able to override those executions in
descendant poms
diff --git a/pom.xml b/pom.xml
index e2cc42b..1a21ab1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -531,9 +531,8 @@
</plugins>
</pluginManagement>
- <plugins>
-
+ <plugins>
<!-- Set the 'maven.version' property to the version of Maven being
used,
so we can include the Maven version in the MANIFEST.MF files of all
@@ -614,8 +613,9 @@
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
- <executions>
+ <executions>
<execution>
+ <id>read-build-properties</id>
<phase>process-resources</phase>
<goals>
<goal>read-project-properties</goal>
commit 02f669162cdd6204c1fca900a76633ca2893ae8d
Merge: 6114257... eb23f6f...
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Fri Mar 19 13:50:56 2010 -0400
Merge branch 'master' of
ssh://git.fedorahosted.org/git/rhq/rhq
commit 6114257b990eaebd93ab552ae6ea621415099dbe
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Thu Mar 18 18:31:34 2010 -0400
fix content source sync so status of successfully completed requests gets flipped from
INPROGRESS to SUCCESS; also improve results message for sync requests
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java
index ab2fad2..4e078aa 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java
@@ -394,8 +394,8 @@ public class RepoManagerBean implements RepoManagerLocal,
RepoManagerRemote {
// Import groups first
List<RepoGroupDetails> repoGroups = report.getRepoGroups();
- int repoGroupCounter = 0;
+ List<RepoGroupDetails> importedRepoGroups = new
ArrayList<RepoGroupDetails>();
for (RepoGroupDetails createMe : repoGroups) {
String name = createMe.getName();
@@ -411,7 +411,7 @@ public class RepoManagerBean implements RepoManagerLocal,
RepoManagerRemote {
// but be sure to mention it to the report
try {
createRepoGroup(subject, existingGroup);
- repoGroupCounter++;
+ importedRepoGroups.add(createMe);
} catch (RepoException e) {
if (e.getType() ==
RepoException.RepoExceptionType.NAME_ALREADY_EXISTS) {
@@ -424,7 +424,13 @@ public class RepoManagerBean implements RepoManagerLocal,
RepoManagerRemote {
}
}
}
- result.append("Imported [").append(repoGroupCounter).append("]
repo groups.").append('\n');
+
+ if (importedRepoGroups.isEmpty()) {
+ result.append("There are new repo groups since the last time this
content source was synchronized.\n");
+ } else {
+ result.append("Imported the following
[").append(importedRepoGroups.size()).append("] repo group(s): ").
+ append(importedRepoGroups).append('\n');
+ }
// Hold on to all current candidate repos for the content provider. If any were
not present in this
// report, remove them from the system (the rationale being, the content provider
no longer knows
@@ -437,19 +443,18 @@ public class RepoManagerBean implements RepoManagerLocal,
RepoManagerRemote {
// Once the groups are in the system, import any repos that were added
List<RepoDetails> repos = report.getRepos();
- int repoCounter = 0;
// First add repos that have no parent. We later add repos with a parent
afterwards to prevent
// issues where both the parent and child are specified in this report.
+ List<RepoDetails> importedRepos = new ArrayList<RepoDetails>();
for (RepoDetails createMe : repos) {
-
if (createMe.getParentRepoName() == null) {
try {
- addCandidateRepo(contentSourceId, createMe);
+ if (addCandidateRepo(contentSourceId, createMe)) {
+ importedRepos.add(createMe);
+ }
removeRepoFromList(createMe.getName(), candidatesForThisProvider);
- repoCounter++;
} catch (Exception e) {
-
if (e instanceof RepoException
&& ((RepoException) e).getType() ==
RepoException.RepoExceptionType.NAME_ALREADY_EXISTS) {
result.append("Skipping addition of existing repo
[").append(createMe.getName()).append("]")
@@ -466,12 +471,12 @@ public class RepoManagerBean implements RepoManagerLocal,
RepoManagerRemote {
// Take a second pass through the list checking for any repos that were created
to be
// a child of another repo.
for (RepoDetails createMe : repos) {
-
if (createMe.getParentRepoName() != null) {
try {
- addCandidateRepo(contentSourceId, createMe);
- removeRepoFromList(createMe.getName(), candidatesForThisProvider);
- repoCounter++;
+ if (addCandidateRepo(contentSourceId, createMe)) {
+ importedRepos.add(createMe);
+ }
+ removeRepoFromList(createMe.getName(), candidatesForThisProvider);
} catch (Exception e) {
log.error("Error processing repo [" + createMe +
"]", e);
result.append("Could not add repo
[").append(createMe.getName()).append(
@@ -480,7 +485,12 @@ public class RepoManagerBean implements RepoManagerLocal,
RepoManagerRemote {
}
}
- result.append("Imported [").append(repoCounter).append("]
repos.").append('\n');
+ if (importedRepos.isEmpty()) {
+ result.append("There are new repos since the last time this content
source was synchronized.\n");
+ } else {
+ result.append("Imported the following
").append(importedRepos.size()).append(" repo(s): ").
+ append(importedRepos).append('\n');
+ }
// Any repos that haven't been removed from candidatesForThisProvider were
not returned in this
// report, so remove them from the database.
@@ -500,7 +510,7 @@ public class RepoManagerBean implements RepoManagerLocal,
RepoManagerRemote {
}
if (!repo.isCandidate()) {
- throw new RepoException("Unable to import repo, repo is already
imported. ID: " + repoId);
+ throw new RepoException("Unable to import repo - repo is already
imported. ID: " + repoId);
}
repo.setCandidate(false);
@@ -865,7 +875,7 @@ public class RepoManagerBean implements RepoManagerLocal,
RepoManagerRemote {
* @throws Exception if there is an error associating the content source with the
repo or if the repo
* indicates a parent or repo group that does not exist
*/
- private void addCandidateRepo(int contentSourceId, RepoDetails createMe) throws
Exception {
+ private boolean addCandidateRepo(int contentSourceId, RepoDetails createMe) throws
Exception {
Subject overlord = subjectManager.getOverlord();
String name = createMe.getName();
@@ -874,7 +884,7 @@ public class RepoManagerBean implements RepoManagerLocal,
RepoManagerRemote {
// If the repo doesn't exist, create it.
if (existingRepo.size() != 0) {
- return;
+ return false;
}
// Create and populate the repo
@@ -908,6 +918,8 @@ public class RepoManagerBean implements RepoManagerLocal,
RepoManagerRemote {
addRepoRelationship(overlord, addMe.getId(), parent.getId(),
PARENT_RELATIONSHIP_NAME);
}
}
+
+ return true;
}
private void removeRepoFromList(String repoName, List<Repo> repoList) {
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManager.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManager.java
index 21fac03..c486873 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManager.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/ContentProviderManager.java
@@ -186,7 +186,6 @@ public class ContentProviderManager {
results = new ContentSourceSyncResults(contentSource);
results.setResults(progress.toString());
results = contentSourceManager.persistContentSourceSyncResults(results);
-
}
if (results == null) {
@@ -202,12 +201,15 @@ public class ContentProviderManager {
// one sync will get an error and rollback its tx and no harm
// will be done.
log.info("Content provider [" + contentSource.getName()
- + "] is already currently being synchronized, this sync request
will be ignored");
+ + "] is already currently being synchronized - this sync request
will be ignored.");
return false;
}
RepoSourceSynchronizer repoSourceSynchronizer = new
RepoSourceSynchronizer(contentSource, provider);
repoSourceSynchronizer.synchronizeCandidateRepos(progress);
+ results.setStatus(ContentSyncStatus.SUCCESS);
+ results.setResults(progress.toString());
+
} catch (Throwable t) {
if (results != null) {
// try to reload the results in case it was updated by the SLSB
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/RepoDetails.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/RepoDetails.java
index 3ac75db..d277579 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/RepoDetails.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/RepoDetails.java
@@ -1,6 +1,6 @@
/*
* RHQ Management Platform
-* Copyright (C) 2005-2008 Red Hat, Inc.
+* Copyright (C) 2005-2010 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
@@ -127,4 +127,15 @@ public class RepoDetails {
public void setRepoGroup(String repoGroup) {
this.repoGroup = repoGroup;
}
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("RepoDetails[");
+ sb.append("name='").append(this.name).append('\'');
+ sb.append(",
parentRepoName='").append(this.parentRepoName).append('\'');
+ sb.append(",
repoGroup='").append(this.repoGroup).append('\'');
+ sb.append(']');
+ return sb.toString();
+ }
}
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/RepoGroupDetails.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/RepoGroupDetails.java
index 502cdea..5ae72e1 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/RepoGroupDetails.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/RepoGroupDetails.java
@@ -101,4 +101,14 @@ public class RepoGroupDetails {
public void setDescription(String description) {
this.description = description;
}
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("RepoGroupDetails[");
+ sb.append("name='").append(this.name).append('\'');
+ sb.append(",
typeName='").append(this.typeName).append('\'');
+ sb.append(']');
+ return sb.toString();
+ }
}
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/RepoSourceSynchronizer.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/RepoSourceSynchronizer.java
index 5f801ab..6edf1f9 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/RepoSourceSynchronizer.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/sync/RepoSourceSynchronizer.java
@@ -67,7 +67,7 @@ public class RepoSourceSynchronizer {
}
progress.append(new Date()).append(": ");
- progress.append("Asking content provider for repositories to
import...");
+ progress.append("Asking content provider for new repositories to
import...\n");
RepoSource repoSource = (RepoSource) provider;
diff --git
a/modules/enterprise/server/plugins/jboss-software/src/main/java/org/rhq/enterprise/server/plugins/jboss/software/JBossSoftwareContentSourceAdapter.java
b/modules/enterprise/server/plugins/jboss-software/src/main/java/org/rhq/enterprise/server/plugins/jboss/software/JBossSoftwareContentSourceAdapter.java
index 967fbcf..7f065da 100644
---
a/modules/enterprise/server/plugins/jboss-software/src/main/java/org/rhq/enterprise/server/plugins/jboss/software/JBossSoftwareContentSourceAdapter.java
+++
b/modules/enterprise/server/plugins/jboss-software/src/main/java/org/rhq/enterprise/server/plugins/jboss/software/JBossSoftwareContentSourceAdapter.java
@@ -126,7 +126,7 @@ public class JBossSoftwareContentSourceAdapter implements
ContentProvider, Packa
try {
rssDocument = retrieveRssDocument();
} catch (Exception e) {
- throw new SyncException("Error retrieving rss doc", e);
+ throw new SyncException("Error retrieving RSS document.", e);
}
if (rssDocument == null) {
commit eb23f6fb9a557cb23069ae103a25905bdab5370b
Author: Filip Drabek <fdrabek(a)dhcp-lab-136.englab.brq.redhat.com>
Date: Thu Mar 18 22:27:23 2010 +0100
BZ - 535792 JBossCache plugin throws parsing error while checking configuration.
diff --git
a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/util/DeploymentUtility.java
b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/util/DeploymentUtility.java
index 242084b..60d2467 100644
---
a/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/util/DeploymentUtility.java
+++
b/modules/plugins/jboss-as/src/main/java/org/rhq/plugins/jbossas/util/DeploymentUtility.java
@@ -145,7 +145,7 @@ public class DeploymentUtility {
// this is the deployment descriptor file that we are currently
examining;
// this is what will be returned if the MBean was configured in this
file.
- String file = i.eval("sdi.url").toString();
+ String file = i.eval("sdi.watch").toString();
if (file.startsWith("file:/")) {
file = file.substring(5);
commit 99156a79b26d6c43951ee4b1b596b6efc5b268bc
Author: Joseph Marques <joseph(a)redhat.com>
Date: Thu Mar 18 14:37:15 2010 -0400
search assist has not been written for resource groups yet, disable for now
diff --git
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/browse/BrowseGroupsUIBean.java
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/browse/BrowseGroupsUIBean.java
index cd31a4d..5c39367 100644
---
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/browse/BrowseGroupsUIBean.java
+++
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/browse/BrowseGroupsUIBean.java
@@ -1,5 +1,6 @@
package org.rhq.enterprise.gui.inventory.browse;
+import java.util.ArrayList;
import java.util.List;
import javax.faces.model.DataModel;
@@ -10,7 +11,6 @@ import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.criteria.ResourceGroupCriteria;
import org.rhq.core.domain.resource.group.GroupCategory;
import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite;
-import org.rhq.core.domain.search.SearchSubsystem;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.gui.util.FacesContextUtility;
@@ -18,7 +18,6 @@ import org.rhq.enterprise.gui.common.framework.PagedDataTableUIBean;
import org.rhq.enterprise.gui.common.paging.PageControlView;
import org.rhq.enterprise.gui.common.paging.PagedListDataModel;
import org.rhq.enterprise.server.resource.group.ResourceGroupManagerLocal;
-import org.rhq.enterprise.server.search.execution.SearchAssistManager;
import org.rhq.enterprise.server.search.execution.SearchSuggestion;
import org.rhq.enterprise.server.util.LookupUtil;
@@ -86,13 +85,10 @@ public class BrowseGroupsUIBean extends PagedDataTableUIBean {
}
}
- SearchAssistManager searchAssist = new SearchAssistManager(SearchSubsystem.Group);
-
public List<SearchSuggestion> autocomplete(Object suggest) {
String currentInputText = (String) suggest;
- List<SearchSuggestion> suggestions =
searchAssist.getAdvancedSuggestions(currentInputText, currentInputText
- .length());
+ List<SearchSuggestion> suggestions = new
ArrayList<SearchSuggestion>();
// offer suggestions based on currentInputText
return suggestions;
diff --git
a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/inventory/browseGroups.xhtml
b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/inventory/browseGroups.xhtml
index 9d92183..65be544 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/inventory/browseGroups.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/inventory/browseGroups.xhtml
@@ -39,6 +39,7 @@
<h:inputText id="filter"
value="#{BrowseGroupsUIBean.filter}"
onkeypress="return ignoreEnterKey(event);"
style="width: 600px;" />
+ <ui:remove>
<rich:suggestionbox id="suggest" for="filter"
tokens=",[]"
width="600" height="400"
@@ -58,6 +59,7 @@
<h:outputText value="#{suggestItem.label}" />
</h:column>
</rich:suggestionbox>
+ </ui:remove>
<rich:spacer/>
<a4j:commandButton value="GO"
reRender="browseGroupsDataTable,
browseGroupsDataTableScroller"
commit d07e040c976d1493d4c5fae7cf70e76ed8c35273
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Thu Mar 18 13:51:22 2010 -0400
add support for discovering and managing JBoss EWP
(
https://jira.jboss.org/jira/browse/JBPAPP-3673)
(cherry picked from commit f988b4721041aefe74cff16ee0d0f5e6475cdf39)
diff --git
a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerDiscoveryComponent.java
b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerDiscoveryComponent.java
index 4c8e999..b02bd01 100644
---
a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerDiscoveryComponent.java
+++
b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/ApplicationServerDiscoveryComponent.java
@@ -85,11 +85,14 @@ public class ApplicationServerDiscoveryComponent implements
ResourceDiscoveryCom
static {
MINIMUM_PRODUCT_VERSIONS.put(JBossProductType.AS, new
ComparableVersion("5.2.0.Beta1"));
MINIMUM_PRODUCT_VERSIONS.put(JBossProductType.EAP, new
ComparableVersion("5.0.0.Beta"));
+ MINIMUM_PRODUCT_VERSIONS.put(JBossProductType.EWP, new
ComparableVersion("5.0.0.CR1"));
MINIMUM_PRODUCT_VERSIONS.put(JBossProductType.SOA, new
ComparableVersion("5.0.0.Beta"));
}
private static final String[] CLIENT_JARS = new String[] {
"client/jbossall-client.jar",
+ "client/trove.jar",
+ "client/javassist.jar",
"common/lib/jboss-security-aspects.jar",
"lib/jboss-managed.jar",
"lib/jboss-metatype.jar",
diff --git
a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/helper/JBossProductType.java
b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/helper/JBossProductType.java
index 6804195..024bc41 100644
---
a/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/helper/JBossProductType.java
+++
b/modules/plugins/jboss-as-5/src/main/java/org/rhq/plugins/jbossas5/helper/JBossProductType.java
@@ -1,6 +1,6 @@
/*
* Jopr Management Platform
-* Copyright (C) 2005-2009 Red Hat, Inc.
+* Copyright (C) 2005-2010 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
@@ -25,7 +25,7 @@ package org.rhq.plugins.jbossas5.helper;
import java.util.jar.Attributes;
/**
- * The product type of a JBoss application server installation - AS, EAP, or SOA.
+ * The product type of a JBoss 5.x/6.x application server installation - AS, EAP, EWP, or
SOA.
*
* @author Jessica Sant
* @author Ian Springer
@@ -33,6 +33,7 @@ import java.util.jar.Attributes;
public enum JBossProductType {
AS("JBoss AS", "JBoss Application Server", "default"),
// the public offering
EAP("JBoss EAP", "JBoss Enterprise Application Platform",
"default"), // the customer offering
+ EWP("JBoss EWP", "JBoss Enterprise Web Platform",
"default"), // the customer offering
SOA("JBoss SOA-P", "JBoss Enterprise SOA Platform",
"production"); // the customer SOA platform
public final String NAME;
@@ -40,6 +41,7 @@ public enum JBossProductType {
public final String DEFAULT_CONFIG_NAME;
private static final String EAP_IMPLEMENTATION_TITLE = "JBoss [EAP]";
+ private static final String EWP_IMPLEMENTATION_TITLE = "JBoss [EWP]";
private static final String SOA_IMPLEMENTATION_TITLE = "JBoss [SOA]";
JBossProductType(String name, String description, String defaultConfigName) {
@@ -49,10 +51,11 @@ public enum JBossProductType {
}
/**
- * Determines the product type (AS, EAP or SOA) based on the Implementation-Title
MANIFEST.MF attribute.
+ * Determines the product type (AS, EAP, EWP, or SOA) based on the
Implementation-Title MANIFEST.MF attribute.
*
* @param attributes the attributes from a manifest file (typically run.jar or
jboss-j2ee.jar)
- * @return AS, EAP or SOA
+ *
+ * @return the product type (AS, EAP, EWP, or SOA)
*/
public static JBossProductType determineJBossProductType(Attributes attributes) {
JBossProductType result = JBossProductType.AS;
@@ -61,6 +64,8 @@ public enum JBossProductType {
if (implementationTitle != null) {
if (implementationTitle.equalsIgnoreCase(EAP_IMPLEMENTATION_TITLE)) {
result = JBossProductType.EAP;
+ } else if (implementationTitle.equalsIgnoreCase(EWP_IMPLEMENTATION_TITLE)) {
+ result = JBossProductType.EWP;
} else if (implementationTitle.equalsIgnoreCase(SOA_IMPLEMENTATION_TITLE)) {
result = JBossProductType.SOA;
}
commit 5d7df4e65e66115206314d19d55974166f496a76
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Thu Mar 18 10:14:47 2010 -0400
fix bug when trying to toggle favorite flag on current Resource
(cherry picked from commit 5019f944b1cfd381f358023333e8a6ec988f58f4)
diff --git
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/resource/FavoritesUIBean.java
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/resource/FavoritesUIBean.java
index 25b3dfe..5bf3da5 100644
---
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/resource/FavoritesUIBean.java
+++
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/resource/FavoritesUIBean.java
@@ -21,18 +21,22 @@ package org.rhq.enterprise.gui.inventory.resource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.rhq.core.gui.util.FacesContextUtility;
+import org.jboss.seam.ScopeType;
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Scope;
import org.rhq.enterprise.gui.legacy.WebUser;
import org.rhq.enterprise.gui.legacy.WebUserPreferences;
import org.rhq.enterprise.gui.legacy.action.resource.common.QuickFavoritesUtil;
import org.rhq.enterprise.gui.util.EnterpriseFacesContextUtility;
-import org.rhq.enterprise.gui.util.WebUtility;
/**
- * A session-scoped bean for toggling the current resource in request scope
+ * A session-scoped bean for toggling the current resource in request scope.
*
* @author Joseph Marques
*/
+@Name("FavoritesUIBean")
+(a)Scope(ScopeType.EVENT)
public class FavoritesUIBean {
protected final Log log = LogFactory.getLog(FavoritesUIBean.class);
@@ -45,6 +49,7 @@ public class FavoritesUIBean {
* requests, particularly with the raw config editor. The raw config editor however
extends the life of the
* current ResourceUIBean beyond the current request so that the id can be accessed
through ResourceUIBean.
*/
+ @In(value = ResourceUIBean.MANAGED_BEAN_NAME, create = true)
private ResourceUIBean resourceUIBean;
public FavoritesUIBean() {
@@ -88,5 +93,4 @@ public class FavoritesUIBean {
return null;
}
-
}
\ No newline at end of file
diff --git
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/resource/ResourceUIBean.java
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/resource/ResourceUIBean.java
index 03be73e..bc62589 100644
---
a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/resource/ResourceUIBean.java
+++
b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/inventory/resource/ResourceUIBean.java
@@ -25,6 +25,9 @@ import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.jboss.seam.ScopeType;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Scope;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -62,6 +65,8 @@ import org.rhq.enterprise.server.util.LookupUtil;
*
* @author Ian Springer
*/
+(a)Name(ResourceUIBean.MANAGED_BEAN_NAME)
+(a)Scope(ScopeType.EVENT)
public class ResourceUIBean {
protected final Log log = LogFactory.getLog(ResourceUIBean.class);
diff --git
a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-managed-beans/inventory-beans.xml
b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-managed-beans/inventory-beans.xml
index ff5d3d9..fb313ca 100644
---
a/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-managed-beans/inventory-beans.xml
+++
b/modules/enterprise/gui/portal-war/src/main/webapp/WEB-INF/jsf-managed-beans/inventory-beans.xml
@@ -26,12 +26,14 @@
<!-- /rhq/resource/** -->
+ <!--
<managed-bean>
<managed-bean-name>ResourceUIBean</managed-bean-name>
<managed-bean-class>org.rhq.enterprise.gui.inventory.resource.ResourceUIBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
-
+ -->
+
<managed-bean>
<managed-bean-name>ResourceOverviewUIBean</managed-bean-name>
<managed-bean-class>org.rhq.enterprise.gui.inventory.resource.ResourceOverviewUIBean</managed-bean-class>
diff --git
a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/group/layout/summary.xhtml
b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/group/layout/summary.xhtml
index 4a0e1cf..9f132c8 100644
--- a/modules/enterprise/gui/portal-war/src/main/webapp/rhq/group/layout/summary.xhtml
+++ b/modules/enterprise/gui/portal-war/src/main/webapp/rhq/group/layout/summary.xhtml
@@ -85,9 +85,9 @@ groupId - the group id of the Group being accessed
<rich:toolTip for="favoritesStar">
- <h:outputText value="Add resource to favorites
list"
+ <h:outputText value="Add group to favorites
list"
rendered="#{!ResourceGroupUIBean.favorite}"/>
- <h:outputText value="Remove resource from
favorites list"
+ <h:outputText value="Remove group from favorites
list"
rendered="#{ResourceGroupUIBean.favorite}"/>
</rich:toolTip>
</a4j:region>
commit ad9fe1aba113f55f9493a205c0a2f29d1a26f9e6
Merge: 450dea0... 7721e26...
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Thu Mar 18 10:42:21 2010 -0400
Merge branch 'master' of
ssh://git.fedorahosted.org/git/rhq/rhq
commit 450dea0ece01d8e2f6c3602a0c7512e695ced5c8
Merge: 44ca5dd... 6278e70...
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Tue Mar 2 08:49:43 2010 -0500
Merge branch 'master' of
ssh://git.fedorahosted.org/git/rhq/rhq
commit 44ca5dd63fabe53654f1db6b17dfbbefdde1a8cb
Author: Ian P. Springer <ips(a)jetengine.(none)>
Date: Fri Feb 26 12:28:45 2010 -0500
jmx plugin will no longer log warning if SIGAR is not available; Agent, rather than
PC, will log this warning once at startup, and only if the user has not explicitly
disabled native support (
https://bugzilla.redhat.com/show_bug.cgi?id=568760)
(cherry picked from commit ab1816d9ecc4cc6e81472538fe30ae767ea0de39)
diff --git
a/modules/core/native-system/src/main/java/org/rhq/core/system/SystemInfoFactory.java
b/modules/core/native-system/src/main/java/org/rhq/core/system/SystemInfoFactory.java
index 27a1375..b2bd37f 100644
--- a/modules/core/native-system/src/main/java/org/rhq/core/system/SystemInfoFactory.java
+++ b/modules/core/native-system/src/main/java/org/rhq/core/system/SystemInfoFactory.java
@@ -29,7 +29,6 @@ import java.lang.reflect.Method;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
-import java.util.TreeMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -50,6 +49,7 @@ public class SystemInfoFactory {
private static final String NATIVE_LIBRARY_CLASS_NAME =
"org.hyperic.sigar.Sigar";
private static boolean nativeLibraryLoadable;
+ private static Throwable nativeLibraryLoadThrowable;
private static boolean disabled;
private static boolean initialized = false;
@@ -78,10 +78,11 @@ public class SystemInfoFactory {
nativeLibraryLoadable = true;
} catch (Throwable t) {
- nativeLibraryLoadable = false; // can't load the native libs if we
don't even have the JNI classes
- LOG
- .warn("System info API not accessible on this platform (native
shared library not found in java.library.path).");
- LOG.trace("Stack trace...", t);
+ // We don't have the JNI classes (sigar.jar) and/or the native shared
library (e.g. libsigar-amd64-linux.so).
+ // This might be expected (e.g. the admin console WAR (Embedded Jopr) does
not include SIGAR), so don't log
+ // anything, but store the Throwable, so callers can log the cause when
appropriate.
+ nativeLibraryLoadable = false;
+ nativeLibraryLoadThrowable = t;
}
disabled = !nativeLibraryLoadable; // automatically disable native system info
iff the native library is not loadable
@@ -170,6 +171,17 @@ public class SystemInfoFactory {
}
/**
+ * Returns a Throwable describing why the native library failed to initialize, or
null if the native library
+ * initialized successfully
+ *
+ * @return a Throwable describing why the native library failed to initialize, or
null if the native library
+ * initialized successfully
+ */
+ public static Throwable getNativeLibraryLoadThrowable() {
+ return nativeLibraryLoadThrowable;
+ }
+
+ /**
* This returns <code>true</code> iff the native libraries have actually
been initialized. This will return <code>
* false</code> if this factory has been {@link #disableNativeSystemInfo()
disabled} from the start (i.e. prior to
* the first call to {@link #createSystemInfo()} or {@link
#getNativeSystemInfoVersion()}). It will also return
@@ -308,7 +320,7 @@ public class SystemInfoFactory {
private static String findNativeLibrariesRootDirectory() throws Exception {
String rootDir = null;
File jniLocation = null;
- URL jarLocation = null;
+ URL jarLocation;
if (isNativeSystemInfoAvailable()) {
rootDir =
System.getProperty("rhq.native-libraries-root-directory");
diff --git
a/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/AgentMain.java
b/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/AgentMain.java
index 94513d0..c7e03a1 100644
--- a/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/AgentMain.java
+++ b/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/AgentMain.java
@@ -359,6 +359,11 @@ public class AgentMain {
private final AgentRestartCounter m_agentRestartCounter = new AgentRestartCounter();
/**
+ * The -t command line option was specified.
+ */
+ private boolean m_disableNativeSystem;
+
+ /**
* The main method that starts the whole thing.
*
* @param args
@@ -2056,9 +2061,20 @@ public class AgentMain {
* disabled no matter what this method decides to do.
*/
private void prepareNativeSystem() {
- if (m_configuration.isNativeSystemDisabled() &&
!SystemInfoFactory.isNativeSystemInfoDisabled()) {
- SystemInfoFactory.disableNativeSystemInfo();
- LOG.info(AgentI18NResourceKeys.NATIVE_SYSTEM_DISABLED);
+ if (m_disableNativeSystem || m_configuration.isNativeSystemDisabled()) {
+ if (!SystemInfoFactory.isNativeSystemInfoDisabled()) {
+ SystemInfoFactory.disableNativeSystemInfo();
+ LOG.info(AgentI18NResourceKeys.NATIVE_SYSTEM_DISABLED);
+ }
+ } else {
+ if (!SystemInfoFactory.isNativeSystemInfoAvailable()) {
+ Throwable t = SystemInfoFactory.getNativeLibraryLoadThrowable();
+ if (LOG.isDebugEnabled()) {
+ LOG.debug(AgentI18NResourceKeys.NATIVE_SYSINFO_UNAVAILABLE_DEBUG,
t);
+ } else {
+ LOG.warn(AgentI18NResourceKeys.NATIVE_SYSINFO_UNAVAILABLE);
+ }
+ }
}
return;
@@ -2814,8 +2830,7 @@ public class AgentMain {
}
case 't': {
- SystemInfoFactory.disableNativeSystemInfo();
- LOG.info(AgentI18NResourceKeys.NATIVE_SYSTEM_DISABLED);
+ m_disableNativeSystem = true;
}
}
}
diff --git
a/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/i18n/AgentI18NResourceKeys.java
b/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/i18n/AgentI18NResourceKeys.java
index e098b2b..08d4311 100644
---
a/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/i18n/AgentI18NResourceKeys.java
+++
b/modules/enterprise/agent/src/main/java/org/rhq/enterprise/agent/i18n/AgentI18NResourceKeys.java
@@ -519,6 +519,15 @@ public interface AgentI18NResourceKeys {
@I18NMessage("Neither server auto-detection nor polling is enabled - the client
will be allowed to start sending commands immediately, but when the server is offline, be
prepared for alot of errors to be logged")
String NO_AUTO_DETECT = "AgentMain.no-auto-detect";
+ @I18NMessage("Native system info is enabled, but the system info API is not
accessible on this platform " +
+ "(sigar.jar not found in classpath or SIGAR shared library not
found in shared library path). " +
+ "Enable DEBUG logging for more details.")
+ String NATIVE_SYSINFO_UNAVAILABLE =
"AgentMain.native-sysinfo-unavailable";
+
+ @I18NMessage("Native system info is enabled, but the system info API is not
accessible on this platform " +
+ "(sigar.jar not found in classpath or SIGAR shared library not
found in shared library path).")
+ String NATIVE_SYSINFO_UNAVAILABLE_DEBUG =
"AgentMain.native-sysinfo-unavailable-debug";
+
@I18NMessage("The agent encountered an error during startup and must
abort")
String STARTUP_ERROR = "AgentMain.startup-error";
diff --git
a/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/JMXDiscoveryComponent.java
b/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/JMXDiscoveryComponent.java
index 84ae286..ce8631a 100644
--- a/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/JMXDiscoveryComponent.java
+++ b/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/JMXDiscoveryComponent.java
@@ -1,6 +1,6 @@
/*
* RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
+ * Copyright (C) 2005-2010 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
@@ -37,6 +37,7 @@ import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails;
+import org.rhq.core.pluginapi.inventory.ProcessScanResult;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;
import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext;
import org.rhq.core.pluginapi.inventory.ManualAddFacet;
@@ -66,8 +67,8 @@ public class JMXDiscoveryComponent implements
ResourceDiscoveryComponent, Manual
public static final String ADDITIONAL_CLASSPATH_ENTRIES =
"additionalClassPathEntries";
- /* Ignore certain processes that are managed by their own plugin. For example The
Tomcat plugin will
- * handle tomcat processes configured for JMX management.
+ /* Ignore certain processes that are managed by their own plugin. For example, the
Tomcat plugin will
+ * handle Tomcat processes configured for JMX management.
*/
private static final String[] PROCESS_FILTERS;
@@ -79,7 +80,7 @@ public class JMXDiscoveryComponent implements
ResourceDiscoveryComponent, Manual
processFilters = env.split(",");
}
} catch (Throwable t) {
- log.error("Can't determine process filters, using default. Cause:
" + t);
+ log.error("Can't determine process filters; using default... Cause:
" + t);
} finally {
PROCESS_FILTERS = processFilters;
}
@@ -135,10 +136,11 @@ public class JMXDiscoveryComponent implements
ResourceDiscoveryComponent, Manual
// }
try {
- List<ProcessInfo> processes =
context.getSystemInformation().getProcesses("process|basename|match=^java.*");
+ List<ProcessScanResult> processes =
context.getAutoDiscoveredProcesses();
- for (ProcessInfo process : processes) {
- DiscoveredResourceDetails details = discoverProcess(context, process);
+ for (ProcessScanResult process : processes) {
+ ProcessInfo processInfo = process.getProcessInfo();
+ DiscoveredResourceDetails details = discoverProcess(context,
processInfo);
if (details != null) {
boolean isFiltered = false;
for (String filter : PROCESS_FILTERS) {
@@ -153,10 +155,11 @@ public class JMXDiscoveryComponent implements
ResourceDiscoveryComponent, Manual
}
}
} catch (Exception e) {
- if (log.isDebugEnabled())
- log.debug("Unable to complete base jmx server discovery.", e);
- else
- log.warn("Unable to complete base jmx server discovery (enable DEBUG
for stack): " + e);
+ if (log.isDebugEnabled()) {
+ log.debug("Unable to complete base JMX server discovery.", e);
+ } else {
+ log.warn("Unable to complete base JMX server discovery (enable DEBUG
for stack): " + e);
+ }
}
return found;
@@ -228,12 +231,16 @@ public class JMXDiscoveryComponent implements
ResourceDiscoveryComponent, Manual
String arg = process.getCommandLine()[i];
if (!arg.startsWith("-")) {
- if (arg.length() < 200) { // don't use it if its really long,
that's an ugly resource name
+ if (arg.length() <= 200) {
name = arg;
- break;
+ } else {
+ // Truncate it if it's really long for a more palatable
Resource name.
+ name = arg.substring(arg.length() - 200);
}
+ break;
} else if (arg.equals("-cp") ||
arg.equals("-classpath")) {
- i++; // skip the next arg, its the classpath, we don't want that
as the name
+ // Skip the next arg - it's the classpath, and we don't want
that as the name.
+ i++;
}
}
diff --git a/modules/plugins/jmx/src/main/resources/META-INF/rhq-plugin.xml
b/modules/plugins/jmx/src/main/resources/META-INF/rhq-plugin.xml
index bcec166..a8131c8 100644
--- a/modules/plugins/jmx/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jmx/src/main/resources/META-INF/rhq-plugin.xml
@@ -69,6 +69,8 @@
</plugin-configuration>
+ <process-scan name="java"
query="process|basename|match=^java.*"/>
+
<help>
<![CDATA[
<p>In order to monitor your Java applications via JMX, you need to expose
their MBeans to remote JMX clients.